isobmff-builder 0.10.0.0 → 0.10.5.0
raw patch · 40 files changed
+6086/−371 lines, 40 filesdep +taggeddep +type-specdep −lensbinary-addedPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: tagged, type-spec
Dependencies removed: lens
API changes (from Hackage documentation)
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: data BoxSizeExtension
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: data BoxTypeExtension
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.Box.Box cnt)
- Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: [Default] :: Template o v
- Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: type U32U64 c = SelectByVersion c (Scalar Word32) (Scalar Word64)
- Data.ByteString.IsoBaseFileFormat.Boxes.DataReference: data DataEntryUrl
- Data.ByteString.IsoBaseFileFormat.Boxes.DataReference: data DataEntryUrn
- Data.ByteString.IsoBaseFileFormat.Boxes.DataReference: dataEntryUrl :: Bool -> Maybe Text -> Box (FullBox DataEntryUrl 0)
- Data.ByteString.IsoBaseFileFormat.Boxes.DataReference: dataEntryUrn :: Bool -> Text -> Text -> Box (FullBox DataEntryUrn 0)
- Data.ByteString.IsoBaseFileFormat.Boxes.DataReference: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.DataReference.DataEntryUrl
- Data.ByteString.IsoBaseFileFormat.Boxes.DataReference: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.DataReference.DataEntryUrn
- Data.ByteString.IsoBaseFileFormat.Boxes.DataReference: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.DataReference.DataEntryUrl
- Data.ByteString.IsoBaseFileFormat.Boxes.DataReference: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.DataReference.DataEntryUrn
- Data.ByteString.IsoBaseFileFormat.Boxes.DataReference: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.DataReference.DataEntryUrl
- Data.ByteString.IsoBaseFileFormat.Boxes.DataReference: localMediaDataEntryUrl :: Box (FullBox DataEntryUrl 0)
- Data.ByteString.IsoBaseFileFormat.Boxes.Handler: TimedMetadataTrack :: HandlerType
- Data.ByteString.IsoBaseFileFormat.Boxes.Handler: [Handler] :: Constant (U32 "pre_defined") 0 :+ (HandlerType :+ (Constant (U32Arr "reserved" 3) '[0, 0, 0] :+ Template Text "")) -> Handler
- Data.ByteString.IsoBaseFileFormat.Boxes.Handler: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.Handler.Handler
- Data.ByteString.IsoBaseFileFormat.Boxes.Handler: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.Handler.Handler
- Data.ByteString.IsoBaseFileFormat.Boxes.Handler: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.Handler.HandlerType
- Data.ByteString.IsoBaseFileFormat.Boxes.Handler: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.Handler.Handler
- Data.ByteString.IsoBaseFileFormat.Boxes.Handler: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.Handler.HandlerType
- Data.ByteString.IsoBaseFileFormat.Boxes.Handler: newtype Handler
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: NullMediaHeader :: NullMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: [HintMediaHeader] :: U16 "maxPDUsize" :+ (U16 "avgPDUsize" :+ (U16 "maxbitrate" :+ (U16 "avgbitrate" :+ U32 "reserved"))) -> HintMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: [SoundMediaHeader] :: Template (I16 "balance") 0 :+ Constant (U16 "reserved") 0 -> SoundMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: [VideoMediaHeader] :: Template (U16 "graphicsmode") 0 :+ Template (U16Arr "opcolor" 3) '[0, 0, 0] -> VideoMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: data NullMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: hintMediaHeader :: HintMediaHeader -> Box (FullBox HintMediaHeader 0)
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.HintMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.NullMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.SoundMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.VideoMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.HintMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.NullMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.SoundMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.VideoMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.HintMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.NullMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.SoundMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader.VideoMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: newtype HintMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: newtype SoundMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: newtype VideoMediaHeader
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: nullMediaHeader :: Box (FullBox NullMediaHeader 0)
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: soundMediaHeader :: SoundMediaHeader -> Box (FullBox SoundMediaHeader 0)
- Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader: videoMediaHeader :: VideoMediaHeader -> Box (FullBox VideoMediaHeader 0)
- Data.ByteString.IsoBaseFileFormat.Boxes.Versioned: [OnV0] :: forall (v :: Nat ~> Type). IsBoxContent (v @@ 0) => v @@ 0 -> ApplyVersioned v
- Data.ByteString.IsoBaseFileFormat.Boxes.Versioned: [OnV1] :: forall (v :: Nat ~> Type). IsBoxContent (v @@ 1) => v @@ 1 -> ApplyVersioned v
- Data.ByteString.IsoBaseFileFormat.Boxes.Versioned: data ApplyVersioned (v' :: Nat ~> Type)
- Data.ByteString.IsoBaseFileFormat.Boxes.Versioned: data SelectByVersion :: (a -> Type) -> a -> a -> Nat ~> Type
- Data.ByteString.IsoBaseFileFormat.Boxes.Versioned: instance (Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (b 0), Data.Default.Class.Default (b 0)) => Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.Versioned.VersionedBox b)
- Data.ByteString.IsoBaseFileFormat.Boxes.Versioned: instance (Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (b Data.Singletons.@@ 0), Data.Default.Class.Default (b Data.Singletons.@@ 0)) => Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.Versioned.ApplyVersioned b)
- Data.ByteString.IsoBaseFileFormat.Boxes.Versioned: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.Versioned.ApplyVersioned c)
- Data.ByteString.IsoBaseFileFormat.Boxes.Versioned: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.Versioned.VersionedBox c)
- Data.ByteString.IsoBaseFileFormat.Brands.Dash: [_hdlr] :: SingleAudioTrackInit -> Handler
- Data.ByteString.IsoBaseFileFormat.Brands.Dash: [_mdhd] :: SingleAudioTrackInit -> MediaHeader 0
- Data.ByteString.IsoBaseFileFormat.Brands.Dash: [_mvhd] :: SingleAudioTrackInit -> MovieHeader 0
- Data.ByteString.IsoBaseFileFormat.Brands.Dash: [_smhd] :: SingleAudioTrackInit -> SoundMediaHeader
- Data.ByteString.IsoBaseFileFormat.Brands.Dash: [_tkhd] :: SingleAudioTrackInit -> TrackHeader 0
- Data.ByteString.IsoBaseFileFormat.Brands.Dash: instance Data.ByteString.IsoBaseFileFormat.Brands.Types.IsBrand (Data.ByteString.IsoBaseFileFormat.Brands.Dash.Dash v)
- Data.ByteString.IsoBaseFileFormat.Brands.Types: class IsBrand brand where type BoxLayout brand mediaBuilder _ t = boxBuilder t where {
+ Data.ByteString.IsoBaseFileFormat.Boxes.AudioSampleEntry: audioSampleEntry :: (KnownSymbol (BoxTypeSymbol (SampleEntry AudioTrack (AudioCoding c)))) => AudioCoding c -> U16 "data_reference_index" -> SampleEntry AudioTrack (AudioCoding c) -> Box (SampleEntry AudioTrack (AudioCoding c))
+ Data.ByteString.IsoBaseFileFormat.Boxes.AudioSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry.SampleEntry 'Data.ByteString.IsoBaseFileFormat.Boxes.Handler.AudioTrack (Data.ByteString.IsoBaseFileFormat.Boxes.AudioSampleEntry.AudioCoding c))
+ Data.ByteString.IsoBaseFileFormat.Boxes.AudioSampleEntry: instance Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry.SampleEntry 'Data.ByteString.IsoBaseFileFormat.Boxes.Handler.AudioTrack (Data.ByteString.IsoBaseFileFormat.Boxes.AudioSampleEntry.AudioCoding c))
+ Data.ByteString.IsoBaseFileFormat.Boxes.AudioSampleEntry: type DefaultSoundSamplerate = 48000
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: ListContent :: [contentType] -> ListContent sizeType contentType
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: instance (GHC.Num.Num sizeType, Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent sizeType, Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent contentType) => Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.Box.ListContent sizeType contentType)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox cnt => Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.Box.Box cnt)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: instance Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.Box.BoxContent b) => Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.Box.Box b)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: instance Data.Default.Class.Default Data.ByteString.Internal.ByteString
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: instance Data.Default.Class.Default Data.Text.Internal.Text
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: instance forall k (sizeTupe :: k) contentType. Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.Box.ListContent sizeTupe contentType)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: instance forall k c (s :: k). Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent c => Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.Tagged.Tagged s c)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: instance forall k c (s :: k). Data.Default.Class.Default c => Data.Default.Class.Default (Data.Tagged.Tagged s c)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: newtype BoxSizeExtension
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: newtype BoxTypeExtension
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: newtype ListContent sizeType contentType
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: [FixSizeText] :: Text -> FixSizeText len label
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: [Template] :: Template o v
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: [U32Text] :: Word32 -> U32Text label
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields.U32Text label)
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: instance Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields.IsTextSize len => Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields.FixSizeText len label)
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: instance Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields.IsTextSize len => Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields.FixSizeText len label)
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: instance Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields.U32Text label)
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: instance Data.String.IsString (Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields.U32Text label)
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: instance GHC.TypeLits.KnownSymbol str => Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields.FromTypeLit (Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields.U32Text label) str
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: newtype FixSizeText (len :: Nat) (label :: Symbol)
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: newtype U32Text (label :: Symbol)
+ Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields: type IsTextSize len = (KnownNat len, 1 <= len, len <= 255)
+ Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl: data DataEntryUrl
+ Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl: dataEntryUrl :: Bool -> Maybe Text -> Box (FullBox DataEntryUrl 0)
+ Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl.DataEntryUrl
+ Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl.DataEntryUrl
+ Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl.DataEntryUrl
+ Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl: localMediaDataEntryUrl :: Box (FullBox DataEntryUrl 0)
+ Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrn: data DataEntryUrn
+ Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrn: dataEntryUrn :: Bool -> Text -> Text -> Box (FullBox DataEntryUrn 0)
+ Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrn: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrn.DataEntryUrn
+ Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrn: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrn.DataEntryUrn
+ Data.ByteString.IsoBaseFileFormat.Boxes.FullBox: instance (GHC.TypeLits.KnownNat version, Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox t, Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.Box.BoxContent t)) => Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.FullBox.FullBox t version)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: TimedMetaDataTrack :: HandlerType
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: audioTrackHandler :: Handler AudioTrack
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: auxilliaryVideoTrackHandler :: Handler AuxilliaryVideoTrack
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: data Handler (t :: HandlerType)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: hintTrackHandler :: Handler HintTrack
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: instance Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.Handler.Handler t)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: instance GHC.TypeLits.KnownSymbol (Data.ByteString.IsoBaseFileFormat.Boxes.Handler.HandlerTypeCode t) => Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox (Data.ByteString.IsoBaseFileFormat.Boxes.Handler.Handler t)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: instance GHC.TypeLits.KnownSymbol (Data.ByteString.IsoBaseFileFormat.Boxes.Handler.HandlerTypeCode t) => Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.Handler.Handler t)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: namedAudioTrackHandler :: Text -> Handler AudioTrack
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: namedAuxilliaryVideoTrackHandler :: Text -> Handler AuxilliaryVideoTrack
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: namedHintTrackHandler :: Text -> Handler HintTrack
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: namedTimedMetadataTrackHandler :: Text -> Handler TimedMetaDataTrack
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: namedVideoTrackHandler :: Text -> Handler VideoTrack
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: timedMetadataTrackHandler :: Handler TimedMetaDataTrack
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: videoTrackHandler :: Handler VideoTrack
+ Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader: [HintMediaHeader] :: U16 "maxPDUsize" :+ (U16 "avgPDUsize" :+ (U16 "maxbitrate" :+ (U16 "avgbitrate" :+ U32 "reserved"))) -> HintMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader: hintMediaHeader :: HintMediaHeader -> Box (FullBox HintMediaHeader 0)
+ Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader.HintMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader.HintMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader.HintMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader: newtype HintMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: BitRate :: (U32 "bufferSizeDB" :+ (U32 "maxBitrate" :+ U32 "avgBitrate")) -> BitRate
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: UriField :: (Tagged "theURI" Text) -> UriField
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: UriInitField :: (Tagged "uri_initialization_data" ByteString) -> UriInitField
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: bitRateBox :: BitRate -> Box BitRate
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.BitRate
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.UriField
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.UriInitField
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.MetaDataCoding "mett")
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.MetaDataCoding "metx")
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.MetaDataCoding "urim")
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.BitRate
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.UriField
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.UriInitField
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.MetaDataCoding "mett")
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.MetaDataCoding "metx")
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.MetaDataCoding "urim")
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.BitRate
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.UriField
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry.UriInitField
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: metaDataSampleEntry :: MetaDataCoding c -> U16 "data_reference_index" -> SampleEntry TimedMetaDataTrack (MetaDataCoding c) -> Box (SampleEntry TimedMetaDataTrack (MetaDataCoding c))
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: newtype BitRate
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: newtype UriField
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: newtype UriInitField
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: type Uri = FullBox UriField 0
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: type UriInit = FullBox UriInitField 0
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: uriBox :: Text -> Box Uri
+ Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry: uriInitBox :: ByteString -> Box UriInit
+ Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader: NullMediaHeader :: NullMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader: data NullMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader.NullMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader.NullMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader.NullMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader: nullMediaHeader :: Box (FullBox NullMediaHeader 0)
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription: SampleDescription :: (U32 "entry_count") -> SampleDescription handlerType
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription: instance forall k (h :: k). Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox (Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription.SampleDescription h)
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription: instance forall k (handlerType :: k). Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription.SampleDescription handlerType)
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription: instance forall k (handlerType :: k). Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription.SampleDescription handlerType)
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription: newtype SampleDescription handlerType
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription: sampleDescription :: (KnownNat (Length ts)) => Boxes ts -> Box (ContainerBox (FullBox (SampleDescription h) 0) ts)
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry: [SampleEntryFields] :: Constant (U8Arr "reserved" 6) '[0, 0, 0, 0, 0, 0] :+ (U16 "data_reference_index" :+ a) -> SampleEntryFields a
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry: data MatchSampleEntry (handlerType :: HandlerType)
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent a => Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry.SampleEntryFields a)
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry: instance Data.Default.Class.Default a => Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry.SampleEntryFields a)
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry: instance forall k (handlertype :: Data.ByteString.IsoBaseFileFormat.Boxes.Handler.HandlerType) (format :: k). (Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry.SampleEntry handlertype format), GHC.TypeLits.KnownSymbol (Data.ByteString.IsoBaseFileFormat.Boxes.Box.BoxTypeSymbol (Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry.SampleEntry handlertype format))) => Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox (Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry.SampleEntry handlertype format)
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry: newtype SampleEntryFields a
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry: sampleEntry :: forall (handlertype :: HandlerType) (format :: k). U16 "data_reference_index" -> SampleEntry handlertype format -> Box (SampleEntry handlertype format)
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleTable: SampleTable :: SampleTable
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleTable: data SampleTable
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleTable: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.SampleTable.SampleTable
+ Data.ByteString.IsoBaseFileFormat.Boxes.SampleTable: sampleTable :: Boxes ts -> Box (ContainerBox SampleTable ts)
+ Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader: [SoundMediaHeader] :: Template (I16 "balance") 0 :+ Constant (U16 "reserved") 0 -> SoundMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader.SoundMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader.SoundMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader.SoundMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader: newtype SoundMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader: soundMediaHeader :: SoundMediaHeader -> Box (FullBox SoundMediaHeader 0)
+ Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample: TimeToSampleTable :: (ListContent (U32 "entry_count") SttsEntry) -> TimeToSampleTable
+ Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample.TimeToSampleTable
+ Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample.TimeToSampleTable
+ Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample.TimeToSampleTable
+ Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample: newtype TimeToSampleTable
+ Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample: timeToSample :: [SttsEntry] -> Box TimeToSample
+ Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample: type SttsEntry = U32 "sample_count" :+ U32 "sample_delta"
+ Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample: type TimeToSample = FullBox TimeToSampleTable 0
+ Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader: [VideoMediaHeader] :: Template (U16 "graphicsmode") 0 :+ Template (U16Arr "opcolor" 3) '[0, 0, 0] -> VideoMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader.VideoMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader.VideoMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader.VideoMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader: newtype VideoMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader: videoMediaHeader :: VideoMediaHeader -> Box (FullBox VideoMediaHeader 0)
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: IsFullRange :: FullRangeFlag
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: IsNotFullRange :: FullRangeFlag
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: OnScreenColours :: ColourTypeProfile
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: RestrictedICCProfile :: ColourTypeProfile
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: UnrestrictedICCProfile :: ColourTypeProfile
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: [CleanAperture] :: U32 "cleanApertureWidthN" :+ (U32 "cleanApertureWidthD" :+ (U32 "cleanApertureHeightN" :+ (U32 "cleanApertureHeightD" :+ (U32 "horizOffN" :+ (U32 "horizOffD" :+ (U32 "vertOffN" :+ U32 "vertOffD")))))) -> CleanAperture
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: [ColourInformation] :: Constant (U32Text "colour_type") (ColourTypeCode profile) :+ ColourType profile -> ColourInformation profile
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: [PixelAspectRatio] :: U32 "hSpacing" :+ U32 "vSpacing" -> PixelAspectRatio
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: [SomeColourInformation] :: forall (profile :: ColourTypeProfile). IsBoxContent (ColourInformation profile) => ColourInformation profile -> SomeColourInformation
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: cleanAperture :: CleanAperture -> Box CleanAperture
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: colourInformation :: ColourType p -> ColourInformation p
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: data ColourTypeProfile
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: data FullRangeFlag
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: data SomeColourInformation
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance (GHC.TypeLits.KnownSymbol (Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.ColourTypeCode profile), Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.ColourType profile)) => Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.ColourInformation profile)
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.CleanAperture
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.PixelAspectRatio
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBox Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.SomeColourInformation
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent (Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry.SampleEntry 'Data.ByteString.IsoBaseFileFormat.Boxes.Handler.VideoTrack (Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.VideoCoding c))
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.CleanAperture
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.FullRangeFlag
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.PixelAspectRatio
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.SomeColourInformation
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.ByteString.IsoBaseFileFormat.Boxes.Box.IsBoxContent [Data.ByteString.IsoBaseFileFormat.Boxes.Box.Box Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.SomeColourInformation]
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry.SampleEntry 'Data.ByteString.IsoBaseFileFormat.Boxes.Handler.VideoTrack (Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.VideoCoding c))
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.ColourType profile) => Data.Default.Class.Default (Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.ColourInformation profile)
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.CleanAperture
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.FullRangeFlag
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: instance Data.Default.Class.Default Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry.PixelAspectRatio
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: newtype CleanAperture
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: newtype ColourInformation (profile :: ColourTypeProfile)
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: newtype PixelAspectRatio
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: onScreenColourInformation :: ColourType OnScreenColours -> ColourInformation OnScreenColours
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: pixelAspectRatio :: PixelAspectRatio -> Box PixelAspectRatio
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: restrictedICCProfileColourInformation :: ColourType RestrictedICCProfile -> ColourInformation RestrictedICCProfile
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: unrestrictedICCProfileColourInformation :: ColourType UnrestrictedICCProfile -> ColourInformation UnrestrictedICCProfile
+ Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry: visualSampleEntry :: (KnownSymbol (BoxTypeSymbol (SampleEntry VideoTrack (VideoCoding codec)))) => VideoCoding codec -> U16 "data_reference_index" -> SampleEntry VideoTrack (VideoCoding codec) -> Box (SampleEntry VideoTrack (VideoCoding codec))
+ Data.ByteString.IsoBaseFileFormat.Brands.Dash: [hdlr] :: SingleAudioTrackInit -> Handler AudioTrack
+ Data.ByteString.IsoBaseFileFormat.Brands.Dash: [mdhd] :: SingleAudioTrackInit -> MediaHeader 0
+ Data.ByteString.IsoBaseFileFormat.Brands.Dash: [mvhd] :: SingleAudioTrackInit -> MovieHeader 0
+ Data.ByteString.IsoBaseFileFormat.Brands.Dash: [smhd] :: SingleAudioTrackInit -> SoundMediaHeader
+ Data.ByteString.IsoBaseFileFormat.Brands.Dash: [tkhd] :: SingleAudioTrackInit -> TrackHeader 0
+ Data.ByteString.IsoBaseFileFormat.Brands.Dash: instance Data.ByteString.IsoBaseFileFormat.Brands.Types.IsMediaFileFormat (Data.ByteString.IsoBaseFileFormat.Brands.Dash.Dash v)
+ Data.ByteString.IsoBaseFileFormat.Brands.Types: class IsMediaFileFormat brand where type BoxLayout brand mediaBuilder _ t = boxBuilder t where {
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: data (:/) :: Symbol -> k -> Type
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: data Field :: Nat -> Type
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: getField :: forall a b (path :: k) (first :: Nat) (last :: Nat) field pxy1 pxy2. (IsFieldC path field first last, Integral a, Bits a, Num b) => pxy1 path -> pxy2 field -> a -> b
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: getFlag :: forall a (path :: k) (first :: Nat) field p1 p2. (IsFieldC path field first first, Bits a) => p1 path -> p2 field -> a -> Bool
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: getFooField :: IsFieldC name Foo first last => proxy name -> Word64 -> Word64
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: setField :: forall a b (path :: k) (first :: Nat) (last :: Nat) field pxy1 pxy2. (IsFieldC path field first last, Num a, Bits a, Integral b) => pxy1 path -> pxy2 field -> b -> a -> a
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: setFlag :: forall a (path :: k) (first :: Nat) field p1 p2. (IsFieldC path field first first, Bits a) => p1 path -> p2 field -> Bool -> a -> a
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: type FieldPosition = (Nat, Nat)
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: type Flag = Field 1
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: type Foo = (((("foo" :=> Flag) :*: Field 4) :*: ("bar" :=> Field 2)) :*: Field 4) :*: ("baz" :=> Field 17)
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: type IsFieldC name field first last = (name `HasFieldConstraint` field, KnownNat first, KnownNat last, Right '(first, last) ~ (GetFieldPosition field name))
+ Data.ByteString.IsoBaseFileFormat.Util.BitRecords: type Rem (x :: Nat) (y :: Nat) = RemImpl x y 0
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: ($:) :: (Boxes '[Box l] -> r) -> Box l -> r
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: ($:) :: IsBox l => (Boxes '[Box l] -> r) -> Box l -> r
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: (:+) :: a -> b -> (:+) a b
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: (:+) :: !a -> !b -> (:+) a b
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: BoxSize :: Word64 -> BoxSize
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: BoxSize :: !Word64 -> BoxSize
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: CustomBoxType :: String -> BoxType
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: CustomBoxType :: !String -> BoxType
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: StdType :: FourCc -> BoxType
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: StdType :: !FourCc -> BoxType
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: [:.] :: Box l -> Boxes r -> Boxes (Box l : r)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: [:.] :: IsBox l => !(Box l) -> !(Boxes r) -> Boxes (Box l : r)
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: [:<>] :: Boxes l -> Boxes r -> Boxes (l :++ r)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: [:<>] :: !(Boxes l) -> !(Boxes r) -> Boxes (l :++ r)
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: [:|] :: Box l -> Box r -> Boxes '[Box l, Box r]
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: [:|] :: (IsBox l, IsBox r) => !(Box l) -> !(Box r) -> Boxes '[Box l, Box r]
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: [Box] :: (IsBox b) => BoxContent b -> Box b
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: [Box] :: !(BoxContent b) -> Box b
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: [ContainerBox] :: IsBox b => BoxContent b -> Boxes bs -> ContainerBox b bs
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: [ContainerBox] :: IsBox b => !(BoxContent b) -> !(Boxes bs) -> ContainerBox b bs
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: class (KnownSymbol (BoxTypeSymbol t), IsBoxContent (BoxContent t)) => IsBox t where type BoxContent t type BoxContent t = t toBoxType _ = parseBoxType (Proxy :: Proxy (BoxTypeSymbol t)) where {
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: class (KnownSymbol (BoxTypeSymbol t), IsBoxContent (BoxContent t)) => IsBox (t :: Type) where type BoxContent t type BoxContent t = t toBoxType _ = parseBoxType (Proxy :: Proxy (BoxTypeSymbol t)) where {
- Data.ByteString.IsoBaseFileFormat.Boxes.Box: singletonBox :: Box l -> Boxes '[Box l]
+ Data.ByteString.IsoBaseFileFormat.Boxes.Box: singletonBox :: IsBox l => Box l -> Boxes '[Box l]
- Data.ByteString.IsoBaseFileFormat.Boxes.Handler: handler :: Handler -> Box (FullBox Handler 0)
+ Data.ByteString.IsoBaseFileFormat.Boxes.Handler: handler :: (KnownSymbol (HandlerTypeCode t)) => Handler t -> Box (FullBox (Handler t) 0)
- Data.ByteString.IsoBaseFileFormat.Brands.Dash: SingleAudioTrackInit :: MovieHeader 0 -> TrackHeader 0 -> MediaHeader 0 -> Handler -> SoundMediaHeader -> SingleAudioTrackInit
+ Data.ByteString.IsoBaseFileFormat.Brands.Dash: SingleAudioTrackInit :: MovieHeader 0 -> TrackHeader 0 -> MediaHeader 0 -> Handler AudioTrack -> SoundMediaHeader -> SingleAudioTrackInit
- Data.ByteString.IsoBaseFileFormat.Brands.Types: mediaBuilder :: forall t proxy. (IsBrand brand, IsBoxContent t, IsRuleConform t (BoxLayout brand) ~ True) => proxy brand -> t -> Builder
+ Data.ByteString.IsoBaseFileFormat.Brands.Types: mediaBuilder :: forall t proxy. (IsMediaFileFormat brand, IsBoxContent t, IsRuleConform t (BoxLayout brand) ~ True) => proxy brand -> t -> Builder
Files
- .gitignore +11/−0
- .travis.yml +24/−0
- README.md +10/−0
- doc/basic-structure.svg +2259/−0
- doc/data_reference_box.svg +2427/−0
- examples/734397657.m4s binary
- examples/audio.mpd +16/−0
- examples/init.mp4 binary
- isobmff-builder.cabal +28/−3
- spec/BoxFieldsSpec.hs +24/−11
- spec/BrandTypeSpec.hs +3/−3
- spec/DashSpec.hs +30/−15
- spec/DataReferenceSpec.hs +15/−21
- src/Data/ByteString/IsoBaseFileFormat/Boxes.hs +39/−28
- src/Data/ByteString/IsoBaseFileFormat/Boxes/AudioSampleEntry.hs +40/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/Box.hs +68/−29
- src/Data/ByteString/IsoBaseFileFormat/Boxes/BoxFields.hs +56/−13
- src/Data/ByteString/IsoBaseFileFormat/Boxes/DataEntryUrl.hs +32/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/DataEntryUrn.hs +24/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/DataReference.hs +1/−43
- src/Data/ByteString/IsoBaseFileFormat/Boxes/FullBox.hs +4/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/Handler.hs +86/−26
- src/Data/ByteString/IsoBaseFileFormat/Boxes/HintMediaHeader.hs +28/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/HintSampleEntry.hs +17/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/Language.hs +0/−2
- src/Data/ByteString/IsoBaseFileFormat/Boxes/MetaDataSampleEntry.hs +110/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/NullMediaHeader.hs +21/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/SampleDescription.hs +27/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/SampleEntry.hs +52/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/SampleTable.hs +19/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/SoundMediaHeader.hs +25/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/SpecificMediaHeader.hs +8/−76
- src/Data/ByteString/IsoBaseFileFormat/Boxes/TimeToSample.hs +27/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/Versioned.hs +3/−40
- src/Data/ByteString/IsoBaseFileFormat/Boxes/VideoMediaHeader.hs +25/−0
- src/Data/ByteString/IsoBaseFileFormat/Boxes/VisualSampleEntry.hs +184/−0
- src/Data/ByteString/IsoBaseFileFormat/Brands/Dash.hs +57/−60
- src/Data/ByteString/IsoBaseFileFormat/Brands/Types.hs +2/−1
- src/Data/ByteString/IsoBaseFileFormat/Util/BitRecords.hs +214/−0
- stack.yaml +70/−0
+ .gitignore view
@@ -0,0 +1,11 @@+*.hi+*.o+*.swp+*.tag+*~+*_flymake.hs+.hsenv+.stack-work/+TAGS+/.idea/+/.dir-locals.el
+ .travis.yml view
@@ -0,0 +1,24 @@+language: c++sudo: false+cache:+ directories:+ - $HOME/.stack/++matrix:+ include:+ - env: CABALVER=1.22 GHCVER=8.0.1+ addons: {apt: {packages: [cabal-install-1.22,ghc-8.0.1],sources: [hvr-ghc]}}++before_install:+ - mkdir -p ~/.local/bin+ - export PATH=~/.local/bin:$PATH+ - travis_retry curl -L https://www.stackage.org/stack/linux-x86_64 | tar -xzO --wildcards '*/stack' > ~/.local/bin/stack+ - chmod a+x ~/.local/bin/stack++install:+ - stack -j 2 setup --no-terminal --resolver nightly+ - stack -j 2 build --only-snapshot --no-terminal++script:+ - stack -j 2 test --no-terminal
+ README.md view
@@ -0,0 +1,10 @@+[](https://travis-ci.org/sheyll/isobmff-builder)+[](http://hackage.haskell.org/package/isobmff-builder)++# ISO-14496-12 Base Media File Format Builder++This project contains a bytestring-builder for the media data container file+format defined as part of the MPEG-4 (ISO-14496) family of standards, called the+Iso Base Media File Format, or ISOBMFF.++It is a container format for both stored and transfered media data.
+ doc/basic-structure.svg view
@@ -0,0 +1,2259 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="297mm"+ height="210mm"+ viewBox="0 0 1052.3622 744.09448"+ id="svg2"+ version="1.1"+ inkscape:version="0.91 r13725"+ enable-background="new"+ sodipodi:docname="basic-structure.svg">+ <defs+ id="defs4">+ <marker+ inkscape:isstock="true"+ style="overflow:visible;"+ id="marker15594"+ refX="0.0"+ refY="0.0"+ orient="auto"+ inkscape:stockid="Arrow2Mend">+ <path+ transform="scale(0.6) rotate(180) translate(0,0)"+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff00ff;stroke-opacity:0.6;fill:#ff00ff;fill-opacity:0.6"+ id="path15596" />+ </marker>+ <marker+ inkscape:isstock="true"+ style="overflow:visible;"+ id="marker15518"+ refX="0.0"+ refY="0.0"+ orient="auto"+ inkscape:stockid="Arrow2Mend">+ <path+ transform="scale(0.6) rotate(180) translate(0,0)"+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff00ff;stroke-opacity:0.6;fill:#ff00ff;fill-opacity:0.6"+ id="path15520" />+ </marker>+ <marker+ inkscape:isstock="true"+ style="overflow:visible;"+ id="marker15508"+ refX="0.0"+ refY="0.0"+ orient="auto"+ inkscape:stockid="Arrow2Mend">+ <path+ transform="scale(0.6) rotate(180) translate(0,0)"+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff00ff;stroke-opacity:0.6;fill:#ff00ff;fill-opacity:0.6"+ id="path15510" />+ </marker>+ <linearGradient+ id="linearGradient15474"+ osb:paint="solid">+ <stop+ style="stop-color:#000000;stop-opacity:1;"+ offset="0"+ id="stop15476" />+ </linearGradient>+ <marker+ inkscape:stockid="Arrow2Lend"+ orient="auto"+ refY="0.0"+ refX="0.0"+ id="marker14724"+ style="overflow:visible;"+ inkscape:isstock="true">+ <path+ id="path14726"+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "+ transform="scale(1.1) rotate(180) translate(1,0)" />+ </marker>+ <marker+ inkscape:isstock="true"+ style="overflow:visible;"+ id="marker14160"+ refX="0.0"+ refY="0.0"+ orient="auto"+ inkscape:stockid="Arrow2Mend">+ <path+ transform="scale(0.6) rotate(180) translate(0,0)"+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#3c3004;stroke-opacity:1;fill:#3c3004;fill-opacity:1"+ id="path14162" />+ </marker>+ <marker+ inkscape:stockid="Arrow2Mend"+ orient="auto"+ refY="0.0"+ refX="0.0"+ id="Arrow2Mend"+ style="overflow:visible;"+ inkscape:isstock="true"+ inkscape:collect="always">+ <path+ id="path5655"+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#3c3004;stroke-opacity:1;fill:#3c3004;fill-opacity:1"+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "+ transform="scale(0.6) rotate(180) translate(0,0)" />+ </marker>+ <marker+ inkscape:isstock="true"+ style="overflow:visible;"+ id="marker12997"+ refX="0.0"+ refY="0.0"+ orient="auto"+ inkscape:stockid="Arrow1Lend">+ <path+ transform="scale(0.8) rotate(180) translate(12.5,0)"+ style="fill-rule:evenodd;stroke:#0a0407;stroke-width:1pt;stroke-opacity:1;fill:#0a0407;fill-opacity:1"+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "+ id="path12999" />+ </marker>+ <linearGradient+ id="linearGradient12749"+ osb:paint="solid">+ <stop+ style="stop-color:#3c3004;stop-opacity:0.98039216;"+ offset="0"+ id="stop12751" />+ </linearGradient>+ <linearGradient+ id="linearGradient12515"+ osb:paint="solid">+ <stop+ style="stop-color:#000000;stop-opacity:1;"+ offset="0"+ id="stop12517" />+ </linearGradient>+ <linearGradient+ id="linearGradient11377"+ osb:paint="solid">+ <stop+ style="stop-color:#000000;stop-opacity:1;"+ offset="0"+ id="stop11379" />+ </linearGradient>+ <linearGradient+ id="linearGradient11061"+ osb:paint="solid">+ <stop+ style="stop-color:#000000;stop-opacity:1;"+ offset="0"+ id="stop11063" />+ </linearGradient>+ <linearGradient+ id="linearGradient10993"+ osb:paint="solid">+ <stop+ style="stop-color:#000000;stop-opacity:1;"+ offset="0"+ id="stop10995" />+ </linearGradient>+ <linearGradient+ id="linearGradient10679"+ osb:paint="solid">+ <stop+ style="stop-color:#000000;stop-opacity:1;"+ offset="0"+ id="stop10681" />+ </linearGradient>+ <linearGradient+ id="linearGradient10671"+ osb:paint="solid">+ <stop+ style="stop-color:#000000;stop-opacity:1;"+ offset="0"+ id="stop10673" />+ </linearGradient>+ <linearGradient+ id="linearGradient10665"+ osb:paint="solid">+ <stop+ style="stop-color:#000000;stop-opacity:1;"+ offset="0"+ id="stop10667" />+ </linearGradient>+ <linearGradient+ inkscape:collect="always"+ id="sample-to-media-data-5">+ <stop+ style="stop-color:#ff00ff;stop-opacity:1"+ offset="0"+ id="stop10623" />+ <stop+ style="stop-color:#881800;stop-opacity:1"+ offset="1"+ id="stop10625" />+ </linearGradient>+ <marker+ inkscape:stockid="Arrow1Lstart"+ orient="auto"+ refY="0.0"+ refX="0.0"+ id="marker8320"+ style="overflow:visible"+ inkscape:isstock="true">+ <path+ id="path8322"+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"+ transform="scale(0.8) translate(12.5,0)" />+ </marker>+ <marker+ inkscape:stockid="Arrow1Lstart"+ orient="auto"+ refY="0.0"+ refX="0.0"+ id="Arrow1Lstart"+ style="overflow:visible"+ inkscape:isstock="true">+ <path+ id="path5628"+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"+ transform="scale(0.8) translate(12.5,0)" />+ </marker>+ <marker+ inkscape:stockid="Arrow1Lend"+ orient="auto"+ refY="0.0"+ refX="0.0"+ id="marker5904"+ style="overflow:visible;"+ inkscape:isstock="true">+ <path+ id="path5906"+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"+ transform="scale(0.8) rotate(180) translate(12.5,0)" />+ </marker>+ <marker+ inkscape:stockid="Arrow1Lend"+ orient="auto"+ refY="0.0"+ refX="0.0"+ id="Arrow1Lend"+ style="overflow:visible;"+ inkscape:isstock="true"+ inkscape:collect="always">+ <path+ id="path5631"+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "+ style="fill-rule:evenodd;stroke:#ff00ff;stroke-width:1pt;stroke-opacity:1;fill:#ff00ff;fill-opacity:1"+ transform="scale(0.8) rotate(180) translate(12.5,0)" />+ </marker>+ <linearGradient+ id="linearGradient5596"+ osb:paint="solid">+ <stop+ style="stop-color:#1486c3;stop-opacity:1;"+ offset="0"+ id="stop5598" />+ </linearGradient>+ <linearGradient+ id="linearGradient4154"+ osb:paint="solid">+ <stop+ style="stop-color:#ff5f8d;stop-opacity:1;"+ offset="0"+ id="stop4156" />+ </linearGradient>+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient5600"+ x1="123.13862"+ y1="808.91543"+ x2="649.62811"+ y2="808.91543"+ gradientUnits="userSpaceOnUse"+ gradientTransform="matrix(1.5049175,0,0,0.58385007,-110.74398,-36.11621)" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient5604"+ gradientUnits="userSpaceOnUse"+ gradientTransform="matrix(1.501081,0,0,0.58385991,-110.27177,53.779441)"+ x1="123.13862"+ y1="808.91541"+ x2="649.62811"+ y2="808.91541" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#sample-to-media-data-5"+ id="linearGradient10599"+ x1="222.7077"+ y1="632.0694"+ x2="43.06395"+ y2="949.92651"+ gradientUnits="userSpaceOnUse" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#sample-to-media-data-5"+ id="linearGradient10601"+ x1="248.17426"+ y1="628.49792"+ x2="69.717415"+ y2="957.78363"+ gradientUnits="userSpaceOnUse" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#sample-to-media-data-5"+ id="linearGradient10637"+ x1="-694.37683"+ y1="522.23401"+ x2="-800.94135"+ y2="515.94836"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(106.28654,-0.60360971)" />+ <filter+ inkscape:collect="always"+ style="color-interpolation-filters:sRGB"+ id="filter10659">+ <feBlend+ inkscape:collect="always"+ mode="lighten"+ in2="BackgroundImage"+ id="feBlend10661" />+ </filter>+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient10675"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient10683"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient10701"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient10703"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient10717"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient10719"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient10721"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient10723"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient10997"+ x1="43.296745"+ y1="715.47632"+ x2="230.45461"+ y2="715.47632"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-1.1307678,7.9153744)" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient10999"+ x1="187.71971"+ y1="714.46619"+ x2="352.71191"+ y2="714.46619"+ gradientUnits="userSpaceOnUse" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient11065"+ x1="277.3237"+ y1="760.4281"+ x2="350.99118"+ y2="760.4281"+ gradientUnits="userSpaceOnUse" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient11067"+ x1="188.41422"+ y1="760.4281"+ x2="226.75848"+ y2="760.4281"+ gradientUnits="userSpaceOnUse" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient11239"+ gradientUnits="userSpaceOnUse"+ x1="188.41422"+ y1="760.4281"+ x2="226.75848"+ y2="760.4281"+ gradientTransform="translate(127.27922,3.0304576)" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient11569"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-228,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient11785"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-92,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient11973"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(146,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient12121"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(386,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient12173"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(626,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12249"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(12,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12297"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(252,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12337"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(492,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12389"+ gradientUnits="userSpaceOnUse"+ x1="187.71971"+ y1="714.46619"+ x2="352.71191"+ y2="714.46619" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient12391"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(127.27922,3.0304576)"+ x1="188.41422"+ y1="760.4281"+ x2="226.75848"+ y2="760.4281" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient12393"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(127.27922,3.0304576)"+ x1="188.41422"+ y1="760.4281"+ x2="226.75848"+ y2="760.4281" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient12395"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(127.27922,3.0304576)"+ x1="188.41422"+ y1="760.4281"+ x2="226.75848"+ y2="760.4281" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient12397"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(127.27922,3.0304576)"+ x1="188.41422"+ y1="760.4281"+ x2="226.75848"+ y2="760.4281" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient12399"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(127.27922,3.0304576)"+ x1="188.41422"+ y1="760.4281"+ x2="226.75848"+ y2="760.4281" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12401"+ gradientUnits="userSpaceOnUse"+ x1="187.71971"+ y1="714.46619"+ x2="352.71191"+ y2="714.46619" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12403"+ gradientUnits="userSpaceOnUse"+ x1="187.71971"+ y1="714.46619"+ x2="352.71191"+ y2="714.46619" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12405"+ gradientUnits="userSpaceOnUse"+ x1="187.71971"+ y1="714.46619"+ x2="352.71191"+ y2="714.46619" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12407"+ gradientUnits="userSpaceOnUse"+ x1="187.71971"+ y1="714.46619"+ x2="352.71191"+ y2="714.46619" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12409"+ gradientUnits="userSpaceOnUse"+ x1="187.71971"+ y1="714.46619"+ x2="352.71191"+ y2="714.46619" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient12749"+ id="linearGradient13103"+ gradientUnits="userSpaceOnUse"+ gradientTransform="matrix(0.9280993,0,0,1.0262209,52.012841,99.94962)"+ x1="196.80742"+ y1="581.64874"+ x2="908.20947"+ y2="581.64874" />+ </defs>+ <sodipodi:namedview+ id="base"+ pagecolor="#ffffff"+ bordercolor="#666666"+ borderopacity="1.0"+ inkscape:pageopacity="0.0"+ inkscape:pageshadow="2"+ inkscape:zoom="1"+ inkscape:cx="518.60504"+ inkscape:cy="348.09569"+ inkscape:document-units="px"+ inkscape:current-layer="layer1"+ showgrid="false"+ borderlayer="true"+ showguides="true"+ inkscape:guide-bbox="true">+ <sodipodi:guide+ position="-282.84272,677.81236"+ orientation="1,0"+ id="guide5606" />+ </sodipodi:namedview>+ <metadata+ id="metadata7">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ <dc:title></dc:title>+ <cc:license+ rdf:resource="http://creativecommons.org/licenses/by/3.0/" />+ </cc:Work>+ <cc:License+ rdf:about="http://creativecommons.org/licenses/by/3.0/">+ <cc:permits+ rdf:resource="http://creativecommons.org/ns#Reproduction" />+ <cc:permits+ rdf:resource="http://creativecommons.org/ns#Distribution" />+ <cc:requires+ rdf:resource="http://creativecommons.org/ns#Notice" />+ <cc:requires+ rdf:resource="http://creativecommons.org/ns#Attribution" />+ <cc:permits+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />+ </cc:License>+ </rdf:RDF>+ </metadata>+ <g+ inkscape:label="Layer 1"+ inkscape:groupmode="layer"+ id="layer1"+ transform="translate(0,-308.26772)"+ style="filter:url(#filter10659)">+ <rect+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.41121864px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ id="rect3336"+ width="853.16766"+ height="253.81555"+ x="50.713242"+ y="316.1817" />+ <text+ xml:space="preserve"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="81.822357"+ y="386.67169"+ id="text3338"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan3340"+ x="81.822357"+ y="386.67169">movie</tspan></text>+ <rect+ style="fill:none"+ id="rect3342"+ width="388.90872"+ height="60.609154"+ x="67.680222"+ y="405.86459" />+ <rect+ style="fill:none;stroke:url(#linearGradient5600);stroke-width:4.18100023;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+ id="rect4152"+ width="792.02228"+ height="70.773323"+ x="74.719971"+ y="400.7825" />+ <rect+ y="490.68549"+ x="74.719383"+ height="70.774506"+ width="790.00317"+ id="rect5602"+ style="fill:none;stroke:url(#linearGradient5604);stroke-width:4.18100023;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <text+ sodipodi:linespacing="125%"+ id="text5612"+ y="451.16916"+ x="84.576263"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ xml:space="preserve"><tspan+ y="451.16916"+ x="84.576263"+ id="tspan5614"+ sodipodi:role="line">track 1</tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="84.576263"+ y="541.07275"+ id="text5616"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan5618"+ x="84.576263"+ y="541.07275">track 2</tspan></text>+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:1.49778581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Lend)"+ d="m 234.25549,623.48964 661.03572,-1.08562"+ id="path5622"+ inkscape:connector-curvature="0" />+ <text+ xml:space="preserve"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.93999999;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="841.23474"+ y="687.60681"+ id="text5938"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan5940"+ x="841.23474"+ y="687.60681">seconds </tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.94;"+ x="841.23474"+ y="616.05341"+ id="text8224"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan8226"+ x="841.23474"+ y="616.05341">Samples</tspan></text>+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 236.0051,404.32129 0,219.2031"+ id="path7614"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7616"+ d="m 247.99459,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 259.98408,404.32129 0,219.2031"+ id="path7618"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7620"+ d="m 271.97357,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 283.96308,404.32129 0,219.2031"+ id="path7622"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 295.95257,404.32129 0,219.2031"+ id="path7624"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7626"+ d="m 307.94206,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 319.93157,404.32129 0,219.2031"+ id="path7628"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7630"+ d="m 331.92106,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 343.91056,404.32129 0,219.2031"+ id="path7632"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7634"+ d="m 355.90005,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 367.88952,404.32129 0,219.2031"+ id="path7636"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7638"+ d="m 379.87903,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path7640"+ d="m 391.86852,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 403.85804,404.32129 0,219.2031"+ id="path7642"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7644"+ d="m 415.84754,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 427.83702,404.32129 0,219.2031"+ id="path7646"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7648"+ d="m 439.82653,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 451.81602,404.32129 0,219.2031"+ id="path7650"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7652"+ d="m 463.80551,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 475.79498,404.32129 0,219.2031"+ id="path7654"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 487.78449,404.32129 0,219.2031"+ id="path7656"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7658"+ d="m 499.77398,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 511.76348,404.32129 0,219.2031"+ id="path7660"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7662"+ d="m 523.75297,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path7664"+ d="m 535.7425,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 547.73192,404.32129 0,219.2031"+ id="path7666"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path7668"+ d="m 559.72146,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 571.71095,404.32129 0,219.2031"+ id="path7670"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path8228"+ d="m 583.70046,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 595.68994,404.32129 0,219.2031"+ id="path8230"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path8232"+ d="m 607.67941,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 619.66896,404.32129 0,219.2031"+ id="path8234"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path8236"+ d="m 631.65844,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path8238"+ d="m 643.64793,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 655.63745,404.32129 0,219.2031"+ id="path8240"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path8242"+ d="m 667.62693,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 679.61648,404.32129 0,219.2031"+ id="path8244"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path8246"+ d="m 691.60596,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 703.59538,404.32129 0,219.2031"+ id="path8248"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path8250"+ d="m 715.58491,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 727.5744,404.32129 0,219.2031"+ id="path8252"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 739.56388,404.32129 0,219.2031"+ id="path8254"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path8256"+ d="m 751.55334,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 763.54287,404.32129 0,219.2031"+ id="path8258"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path8260"+ d="m 775.53235,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 787.52183,404.32129 0,219.2031"+ id="path8262"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path8264"+ d="m 799.51135,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 811.50088,404.32129 0,219.2031"+ id="path8266"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path8268"+ d="m 823.49034,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path8270"+ d="m 835.47988,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1"+ d="m 847.46937,404.32129 0,219.2031"+ id="path8272"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path8274"+ d="m 859.45887,404.32129 0,219.2031"+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:0.52431506;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.04863016, 0.52431507;stroke-dashoffset:0;stroke-opacity:1" />+ <g+ id="g8378"+ transform="translate(0,3.0517578e-5)">+ <rect+ y="406.32239"+ x="227.23705"+ height="59.693489"+ width="126.36358"+ id="rect8298"+ style="opacity:1;fill:none;fill-opacity:1;stroke:#00ff17;stroke-width:3.98548293;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:#00ff17;stroke-width:3.98548293;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ id="rect8348"+ width="126.36358"+ height="59.693489"+ x="354.01117"+ y="406.32239" />+ <rect+ y="406.32239"+ x="480.78534"+ height="59.693489"+ width="126.36358"+ id="rect8350"+ style="opacity:1;fill:none;fill-opacity:1;stroke:#00ff17;stroke-width:3.98548293;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:#00ff17;stroke-width:3.98548293;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ id="rect8352"+ width="126.36358"+ height="59.693489"+ x="607.55945"+ y="406.32239" />+ <rect+ y="406.32239"+ x="734.33362"+ height="59.693489"+ width="126.36358"+ id="rect8354"+ style="opacity:1;fill:none;fill-opacity:1;stroke:#00ff17;stroke-width:3.98548293;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />+ <text+ sodipodi:linespacing="125%"+ id="text8358"+ y="450.25116"+ x="227.28432"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ xml:space="preserve"><tspan+ y="450.25116"+ x="227.28432"+ id="tspan8360"+ sodipodi:role="line">Frame</tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="355.32117"+ y="450.25116"+ id="text8362"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan8364"+ x="355.32117"+ y="450.25116">Frame</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text8366"+ y="450.25116"+ x="483.35803"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ xml:space="preserve"><tspan+ y="450.25116"+ x="483.35803"+ id="tspan8368"+ sodipodi:role="line">Frame</tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="611.39484"+ y="450.25116"+ id="text8370"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan8372"+ x="611.39484"+ y="450.25116">Frame</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text8374"+ y="450.25116"+ x="739.4317"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ xml:space="preserve"><tspan+ y="450.25116"+ x="739.4317"+ id="tspan8376"+ sodipodi:role="line">Frame</tspan></text>+ </g>+ <g+ id="g8395"+ transform="translate(-1.0101525,89.903606)">+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:#00ff17;stroke-width:3.98548293;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ id="rect8397"+ width="126.36358"+ height="59.693489"+ x="227.23705"+ y="406.32239" />+ <rect+ y="406.32239"+ x="354.01117"+ height="59.693489"+ width="126.36358"+ id="rect8399"+ style="opacity:1;fill:none;fill-opacity:1;stroke:#00ff17;stroke-width:3.98548293;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:#00ff17;stroke-width:3.98548293;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ id="rect8401"+ width="126.36358"+ height="59.693489"+ x="480.78534"+ y="406.32239" />+ <rect+ y="406.32239"+ x="607.55945"+ height="59.693489"+ width="126.36358"+ id="rect8403"+ style="opacity:1;fill:none;fill-opacity:1;stroke:#00ff17;stroke-width:3.98548293;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:#00ff17;stroke-width:3.98548293;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ id="rect8405"+ width="126.36358"+ height="59.693489"+ x="734.33362"+ y="406.32239" />+ <text+ xml:space="preserve"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="227.28432"+ y="450.25116"+ id="text8407"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan8409"+ x="227.28432"+ y="450.25116">Frame</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text8411"+ y="450.25116"+ x="355.32117"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ xml:space="preserve"><tspan+ y="450.25116"+ x="355.32117"+ id="tspan8413"+ sodipodi:role="line">Frame</tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="483.35803"+ y="450.25116"+ id="text8415"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan8417"+ x="483.35803"+ y="450.25116">Frame</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text8419"+ y="450.25116"+ x="611.39484"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ xml:space="preserve"><tspan+ y="450.25116"+ x="611.39484"+ id="tspan8421"+ sodipodi:role="line">Frame</tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="739.4317"+ y="450.25116"+ id="text8423"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan8425"+ x="739.4317"+ y="450.25116">Frame</tspan></text>+ </g>+ <path+ style="fill:none;fill-rule:evenodd;stroke:url(#linearGradient10599);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ d="M 236.55953,624.64926 42.78355,960.20373"+ id="path10587"+ inkscape:connector-curvature="0"+ sodipodi:nodetypes="cc" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:url(#linearGradient10601);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ d="M 248.20166,625.36354 75.404298,960.20373"+ id="path10591"+ inkscape:connector-curvature="0"+ sodipodi:nodetypes="cc" />+ <text+ xml:space="preserve"+ style="font-style:normal;font-weight:normal;font-size:15.94160843px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:url(#linearGradient10637);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="-695.56689"+ y="521.3186"+ id="text10627"+ sodipodi:linespacing="125%"+ transform="matrix(0.48547195,-0.87425225,0.87425225,0.48547195,0,0)"><tspan+ sodipodi:role="line"+ id="tspan10629"+ x="-695.56689"+ y="521.3186"+ style="stroke:url(#linearGradient10637)">Sample Config</tspan></text>+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:#881800;stroke-width:5;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ id="rect10639"+ width="1023.2421"+ height="340.10092"+ x="14.32107"+ y="578.96661" />+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.5px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="74.751289"+ y="755.72766"+ id="text10643"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan10645"+ x="74.751289"+ y="755.72766">sample size box</tspan></text>+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:#881800;stroke-width:0.98892051;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ id="rect9434"+ width="950.12048"+ height="63.206535"+ x="42.137867"+ y="960.14978" />+ <g+ id="g9684"+ style="stroke:#881800;stroke-opacity:1"+ transform="matrix(1.0006077,0,0,0.39854318,-0.31432415,615.94439)">+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 49.175146,867.1945 0,151.5229"+ id="path9436"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9438"+ d="m 58.057688,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 66.940233,867.1945 0,151.5229"+ id="path9440"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9442"+ d="m 75.822772,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 84.70532,867.1945 0,151.5229"+ id="path9444"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 93.587864,867.1945 0,151.5229"+ id="path9446"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9448"+ d="m 102.4704,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 111.35295,867.1945 0,151.5229"+ id="path9450"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9452"+ d="m 120.2355,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 129.11803,867.1945 0,151.5229"+ id="path9454"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9456"+ d="m 138.00058,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 146.88313,867.1945 0,151.5229"+ id="path9458"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9460"+ d="m 155.76567,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9462"+ d="m 164.64819,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 173.53075,867.1945 0,151.5229"+ id="path9464"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9466"+ d="m 182.41329,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 191.29582,867.1945 0,151.5229"+ id="path9468"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9470"+ d="m 200.17837,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 209.06092,867.1945 0,151.5229"+ id="path9472"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9474"+ d="m 217.94346,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 226.826,867.1945 0,151.5229"+ id="path9476"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 235.70855,867.1945 0,151.5229"+ id="path9478"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9480"+ d="m 244.59109,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 253.47362,867.1945 0,151.5229"+ id="path9482"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9484"+ d="m 262.35618,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9486"+ d="m 271.23871,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 280.12125,867.1945 0,151.5229"+ id="path9488"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9490"+ d="m 289.00379,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 297.88636,867.1945 0,151.5229"+ id="path9492"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9498"+ d="m 306.7689,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 315.65143,867.1945 0,151.5229"+ id="path9500"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9502"+ d="m 324.53398,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 333.4165,867.1945 0,151.5229"+ id="path9504"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9506"+ d="m 342.29905,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9508"+ d="m 351.18159,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 360.06412,867.1945 0,151.5229"+ id="path9510"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9512"+ d="m 368.9467,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 377.82922,867.1945 0,151.5229"+ id="path9514"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9516"+ d="m 386.71177,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 395.59429,867.1945 0,151.5229"+ id="path9518"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9520"+ d="m 404.47685,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 413.35939,867.1945 0,151.5229"+ id="path9522"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 422.24194,867.1945 0,151.5229"+ id="path9524"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9526"+ d="m 431.12448,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 440.00702,867.1945 0,151.5229"+ id="path9528"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9530"+ d="m 448.88955,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 457.7721,867.1945 0,151.5229"+ id="path9532"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9534"+ d="m 466.65463,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 475.53719,867.1945 0,151.5229"+ id="path9536"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9538"+ d="m 484.41974,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9540"+ d="m 493.30227,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 502.18481,867.1945 0,151.5229"+ id="path9542"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9544"+ d="m 511.06735,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9578"+ d="m 519.94988,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 528.83248,867.1945 0,151.5229"+ id="path9580"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9582"+ d="m 537.71502,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 546.59755,867.1945 0,151.5229"+ id="path9584"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9586"+ d="m 555.48009,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9588"+ d="m 564.36269,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 573.24517,867.1945 0,151.5229"+ id="path9590"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9592"+ d="m 582.12778,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 591.01025,867.1945 0,151.5229"+ id="path9594"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9596"+ d="m 599.8928,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 608.77533,867.1945 0,151.5229"+ id="path9598"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9600"+ d="m 617.65791,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 626.54045,867.1945 0,151.5229"+ id="path9602"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 635.42298,867.1945 0,151.5229"+ id="path9604"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9606"+ d="m 644.30555,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 653.18803,867.1945 0,151.5229"+ id="path9608"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9610"+ d="m 662.07061,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 670.95311,867.1945 0,151.5229"+ id="path9612"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9614"+ d="m 679.8357,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 688.71829,867.1945 0,151.5229"+ id="path9616"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9618"+ d="m 697.60075,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9620"+ d="m 706.48336,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 715.36584,867.1945 0,151.5229"+ id="path9622"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9624"+ d="m 724.24843,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 733.13097,867.1945 0,151.5229"+ id="path9626"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 742.01348,867.1945 0,151.5229"+ id="path9628"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9630"+ d="m 750.89608,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 759.77859,867.1945 0,151.5229"+ id="path9632"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9634"+ d="m 768.66112,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 777.54367,867.1945 0,151.5229"+ id="path9636"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9638"+ d="m 786.4262,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 795.30878,867.1945 0,151.5229"+ id="path9640"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9642"+ d="m 804.1913,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 813.07388,867.1945 0,151.5229"+ id="path9644"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 821.95636,867.1945 0,151.5229"+ id="path9646"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9648"+ d="m 830.83891,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 839.72143,867.1945 0,151.5229"+ id="path9650"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9652"+ d="m 848.60402,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 857.4866,867.1945 0,151.5229"+ id="path9654"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9656"+ d="m 866.36909,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 875.25164,867.1945 0,151.5229"+ id="path9658"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9660"+ d="m 884.13413,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9662"+ d="m 893.01671,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 901.89928,867.1945 0,151.5229"+ id="path9664"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9666"+ d="m 910.78178,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 919.66438,867.1945 0,151.5229"+ id="path9668"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9670"+ d="m 928.5469,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 937.42946,867.1945 0,151.5229"+ id="path9672"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9674"+ d="m 946.31196,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 955.19454,867.1945 0,151.5229"+ id="path9676"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 964.0771,867.1945 0,151.5229"+ id="path9678"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9680"+ d="m 972.95957,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 981.84218,867.1945 0,151.5229"+ id="path9682"+ inkscape:connector-curvature="0" />+ </g>+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="48.066017"+ y="1046.7532"+ id="text10249"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan10251"+ x="48.066017"+ y="1046.7532">Media-Data</tspan></text>+ <g+ id="g10973"+ transform="matrix(0.68954077,0,0,1.0074925,14.217977,-7.4348225)">+ <g+ id="g10691">+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10675);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10663"+ width="208.09143"+ height="54.548237"+ x="46.467014"+ y="965.0246" />+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10683);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10677"+ width="129.29953"+ height="55.558392"+ x="256.63965"+ y="964.51953" />+ </g>+ <g+ transform="translate(343.01015,0)"+ id="g10695">+ <rect+ y="965.0246"+ x="46.467014"+ height="54.548237"+ width="208.09143"+ id="rect10697"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10701);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ <rect+ y="964.51953"+ x="256.63965"+ height="55.558392"+ width="129.29953"+ id="rect10699"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10703);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ </g>+ <g+ transform="translate(686,0)"+ id="g10705">+ <rect+ y="965.0246"+ x="46.467014"+ height="54.548237"+ width="208.09143"+ id="rect10707"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10717);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ <rect+ y="964.51953"+ x="256.63965"+ height="55.558392"+ width="129.29953"+ id="rect10709"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10719);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ </g>+ <g+ id="g10711"+ transform="translate(1029.0101,0)">+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10721);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10713"+ width="208.09143"+ height="54.548237"+ x="46.467014"+ y="965.0246" />+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10723);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10715"+ width="129.29953"+ height="55.558392"+ x="256.63965"+ y="964.51953" />+ </g>+ </g>+ <path+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient10997);stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ d="M 227.16371,473.37894 44.326097,973.40445"+ id="path10989"+ inkscape:connector-curvature="0" />+ <path+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient12389);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ d="M 350.52293,465.46357 C 222.86936,571.83233 215.18758,787.75295 189.90868,963.46878"+ id="path10991"+ inkscape:connector-curvature="0"+ sodipodi:nodetypes="cc" />+ <path+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient11067);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ d="m 225.26402,555.36715 c 20.15818,137.60669 25.58762,288.18693 -35.35534,410.12193"+ id="path11057"+ inkscape:connector-curvature="0"+ sodipodi:nodetypes="cc" />+ <path+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient11065);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ d="m 349.51278,554.357 c -89.66529,95.12579 -69.8214,258.09851 -70.71068,412.14224"+ id="path11059"+ inkscape:connector-curvature="0"+ sodipodi:nodetypes="cc" />+ <path+ inkscape:connector-curvature="0"+ id="path11237"+ d="m 352.54324,558.39761 c 70.84307,126.40419 56.41235,269.05101 76.77159,405.07117"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient12391);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ sodipodi:nodetypes="cc" />+ <path+ sodipodi:nodetypes="cc"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient12393);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ d="m 478.81231,558.39761 c -20.40661,132.496 21.89426,269.17249 37.37564,404.06102"+ id="path11241"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path11243"+ d="m 480.83262,560.41792 c 100.09217,116.89753 90.48266,252.74241 178.79699,402.04071"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient12395);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ sodipodi:nodetypes="cc" />+ <path+ sodipodi:nodetypes="cc"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient12397);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ d="m 604.07123,560.41792 c 69.7221,149.2514 45.35422,277.70823 150.51272,402.04071"+ id="path11245"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path11247"+ d="M 604.07123,560.41792 C 773.88312,685.27297 824.5402,825.80628 897.01546,963.46878"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient12399);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ sodipodi:nodetypes="cc" />+ <path+ sodipodi:nodetypes="cc"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient11239);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ d="m 733.37076,559.40777 c 139.50731,143.03779 154.80905,287.61171 254.55843,400.0204"+ id="path11249"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path11251"+ d="m 350.52293,465.46357 c 60.20791,169.02184 -12.38604,332.14138 -68.69037,495.9849"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient12401);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ sodipodi:nodetypes="cc" />+ <path+ sodipodi:nodetypes="cc"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient12403);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ d="M 479.82246,470.51433 C 402.3894,619.54024 415.34447,790.47843 424.26407,960.43832"+ id="path11253"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path11255"+ d="m 479.82246,470.51433 c 87.39169,173.71093 58.84007,333.28243 39.39595,493.9646"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient12405);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ sodipodi:nodetypes="cc" />+ <path+ sodipodi:nodetypes="cc"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient12407);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ d="m 604.07122,464.45341 c -28.20629,167.73232 12.56584,332.90988 55.55839,498.00521"+ id="path11257"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path11259"+ d="M 604.07122,464.45341 C 710.73025,632.74802 739.3706,796.45329 755.5941,959.42816"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient12409);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ sodipodi:nodetypes="cc" />+ <path+ sodipodi:nodetypes="cc"+ style="opacity:0.6;fill:none;fill-rule:evenodd;stroke:url(#linearGradient10999);stroke-width:0.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ d="M 731.35044,463.44326 893.985,959.42816"+ id="path11261"+ inkscape:connector-curvature="0" />+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient11569);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="57.873169"+ y="1004.9053"+ id="text11263"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan11265"+ x="57.873169"+ y="1004.9053"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient11569);fill-opacity:1">Chunk</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text11571"+ y="1004.9053"+ x="193.87317"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:url(#linearGradient11785);fill-opacity:1.0;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ xml:space="preserve"><tspan+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr;text-anchor:start;fill:url(#linearGradient11785);fill-opacity:1.0"+ y="1004.9053"+ x="193.87317"+ id="tspan11573"+ sodipodi:role="line">Chunk</tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient11973);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="431.87317"+ y="1004.9053"+ id="text11787"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan11789"+ x="431.87317"+ y="1004.9053"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient11973);fill-opacity:1">Chunk</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text11975"+ y="1004.9053"+ x="671.87317"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient12121);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ xml:space="preserve"><tspan+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient12121);fill-opacity:1"+ y="1004.9053"+ x="671.87317"+ id="tspan11977"+ sodipodi:role="line">Chunk</tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient12173);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="911.87317"+ y="1004.9053"+ id="text12123"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan12125"+ x="911.87317"+ y="1004.9053"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient12173);fill-opacity:1">Chunk</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text12175"+ y="1004.9053"+ x="297.87317"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient12249);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ xml:space="preserve"><tspan+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient12249);fill-opacity:1"+ y="1004.9053"+ x="297.87317"+ id="tspan12177"+ sodipodi:role="line">Chunk</tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient12297);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="537.87317"+ y="1004.9053"+ id="text12251"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan12253"+ x="537.87317"+ y="1004.9053"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient12297);fill-opacity:1">Chunk</tspan></text>+ <text+ sodipodi:linespacing="125%"+ id="text12299"+ y="1004.9053"+ x="777.87317"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient12337);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ xml:space="preserve"><tspan+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient12337);fill-opacity:1"+ y="1004.9053"+ x="777.87317"+ id="tspan12301"+ sodipodi:role="line">Chunk</tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-weight:normal;font-size:71.43800354px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.38805971;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"+ x="16.897184"+ y="1974.3336"+ id="text12491"+ sodipodi:linespacing="125%"+ transform="scale(2.1986526,0.45482402)"><tspan+ sodipodi:role="line"+ id="tspan12493"+ x="16.897184"+ y="1974.3336"><tspan+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:49.1136322px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:0.38805971;"+ id="tspan12495">data reference box</tspan></tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="310.96112"+ y="758.36255"+ id="text14460"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan14462"+ x="310.96112"+ y="758.36255">sample-to-chunk</tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="306.43805"+ y="796.02411"+ id="text14464"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan14466"+ x="306.43805"+ y="796.02411">chunk offset box</tspan></text>+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.60000002;marker-end:url(#marker15518);stroke-miterlimit:4;stroke-dasharray:24, 2;stroke-dashoffset:0"+ d="m 261.20736,623.80122 47.49225,109.68446"+ id="path14468"+ inkscape:connector-curvature="0"+ sodipodi:nodetypes="cc" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:24, 2;stroke-dashoffset:0;stroke-opacity:0.6;marker-end:url(#marker15594)"+ d="m 332.09691,803.37923 20.69764,161.91252"+ id="path14472"+ inkscape:connector-curvature="0"+ sodipodi:nodetypes="cc" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#ff00ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:24, 2;stroke-dashoffset:0;stroke-opacity:0.6;marker-end:url(#marker15508)"+ d="m 259.78423,626.15485 c 16.03073,65.46936 -144.96219,240.48875 69.3923,208.83074"+ id="path14716"+ inkscape:connector-curvature="0"+ sodipodi:nodetypes="cc" />+ <rect+ style="opacity:0.6;fill:#000000;fill-opacity:0;stroke:#ff00ff;stroke-width:1.9069823;stroke-miterlimit:3.5;stroke-dasharray:22.88378754, 1.9069823;stroke-dashoffset:1.8443985;stroke-opacity:1"+ id="rect15328"+ width="243.07732"+ height="28.200623"+ x="301.3685"+ y="736.33148" />+ <rect+ y="774.33148"+ x="301.3685"+ height="28.200623"+ width="243.07732"+ id="rect15632"+ style="opacity:0.6;fill:#000000;fill-opacity:0;stroke:#ff00ff;stroke-width:1.9069823;stroke-miterlimit:3.5;stroke-dasharray:22.88378754, 1.9069823;stroke-dashoffset:1.8443985;stroke-opacity:1" />+ <rect+ y="736.96698"+ x="68.003967"+ height="127.9297"+ width="148.80638"+ id="rect16102"+ style="opacity:0.6;fill:#000000;fill-opacity:0;stroke:#ff00ff;stroke-width:3.17790985;stroke-miterlimit:3.5;stroke-dasharray:38.13491771, 3.17790982;stroke-dashoffset:1.8443985;stroke-opacity:1" />+ <rect+ style="opacity:0.6;fill:#000000;fill-opacity:0;stroke:#ff00ff;stroke-width:3.87848878;stroke-miterlimit:3.5;stroke-dasharray:46.54186579, 3.87848883;stroke-dashoffset:1.8443985;stroke-opacity:1"+ id="rect16104"+ width="970.10577"+ height="29.229124"+ x="32.354256"+ y="875.31726" />+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="688.91504"+ y="648.37811"+ id="text14456"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan14458"+ x="688.91504"+ y="648.37811">time scale = per</tspan></text>+ <g+ id="g16182">+ <path+ style="fill:none;fill-rule:evenodd;stroke:url(#linearGradient13103);stroke-width:3.02537584;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.5;stroke-dasharray:72.60902197, 3.02537592;stroke-dashoffset:1.8599999;stroke-opacity:1;marker-end:url(#Arrow2Mend)"+ d="m 234.67074,697.90698 657.65431,-1.09455"+ id="path12995"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path16110"+ d="m 306,624.3622 0,74"+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ d="m 380,624.3622 0,74"+ id="path16112"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path16114"+ d="m 456,624.3622 0,74"+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ d="m 532,624.3622 0,74"+ id="path16116"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path16118"+ d="m 608,624.3622 0,74"+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ d="m 684,624.3622 0,74"+ id="path16120"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path16122"+ d="m 758,624.3622 0,74"+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ d="m 834,624.3622 0,74"+ id="path16124"+ inkscape:connector-curvature="0" />+ </g>+ </g>+</svg>
+ doc/data_reference_box.svg view
@@ -0,0 +1,2427 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="297mm"+ height="210mm"+ viewBox="0 0 1052.3622 744.09448"+ id="svg3709"+ version="1.1"+ inkscape:version="0.91 r13725"+ sodipodi:docname="data_reference_box.svg">+ <defs+ id="defs3711">+ <linearGradient+ id="linearGradient9945"+ osb:paint="solid">+ <stop+ style="stop-color:#000000;stop-opacity:1;"+ offset="0"+ id="stop9947" />+ </linearGradient>+ <linearGradient+ id="linearGradient4154"+ osb:paint="solid">+ <stop+ style="stop-color:#ff5f8d;stop-opacity:1;"+ offset="0"+ id="stop4156" />+ </linearGradient>+ <linearGradient+ id="linearGradient5596"+ osb:paint="solid">+ <stop+ style="stop-color:#1486c3;stop-opacity:1;"+ offset="0"+ id="stop5598" />+ </linearGradient>+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12337"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(492,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient3884"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(492,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12297"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(252,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient3895"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(252,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient12249"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(12,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient3906"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(12,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient12173"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(626,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient3915"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(626,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient12121"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(386,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient3926"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(386,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient11973"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(146,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient3937"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(146,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient11785"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-92,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient3948"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-92,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient11569"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-228,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient3959"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-228,-2)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(-228,-2)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient4144"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(-92,-2)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient4148"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(146,-2)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient4152"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(386,-2)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient4157"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(626,-2)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient4161"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(12,-2)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient4165"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(252,-2)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient4169"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(492,-2)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient4173"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient5549"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(488.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient5865"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(488.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient5545"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(248.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient5876"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(248.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient5541"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(8.9695366,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient5887"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(8.9695366,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient5537"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(622.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient5896"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(622.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient5533"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(382.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient5907"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(382.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient5529"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(142.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient5918"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(142.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient5525"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-95.030466,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient5929"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-95.030466,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient5521"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-231.03047,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient5940"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-231.03047,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient10675"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient10683"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient10701"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient10703"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient10717"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient10719"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient10721"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient10723"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(-231.03047,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient6125"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(-95.030466,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient6129"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(142.96953,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient6133"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(382.96953,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient6137"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(622.96953,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient6141"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(8.9695366,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient6145"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(248.96953,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient6149"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(488.96953,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient6153"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient7762"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(488.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient7764"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(248.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient7766"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(248.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient7768"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(8.9695366,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient7770"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(8.9695366,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient7772"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(622.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient7774"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(382.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient7776"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(382.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient7778"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(142.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient7780"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(142.96953,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient7782"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-95.030466,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient7784"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-95.030466,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient7786"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-231.03047,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient7788"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-231.03047,-28.725546)"+ x1="288.31458"+ y1="991.90527"+ x2="424.25208"+ y2="991.90527" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient7790"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient7792"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient7794"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient7796"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient7798"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient7800"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient7802"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient7804"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(-231.03047,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient7806"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(-95.030466,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient7809"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(142.96953,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient7812"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(382.96953,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient7815"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(622.96953,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient7818"+ xlink:href="#linearGradient4154"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(8.9695366,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient7821"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(248.96953,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient7824"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ y2="991.90527"+ x2="424.25208"+ y1="991.90527"+ x1="288.31458"+ gradientTransform="translate(488.96953,-28.725546)"+ gradientUnits="userSpaceOnUse"+ id="linearGradient7827"+ xlink:href="#linearGradient5596"+ inkscape:collect="always" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient8866"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient8868"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient8870"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient8872"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient8874"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient8876"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient9002"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient9004"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient9006"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient9008"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient9010"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient9012"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient9014"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(1.0101525,-1.4745979)"+ x1="44.206863"+ y1="993.77332"+ x2="254.79829"+ y2="993.77332" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient4154"+ id="linearGradient9016"+ gradientUnits="userSpaceOnUse"+ gradientTransform="translate(-6,-6.0203247)"+ x1="261.38965"+ y1="998.31903"+ x2="393.18918"+ y2="998.31903" />+ <linearGradient+ inkscape:collect="always"+ xlink:href="#linearGradient5596"+ id="linearGradient9949"+ x1="105.05586"+ y1="612.4408"+ x2="316.17776"+ y2="612.4408"+ gradientUnits="userSpaceOnUse"+ gradientTransform="matrix(0.97435303,0,0,1.9091142,129.10476,-565.86994)" />+ </defs>+ <sodipodi:namedview+ id="base"+ pagecolor="#ffffff"+ bordercolor="#666666"+ borderopacity="1.0"+ inkscape:pageopacity="0.0"+ inkscape:pageshadow="2"+ inkscape:zoom="0.98994949"+ inkscape:cx="633.34229"+ inkscape:cy="401.96717"+ inkscape:document-units="px"+ inkscape:current-layer="layer1"+ showgrid="false"+ inkscape:snap-text-baseline="true"+ inkscape:window-width="1680"+ inkscape:window-height="1034"+ inkscape:window-x="1050"+ inkscape:window-y="331"+ inkscape:window-maximized="0" />+ <metadata+ id="metadata3714">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ <dc:title></dc:title>+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <g+ inkscape:label="Layer 1"+ inkscape:groupmode="layer"+ id="layer1"+ transform="translate(0,-308.26772)">+ <g+ id="g8303"+ transform="translate(8,94)">+ <rect+ y="883.58496"+ x="468.16666"+ height="63.433216"+ width="562.44861"+ id="rect9434"+ style="opacity:1;fill:none;fill-opacity:1;stroke:#881800;stroke-width:0.76223844;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter10659)" />+ <g+ transform="matrix(0.59233581,0,0,0.3999725,443.03598,538.14512)"+ style="stroke:#881800;stroke-opacity:1;filter:url(#filter10659)"+ id="g9684">+ <path+ inkscape:connector-curvature="0"+ id="path9436"+ d="m 49.175146,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 58.057688,867.1945 0,151.5229"+ id="path9438"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9440"+ d="m 66.940233,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 75.822772,867.1945 0,151.5229"+ id="path9442"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9444"+ d="m 84.70532,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9446"+ d="m 93.587864,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 102.4704,867.1945 0,151.5229"+ id="path9448"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9450"+ d="m 111.35295,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 120.2355,867.1945 0,151.5229"+ id="path9452"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9454"+ d="m 129.11803,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 138.00058,867.1945 0,151.5229"+ id="path9456"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9458"+ d="m 146.88313,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 155.76567,867.1945 0,151.5229"+ id="path9460"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 164.64819,867.1945 0,151.5229"+ id="path9462"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9464"+ d="m 173.53075,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 182.41329,867.1945 0,151.5229"+ id="path9466"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9468"+ d="m 191.29582,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 200.17837,867.1945 0,151.5229"+ id="path9470"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9472"+ d="m 209.06092,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 217.94346,867.1945 0,151.5229"+ id="path9474"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9476"+ d="m 226.826,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9478"+ d="m 235.70855,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 244.59109,867.1945 0,151.5229"+ id="path9480"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9482"+ d="m 253.47362,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 262.35618,867.1945 0,151.5229"+ id="path9484"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 271.23871,867.1945 0,151.5229"+ id="path9486"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9488"+ d="m 280.12125,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 289.00379,867.1945 0,151.5229"+ id="path9490"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9492"+ d="m 297.88636,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 306.7689,867.1945 0,151.5229"+ id="path9498"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9500"+ d="m 315.65143,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 324.53398,867.1945 0,151.5229"+ id="path9502"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9504"+ d="m 333.4165,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 342.29905,867.1945 0,151.5229"+ id="path9506"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 351.18159,867.1945 0,151.5229"+ id="path9508"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9510"+ d="m 360.06412,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 368.9467,867.1945 0,151.5229"+ id="path9512"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9514"+ d="m 377.82922,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 386.71177,867.1945 0,151.5229"+ id="path9516"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9518"+ d="m 395.59429,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 404.47685,867.1945 0,151.5229"+ id="path9520"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9522"+ d="m 413.35939,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9524"+ d="m 422.24194,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 431.12448,867.1945 0,151.5229"+ id="path9526"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9528"+ d="m 440.00702,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 448.88955,867.1945 0,151.5229"+ id="path9530"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9532"+ d="m 457.7721,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 466.65463,867.1945 0,151.5229"+ id="path9534"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9536"+ d="m 475.53719,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 484.41974,867.1945 0,151.5229"+ id="path9538"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 493.30227,867.1945 0,151.5229"+ id="path9540"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9542"+ d="m 502.18481,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 511.06735,867.1945 0,151.5229"+ id="path9544"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 519.94988,867.1945 0,151.5229"+ id="path9578"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9580"+ d="m 528.83248,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 537.71502,867.1945 0,151.5229"+ id="path9582"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9584"+ d="m 546.59755,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 555.48009,867.1945 0,151.5229"+ id="path9586"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 564.36269,867.1945 0,151.5229"+ id="path9588"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9590"+ d="m 573.24517,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 582.12778,867.1945 0,151.5229"+ id="path9592"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9594"+ d="m 591.01025,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 599.8928,867.1945 0,151.5229"+ id="path9596"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9598"+ d="m 608.77533,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 617.65791,867.1945 0,151.5229"+ id="path9600"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9602"+ d="m 626.54045,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9604"+ d="m 635.42298,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 644.30555,867.1945 0,151.5229"+ id="path9606"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9608"+ d="m 653.18803,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 662.07061,867.1945 0,151.5229"+ id="path9610"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9612"+ d="m 670.95311,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 679.8357,867.1945 0,151.5229"+ id="path9614"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9616"+ d="m 688.71829,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 697.60075,867.1945 0,151.5229"+ id="path9618"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 706.48336,867.1945 0,151.5229"+ id="path9620"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9622"+ d="m 715.36584,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 724.24843,867.1945 0,151.5229"+ id="path9624"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9626"+ d="m 733.13097,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9628"+ d="m 742.01348,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 750.89608,867.1945 0,151.5229"+ id="path9630"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9632"+ d="m 759.77859,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 768.66112,867.1945 0,151.5229"+ id="path9634"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9636"+ d="m 777.54367,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 786.4262,867.1945 0,151.5229"+ id="path9638"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9640"+ d="m 795.30878,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 804.1913,867.1945 0,151.5229"+ id="path9642"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9644"+ d="m 813.07388,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9646"+ d="m 821.95636,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 830.83891,867.1945 0,151.5229"+ id="path9648"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9650"+ d="m 839.72143,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 848.60402,867.1945 0,151.5229"+ id="path9652"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9654"+ d="m 857.4866,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 866.36909,867.1945 0,151.5229"+ id="path9656"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9658"+ d="m 875.25164,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 884.13413,867.1945 0,151.5229"+ id="path9660"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 893.01671,867.1945 0,151.5229"+ id="path9662"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9664"+ d="m 901.89928,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 910.78178,867.1945 0,151.5229"+ id="path9666"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9668"+ d="m 919.66438,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 928.5469,867.1945 0,151.5229"+ id="path9670"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9672"+ d="m 937.42946,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 946.31196,867.1945 0,151.5229"+ id="path9674"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9676"+ d="m 955.19454,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9678"+ d="m 964.0771,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 972.95957,867.1945 0,151.5229"+ id="path9680"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9682"+ d="m 981.84218,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ </g>+ <text+ sodipodi:linespacing="125%"+ id="text10249"+ y="928.30164"+ x="482.20816"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter10659)"+ xml:space="preserve"><tspan+ y="928.30164"+ x="482.20816"+ id="tspan10251"+ sodipodi:role="line">Media-Data http://foo.bar/stream_1.mp4</tspan></text>+ <g+ transform="matrix(0.40819163,0,0,1.0111057,451.63875,-87.46976)"+ id="g10973"+ style="filter:url(#filter10659)">+ <g+ id="g10691">+ <rect+ y="965.0246"+ x="46.467014"+ height="54.548237"+ width="208.09143"+ id="rect10663"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10675);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ <rect+ y="964.51953"+ x="256.63965"+ height="55.558392"+ width="129.29953"+ id="rect10677"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10683);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ </g>+ <g+ id="g10695"+ transform="translate(343.01015,0)">+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10701);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10697"+ width="208.09143"+ height="54.548237"+ x="46.467014"+ y="965.0246" />+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10703);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10699"+ width="129.29953"+ height="55.558392"+ x="256.63965"+ y="964.51953" />+ </g>+ <g+ id="g10705"+ transform="translate(686,0)">+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10717);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10707"+ width="208.09143"+ height="54.548237"+ x="46.467014"+ y="965.0246" />+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10719);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10709"+ width="129.29953"+ height="55.558392"+ x="256.63965"+ y="964.51953" />+ </g>+ <g+ transform="translate(1029.0101,0)"+ id="g10711">+ <rect+ y="965.0246"+ x="46.467014"+ height="54.548237"+ width="208.09143"+ id="rect10713"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10721);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ <rect+ y="964.51953"+ x="256.63965"+ height="55.558392"+ width="129.29953"+ id="rect10715"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient10723);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ </g>+ </g>+ </g>+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+ x="32.934036"+ y="417.79865"+ id="text8472"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan8474"+ x="32.934036"+ y="417.79865">Movie > Track > Media > MediaInfo</tspan><tspan+ sodipodi:role="line"+ x="32.934036"+ y="452.17365"+ id="tspan8476" /><tspan+ sodipodi:role="line"+ x="32.934036"+ y="486.54865"+ id="tspan9969"> > Data Info > Data Reference </tspan><tspan+ sodipodi:role="line"+ x="32.934036"+ y="520.92365"+ id="tspan9951"> [flags </tspan><tspan+ sodipodi:role="line"+ x="32.934036"+ y="555.29865"+ id="tspan9953"> > DataEntry #0 > DataEntryUrl/Urn (External file)</tspan><tspan+ sodipodi:role="line"+ x="32.934036"+ y="589.67365"+ id="tspan9955"> > DataEntry #1 [flag == 0]: </tspan><tspan+ sodipodi:role="line"+ x="32.934036"+ y="624.04865"+ id="tspan9977"> Location = http://foo.bar/stream_0.mp4</tspan><tspan+ sodipodi:role="line"+ x="32.934036"+ y="658.42365"+ id="tspan9959"> > ...</tspan><tspan+ sodipodi:role="line"+ x="32.934036"+ y="692.79865"+ id="tspan9961"> > DataEntry #N > DataEntryUrl (Media embeded in file) </tspan><tspan+ sodipodi:role="line"+ x="32.934036"+ y="727.17365"+ id="tspan9973"> [flag == 1]: The box must be completely </tspan><tspan+ sodipodi:role="line"+ x="32.934036"+ y="761.54865"+ id="tspan9979"> empty, i.e 0 bytes follow the header</tspan><tspan+ sodipodi:role="line"+ x="32.934036"+ y="795.92365"+ id="tspan9963" /><tspan+ sodipodi:role="line"+ x="32.934036"+ y="830.29865"+ id="tspan9965" /><tspan+ sodipodi:role="line"+ x="32.934036"+ y="864.67365"+ id="tspan9967"> > SampleTable</tspan></text>+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:#881800;stroke-width:0.76223844;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter10659)"+ id="rect9434-7"+ width="562.44861"+ height="63.433216"+ x="482.65918"+ y="904.23938" />+ <g+ id="g9684-6"+ style="stroke:#881800;stroke-opacity:1;filter:url(#filter10659)"+ transform="matrix(0.59233581,0,0,0.3999725,457.5285,558.79955)">+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 49.175146,867.1945 0,151.5229"+ id="path9436-8"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9438-9"+ d="m 58.057688,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 66.940233,867.1945 0,151.5229"+ id="path9440-0"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9442-6"+ d="m 75.822772,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 84.70532,867.1945 0,151.5229"+ id="path9444-8"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 93.587864,867.1945 0,151.5229"+ id="path9446-7"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9448-9"+ d="m 102.4704,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 111.35295,867.1945 0,151.5229"+ id="path9450-0"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9452-3"+ d="m 120.2355,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 129.11803,867.1945 0,151.5229"+ id="path9454-3"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9456-3"+ d="m 138.00058,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 146.88313,867.1945 0,151.5229"+ id="path9458-7"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9460-3"+ d="m 155.76567,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9462-2"+ d="m 164.64819,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 173.53075,867.1945 0,151.5229"+ id="path9464-6"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9466-5"+ d="m 182.41329,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 191.29582,867.1945 0,151.5229"+ id="path9468-2"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9470-6"+ d="m 200.17837,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 209.06092,867.1945 0,151.5229"+ id="path9472-5"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9474-8"+ d="m 217.94346,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 226.826,867.1945 0,151.5229"+ id="path9476-7"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 235.70855,867.1945 0,151.5229"+ id="path9478-9"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9480-6"+ d="m 244.59109,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 253.47362,867.1945 0,151.5229"+ id="path9482-0"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9484-4"+ d="m 262.35618,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9486-1"+ d="m 271.23871,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 280.12125,867.1945 0,151.5229"+ id="path9488-0"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9490-4"+ d="m 289.00379,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 297.88636,867.1945 0,151.5229"+ id="path9492-8"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9498-7"+ d="m 306.7689,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 315.65143,867.1945 0,151.5229"+ id="path9500-0"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9502-8"+ d="m 324.53398,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 333.4165,867.1945 0,151.5229"+ id="path9504-6"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9506-2"+ d="m 342.29905,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9508-4"+ d="m 351.18159,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 360.06412,867.1945 0,151.5229"+ id="path9510-7"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9512-9"+ d="m 368.9467,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 377.82922,867.1945 0,151.5229"+ id="path9514-3"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9516-9"+ d="m 386.71177,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 395.59429,867.1945 0,151.5229"+ id="path9518-2"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9520-8"+ d="m 404.47685,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 413.35939,867.1945 0,151.5229"+ id="path9522-3"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 422.24194,867.1945 0,151.5229"+ id="path9524-0"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9526-1"+ d="m 431.12448,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 440.00702,867.1945 0,151.5229"+ id="path9528-7"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9530-8"+ d="m 448.88955,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 457.7721,867.1945 0,151.5229"+ id="path9532-9"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9534-1"+ d="m 466.65463,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 475.53719,867.1945 0,151.5229"+ id="path9536-5"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9538-4"+ d="m 484.41974,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9540-9"+ d="m 493.30227,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 502.18481,867.1945 0,151.5229"+ id="path9542-2"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9544-5"+ d="m 511.06735,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9578-7"+ d="m 519.94988,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 528.83248,867.1945 0,151.5229"+ id="path9580-4"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9582-9"+ d="m 537.71502,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 546.59755,867.1945 0,151.5229"+ id="path9584-9"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9586-4"+ d="m 555.48009,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9588-5"+ d="m 564.36269,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 573.24517,867.1945 0,151.5229"+ id="path9590-9"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9592-3"+ d="m 582.12778,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 591.01025,867.1945 0,151.5229"+ id="path9594-5"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9596-7"+ d="m 599.8928,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 608.77533,867.1945 0,151.5229"+ id="path9598-0"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9600-8"+ d="m 617.65791,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 626.54045,867.1945 0,151.5229"+ id="path9602-1"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 635.42298,867.1945 0,151.5229"+ id="path9604-9"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9606-9"+ d="m 644.30555,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 653.18803,867.1945 0,151.5229"+ id="path9608-7"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9610-8"+ d="m 662.07061,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 670.95311,867.1945 0,151.5229"+ id="path9612-2"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9614-5"+ d="m 679.8357,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 688.71829,867.1945 0,151.5229"+ id="path9616-3"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9618-4"+ d="m 697.60075,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9620-9"+ d="m 706.48336,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 715.36584,867.1945 0,151.5229"+ id="path9622-0"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9624-2"+ d="m 724.24843,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 733.13097,867.1945 0,151.5229"+ id="path9626-0"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 742.01348,867.1945 0,151.5229"+ id="path9628-1"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9630-9"+ d="m 750.89608,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 759.77859,867.1945 0,151.5229"+ id="path9632-6"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9634-2"+ d="m 768.66112,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 777.54367,867.1945 0,151.5229"+ id="path9636-1"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9638-2"+ d="m 786.4262,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 795.30878,867.1945 0,151.5229"+ id="path9640-0"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9642-7"+ d="m 804.1913,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 813.07388,867.1945 0,151.5229"+ id="path9644-3"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 821.95636,867.1945 0,151.5229"+ id="path9646-1"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9648-1"+ d="m 830.83891,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 839.72143,867.1945 0,151.5229"+ id="path9650-9"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9652-0"+ d="m 848.60402,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 857.4866,867.1945 0,151.5229"+ id="path9654-5"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9656-6"+ d="m 866.36909,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 875.25164,867.1945 0,151.5229"+ id="path9658-7"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9660-7"+ d="m 884.13413,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ id="path9662-4"+ d="m 893.01671,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 901.89928,867.1945 0,151.5229"+ id="path9664-0"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9666-6"+ d="m 910.78178,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 919.66438,867.1945 0,151.5229"+ id="path9668-4"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9670-7"+ d="m 928.5469,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 937.42946,867.1945 0,151.5229"+ id="path9672-4"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9674-8"+ d="m 946.31196,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 955.19454,867.1945 0,151.5229"+ id="path9676-5"+ inkscape:connector-curvature="0" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 964.0771,867.1945 0,151.5229"+ id="path9678-8"+ inkscape:connector-curvature="0" />+ <path+ inkscape:connector-curvature="0"+ id="path9680-2"+ d="m 972.95957,867.1945 0,151.5229"+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#881800;stroke-width:0.37528634;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.75057268, 0.37528634;stroke-dashoffset:0;stroke-opacity:1"+ d="m 981.84218,867.1945 0,151.5229"+ id="path9682-6"+ inkscape:connector-curvature="0" />+ </g>+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter10659)"+ x="496.70068"+ y="948.95605"+ id="text10249-0"+ sodipodi:linespacing="125%"><tspan+ sodipodi:role="line"+ id="tspan10251-6"+ x="496.70068"+ y="948.95605">Media-Data http://foo.bar/stream_0.mp4</tspan></text>+ <g+ style="filter:url(#filter10659)"+ id="g10973-6"+ transform="matrix(0.40819163,0,0,1.0111057,466.13127,-66.81533)">+ <g+ id="g10691-4">+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient9002);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10663-6"+ width="208.09143"+ height="54.548237"+ x="46.467014"+ y="965.0246" />+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient9004);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10677-2"+ width="129.29953"+ height="55.558392"+ x="256.63965"+ y="964.51953" />+ </g>+ <g+ transform="translate(343.01015,0)"+ id="g10695-8">+ <rect+ y="965.0246"+ x="46.467014"+ height="54.548237"+ width="208.09143"+ id="rect10697-9"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient9006);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ <rect+ y="964.51953"+ x="256.63965"+ height="55.558392"+ width="129.29953"+ id="rect10699-6"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient9008);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ </g>+ <g+ transform="translate(686,0)"+ id="g10705-0">+ <rect+ y="965.0246"+ x="46.467014"+ height="54.548237"+ width="208.09143"+ id="rect10707-7"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient9010);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ <rect+ y="964.51953"+ x="256.63965"+ height="55.558392"+ width="129.29953"+ id="rect10709-0"+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient9012);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496" />+ </g>+ <g+ id="g10711-1"+ transform="translate(1029.0101,0)">+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient9014);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10713-0"+ width="208.09143"+ height="54.548237"+ x="46.467014"+ y="965.0246" />+ <rect+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient9016);stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.99701496"+ id="rect10715-1"+ width="129.29953"+ height="55.558392"+ x="256.63965"+ y="964.51953" />+ </g>+ </g>+ <rect+ style="fill:none;stroke:url(#linearGradient9949);stroke-width:1.3638736"+ id="rect9143"+ width="205.70724"+ height="283.48898"+ x="231.46625"+ y="461.60492" />+ </g>+</svg>
+ examples/734397657.m4s view
binary file changed (absent → 13293 bytes)
+ examples/audio.mpd view
@@ -0,0 +1,16 @@+<?xml version="1.0" encoding="utf-8"?>+<MPD availabilityStartTime="1970-01-01T00:00:00Z" maxSegmentDuration="PT2S" minBufferTime="PT2S" minimumUpdatePeriod="P100Y" profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash-if-simple" timeShiftBufferDepth="PT5M" type="dynamic" ns1:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance">+ <ProgramInformation>+ <Title>Media Presentation Description for audio only from DASH-IF live simulator</Title>+ </ProgramInformation>+ <BaseURL>http://vm2.dashif.org/livesim/testpic_2s/</BaseURL>+<Period id="p0" start="PT0S">+ <AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1">+ <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />+ <SegmentTemplate duration="2" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/$Number$.m4s" startNumber="0" />+ <Representation audioSamplingRate="48000" bandwidth="48000" codecs="mp4a.40.2" id="A48">+ <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />+ </Representation>+ </AdaptationSet>+ </Period>+</MPD>
+ examples/init.mp4 view
binary file changed (absent → 651 bytes)
isobmff-builder.cabal view
@@ -1,5 +1,5 @@ name: isobmff-builder-version: 0.10.0.0+version: 0.10.5.0 synopsis: A (bytestring-) builder for the ISO-14496-12 base media file format description: Please see README.md homepage: https://github.com/sheyll/isobmff-builder#readme@@ -10,45 +10,69 @@ copyright: 2016 Sven Heyll category: Codec build-type: Simple--- extra-source-files:+extra-source-files: README.md+ , stack.yaml+ , .travis.yml+ , doc/basic-structure.svg+ , doc/data_reference_box.svg+ , examples/734397657.m4s+ , examples/init.mp4+ , examples/audio.mpd+ , .gitignore cabal-version: >=1.10 library hs-source-dirs: src exposed-modules: Data.ByteString.IsoBaseFileFormat.Boxes+ , Data.ByteString.IsoBaseFileFormat.Boxes.AudioSampleEntry , Data.ByteString.IsoBaseFileFormat.Boxes.Box , Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields+ , Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl+ , Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrn , Data.ByteString.IsoBaseFileFormat.Boxes.DataInformation , Data.ByteString.IsoBaseFileFormat.Boxes.DataReference , Data.ByteString.IsoBaseFileFormat.Boxes.FileType , Data.ByteString.IsoBaseFileFormat.Boxes.FullBox , Data.ByteString.IsoBaseFileFormat.Boxes.Handler+ , Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader+ , Data.ByteString.IsoBaseFileFormat.Boxes.HintSampleEntry , Data.ByteString.IsoBaseFileFormat.Boxes.Media , Data.ByteString.IsoBaseFileFormat.Boxes.MediaData , Data.ByteString.IsoBaseFileFormat.Boxes.MediaHeader , Data.ByteString.IsoBaseFileFormat.Boxes.MediaInformation+ , Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry , Data.ByteString.IsoBaseFileFormat.Boxes.Movie , Data.ByteString.IsoBaseFileFormat.Boxes.MovieHeader+ , Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader , Data.ByteString.IsoBaseFileFormat.Boxes.ProgressiveDownloadInformation , Data.ByteString.IsoBaseFileFormat.Boxes.Language+ , Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription+ , Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry+ , Data.ByteString.IsoBaseFileFormat.Boxes.SampleTable , Data.ByteString.IsoBaseFileFormat.Boxes.Skip+ , Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader , Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader , Data.ByteString.IsoBaseFileFormat.Boxes.Time+ , Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample , Data.ByteString.IsoBaseFileFormat.Boxes.Track , Data.ByteString.IsoBaseFileFormat.Boxes.TrackHeader , Data.ByteString.IsoBaseFileFormat.Boxes.Versioned+ , Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader+ , Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry , Data.ByteString.IsoBaseFileFormat.Brands.Dash , Data.ByteString.IsoBaseFileFormat.Brands.Types , Data.ByteString.IsoBaseFileFormat.Util.TypeLayout+ , Data.ByteString.IsoBaseFileFormat.Util.BitRecords build-depends: base >= 4.9 && < 5 , bytestring >= 0.10.8.1 && < 0.11 , type-list >= 0.5.0.0 && < 0.6 , data-default >= 0.7.1.1 && < 0.8 , vector-sized >= 0.3.2.0 && < 0.4 , singletons >= 2.2 && < 3- , lens >= 4.14 && < 5+ , tagged >= 0.8 && < 1 , time >= 1.6.0.1 && < 2 , text >= 1.2.2.1 && < 2+ , type-spec >= 0.1 default-language: Haskell2010 ghc-options: -Wall -funbox-strict-fields -fno-warn-unused-do-bind default-extensions: ConstraintKinds@@ -96,6 +120,7 @@ , isobmff-builder , binary , text >= 1.2.2.1 && < 2+ , type-spec >= 0.1 default-language: Haskell2010 default-extensions: ConstraintKinds , CPP
spec/BoxFieldsSpec.hs view
@@ -2,11 +2,8 @@ import Test.Hspec import Data.ByteString.IsoBaseFileFormat.Boxes--- import qualified Data.ByteString.Builder as B import qualified Data.ByteString.Lazy as BL--- import qualified Data.Binary.Get as Binary import Control.Exception (evaluate)-import qualified Data.Text as T -- import qualified Data.ByteString.Builder as B import qualified Data.ByteString.Lazy as BL import -- qualified Data.Binary.Get as Binary@@ -40,7 +37,7 @@ do it "boxSize reports the correct size" $ boxSize example2 `shouldBe` (2 * 4 + 2 + 2 + 2 + 2 + 9 * 4 + 4 + 4) it "it renders the expected content" $ renderBox example2 `shouldBe`- (BL.pack [0 ,0 ,0 ,0+ BL.pack [0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,65 ,0 ,66 ,1 ,0 ,0 ,0@@ -54,27 +51,43 @@ ,0 ,0 ,0 ,74 ,0 ,0 ,0 ,75 ,0 ,0 ,0 ,76- ,0 ,0 ,0 ,77])+ ,0 ,0 ,0 ,77] renderBox :: IsBoxContent c => c -> BL.ByteString renderBox = toLazyByteString . boxBuilder -type ExampleContent = Scalar Word8 "bla" :+ Constant (Scalar Word8 "blub") 123 :+ Template (ScalarArray "foos" 3 Int64) '[1, 2, 3] :+ ScalarArray "baz" 7 Word64+type ExampleContent =+ Scalar Word8 "bla"+ :+ Constant (Scalar Word8 "blub") 123+ :+ Template (ScalarArray "foos" 3 Int64) '[1, 2, 3]+ :+ ScalarArray "baz" 7 Word64 -type ExampleContentShort = U8 "bla" :+ Constant (U8 "blub") 123 :+ Template (I64Arr "foos" 3) '[1, 2, 3] :+ U64Arr "baz" 7+type ExampleContentShort =+ U8 "bla"+ :+ Constant (U8 "blub") 123+ :+ Template (I64Arr "foos" 3) '[1, 2, 3]+ :+ U64Arr "baz" 7 example1 :: ExampleContent-example1 = Scalar 100 :+ Constant :+ Default :+ u64Arr [1,2,3]+example1 = Scalar 100 :+ Constant :+ Template :+ u64Arr [1,2,3,4,5,6,7] example1' :: ExampleContentShort-example1' = example1+example1' = Scalar 100 :+ Constant :+ Template :+ u64Arr [6,6,6] -type Example2 isAudio = Constant (I32Arr "reserved" 2) '[0, 0] :+ Template (I16 "layer") 0 :+ Template (I16 "alternate_group") 0 :+ Template (I16 "volume") (If isAudio 256 0) :+ Constant (I16 "reserved") 0 :+ Template (I32Arr "matrix" 9) '[65536, 0, 0, 0, 65536, 0, 0, 0, 1073741824] :+ I32 "width" :+ I32 "height"+type Example2 isAudio =+ Constant (I32Arr "reserved" 2) '[0, 0]+ :+ Template (I16 "layer") 0+ :+ Template (I16 "alternate_group") 0+ :+ Template (I16 "volume") (If isAudio 256 0)+ :+ Constant (I16 "reserved") 0+ :+ Template (I32Arr "matrix" 9) '[65536, 0, 0, 0, 65536, 0, 0, 0, 1073741824]+ :+ I32 "width"+ :+ I32 "height" example2 :: Example2 'True example2 =- Constant :+ Custom 65 :+ Custom 66 :+ Default :+ Constant :++ Constant :+ Custom 65 :+ Custom 66 :+ Template :+ Constant :+ Custom (i32Arr [67 .. 75]) :+ i32 76 :+ i32 77
spec/BrandTypeSpec.hs view
@@ -56,15 +56,15 @@ data TestBrandEmpty -instance IsBrand TestBrandEmpty where+instance IsMediaFileFormat TestBrandEmpty where type BoxLayout TestBrandEmpty = Boxes '[] data TestBrandSingle -instance IsBrand TestBrandSingle where+instance IsMediaFileFormat TestBrandSingle where type BoxLayout TestBrandSingle = Boxes '[OM_ TestBox1] data TestBrandNested -instance IsBrand TestBrandNested where+instance IsMediaFileFormat TestBrandNested where type BoxLayout TestBrandNested = Boxes '[OM TestParentBox1 '[OM_ TestBox1]]
spec/DashSpec.hs view
@@ -1,5 +1,5 @@ {-# LANGUAGE OverloadedStrings #-}-module DashSpec (spec) where+module DashSpec (spec) where -- TODO rename to mp4 audio init spec import Test.Hspec import Data.ByteString.IsoBaseFileFormat.Brands.Dash@@ -26,9 +26,9 @@ [ -- ftyp box 0,0,0,28,102,116,121,112,100,97,115,104,0,0,0,0- ,105,115,111,109,105,115,111,53,109,112,52,50,0,0+ ,105,115,111,109,105,115,111,53,109,112,52,50 -- moov box- ,1 ,105 ,109 ,111 ,111 ,118+ ,0,0,1,180,109 ,111 ,111 ,118 -- mvhd box ,0 ,0 ,0 ,108 ,109 ,118 ,104 ,100 ,0 ,0 ,0 ,0] ++ cts ++ [0 ,0 ,0 ,0 ,0@@ -39,7 +39,7 @@ ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,255 ,255 ,255 ,255 -- trak box- ,0 ,0 ,0 ,245+ ,0 ,0 ,1,64 ,116 ,114 ,97 ,107 -- tkhd box ,0 ,0 ,0 ,92@@ -51,28 +51,43 @@ ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,64 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 -- mdia box- ,0,0,0,145+ ,0,0,0,220 ,109,100,105,97 ,0,0,0,32,109,100,104,100,0,0,0,0 ,0,0,0,0,0,0,0,0,0,1,95,144,0,0,0,0,16,181,0,0 -- hdlr box- ,0,0,0,45+ ,0,0,0,44 ,104,100,108,114 ,0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0- ,72,101,108,108,111,32,119,111,114,108,100,33,0- ,0,0,0,60+ ,72,101,108,108,111,32,119,111,114,108,100,0+ -- minf box+ ,0,0,0,136 ,109,105,110,102 ,0,0,0,16 ,115,109,104,100,0,0,0,0,0,0,0,0+ -- dinf box ,0,0,0,36 ,100,105,110,102+ -- dref box ,0,0,0,28 ,100,114,101,102 ,0,0,0,0,0,0,0,1+ -- url box ,0,0,0,12- ,117,114,110,32- ,0,0,0,1]- -- BL.writeFile "/tmp/xxx.mp4" (BL.pack rendered)+ ,117,114,108,32+ ,0,0,0,1+ -- stbl+ ,0,0,0,76,115,116,98,108+ -- stsd+ ,0,0,0,52,115,116,115,100+ ,0,0,0,0,0,0,0,1+ -- mp4a+ ,0,0,0,36,109,112,52,97+ ,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,16,0,0,0,0+ ,187,128,0,0+ -- stts+ ,0,0,0,16,115,116,116,115,0,0,0,0,0,0,0,0]+ BL.writeFile "/tmp/isobmff-test-case-dash-spec.mp4" (BL.pack rendered) rendered `shouldBe` expected @@ -80,11 +95,11 @@ exampleSingleTrackInit creationTime = SingleAudioTrackInit (MovieHeader $- V0 (creationTime :+ 0 :+ Default :+ durationFromSeconds Default 1) :++ V0 (creationTime :+ 0 :+ Template :+ durationFromSeconds Template 1) :+ def) (TrackHeader $- V0 (0 :+ 0 :+ 1 :+ Constant :+ durationFromSeconds Default 1) :++ V0 (0 :+ 0 :+ 1 :+ Constant :+ durationFromSeconds Template 1) :+ def)- (MediaHeader $ def)- (Handler $ def :+ AudioTrack :+ def :+ (Custom "Hello world!"))+ (MediaHeader def)+ (namedAudioTrackHandler "Hello world") (SoundMediaHeader def)
spec/DataReferenceSpec.hs view
@@ -1,25 +1,19 @@ module DataReferenceSpec (spec) where -import Test.Hspec-import Data.ByteString.IsoBaseFileFormat.Boxes--import qualified Data.ByteString.Builder as B-import qualified Data.ByteString.Lazy as BL-import qualified Data.Binary.Get as Binary-import qualified Data.Text as T+import Data.ByteString.IsoBaseFileFormat.Boxes+import Test.Hspec spec :: Spec-spec = return ()--- describe "IsBoxContent" $ do--- describe "LocalMediaEntry" $ do--- describe "boxSize" $ do--- it "returns 0" $--- let actual = boxSize (localMediaDataReference :: DRef)--- -- dref: size+fourcc+fullbox+entries -> 4 * 4bytes--- expected = 4 + 4 + 4 + 4 + (4 + 4 + boxSize ("xxxx" :+ FullBox Default 0 () :: DEntryLocal))--- in actual `shouldBe` expected------ -- type DRef = Box (Dash 0) DataReference--- type DEntryLocal = FourCc :+ FullBox 0 ()--- type DEntryUrl = FourCc :+ FullBox 0 (T.Text)--- type DEntryUrn = FourCc :+ FullBox 0 (T.Text :+ T.Text)+spec =+ describe "IsBoxContent" $+ describe "LocalMediaEntry" $+ describe "boxSize" $+ it "returns 0" $+ let actual = boxSize localMediaDataReference+ expected = drefHeader + entryField + durlHeader+ drefHeader = boxHeader + fullHeader+ entryField = 4+ durlHeader = boxHeader + fullHeader+ boxHeader = 4 + 4+ fullHeader = 4+ in actual `shouldBe` expected
src/Data/ByteString/IsoBaseFileFormat/Boxes.hs view
@@ -3,32 +3,43 @@ ( module X) where -import Data.ByteString.IsoBaseFileFormat.Boxes.Box as X-import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields as X-import Data.ByteString.IsoBaseFileFormat.Boxes.DataInformation as X-import Data.ByteString.IsoBaseFileFormat.Boxes.DataReference as X-import Data.ByteString.IsoBaseFileFormat.Boxes.FileType as X-import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox as X-import Data.ByteString.IsoBaseFileFormat.Boxes.Handler as X-import Data.ByteString.IsoBaseFileFormat.Boxes.Media as X-import Data.ByteString.IsoBaseFileFormat.Boxes.MediaData as X-import Data.ByteString.IsoBaseFileFormat.Boxes.MediaHeader as X-import Data.ByteString.IsoBaseFileFormat.Boxes.MediaInformation as X-import Data.ByteString.IsoBaseFileFormat.Boxes.Movie as X-import Data.ByteString.IsoBaseFileFormat.Boxes.MovieHeader as X-import Data.ByteString.IsoBaseFileFormat.Boxes.ProgressiveDownloadInformation as X-import Data.ByteString.IsoBaseFileFormat.Boxes.Language as X-import Data.ByteString.IsoBaseFileFormat.Boxes.Skip as X-import Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader as X-import Data.ByteString.IsoBaseFileFormat.Boxes.Time as X-import Data.ByteString.IsoBaseFileFormat.Boxes.Track as X-import Data.ByteString.IsoBaseFileFormat.Boxes.TrackHeader as X-import Data.ByteString.IsoBaseFileFormat.Boxes.Versioned as X+import Data.ByteString.IsoBaseFileFormat.Boxes.AudioSampleEntry as X+import Data.ByteString.IsoBaseFileFormat.Boxes.Box as X+import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields as X+import Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl as X+import Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrn as X+import Data.ByteString.IsoBaseFileFormat.Boxes.DataInformation as X+import Data.ByteString.IsoBaseFileFormat.Boxes.DataReference as X+import Data.ByteString.IsoBaseFileFormat.Boxes.FileType as X+import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox as X+import Data.ByteString.IsoBaseFileFormat.Boxes.Handler as X+import Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader as X+import Data.ByteString.IsoBaseFileFormat.Boxes.HintSampleEntry as X+import Data.ByteString.IsoBaseFileFormat.Boxes.Language as X+import Data.ByteString.IsoBaseFileFormat.Boxes.Media as X+import Data.ByteString.IsoBaseFileFormat.Boxes.MediaData as X+import Data.ByteString.IsoBaseFileFormat.Boxes.MediaHeader as X+import Data.ByteString.IsoBaseFileFormat.Boxes.MediaInformation as X+import Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry as X+import Data.ByteString.IsoBaseFileFormat.Boxes.Movie as X+import Data.ByteString.IsoBaseFileFormat.Boxes.MovieHeader as X+import Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader as X+import Data.ByteString.IsoBaseFileFormat.Boxes.ProgressiveDownloadInformation as X+import Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription as X+import Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry as X+import Data.ByteString.IsoBaseFileFormat.Boxes.SampleTable as X+import Data.ByteString.IsoBaseFileFormat.Boxes.Skip as X+import Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader as X+import Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader as X+import Data.ByteString.IsoBaseFileFormat.Boxes.Time as X+import Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample as X+import Data.ByteString.IsoBaseFileFormat.Boxes.Track as X+import Data.ByteString.IsoBaseFileFormat.Boxes.TrackHeader as X+import Data.ByteString.IsoBaseFileFormat.Boxes.Versioned as X+import Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader as X+import Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry as X -import Data.Int as X-import Data.Kind as X (Type, Constraint)-import Data.Maybe as X-import Data.Type.Bool as X-import Data.Type.Equality as X-import Text.Printf as X-import Data.Default as X+import Data.Kind as X+ (Constraint,+ Type)+import Text.Printf as X
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/AudioSampleEntry.hs view
@@ -0,0 +1,40 @@+-- | Detailed audio sample description.+module Data.ByteString.IsoBaseFileFormat.Boxes.AudioSampleEntry where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields+import Data.ByteString.IsoBaseFileFormat.Boxes.Handler+import Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry++-- | Construct an audio sample entry box.+audioSampleEntry ::+ (KnownSymbol+ (BoxTypeSymbol (SampleEntry 'AudioTrack (AudioCoding c))))+ => AudioCoding c+ -> U16 "data_reference_index"+ -> SampleEntry 'AudioTrack (AudioCoding c)+ -> Box (SampleEntry 'AudioTrack (AudioCoding c))+audioSampleEntry _ = sampleEntry++-- | Fields if audio sample entries+newtype instance SampleEntry 'AudioTrack (AudioCoding c) where+ AudioSampleEntry+ :: Constant (U32Arr "reserved" 2) '[0,0]+ :+ Template (U16 "channelcount") 2+ :+ Template (U16 "samplesize") 16+ :+ U16 "pre_defined"+ :+ Constant (U16 "reserved") 0+ :+ Template (U32 "samplerate") (DefaultSoundSamplerate * 65536)+ -- TODO implement fix point integer+ -> SampleEntry 'AudioTrack (AudioCoding c)+ deriving (IsBoxContent, Default)++type DefaultSoundSamplerate = 48000++-- | A coproduct of audio codec types+data family AudioCoding (c :: Symbol)++-- | The MPEG-4 AAC Audio codec+data instance AudioCoding "mp4a" = Mpeg4Aac++type instance BoxTypeSymbol (AudioCoding c) = c
src/Data/ByteString/IsoBaseFileFormat/Boxes/Box.hs view
@@ -13,26 +13,29 @@ where import Data.ByteString.IsoBaseFileFormat.Util.TypeLayout as X+import Data.Default as X+import Data.Foldable as X (fold)+import Data.Int as X+import Data.Maybe as X+import Data.Tagged as X+import Data.Proxy as X+import Data.Word as X import Data.Bits as X import Data.ByteString.Builder as X import Data.Monoid as X-import Data.Proxy as X-import Data.Word as X import Data.Kind import GHC.TypeLits as X-import Data.String-import Data.Default-import Data.Singletons.Prelude.List (Length)-import Data.Type.Equality-import Data.Type.Bool+import Data.String as X+import Data.Singletons.Prelude.List (Length, (:++))+import Data.Type.Equality as X+import Data.Type.Bool as X import qualified Data.Text as T import qualified Data.Text.Encoding as T-import Data.Singletons.Prelude.List ((:++)) import qualified Data.ByteString as B -- * Box Type Classes -- | Base class for all (abstract/phantom/normal-) types that represent boxes-class (KnownSymbol (BoxTypeSymbol t), IsBoxContent (BoxContent t)) => IsBox t where+class (KnownSymbol (BoxTypeSymbol t), IsBoxContent (BoxContent t)) => IsBox (t :: Type) where type BoxContent t type BoxContent t = t toBoxType :: proxy t -> BoxType@@ -42,7 +45,7 @@ -- that an instance of this type family exists for every 'IsBox' instance. -- This family could not be associative since it is used by type families that -- cannot have type class constraints.-type family BoxTypeSymbol t :: Symbol+type family BoxTypeSymbol (t :: k) :: Symbol -- | Types that go into a box. A box content is a piece of data that can be -- reused in different instances of 'IsBox'. It has no 'BoxType' and hence@@ -51,14 +54,13 @@ boxSize :: a -> BoxSize boxBuilder :: a -> Builder --- * Data types-+-- * Box Contents+-- TODO move all IsBoxContent stuff to BoxContent.hs -- | A type that wraps the contents of a box and the box type. data Box b where Box ::- (IsBox b) =>- BoxContent b -> Box b+ !(BoxContent b) -> Box b instance IsBox b => IsBox (Box b) where type BoxContent (Box b) = BoxContent b@@ -66,7 +68,7 @@ type instance BoxTypeSymbol (Box b) = BoxTypeSymbol b -instance IsBoxContent (Box cnt) where+instance IsBox cnt => IsBoxContent (Box cnt) where boxBuilder b@(Box cnt) = sB <> tB <> sExtB <> tExtB <> cntB where s = boxSize b t = toBoxType b@@ -81,10 +83,13 @@ boxSize (BoxTypeExtension t) t = toBoxType b +instance (Default (BoxContent b)) => Default (Box b) where+ def = Box def+ -- | Compose 'BoxContent' and 'Boxes' under the Constraint that they are -- composable. data ContainerBox b (bs :: [Type]) where- ContainerBox :: IsBox b => BoxContent b -> Boxes bs -> ContainerBox b bs+ ContainerBox :: IsBox b => !(BoxContent b) -> !(Boxes bs) -> ContainerBox b bs instance (IsBox b) => IsBox (ContainerBox b bs) @@ -97,10 +102,10 @@ -- | A heterogenous collection of boxes. data Boxes (boxTypes :: [Type]) where NoBoxes :: Boxes '[]- (:.) :: Box l -> Boxes r -> Boxes (Box l ': r)+ (:.) :: IsBox l => !(Box l) -> !(Boxes r) -> Boxes (Box l ': r) -- | Create a 'Boxes' collection from two 'Box'es- (:<>) :: Boxes l -> Boxes r -> Boxes (l :++ r)- (:|) :: Box l -> Box r -> Boxes '[Box l, Box r]+ (:<>) :: !(Boxes l) -> !(Boxes r) -> Boxes (l :++ r)+ (:|) :: (IsBox l, IsBox r) => !(Box l) -> !(Box r) -> Boxes '[Box l, Box r] infixr 1 :<> infixr 2 :.@@ -108,11 +113,11 @@ infixr 3 $: -- | Apply a function to a 'Boxes' collection containing only a single 'Box'.-($:) :: (Boxes '[Box l] -> r) -> Box l -> r+($:) :: IsBox l => (Boxes '[Box l] -> r) -> Box l -> r ($:) f = f . singletonBox -- | Create a 'Boxes' collection with a single 'Box'.-singletonBox :: Box l -> Boxes '[Box l]+singletonBox :: IsBox l => Box l -> Boxes '[Box l] singletonBox b = b :. NoBoxes -- | Get the elements in a type level array@@ -142,7 +147,7 @@ -- the end of the file. data BoxSize = UnlimitedSize- | BoxSize Word64+ | BoxSize !Word64 deriving (Show,Eq) instance IsBoxContent BoxSize where@@ -172,7 +177,7 @@ -- | The 'BoxSize' can be > 2^32 in which case an 'BoxSizeExtension' must be -- added after the type field.-data BoxSizeExtension =+newtype BoxSizeExtension = BoxSizeExtension BoxSize instance IsBoxContent BoxSizeExtension where@@ -193,10 +198,10 @@ = -- | `FourCc` can be used as @boxType@ in `Box`, standard four letter character -- code, e.g. @ftyp@- StdType FourCc+ StdType !FourCc | -- | CustomBoxType defines custom @boxType@s in `Box`es.- CustomBoxType String+ CustomBoxType !String deriving (Show,Eq) -- | Create a box type from a 'Symbol'. Parse the symbol value, if it's a four@@ -205,7 +210,7 @@ parseBoxType :: KnownSymbol t => proxy t -> BoxType parseBoxType px = StdType (fromString (symbolVal px)) --- | A type containin a printable four letter character code.+-- | A type containin a printable four letter character code. TODO replace impl with U32Text newtype FourCc = FourCc (Char,Char,Char,Char) deriving (Show,Eq)@@ -234,7 +239,7 @@ -- | When using custom types extra data must be written after the extra size -- information. Since the box type and the optional custom box type are not -- guaranteed to be consequtive, this type handles the /second/ part seperately.-data BoxTypeExtension =+newtype BoxTypeExtension = BoxTypeExtension BoxType instance IsBoxContent BoxTypeExtension where@@ -260,12 +265,19 @@ -- boxSize = foldr' (\e acc -> acc + boxSize e) 0 -- boxBuilder = foldMap boxBuilder +instance Default B.ByteString where+ def = mempty+ -- | This 'Text' instance writes a null terminated UTF-8 string. instance IsBoxContent T.Text where boxSize = (1+) . fromIntegral . T.length boxBuilder txt = boxBuilder (T.encodeUtf8 txtNoNulls) <> word8 0 where txtNoNulls = T.map (\c -> if c == '\0' then ' ' else c) txt +instance Default T.Text where+ def = ""++ -- | This instance writes zero bytes for 'Nothing' and delegates on 'Just'. instance IsBoxContent a => IsBoxContent (Maybe a) where boxSize = maybe 0 boxSize@@ -274,16 +286,43 @@ -- * Box concatenation -- | Box content composition-data a :+ b = a :+ b+data a :+ b = !a :+ !b infixr 3 :+ instance (IsBoxContent p,IsBoxContent c) => IsBoxContent (p :+ c) where- boxSize (p :+ c) = boxSize p + boxSize c+ boxSize (p :+ c) = boxSize p + boxSize c boxBuilder (p :+ c) = boxBuilder p <> boxBuilder c instance (Default a, Default b) => Default (a :+ b) where def = def :+ def++-- * Tagged boxes++instance IsBoxContent c => IsBoxContent (Tagged s c) where+ boxSize = boxSize . untag+ boxBuilder = boxBuilder . untag++instance Default c => Default (Tagged s c) where+ def = Tagged def++-- * List Box Content++-- | A list of things that renders to a size field with the number of elements+-- and the sequence of elements. This type is index with the size field type.+newtype ListContent sizeType contentType =+ ListContent [contentType]++instance (Num sizeType, IsBoxContent sizeType, IsBoxContent contentType)+ => IsBoxContent (ListContent sizeType contentType) where+ boxSize (ListContent es) =+ boxSize (fromIntegral (length es) :: sizeType) + sum (boxSize <$> es)+ boxBuilder (ListContent es) =+ boxBuilder (fromIntegral (length es) :: sizeType)+ <> fold (boxBuilder <$> es)++instance Default (ListContent sizeTupe contentType) where+ def = ListContent [] -- * Type Layout Rule Matchers
src/Data/ByteString/IsoBaseFileFormat/Boxes/BoxFields.hs view
@@ -4,16 +4,15 @@ where import Data.ByteString.IsoBaseFileFormat.Boxes.Box-import Data.ByteString.IsoBaseFileFormat.Boxes.Versioned-import Data.Default-import Data.Int-import Data.Maybe import Text.Printf import Data.Singletons import Data.Singletons.Prelude.List import qualified Data.Vector.Sized as Vec import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import qualified Data.ByteString as B + -- * Scalar box fields type U64 label = Scalar Word64 label@@ -27,7 +26,6 @@ i64 = Scalar type U32 label = Scalar Word32 label- type I32 label = Scalar Int32 label u32 :: Word32 -> U32 label@@ -214,15 +212,15 @@ -- 'ScalarArray', with a type level default value. The wrapped content must -- implement 'FromTypeLit'. data Template o v where- Default :: Template o v+ Template :: Template o v Custom :: o -> Template o v instance Default (Template o v) where- def = Default+ def = Template -- | Get a value from a 'Template'. templateValue :: FromTypeLit o v => Template o v -> o-templateValue d@Default = fromTypeLit d+templateValue d@Template = fromTypeLit d templateValue (Custom v) = v instance (IsBoxContent o,FromTypeLit o v) => IsBoxContent (Template o v) where@@ -247,9 +245,54 @@ instance KnownSymbol str => FromTypeLit T.Text (str :: Symbol) where fromTypeLit = T.pack . symbolVal --- * Versioned support+-- * String/Text field types --- | A utility for 'Versioned' to apply a type constructor to either a--- @('Scalar' Word32)@ or a @('Scalar' Word64)@ depending on the type level--- version. This uses 'SelectByVersion'. -type U32U64 c = SelectByVersion c (Scalar Word32) (Scalar Word64)+-- | A fixed size string, the first byte is the string length, after the String,+-- the field is padded with @0@ bytes. The string must be in UTF8 format.+newtype FixSizeText (len :: Nat) (label :: Symbol) where+ FixSizeText :: T.Text -> FixSizeText len label++-- | A constraint that matches type level numbers that are valid text sizes for+-- 'FixSizeText's.+type IsTextSize len = (KnownNat len, 1 <= len, len <= 255)++instance IsTextSize len => IsBoxContent (FixSizeText len label) where+ boxSize _ = fromIntegral (natVal (Proxy :: Proxy len))+ boxBuilder (FixSizeText t) =+ let+ -- leave room for the size byte+ maxSize = fromIntegral (natVal (Proxy :: Proxy len) - 1)+ displayableText = B.take maxSize (T.encodeUtf8 t)+ displayableTextSize = B.length displayableText+ paddingSize = max 0 (maxSize - displayableTextSize)+ in+ word8 (fromIntegral displayableTextSize)+ <> byteString displayableText+ <> fold (replicate paddingSize (word8 0))++instance IsTextSize len => Default (FixSizeText len label) where+ def = FixSizeText ""++-- | Four character strings embedded in a uint32.+newtype U32Text (label :: Symbol) where+ U32Text :: Word32 -> U32Text label++instance IsString (U32Text label) where+ fromString str = U32Text $+ let cw s c = (0xFF .&. (fromIntegral (fromEnum c))) `shiftL` s+ in case str of+ [] -> 0x20202020+ [a] -> (cw 24 a .|. 0x00202020)+ [a,b] -> (cw 24 a .|. cw 16 b .|. 0x00002020)+ [a,b,c] -> (cw 24 a .|. cw 16 b .|. cw 8 c .|. 0x20)+ (a:b:c:d:_) -> (cw 24 a .|. cw 16 b .|. cw 8 c .|. cw 0 d)++instance IsBoxContent (U32Text label) where+ boxSize _ = 4+ boxBuilder (U32Text t) = word32BE t++instance KnownSymbol str => FromTypeLit (U32Text label) (str :: Symbol) where+ fromTypeLit = fromString . symbolVal++instance Default (U32Text label) where+ def = U32Text 0x20202020
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/DataEntryUrl.hs view
@@ -0,0 +1,32 @@+-- | A data references URL.+module Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl+ (DataEntryUrl()+ ,localMediaDataEntryUrl+ ,dataEntryUrl+ )+ where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox+import qualified Data.Text as T++-- | A container for a URL or an indicator for local only media+newtype DataEntryUrl =+ DataEntryUrl (Maybe T.Text)+ deriving (Default,IsBoxContent)++-- | Create a 'DataEntryUrl' box for local media entry with the flag set and+-- empty content.+localMediaDataEntryUrl+ :: Box (FullBox DataEntryUrl 0)+localMediaDataEntryUrl = dataEntryUrl True Nothing++-- | Create a 'DataEntryUrl' box. The flag determines if the url is local, i.e.+-- the media data is in the same file.+dataEntryUrl+ :: Bool -> Maybe T.Text -> Box (FullBox DataEntryUrl 0)+dataEntryUrl isLocal Nothing = Box (FullBox (fromIntegral $ fromEnum isLocal) $ DataEntryUrl Nothing)+dataEntryUrl isLocal murl = Box (FullBox (fromIntegral $ fromEnum isLocal) $ DataEntryUrl murl)++instance IsBox DataEntryUrl+type instance BoxTypeSymbol DataEntryUrl = "url "
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/DataEntryUrn.hs view
@@ -0,0 +1,24 @@+-- | A table of data references (URN with optional URL.+module Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrn+ (DataEntryUrn()+ ,dataEntryUrn+ )+ where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox+import qualified Data.Text as T++-- | A container for a URN and optionally a URL+newtype DataEntryUrn =+ DataEntryUrn (T.Text :+ T.Text)+ deriving (IsBoxContent)++-- | Create a 'DataEntryUrn' box. The flag determines if the url is local, i.e.+-- the media data is in the same file.+dataEntryUrn+ :: Bool -> T.Text -> T.Text -> Box (FullBox DataEntryUrn 0)+dataEntryUrn isLocal urn url = Box (FullBox (fromIntegral $ fromEnum isLocal) $ DataEntryUrn $ urn :+ url)++instance IsBox DataEntryUrn+type instance BoxTypeSymbol DataEntryUrn = "urn "
src/Data/ByteString/IsoBaseFileFormat/Boxes/DataReference.hs view
@@ -4,39 +4,22 @@ -- same file as the. module Data.ByteString.IsoBaseFileFormat.Boxes.DataReference (DataReference()- ,DataEntryUrl()- ,DataEntryUrn() ,dataReference ,localMediaDataReference- ,localMediaDataEntryUrl- ,dataEntryUrl- ,dataEntryUrn ) where import Data.ByteString.IsoBaseFileFormat.Boxes.Box import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox+import Data.ByteString.IsoBaseFileFormat.Boxes.DataEntryUrl import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields- hiding (Default)-import qualified Data.Text as T import Data.Singletons.Prelude.List (Length)-import Data.Default -- | A container for 'DataEntryUrl's and 'DataEntryUrn's newtype DataReference = DataReference (U32 "entry_count") deriving (Default,IsBoxContent) --- | A container for a URL-newtype DataEntryUrl =- DataEntryUrl (Maybe T.Text)- deriving (Default,IsBoxContent)---- | A container for a URN and optionally a URL-newtype DataEntryUrn =- DataEntryUrn (T.Text :+ T.Text)- deriving (IsBoxContent)- -- | Create a 'DataReference' box. dataReference :: KnownNat (Length ts)@@ -50,30 +33,5 @@ :: Box (ContainerBox (FullBox DataReference 0) '[Box (FullBox DataEntryUrl 0)]) localMediaDataReference = dataReference (singletonBox localMediaDataEntryUrl) --- | Create a 'DataEntryUrl' box for local media entry with the flag set and--- empty content.-localMediaDataEntryUrl- :: Box (FullBox DataEntryUrl 0)-localMediaDataEntryUrl = dataEntryUrl True Nothing---- | Create a 'DataEntryUrl' box. The flag determines if the url is local, i.e.--- the media data is in the same file.-dataEntryUrl- :: Bool -> Maybe T.Text -> Box (FullBox DataEntryUrl 0)-dataEntryUrl isLocal Nothing = Box (FullBox (fromIntegral $ fromEnum isLocal) $ DataEntryUrl Nothing)-dataEntryUrl isLocal murl = Box (FullBox (fromIntegral $ fromEnum isLocal) $ DataEntryUrl murl)---- | Create a 'DataEntryUrn' box. The flag determines if the url is local, i.e.--- the media data is in the same file.-dataEntryUrn- :: Bool -> T.Text -> T.Text -> Box (FullBox DataEntryUrn 0)-dataEntryUrn isLocal urn url = Box (FullBox (fromIntegral $ fromEnum isLocal) $ DataEntryUrn $ urn :+ url)- instance IsBox DataReference type instance BoxTypeSymbol DataReference = "dref"--instance IsBox DataEntryUrn-type instance BoxTypeSymbol DataEntryUrn = "urn "--instance IsBox DataEntryUrl-type instance BoxTypeSymbol DataEntryUrl = "urn "
src/Data/ByteString/IsoBaseFileFormat/Boxes/FullBox.hs view
@@ -15,6 +15,10 @@ -> BoxContent t -> FullBox t version +instance (KnownNat version, IsBox t, Default (BoxContent t))+ => Default (FullBox t version) where+ def = FullBox 0 def+ instance (KnownNat v, IsBox t) => IsBox (FullBox t v) where type BoxContent (FullBox t v) = FullBox t v
src/Data/ByteString/IsoBaseFileFormat/Boxes/Handler.hs view
@@ -1,48 +1,108 @@+{-# LANGUAGE UndecidableInstances #-} -- | A 'Handler' box describes how a track is presentation and by which sensory -- process it is perceived, e.g. audio, video, text, see 'HandlerType'-module Data.ByteString.IsoBaseFileFormat.Boxes.Handler where+module Data.ByteString.IsoBaseFileFormat.Boxes.Handler+ (Handler()+ ,handler+ ,audioTrackHandler+ ,namedAudioTrackHandler+ ,videoTrackHandler+ ,namedVideoTrackHandler+ ,hintTrackHandler+ ,namedHintTrackHandler+ ,timedMetadataTrackHandler+ ,namedTimedMetadataTrackHandler+ ,auxilliaryVideoTrackHandler+ ,namedAuxilliaryVideoTrackHandler+ ,HandlerType(..)+ ,HandlerTypeCode)+ where import Data.ByteString.IsoBaseFileFormat.Boxes.Box import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox-import Data.Default import qualified Data.Text as T -- | Handler box fields. A handler box may also contain a null terminated--- description text in UTF-8.-newtype Handler where- Handler :: Constant (U32 "pre_defined") 0- :+ HandlerType- :+ Constant (U32Arr "reserved" 3) '[0,0,0]- :+ Template T.Text ""- -> Handler- deriving (IsBoxContent, Default)+-- description text in UTF-8. The 'T.Text' parameter is a human readable name of+-- the track type for debugging.+newtype Handler (t :: HandlerType) where+ Handler ::+ Constant (U32 "pre_defined") 0 :++ Constant (U32Text "t") (HandlerTypeCode t) :++ Constant (U32Arr "reserved" 3) '[0, 0, 0] :++ Template T.Text "" -> Handler t +deriving instance (KnownSymbol (HandlerTypeCode t)) => IsBoxContent (Handler t)+deriving instance Default (Handler t)+ -- | A 'Handler' can be exactly one of these.-data HandlerType =- VideoTrack+data HandlerType+ = VideoTrack | AudioTrack | HintTrack- | TimedMetadataTrack+ | TimedMetaDataTrack | AuxilliaryVideoTrack +type family HandlerTypeCode (handlertype :: HandlerType) :: Symbol where+ HandlerTypeCode 'VideoTrack = "vide"+ HandlerTypeCode 'AudioTrack = "soun"+ HandlerTypeCode 'HintTrack = "hint"+ HandlerTypeCode 'TimedMetaDataTrack = "meta"+ HandlerTypeCode 'AuxilliaryVideoTrack = "auxv"+ -- | Create a 'Handler' box. handler- :: Handler -> Box (FullBox Handler 0)+ :: (KnownSymbol (HandlerTypeCode t))+ => Handler t -> Box (FullBox (Handler t) 0) handler = fullBox 0 -instance IsBox Handler where- type BoxContent Handler = Handler+-- | Create 'Handler' fields for 'AudioTrack's with @"Audio Track"@ as @name@.+audioTrackHandler :: Handler 'AudioTrack+audioTrackHandler = namedAudioTrackHandler "Audio Track" -type instance BoxTypeSymbol Handler = "hdlr"+-- | Create 'Handler' fields for 'AudioTrack's, with the given name.+namedAudioTrackHandler :: T.Text -> Handler 'AudioTrack+namedAudioTrackHandler txt = Handler (def :+ def :+ def :+ Custom txt) -instance Default HandlerType where- def = AudioTrack+-- | Create 'Handler' fields for 'VideoTrack's with @"Video Track"@ as @name@.+videoTrackHandler :: Handler 'VideoTrack+videoTrackHandler = namedVideoTrackHandler "Video Track" -instance IsBoxContent HandlerType where- boxSize _ = 4- boxBuilder VideoTrack = boxBuilder (FourCc ('v','i','d','e'))- boxBuilder AudioTrack = boxBuilder (FourCc ('s','o','u','n'))- boxBuilder HintTrack = boxBuilder (FourCc ('h','i','n','t'))- boxBuilder TimedMetadataTrack = boxBuilder (FourCc ('m','e','t','a'))- boxBuilder AuxilliaryVideoTrack = boxBuilder (FourCc ('a','u','x','v'))+-- | Create 'Handler' fields for 'VideoTrack's, with the given name.+namedVideoTrackHandler :: T.Text -> Handler 'VideoTrack+namedVideoTrackHandler txt = Handler (def :+ def :+ def :+ Custom txt)++-- | Create 'Handler' fields for 'HintTrack's with @"Hint Track"@ as @name@.+hintTrackHandler :: Handler 'HintTrack+hintTrackHandler = namedHintTrackHandler "Hint Track"++-- | Create 'Handler' fields for 'HintTrack's, with the given name.+namedHintTrackHandler :: T.Text -> Handler 'HintTrack+namedHintTrackHandler txt = Handler (def :+ def :+ def :+ Custom txt)++-- | Create 'Handler' fields for 'TimedMetadataTrack's with @"TimedMetadata+-- Track"@ as @name@.+timedMetadataTrackHandler :: Handler 'TimedMetaDataTrack+timedMetadataTrackHandler =+ namedTimedMetadataTrackHandler "Timed Metadata Track"++-- | Create 'Handler' fields for 'TimedMetadataTrack's, with the given name.+namedTimedMetadataTrackHandler :: T.Text -> Handler 'TimedMetaDataTrack+namedTimedMetadataTrackHandler txt =+ Handler (def :+ def :+ def :+ Custom txt)++-- | Create 'Handler' fields for 'AuxilliaryVideoTrack's with+-- @"AuxilliaryVideoTrack Track"@ as @name@.+auxilliaryVideoTrackHandler :: Handler 'AuxilliaryVideoTrack+auxilliaryVideoTrackHandler =+ namedAuxilliaryVideoTrackHandler "Timed Metadata Track"++-- | Create 'Handler' fields for 'AuxilliaryVideoTrack's, with the given name.+namedAuxilliaryVideoTrackHandler :: T.Text -> Handler 'AuxilliaryVideoTrack+namedAuxilliaryVideoTrackHandler txt =+ Handler (def :+ def :+ def :+ (Custom txt))++instance (KnownSymbol (HandlerTypeCode t)) => IsBox (Handler t)++type instance BoxTypeSymbol (Handler t) = "hdlr"
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/HintMediaHeader.hs view
@@ -0,0 +1,28 @@+-- | Media-independent properties of a hint tracks media content.+module Data.ByteString.IsoBaseFileFormat.Boxes.HintMediaHeader where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields+import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox+import Data.ByteString.IsoBaseFileFormat.Boxes.Handler+import Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader++type instance MediaHeaderFor 'HintTrack = HintMediaHeader++-- | Hint data box.+newtype HintMediaHeader where+ HintMediaHeader+ :: U16 "maxPDUsize"+ :+ U16 "avgPDUsize"+ :+ U16 "maxbitrate"+ :+ U16 "avgbitrate"+ :+ U32 "reserved"+ -> HintMediaHeader+ deriving (Default, IsBoxContent)++-- | Create a hint media header data box.+hintMediaHeader :: HintMediaHeader -> Box (FullBox HintMediaHeader 0)+hintMediaHeader = fullBox 0++instance IsBox HintMediaHeader+type instance BoxTypeSymbol HintMediaHeader = "hmhd"
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/HintSampleEntry.hs view
@@ -0,0 +1,17 @@+{-# LANGUAGE UndecidableInstances #-}+-- | Format of the hint track as well as streaming protocol settings.+module Data.ByteString.IsoBaseFileFormat.Boxes.HintSampleEntry where++import Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry+import Data.ByteString.IsoBaseFileFormat.Boxes.Handler+import Data.ByteString.IsoBaseFileFormat.Boxes.Box++-- | Protocol specific data. To create 'HintSampleEntry's a protocol specific+-- 'HintFields' instance must be provided+data instance SampleEntry 'HintTrack protocol where+ HintSampleEntry+ :: (IsBoxContent (HintFields protocol), Default (HintFields protocol))+ => HintFields protocol -> SampleEntry 'HintTrack protocol++-- | Family of protocol specific contents for 'HintTrack's.+type family HintFields (protocol :: Symbol)
src/Data/ByteString/IsoBaseFileFormat/Boxes/Language.hs view
@@ -2,8 +2,6 @@ module Data.ByteString.IsoBaseFileFormat.Boxes.Language (Language, mkLanguage) where import Data.ByteString.IsoBaseFileFormat.Boxes.Box-import Data.Default-import Data.String -- | A Boxfield contains an ISO 639-2-T alpha-3 language code, which is encoded -- as a single bit followed by three 5 bit words, each representing the
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/MetaDataSampleEntry.hs view
@@ -0,0 +1,110 @@+module Data.ByteString.IsoBaseFileFormat.Boxes.MetaDataSampleEntry where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields+import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox+import Data.ByteString.IsoBaseFileFormat.Boxes.Handler+import Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry+import qualified Data.Text as T+import qualified Data.ByteString as B+import Data.Tagged ()+import Data.Default ()++-- * Generat meta data sample entry++-- | Construct a meta data sample entry box. For every 'MetaDataCoding'+-- a 'SampleEntry' instances must be provided.+metaDataSampleEntry ::+ MetaDataCoding c+ -> U16 "data_reference_index"+ -> SampleEntry 'TimedMetaDataTrack (MetaDataCoding c)+ -> Box (SampleEntry 'TimedMetaDataTrack (MetaDataCoding c))+metaDataSampleEntry _ = sampleEntry++type instance BoxTypeSymbol (MetaDataCoding c) = c++-- | A coproduct of meta data codings (XML, Text, ...)+data family MetaDataCoding (c :: Symbol)++-- * XML Meta Data++-- | The xml meta data samples declaration+newtype instance MetaDataCoding "metx" =+ XMLMetaDataSampleEntry+ ( Tagged "content_encoding" T.Text+ :+ Tagged "namespace" T.Text+ :+ Tagged "schema_location" T.Text+ :+ Maybe (Box BitRate))+ deriving (IsBoxContent, Default)++-- * Text Meta Data++-- | The plain text meta data samples declaration+newtype instance MetaDataCoding "mett" =+ TextMetaDataSampleEntry+ ( Tagged "content_encoding" T.Text+ :+ Tagged "mime_format" T.Text+ :+ Maybe (Box BitRate))+ deriving (IsBoxContent, Default)++-- * URI based meta data++-- | The URI meta data samples declaration+newtype instance MetaDataCoding "urim" =+ UriMetaDataSampleEntry+ ( Tagged "the_label" (Box Uri)+ :+ Tagged "init" (Maybe (Box UriInit))+ :+ Maybe (Box BitRate))+ deriving (IsBoxContent, Default)++-- * Uri Box++-- | Contents of a 'Uri' box.+type Uri = FullBox UriField 0++-- | The URI that's inside the box+newtype UriField =+ UriField (Tagged "theURI" T.Text)+ deriving (Default, IsBoxContent)++-- | Make box with a UTF-8 URI.+uriBox :: T.Text -> Box Uri+uriBox t = fullBox 0 (UriField (Tagged t))++type instance BoxTypeSymbol UriField = "uri "++instance IsBox UriField++-- * Uri-Init Box++-- | Opaque data for the applications processing 'Uri' meta data.+newtype UriInitField =+ UriInitField (Tagged "uri_initialization_data" B.ByteString)+ deriving (Default, IsBoxContent)++-- | A 'FullBox' an UriInitField.+type UriInit = FullBox UriInitField 0++-- | Make box an 'UriInitField'+uriInitBox :: B.ByteString -> Box UriInit+uriInitBox = fullBox 0 . UriInitField . Tagged++type instance BoxTypeSymbol UriInitField = "uriI"++instance IsBox UriInitField++-- * Bit Rate Box++-- | Create a box for bit rates. Every 'SampleEntry' instance for meta data+-- may contain this box at the end.+bitRateBox :: BitRate -> Box BitRate+bitRateBox = Box++-- | Bitrate info for meta data samples+newtype BitRate =+ BitRate (U32 "bufferSizeDB" :+ U32 "maxBitrate" :+ U32 "avgBitrate")+ deriving (Default, IsBoxContent)++type instance BoxTypeSymbol BitRate = "btrt"++instance IsBox BitRate
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/NullMediaHeader.hs view
@@ -0,0 +1,21 @@+-- | Indicate that a tracks media content is /null/ or /dummy/ media.+module Data.ByteString.IsoBaseFileFormat.Boxes.NullMediaHeader where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox++-- | Null header data box.+data NullMediaHeader = NullMediaHeader++-- | Create a null media header data box.+nullMediaHeader :: Box (FullBox NullMediaHeader 0)+nullMediaHeader = fullBox 0 NullMediaHeader++instance IsBox NullMediaHeader+type instance BoxTypeSymbol NullMediaHeader = "nmhd"++instance Default NullMediaHeader where+ def = NullMediaHeader+instance IsBoxContent NullMediaHeader where+ boxSize _ = 0+ boxBuilder _ = mempty
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/SampleDescription.hs view
@@ -0,0 +1,27 @@+-- | Detailed information about the coced, as well as coding specific+-- initialization. Depending on the 'Trak' media type different kinds of sample+-- entry boxes are entailed.+module Data.ByteString.IsoBaseFileFormat.Boxes.SampleDescription where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox+import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields+import Data.Singletons.Prelude.List (Length)++-- | A sample table contains no fieds.+newtype SampleDescription handlerType =+ SampleDescription (U32 "entry_count")+ deriving (Default,IsBoxContent)++-- | Create a hint media header data box.+sampleDescription+ :: (KnownNat (Length ts))+ => Boxes ts+ -> Box (ContainerBox (FullBox (SampleDescription h) 0) ts)+sampleDescription bs =+ containerBox (FullBox 0 $ SampleDescription (typeListLength bs))+ bs++instance IsBox (SampleDescription h)++type instance BoxTypeSymbol (SampleDescription h) = "stsd"
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/SampleEntry.hs view
@@ -0,0 +1,52 @@+{-# LANGUAGE UndecidableInstances #-}+-- | Connect a sample description to a data reference via an index into the data+-- reference entry table.+module Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.Handler+import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields++-- | Specific sample entries must provide an instance for this data family.+-- The @format@ parameter will be used as 'BoxTypeSymbol'.+data family SampleEntry (handlertype :: HandlerType) (format :: k)++-- | Create a 'SampleEntry' 'Box' from the data reference index and the+-- 'HandlerType' specific 'SampleEntry' instance.+sampleEntry+ :: forall (handlertype :: HandlerType) (format :: k)+ . U16 "data_reference_index"+ -> SampleEntry handlertype format+ -> Box (SampleEntry handlertype format)+sampleEntry i c = Box (SampleEntryFields (Constant :+ i :+ c))++-- | A common header for all specific sample entries, the 'BoxContent' of the+-- abstract 'SampleEntry' is @SampleEntryFields (SampleEntry h f)@.+newtype SampleEntryFields a where+ SampleEntryFields+ :: Constant (U8Arr "reserved" 6) '[0,0,0,0,0,0]+ :+ U16 "data_reference_index"+ :+ a+ -> SampleEntryFields a+deriving instance IsBoxContent a => IsBoxContent (SampleEntryFields a)+deriving instance Default a => Default (SampleEntryFields a)++-- | Use this in 'IsMediaFileFormat's 'BoxLayout' to range over any specific+-- 'SampleEntry', disregarding the second parameter (that indicates low-level+-- format, protocol or codec characteristics).+data MatchSampleEntry (handlerType :: HandlerType)++type instance+ IsRuleConform (Box (SampleEntry g' f)) (MatchSampleEntry g) =+ HandlerTypeCode g' == HandlerTypeCode g++-- | The 'BoxTypeSymbol' of sample entry is exactly the @format@ type index of+-- the 'SampleEntry' family.+type instance+ BoxTypeSymbol (SampleEntry handlertype format) = BoxTypeSymbol format++instance (IsBoxContent (SampleEntry handlertype format)+ ,KnownSymbol (BoxTypeSymbol (SampleEntry handlertype format)))+ => IsBox (SampleEntry handlertype format) where+ type BoxContent (SampleEntry handlertype format) =+ SampleEntryFields (SampleEntry handlertype format)
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/SampleTable.hs view
@@ -0,0 +1,19 @@+-- | Time and indexing information for the media samples in a track,a sample+-- table can reference 'DataReference' boxes via a 'SampleTableDescription'.+--+-- **NOTE** A /sample/ referes to a **frame** e.g. a video frame frame or a+-- block of audio samples.+module Data.ByteString.IsoBaseFileFormat.Boxes.SampleTable where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box++-- | A sample table contains no fieds.+data SampleTable = SampleTable++-- | Create a hint media header data box.+sampleTable :: Boxes ts -> Box (ContainerBox SampleTable ts)+sampleTable = containerBox ()++instance IsBox SampleTable where+ type BoxContent SampleTable = ()+type instance BoxTypeSymbol SampleTable = "stbl"
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/SoundMediaHeader.hs view
@@ -0,0 +1,25 @@+-- | Media-independent properties of a tracks sound content.+module Data.ByteString.IsoBaseFileFormat.Boxes.SoundMediaHeader where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields+import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox+import Data.ByteString.IsoBaseFileFormat.Boxes.Handler+import Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader++type instance MediaHeaderFor 'AudioTrack = SoundMediaHeader++-- | Sound header data box.+newtype SoundMediaHeader where+ SoundMediaHeader+ :: Template (I16 "balance") 0+ :+ Constant (U16 "reserved") 0+ -> SoundMediaHeader+ deriving (Default, IsBoxContent)++-- | Create a sound media header data box.+soundMediaHeader :: SoundMediaHeader -> Box (FullBox SoundMediaHeader 0)+soundMediaHeader = fullBox 0++instance IsBox SoundMediaHeader+type instance BoxTypeSymbol SoundMediaHeader = "smhd"
src/Data/ByteString/IsoBaseFileFormat/Boxes/SpecificMediaHeader.hs view
@@ -1,79 +1,11 @@--- | Media-independent properties of a tracks media content.+-- | Select the specific media header from the 'HandlerType' module Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader where -import Data.ByteString.IsoBaseFileFormat.Boxes.Box-import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields-import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox-import Data.Default---- * Videos---- | Video header data box.-newtype VideoMediaHeader where- VideoMediaHeader- :: Template (U16 "graphicsmode") 0- :+ Template (U16Arr "opcolor" 3) '[0,0,0]- -> VideoMediaHeader- deriving (Default, IsBoxContent)---- | Create a video media header data box.-videoMediaHeader :: VideoMediaHeader -> Box (FullBox VideoMediaHeader 0)-videoMediaHeader = fullBox 1--instance IsBox VideoMediaHeader-type instance BoxTypeSymbol VideoMediaHeader = "vmhd"---- * Sounds---- | Sound header data box.-newtype SoundMediaHeader where- SoundMediaHeader- :: Template (I16 "balance") 0- :+ Constant (U16 "reserved") 0- -> SoundMediaHeader- deriving (Default, IsBoxContent)---- | Create a sound media header data box.-soundMediaHeader :: SoundMediaHeader -> Box (FullBox SoundMediaHeader 0)-soundMediaHeader = fullBox 0--instance IsBox SoundMediaHeader-type instance BoxTypeSymbol SoundMediaHeader = "smhd"---- * Hints---- | Hint data box.-newtype HintMediaHeader where- HintMediaHeader- :: U16 "maxPDUsize"- :+ U16 "avgPDUsize"- :+ U16 "maxbitrate"- :+ U16 "avgbitrate"- :+ U32 "reserved"- -> HintMediaHeader- deriving (Default, IsBoxContent)---- | Create a hint media header data box.-hintMediaHeader :: HintMediaHeader -> Box (FullBox HintMediaHeader 0)-hintMediaHeader = fullBox 0--instance IsBox HintMediaHeader-type instance BoxTypeSymbol HintMediaHeader = "hmhd"---- * Dummy/Null media---- | Null header data box.-data NullMediaHeader = NullMediaHeader---- | Create a null media header data box.-nullMediaHeader :: Box (FullBox NullMediaHeader 0)-nullMediaHeader = fullBox 0 NullMediaHeader--instance IsBox NullMediaHeader-type instance BoxTypeSymbol NullMediaHeader = "nmhd"+--+-- import Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader+import Data.ByteString.IsoBaseFileFormat.Boxes.Handler+-- -instance Default NullMediaHeader where- def = NullMediaHeader-instance IsBoxContent NullMediaHeader where- boxSize _ = 0- boxBuilder _ = mempty+-- | An open type family to select the specific media header from the+-- 'HandlerType'+type family MediaHeaderFor (t :: HandlerType)
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/TimeToSample.hs view
@@ -0,0 +1,27 @@+-- | A table assigns each video frame or audio sample block, this is useful for+-- seeking in complex media files.+module Data.ByteString.IsoBaseFileFormat.Boxes.TimeToSample where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox+import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields++-- | An alias for the box content type.+type TimeToSample = FullBox TimeToSampleTable 0++-- | Define an entry of the compact table, that specifes the namber of samples+-- with the same time delta. (All this to help random seeking in media).+type SttsEntry = U32 "sample_count" :+ U32 "sample_delta"++-- | A compact table to map decoding time to sample number.+newtype TimeToSampleTable =+ TimeToSampleTable (ListContent (U32 "entry_count") SttsEntry)+ deriving (Default, IsBoxContent)++-- | Create a hint media header data box.+timeToSample :: [SttsEntry] -> Box TimeToSample+timeToSample = fullBox 0 . TimeToSampleTable . ListContent++instance IsBox TimeToSampleTable++type instance BoxTypeSymbol TimeToSampleTable = "stts"
src/Data/ByteString/IsoBaseFileFormat/Boxes/Versioned.hs view
@@ -1,14 +1,13 @@ {-# LANGUAGE UndecidableInstances #-} -- | A binary version 0/1 field with seperate content for each version. module Data.ByteString.IsoBaseFileFormat.Boxes.Versioned- (Versioned(..), ApplyVersioned(..), SelectByVersion)+ (Versioned(..)) where import Data.ByteString.IsoBaseFileFormat.Boxes.Box-import Data.Default-import Data.Kind-import Data.Singletons +-- TODO rewrite/cleanup the versioned mess+ -- | Two alternative representations based on a /version/ index. -- Use this for box content that can be either 32 or 64 bit. data Versioned v0 v1 (version :: Nat) where@@ -23,39 +22,3 @@ boxSize (V1 c) = boxSize c boxBuilder (V0 c) = boxBuilder c boxBuilder (V1 c) = boxBuilder c--data VersionedBox c where- BoxV0 :: forall (v :: Nat -> Type). IsBoxContent (v 0) => v 0 -> VersionedBox v- BoxV1 :: forall (v :: Nat -> Type). IsBoxContent (v 1) => v 1 -> VersionedBox v--instance (IsBoxContent (b 0), Default (b 0)) => Default (VersionedBox b) where- def = BoxV0 def--instance IsBoxContent (VersionedBox c) where- boxSize (BoxV0 c) = boxSize c- boxSize (BoxV1 c) = boxSize c- boxBuilder (BoxV0 c) = boxBuilder c- boxBuilder (BoxV1 c) = boxBuilder c---- * Versions based on type level arrows---- | Two alternative representations based on a /version/ index.--- Use this for box content that can be either 32 or 64 bit.-data ApplyVersioned (v' :: Nat ~> Type) where- OnV0 :: forall (v :: Nat ~> Type). IsBoxContent (v @@ 0) => v @@ 0 -> ApplyVersioned v- OnV1 :: forall (v :: Nat ~> Type). IsBoxContent (v @@ 1) => v @@ 1 -> ApplyVersioned v--instance (IsBoxContent (b @@ 0), Default (b @@ 0)) => Default (ApplyVersioned b) where- def = OnV0 def--instance IsBoxContent (ApplyVersioned c) where- boxSize (OnV0 c) = boxSize c- boxSize (OnV1 c) = boxSize c- boxBuilder (OnV0 c) = boxBuilder c- boxBuilder (OnV1 c) = boxBuilder c---- | A type level arrow that applys the type constructor to one of the two--- versions depending on the /version/ parameter.-data SelectByVersion :: (a -> Type) -> a -> a -> Nat ~> Type-type instance Apply (SelectByVersion f v0 v1) 0 = f v0-type instance Apply (SelectByVersion f v0 v1) 1 = f v1
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/VideoMediaHeader.hs view
@@ -0,0 +1,25 @@+-- | Media-independent properties of a tracks video content.+module Data.ByteString.IsoBaseFileFormat.Boxes.VideoMediaHeader where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields+import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox+import Data.ByteString.IsoBaseFileFormat.Boxes.Handler+import Data.ByteString.IsoBaseFileFormat.Boxes.SpecificMediaHeader++type instance MediaHeaderFor 'VideoTrack = VideoMediaHeader++-- | Video header data box.+newtype VideoMediaHeader where+ VideoMediaHeader+ :: Template (U16 "graphicsmode") 0+ :+ Template (U16Arr "opcolor" 3) '[0,0,0]+ -> VideoMediaHeader+ deriving (Default, IsBoxContent)++-- | Create a video media header data box.+videoMediaHeader :: VideoMediaHeader -> Box (FullBox VideoMediaHeader 0)+videoMediaHeader = fullBox 1++instance IsBox VideoMediaHeader+type instance BoxTypeSymbol VideoMediaHeader = "vmhd"
+ src/Data/ByteString/IsoBaseFileFormat/Boxes/VisualSampleEntry.hs view
@@ -0,0 +1,184 @@+{-# LANGUAGE UndecidableInstances #-}+-- | Detailed visual sample description.+module Data.ByteString.IsoBaseFileFormat.Boxes.VisualSampleEntry where++import Data.ByteString.IsoBaseFileFormat.Boxes.Box+import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields+import Data.ByteString.IsoBaseFileFormat.Boxes.Handler+import Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry+import qualified Data.Text as T++-- | Construct a visual sample entry box+visualSampleEntry ::+ (KnownSymbol+ (BoxTypeSymbol (SampleEntry 'VideoTrack (VideoCoding codec))))+ => VideoCoding codec+ -> U16 "data_reference_index"+ -> SampleEntry 'VideoTrack (VideoCoding codec)+ -> Box (SampleEntry 'VideoTrack (VideoCoding codec))+visualSampleEntry _ = sampleEntry++-- | Fields if visual sample entries.+-- A @depth@ of 0x0018 means colour image with no alpha.+-- The @horizresolution@ and @vertresolution@ of 0x00480000 means 72 dpi.+-- The @frame_count@ indicates the number of video frames per sample.+newtype instance SampleEntry 'VideoTrack (VideoCoding c) where+ VideoSampleEntry+ :: U16 "pre_defined"+ :+ Constant (U16 "reserved") 0+ :+ U16 "width"+ :+ U16 "height"+ :+ Template (U32 "horizresolution") 0x00480000 -- TODO fix point+ :+ Template (U32 "vertresolution") 0x00480000 -- TODO fix point+ :+ Constant (U32 "reserved") 0+ :+ Template (U16 "frame_count") 1+ :+ FixSizeText 32 "compressorname"+ :+ Template (U16 "depth") 0x0018+ :+ Template (I16 "pre_defined") 65535+ :+ Maybe (Box CleanAperture)+ :+ Maybe (Box PixelAspectRatio)+ :+ [Box SomeColourInformation]+ -> SampleEntry 'VideoTrack (VideoCoding c)+ deriving (IsBoxContent, Default)++instance IsBoxContent [Box SomeColourInformation] where+ boxSize = sum . fmap boxSize+ boxBuilder = fold . fmap boxBuilder++-- | A coproduct of video codec types+data family VideoCoding (c :: Symbol)++-- | Simple default MPEG-4 video+data instance VideoCoding "mp4v" = Mpeg4Avc++type instance BoxTypeSymbol (VideoCoding c) = c++-- * Clean Aperture sub box++-- | Construct a 'CleanAperture' (sub-) 'Box'+cleanAperture :: CleanAperture -> Box CleanAperture+cleanAperture = Box++-- | The clean aperture settings+newtype CleanAperture where+ CleanAperture+ :: U32 "cleanApertureWidthN"+ :+ U32 "cleanApertureWidthD"+ :+ U32 "cleanApertureHeightN"+ :+ U32 "cleanApertureHeightD"+ :+ U32 "horizOffN"+ :+ U32 "horizOffD"+ :+ U32 "vertOffN"+ :+ U32 "vertOffD"+ -> CleanAperture+ deriving (Default, IsBoxContent)++type instance BoxTypeSymbol CleanAperture = "clap"+instance IsBox CleanAperture++-- * Pixel aspect ratio sub box++-- | Construct a 'PixelAspectRatio' (sub-) 'Box'+pixelAspectRatio :: PixelAspectRatio -> Box PixelAspectRatio+pixelAspectRatio = Box++-- | The pixel aspect ratio.+newtype PixelAspectRatio where+ PixelAspectRatio+ :: U32 "hSpacing"+ :+ U32 "vSpacing"+ -> PixelAspectRatio+ deriving (Default, IsBoxContent)++type instance BoxTypeSymbol PixelAspectRatio = "pasp"+instance IsBox PixelAspectRatio++-- * Colour information sub box++-- | Construct a 'ColourInformation' (sub-) 'Box'+colourInformation+ :: ColourType p -> ColourInformation p+colourInformation = ColourInformation . (Constant :+)++-- | Construct a 'ColourInformation' (sub-) 'Box' from 'OnScreenColours'+onScreenColourInformation+ :: ColourType 'OnScreenColours -> ColourInformation 'OnScreenColours+onScreenColourInformation = colourInformation++-- | Construct a 'ColourInformation' (sub-) 'Box' from 'RestrictedICCProfile'+restrictedICCProfileColourInformation+ :: ColourType 'RestrictedICCProfile -> ColourInformation 'RestrictedICCProfile+restrictedICCProfileColourInformation = colourInformation++-- | Construct a 'ColourInformation' (sub-) 'Box' from 'UnrestrictedICCProfile'+unrestrictedICCProfileColourInformation+ :: ColourType 'UnrestrictedICCProfile -> ColourInformation 'UnrestrictedICCProfile+unrestrictedICCProfileColourInformation = colourInformation++type instance BoxTypeSymbol SomeColourInformation = "pasp"+instance IsBox SomeColourInformation++-- | A wrapper that hides the concrete 'ColourTypeProfile' of a+-- 'ColourInformation'.+data SomeColourInformation where+ SomeColourInformation+ :: forall (profile :: ColourTypeProfile)+ . IsBoxContent (ColourInformation profile)+ => ColourInformation profile+ -> SomeColourInformation+instance IsBoxContent SomeColourInformation where+ boxSize (SomeColourInformation c) = boxSize c+ boxBuilder (SomeColourInformation c) = boxBuilder c++-- | Profile dependent colour information+newtype ColourInformation (profile :: ColourTypeProfile) where+ ColourInformation+ :: Constant (U32Text "colour_type") (ColourTypeCode profile)+ :+ ColourType profile+ -> ColourInformation profile++deriving instance+ (Default (ColourType profile))+ => Default (ColourInformation profile)+deriving instance+ (KnownSymbol (ColourTypeCode profile),IsBoxContent (ColourType profile))+ => IsBoxContent (ColourInformation profile)++-- | Colour type profiles+data ColourTypeProfile =+ -- | PTM_COLOR_INFO from A.7.2 of ISO/IEC 29199-2, mind the full range flag.+ OnScreenColours |+ -- | A restricted ICC.1 (2010) profile+ RestrictedICCProfile |+ -- | An unrestricted IEC ISO-15076 part 1, ICC.1 (2010) profile+ UnrestrictedICCProfile++-- | Profile dependent colour information family+type family+ ColourType (p :: ColourTypeProfile) where+ ColourType 'OnScreenColours =+ U16 "colour_primaries"+ :+ U16 "transfer_characteristics"+ :+ U16 "matrix_coefficients"+ :+ FullRangeFlag+ ColourType 'RestrictedICCProfile =+ T.Text -- TODO+ ColourType 'UnrestrictedICCProfile =+ T.Text -- TODO++-- | The full range flag, note the different bit layout compared to+-- PTM_COLOR_INFO in ISO 29199-2.+data FullRangeFlag = IsFullRange | IsNotFullRange+instance IsBoxContent FullRangeFlag where+ boxSize _ = 1+ boxBuilder IsFullRange = word8 128+ boxBuilder IsNotFullRange = word8 0+instance Default FullRangeFlag where+ def = IsFullRange++-- | Return the color type four letter code for a 'ColourTypeProfile'.+type family+ ColourTypeCode (p :: ColourTypeProfile) :: Symbol where+ ColourTypeCode 'OnScreenColours = "nclx"+ ColourTypeCode 'RestrictedICCProfile = "rICC"+ ColourTypeCode 'UnrestrictedICCProfile = "prof"
src/Data/ByteString/IsoBaseFileFormat/Brands/Dash.hs view
@@ -4,14 +4,12 @@ -- educational, current need. -- This is a convenient way of building documents of that kind. module Data.ByteString.IsoBaseFileFormat.Brands.Dash- (Dash, SingleAudioTrackInit(..), mkSingleTrackInit, module X) where+ (Dash, SingleAudioTrackInit(..), mkSingleTrackInit, module X)+ where import Data.ByteString.IsoBaseFileFormat.Brands.Types import Data.ByteString.IsoBaseFileFormat.Boxes as X hiding (All) import Data.Kind (Type, Constraint)-import Control.Lens-import Data.Promotion.Prelude.List-import Data.Singletons -- | A phantom type to indicate this branding. Version can be 0 or 1 it is used -- in some boxes to switch between 32/64 bits.@@ -23,61 +21,54 @@ -- | A 'BoxLayout' which contains the stuff needed for the 'dash' brand. -- TODO incomplete-instance IsBrand (Dash v) where+instance IsMediaFileFormat (Dash v) where type BoxLayout (Dash v) = Boxes- '[ OM_ FileType+ '[ OM_ FileType , OM Movie '[ OM_ (MovieHeader v)- , SM Track- '[ OM_ (TrackHeader v)- , OM Media- '[ OM_ (MediaHeader v)- , OM_ Handler- , OM MediaInformation- '[ OneOf '[ OM_ VideoMediaHeader- , OM_ SoundMediaHeader- , OM_ HintMediaHeader- , OM_ NullMediaHeader]- , OM DataInformation- '[ OM DataReference- '[ OneOf '[ OM_ DataEntryUrl- , OM_ DataEntryUrn]- , SomeOptionalX- (OneOf '[ OM_ DataEntryUrl- , OM_ DataEntryUrn])]]- -- , OM (SampleTable v) -- TODO- -- '[ OM_ (SampleDescriptions v)- -- , OM_ (TimeToSample v)- -- , OM_ (SampleToChunk v)- -- , OO_ (SampleSizes v)- -- , OM_ (SampleChunkOffset v)- -- ]- ]- ]- ]+ , SomeMandatoryX+ (OneOf '[ TrackLayout v 'VideoTrack+ , TrackLayout v 'AudioTrack+ , TrackLayout v 'HintTrack+ , TrackLayout v 'TimedMetaDataTrack+ , TrackLayout v 'AuxilliaryVideoTrack]) ] , SO_ Skip ] +type TrackLayout version handlerType =+ (ContainerBox Track+ '[ OM_ (TrackHeader version)+ , OM Media+ '[ OM_ (MediaHeader version)+ , OM_ (Handler handlerType)+ , OM MediaInformation+ '[ OneOf '[ OM_ (MediaHeaderFor handlerType)+ , OM_ NullMediaHeader]+ , OM DataInformation+ '[ OM DataReference+ '[ SomeMandatoryX+ (OneOf '[ OM_ DataEntryUrl+ , OM_ DataEntryUrn])]]+ , OM SampleTable+ '[ OM (SampleDescription handlerType)+ '[ SomeMandatoryX (MatchSampleEntry handlerType) ]+ , OM_ TimeToSample+ -- , OM_ (SampleToChunk version)+ -- , OO_ (SampleSizes version)+ -- , OM_ (SampleChunkOffset version)+ ]+ ]+ ]+ ])++ -- Missing Boxes--- START 17:47:--- mdia--- mdhd--- hdlr--- minf--- smhd--- dinf--- dref--- ??url--- stbl--- stsd -- stts -- stsc -- stsz -- stco--- soun--- mp4a -- esds -- mvex -- trex@@ -90,23 +81,29 @@ -- trun -- | A record which contains the stuff needed for a single track initialization -- document according to the 'Dash' brand. TODO incomplete+-- TODO take this out into its own module, make a new package for specific file formats data SingleAudioTrackInit =- SingleAudioTrackInit {_mvhd :: MovieHeader 0- ,_tkhd :: TrackHeader 0- ,_mdhd :: MediaHeader 0- ,_hdlr :: Handler- ,_smhd :: SoundMediaHeader}--makeLenses ''SingleAudioTrackInit+ SingleAudioTrackInit {mvhd :: MovieHeader 0+ ,tkhd :: TrackHeader 0+ ,mdhd :: MediaHeader 0+ ,hdlr :: Handler 'AudioTrack+ ,smhd :: SoundMediaHeader} -- | Convert a 'SingleAudioTrackInit' record to a generic 'Boxes' collection. mkSingleTrackInit :: SingleAudioTrackInit -> Builder mkSingleTrackInit doc = mediaBuilder dash $- fileTypeBox (FileType "dash" 0 ["isom","iso5","mp42"])- :|- movie (movieHeader (doc ^. mvhd) :|- track (trackHeader (doc ^. tkhd) :|- media (mediaHeader (doc ^. mdhd) :. handler (doc ^. hdlr) :|- mediaInformation- (soundMediaHeader (doc ^. smhd) :| dataInformation $: localMediaDataReference ))))+ fileTypeBox (FileType "dash" 0 ["isom","iso5","mp42"])+ :| movie+ ( movieHeader (mvhd doc)+ :| track+ ( trackHeader (tkhd doc)+ :| media+ ( mediaHeader (mdhd doc)+ :. handler (hdlr doc)+ :| mediaInformation+ ( soundMediaHeader (smhd doc)+ :. (dataInformation $: localMediaDataReference)+ :| sampleTable+ ((sampleDescription $: audioSampleEntry Mpeg4Aac 1 def)+ :| timeToSample [] )))))
src/Data/ByteString/IsoBaseFileFormat/Brands/Types.hs view
@@ -5,9 +5,10 @@ import Data.ByteString.IsoBaseFileFormat.Boxes.Box import Data.ByteString.IsoBaseFileFormat.Util.TypeLayout () +-- TODO move this to general module merge with Box.hs -- | A class that describes (on the type level) how a box can be nested into -- other boxes (see 'Boxes).-class IsBrand brand where+class IsMediaFileFormat brand where -- | The layout that an IsBoxContent instance has to have, before 'packMedia' accepts it type BoxLayout brand mediaBuilder
+ src/Data/ByteString/IsoBaseFileFormat/Util/BitRecords.hs view
@@ -0,0 +1,214 @@+{-# LANGUAGE UndecidableInstances #-}+module Data.ByteString.IsoBaseFileFormat.Util.BitRecords where++import Data.Kind+import Data.Word+import Data.Type.Bool+import GHC.TypeLits+import Data.Bits+import Data.Proxy+import Test.TypeSpecCrazy++data Field :: Nat -> Type+data (:=>) :: k -> Type -> Type+data (:*:) :: Type -> Type -> Type+type FieldPosition = (Nat, Nat)++type Flag = Field 1++infixr 6 :=>+infixl 5 :*:++-- nested fields+data (:/) :: Symbol -> k -> Type+infixr 7 :/+++type family+ GetFieldSize (f :: l) :: Nat where+ GetFieldSize (label :=> f) = GetFieldSize f+ GetFieldSize (Field n ) = n+ GetFieldSize (l :*: r) = GetFieldSize l + GetFieldSize r++type family+ HasField (f :: fk) (l :: lk) :: Bool where+ HasField (l :=> f) l = 'True+ HasField (l :=> f) (l :/ p) = HasField f p+ HasField (f1 :*: f2) l = HasField f1 l || HasField f2 l+ HasField f l = 'False++type family+ HasFieldConstraint (label :: lk) (field :: fk) :: Constraint where+ HasFieldConstraint l f =+ If (HasField f l)+ (HasField f l ~ 'True)+ (TypeError ('Text "Label not found: '"+ ':<>: 'ShowType l+ ':<>: 'Text "' in:"+ ':$$: 'ShowType f ))++type family+ FocusOn (l :: lk) (f :: fk) :: Result fk where+ FocusOn l f =+ If (HasField f l)+ ('Right (FocusOnUnsafe l f))+ ('Left ('Text "Label not found. Cannot focus '"+ ':<>: 'ShowType l+ ':<>: 'Text "' in:"+ ':$$: 'ShowType f ))++type family+ FocusOnUnsafe (l :: lk) (f :: fk) :: fk where+ FocusOnUnsafe l (l :=> f) = f+ FocusOnUnsafe (l :/ p) (l :=> f) = FocusOnUnsafe p f+ FocusOnUnsafe l (f :*: f') = FocusOnUnsafe l (If (HasField f l) f f')++-- field location and access++type family+ GetFieldPosition (f :: field) (l :: label) :: Result FieldPosition where+ GetFieldPosition f l =+ If (HasField f l)+ ('Right (GetFieldPositionUnsafe f l))+ ('Left ('Text "Label not found. Cannot get bit range for '"+ ':<>: 'ShowType l+ ':<>: 'Text "' in:"+ ':$$: 'ShowType f ))++type family+ GetFieldPositionUnsafe (f :: field) (l :: label) :: FieldPosition where+ GetFieldPositionUnsafe (l :=> f) l = '(0, GetFieldSize f - 1)+ GetFieldPositionUnsafe (l :=> f) (l :/ p) = GetFieldPositionUnsafe f p+ GetFieldPositionUnsafe (f :*: f') l =+ If (HasField f l)+ (GetFieldPositionUnsafe f l)+ (AddToFieldPosition (GetFieldSize f) (GetFieldPositionUnsafe f' l))++type family+ AddToFieldPosition (v :: Nat) (e :: (Nat, Nat)) :: (Nat, Nat) where+ AddToFieldPosition v '(a,b) = '(a + v, b + v)++type family+ IsFieldPostition (pos :: FieldPosition) :: Constraint where+ IsFieldPostition '(a, b) =+ If (a <=? b)+ (a <= b, KnownNat a, KnownNat b)+ (TypeError+ ('Text "Bad field position: " ':<>: 'ShowType '(a,b)+ ':$$: 'Text "First index greater than last: "+ ':<>: 'ShowType a+ ':<>: 'Text " > "+ ':<>: 'ShowType b ))++type family+ FieldPostitionToList (pos :: FieldPosition) :: [Nat] where+ FieldPostitionToList '(a, a) = '[a]+ FieldPostitionToList '(a, b) = (a ': (FieldPostitionToList '(a+1, b)))++type family+ AlignField (a :: Nat) (f :: field) :: Result field where+ AlignField 0 f = 'Left ('Text "Invalid alignment of 0")+ AlignField a f = 'Right (AddPadding ((a - (GetFieldSize f `Rem` a)) `Rem` a) f)++type family+ AddPadding (n :: Nat) (f :: field) :: field where+ AddPadding 0 f = f+ AddPadding n f = f :*: Field n++-- | Get the remainder of the integer division of x and y, such that @forall x+-- y. exists k. (Rem x y) == x - y * k@ The algorithm is: count down x+-- until zero, incrementing the accumulator at each step. Whenever the+-- accumulator is equal to y set it to zero.+--+-- If the accumulator has reached y reset it. It is important to do this+-- BEFORE checking if x == y and then returning the accumulator, for the case+-- where x = k * y with k > 0. For example:+--+-- @+-- 6 `Rem` 3 = RemImpl 6 3 0+-- RemImpl 6 3 0 = RemImpl (6-1) 3 (0+1) -- RemImpl Clause 4+-- RemImpl 5 3 1 = RemImpl (5-1) 3 (1+1) -- RemImpl Clause 4+-- RemImpl 4 3 2 = RemImpl (4-1) 3 (2+1) -- RemImpl Clause 4+-- RemImpl 3 3 3 = RemImpl 3 3 0 -- RemImpl Clause 2 !!!+-- RemImpl 3 3 0 = 0 -- RemImpl Clause 3 !!!+-- @+--+type Rem (x :: Nat) (y :: Nat) = RemImpl x y 0+type family+ RemImpl (x :: Nat) (y :: nat) (acc :: Nat) :: Nat where+ -- finished if x was < y:+ RemImpl 0 y acc = acc+ RemImpl x y y = RemImpl x y 0+ -- finished if x was >= y:+ RemImpl y y acc = acc+ -- the base case+ RemImpl x y acc = RemImpl (x - 1) y (acc + 1)++getFlag+ :: forall a (path :: k) (first :: Nat) field p1 p2+ . ( IsFieldC path field first first+ , Bits a )+ => p1 path -> p2 field -> a -> Bool+getFlag _ _ a = testBit a pos+ where pos = fromIntegral $ natVal (Proxy :: Proxy first)++setFlag+ :: forall a (path :: k) (first :: Nat) field p1 p2+ . ( IsFieldC path field first first+ , Bits a )+ => p1 path -> p2 field -> Bool -> a -> a+setFlag _ _ v a = modifyBit a pos+ where pos = fromIntegral $ natVal (Proxy :: Proxy first)+ modifyBit = if v then setBit else clearBit++getField+ :: forall a b (path :: k) (first :: Nat) (last :: Nat) field pxy1 pxy2+ . ( IsFieldC path field first last+ , Integral a+ , Bits a+ , Num b)+ => pxy1 path -> pxy2 field -> a -> b+getField _ _ a = fromIntegral ((a `shiftR` posFirst) .&. bitMask)+ where+ bitMask =+ let bitCount = 1 + posLast - posFirst+ in (2 ^ bitCount) - 1+ posFirst = fromIntegral $ natVal (Proxy :: Proxy first)+ posLast = fromIntegral $ natVal (Proxy :: Proxy last)++setField+ :: forall a b (path :: k) (first :: Nat) (last :: Nat) field pxy1 pxy2+ . ( IsFieldC path field first last+ , Num a+ , Bits a+ , Integral b)+ => pxy1 path -> pxy2 field -> b -> a -> a+setField _ _ v x = (x .&. bitMaskField) .|. (v' `shiftL` posFirst)+ where+ v' = bitMaskValue .&. fromIntegral v+ bitMaskField = complement (bitMaskValue `shiftL` posFirst)+ bitMaskValue =+ let bitCount = 1 + posLast - posFirst+ in (2 ^ bitCount) - 1+ posFirst = fromIntegral $ natVal (Proxy :: Proxy first)+ posLast = fromIntegral $ natVal (Proxy :: Proxy last)++++type Foo =+ "foo" :=> Flag+ :*: Field 4+ :*: "bar" :=> Field 2+ :*: Field 4+ :*: "baz" :=> Field 17++type IsFieldC name field first last =+ ( name `HasFieldConstraint` field+ , KnownNat first+ , KnownNat last+ , 'Right '(first, last) ~ (GetFieldPosition field name)+ )++getFooField :: IsFieldC name Foo first last+ => proxy name -> Word64 -> Word64+getFooField px = getField px (Proxy :: Proxy Foo)
+ stack.yaml view
@@ -0,0 +1,70 @@+# This file was automatically generated by 'stack init'+#+# Some commonly used options have been documented as comments in this file.+# For advanced use and comprehensive documentation of the format, please see:+# http://docs.haskellstack.org/en/stable/yaml_configuration/++# Resolver to choose a 'specific' stackage snapshot or a compiler version.+# A snapshot resolver dictates the compiler version and the set of packages+# to be used for project dependencies. For example:+#+# resolver: lts-3.5+# resolver: nightly-2015-09-21+# resolver: ghc-7.10.2+# resolver: ghcjs-0.1.0_ghc-7.10.2+# resolver:+# name: custom-snapshot+# location: "./custom-snapshot.yaml"+resolver: nightly-2016-07-30++# User packages to be built.+# Various formats can be used as shown in the example below.+#+# packages:+# - some-directory+# - https://example.com/foo/bar/baz-0.0.2.tar.gz+# - location:+# git: https://github.com/commercialhaskell/stack.git+# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a+# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a+# extra-dep: true+# subdirs:+# - auto-update+# - wai+#+# A package marked 'extra-dep: true' will only be built if demanded by a+# non-dependency (i.e. a user package), and its test suites and benchmarks+# will not be run. This is useful for tweaking upstream packages.+packages:+- '.'++# Dependency packages to be pulled from upstream that are not in the resolver+# (e.g., acme-missiles-0.3)+extra-deps:+- vector-sized-0.3.2.0+- show-type-0.1.1+- type-spec-0.2.0.0++# Override default flag values for local packages and extra-deps+flags: {}++# Extra package databases containing global packages+extra-package-dbs: []++# Control whether we use the GHC we find on the path+# system-ghc: true+#+# Require a specific version of stack, using version ranges+# require-stack-version: -any # Default+# require-stack-version: ">=1.1"+#+# Override the architecture used by stack, especially useful on Windows+# arch: i386+# arch: x86_64+#+# Extra directories used by stack for building+# extra-include-dirs: [/path/to/dir]+# extra-lib-dirs: [/path/to/dir]+#+# Allow a newer minor version of GHC than the snapshot specifies+# compiler-check: newer-minor