From 47c680c62246594107da0a8995c953dfb8040bce Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Fri, 27 Dec 2013 16:13:22 -0800 Subject: AAC Decoder: support 6.1/7.1 decoded as 5.1 - Add 6.1 and 7.1 channel support including downmixer. Per default the decoder creates a 5.1 channel output for all streams with more than six encoded channels. Modified file(s): libPCMutils/include/pcmutils_lib.h libPCMutils/src/pcmutils_lib.cpp libAACdec/include/aacdecoder_lib.h libAACdec/src/aac_rom.h libAACdec/src/aacdecoder.cpp libAACdec/src/aac_ram.cpp libAACdec/src/aacdec_drc.cpp libAACdec/src/aacdecoder_lib.cpp libAACdec/src/aac_rom.cpp libAACdec/src/aacdecoder.h libSBRdec/include/sbrdecoder.h libSBRdec/src/sbrdec_drc.h libSBRdec/src/sbrdecoder.cpp libSBRdec/src/sbr_ram.cpp libSBRdec/src/sbr_ram.h libMpegTPDec/include/tp_data.h libMpegTPDec/include/tpdec_lib.h libMpegTPDec/src/version libMpegTPDec/src/tpdec_asc.cpp libMpegTPEnc/include/tp_data.h libMpegTPEnc/src/version libSYS/include/FDK_audio.h libSYS/src/genericStds.cpp - Fix error concealment modules fade-out/in mechanism. Modified file(s): libAACdec/src/conceal.cpp Bug 9428126 Change-Id: I3230bd2072314b730911cd7ec1740e290cb1d254 --- libPCMutils/src/pcmutils_lib.cpp | 2254 +++++++++++++++++++++++++++++--------- 1 file changed, 1737 insertions(+), 517 deletions(-) (limited to 'libPCMutils/src/pcmutils_lib.cpp') diff --git a/libPCMutils/src/pcmutils_lib.cpp b/libPCMutils/src/pcmutils_lib.cpp index a84a050..bd291d7 100644 --- a/libPCMutils/src/pcmutils_lib.cpp +++ b/libPCMutils/src/pcmutils_lib.cpp @@ -84,8 +84,8 @@ amm-info@iis.fraunhofer.de /**************************** FDK PCM utils module ************************** Author(s): Christian Griebel - Description: Defines functions to interface with the PCM post processing - module. + Description: Defines functions that perform downmixing or a simple channel + expansion in the PCM time domain. *******************************************************************************/ @@ -93,21 +93,66 @@ amm-info@iis.fraunhofer.de #include "genericStds.h" #include "fixpoint_math.h" +#include "FDK_core.h" + + +/* ------------------------ * + * GLOBAL SETTINGS (GFR): * + * ------------------------ */ +#define DSE_METADATA_ENABLE /*!< Enable this to support MPEG/ETSI DVB ancillary data for + encoder assisted downmixing of MPEG-4 AAC and + MPEG-1/2 layer 2 streams. */ +#define PCE_METADATA_ENABLE /*!< Enable this to support MPEG matrix mixdown with a + coefficient carried in the PCE. */ + +#define PCM_DMX_MAX_IN_CHANNELS ( 8 ) /* Neither the maximum number of input nor the maximum number of output channels ... */ +#define PCM_DMX_MAX_OUT_CHANNELS ( 8 ) /* ... must exceed the maximum number of channels that the framework can handle. */ + +/* ------------------------ * + * SPECIFIC SETTINGS: * + * ------------------------ */ +#define PCM_CHANNEL_EXTENSION_ENABLE /*!< Allow module to duplicate mono signals or add zero channels to achieve the + desired number of output channels. */ + +#define PCM_DMX_DFLT_MAX_OUT_CHANNELS ( 6 ) /*!< The maximum number of output channels. If the value is greater than 0 the module + will automatically create a mixdown for all input signals with more channels + than specified. */ +#define PCM_DMX_DFLT_MIN_OUT_CHANNELS ( 0 ) /*!< The minimum number of output channels. If the value is greater than 0 the module + will do channel extension automatically for all input signals with less channels + than specified. */ +#define PCM_DMX_MAX_DELAY_FRAMES ( 1 ) /*!< The maximum delay frames to align the bitstreams payload with the PCM output. */ +#define PCM_DMX_DFLT_EXPIRY_FRAME ( 50 ) /*!< If value is greater than 0 the mixdown coefficients will expire by default after the + given number of frames. The value 50 corresponds to at least 500ms (FL 960 @ 96kHz) */ +/* #define PCMDMX_DEBUG */ + +/* Derived setting: + * No need to edit beyond this line. */ +#if defined(DSE_METADATA_ENABLE) || defined(PCE_METADATA_ENABLE) || defined(ARIB_MIXDOWN_ENABLE) + #define PCM_DOWNMIX_ENABLE /*!< Generally enable down mixing. */ +#endif +#if (PCM_DMX_MAX_IN_CHANNELS > 2) || (PCM_DMX_MAX_OUT_CHANNELS > 2) + #define PCM_DMX_MAX_CHANNELS ( 8 ) + #define PCM_DMX_MAX_CHANNEL_GROUPS ( 4 ) + #define PCM_DMX_MAX_CHANNELS_PER_GROUP PCM_DMX_MAX_CHANNELS /* All channels can be in one group */ +#else + #define PCM_DMX_MAX_CHANNELS ( 3 ) /* Need to add 1 because there are three channel positions in first channel group. */ + #define PCM_DMX_MAX_CHANNEL_GROUPS ( 1 ) /* Only front channels supported. */ + #define PCM_DMX_MAX_CHANNELS_PER_GROUP ( 2 ) /* The maximum over all channel groups */ +#endif +#if (PCM_DMX_MAX_IN_CHANNELS > PCM_DMX_MAX_OUT_CHANNELS) + #define PCM_DMX_MAX_IO_CHANNELS PCM_DMX_MAX_IN_CHANNELS +#else + #define PCM_DMX_MAX_IO_CHANNELS PCM_DMX_MAX_OUT_CHANNELS +#endif /* Decoder library info */ #define PCMDMX_LIB_VL0 2 #define PCMDMX_LIB_VL1 4 -#define PCMDMX_LIB_VL2 0 +#define PCMDMX_LIB_VL2 1 #define PCMDMX_LIB_TITLE "PCM Downmix Lib" #define PCMDMX_LIB_BUILD_DATE __DATE__ #define PCMDMX_LIB_BUILD_TIME __TIME__ -/* Library settings */ -#define PCM_DMX_MAX_DELAY_FRAMES ( 1 ) -#define PCM_DMX_MAX_CHANNELS ( 8 ) -#define PCM_DMX_MAX_CHANNEL_GROUPS ( 4 ) -#define PCM_DMX_MAX_CHANNELS_PER_GROUP ( 3 ) /* The maximum over all groups */ -#define PCMDMX_DFLT_EXPIRY_FRAME ( 50 ) /* At least 500ms (FL 960 @ 96kHz) */ /* Fixed and unique channel group indices. * The last group index has to be smaller than PCM_DMX_MAX_CHANNEL_GROUPS. */ @@ -122,22 +167,64 @@ amm-info@iis.fraunhofer.de #define CENTER_FRONT_CHANNEL ( 0 ) /* C */ #define LEFT_FRONT_CHANNEL ( 1 ) /* L */ #define RIGHT_FRONT_CHANNEL ( 2 ) /* R */ -#define LEFT_OUTSIDE_CHANNEL ( 3 ) /* Lo */ -#define RIGHT_OUTSIDE_CHANNEL ( 4 ) /* Ro */ -#define LEFT_REAR_CHANNEL ( 5 ) /* Lr aka left back channel */ -#define RIGHT_REAR_CHANNEL ( 6 ) /* Rr aka right back channel */ -#define LOW_FREQUENCY_CHANNEL ( 7 ) /* Lf */ +#define LEFT_REAR_CHANNEL ( 3 ) /* Lr (aka left back channel) or center back channel */ +#define RIGHT_REAR_CHANNEL ( 4 ) /* Rr (aka right back channel) */ +#define LOW_FREQUENCY_CHANNEL ( 5 ) /* Lf */ +#define LEFT_MULTIPRPS_CHANNEL ( 6 ) /* Left multipurpose channel */ +#define RIGHT_MULTIPRPS_CHANNEL ( 7 ) /* Right multipurpose channel */ /* More constants */ -#define ANC_DATA_SYNC_BYTE ( 0xBC ) /* ancillary data sync byte. */ -#define ATTENUATION_FACTOR_1 ( FL2FXCONST_SGL(0.70710678f) ) +#define ONE_CHANNEL ( 1 ) #define TWO_CHANNEL ( 2 ) +#define SIX_CHANNEL ( 6 ) +#define EIGHT_CHANNEL ( 8 ) + +#define PCMDMX_A_IDX_DEFAULT ( 2 ) +#define PCMDMX_B_IDX_DEFAULT ( 2 ) +#define PCMDMX_LFE_IDX_DEFAULT ( 15 ) +#define PCMDMX_GAIN_5_DEFAULT ( 0 ) +#define PCMDMX_GAIN_2_DEFAULT ( 0 ) + +#define PCMDMX_MAX_HEADROOM ( 3 ) /* Defines the maximum PCM scaling headroom that can be done by a + postprocessing step. This value must be greater or equal to 0. */ + +#define FALSE 0 +#define TRUE 1 +#define IN 0 +#define OUT 1 + +/* Type definitions: */ +#ifndef DMX_HIGH_PRECISION_ENABLE + #define FIXP_DMX FIXP_SGL + #define FX_DMX2FX_DBL(x) FX_SGL2FX_DBL((FIXP_SGL)(x)) + #define FX_DBL2FX_DMX(x) FX_DBL2FX_SGL(x) + #define FL2FXCONST_DMX(x) FL2FXCONST_SGL(x) + #define MAXVAL_DMX MAXVAL_SGL + #define FX_DMX2SHRT(x) ((SHORT)(x)) + #define FX_DMX2FL(x) FX_DBL2FL(FX_DMX2FX_DBL(x)) +#else + #define FIXP_DMX FIXP_DBL + #define FX_DMX2FX_DBL(x) ((FIXP_DBL)(x)) + #define FX_DBL2FX_DMX(x) ((FIXP_DBL)(x) + #define FL2FXCONST_DMX(x) FL2FXCONST_DBL(x) + #define MAXVAL_DMX MAXVAL_DBL + #define FX_DMX2SHRT(x) ((SHORT)((x)>>FRACT_BITS)) + #define FX_DMX2FL(x) FX_DBL2FL(x) +#endif -/* Sanity checks on library setting: */ +/* The number of channels positions for each group in the internal representation. + * See the channel labels above. */ +static const UCHAR maxChInGrp[PCM_DMX_MAX_CHANNEL_GROUPS] = { +#if (PCM_DMX_MAX_CHANNELS > 3) + 3, 0, 2, 1 +#else + PCM_DMX_MAX_CHANNELS_PER_GROUP +#endif +}; /* List of packed channel modes */ typedef enum -{ /* CH_MODE____ */ +{ /* CH_MODE____ */ CH_MODE_UNDEFINED = 0x0000, /* 1 channel */ CH_MODE_1_0_0_0 = 0x0001, /* chCfg 1 */ @@ -151,53 +238,93 @@ typedef enum CH_MODE_3_0_1_0 = 0x0103, /* chCfg 4 */ CH_MODE_2_0_2_0 = 0x0202, CH_MODE_2_0_1_1 = 0x1102, + CH_MODE_4_0_0_0 = 0x0004, /* 5 channels */ CH_MODE_3_0_2_0 = 0x0203, /* chCfg 5 */ CH_MODE_2_0_2_1 = 0x1202, CH_MODE_3_0_1_1 = 0x1103, CH_MODE_3_2_0_0 = 0x0023, + CH_MODE_5_0_0_0 = 0x0005, /* 6 channels */ CH_MODE_3_0_2_1 = 0x1203, /* chCfg 6 */ + CH_MODE_3_2_0_1 = 0x1023, CH_MODE_3_2_1_0 = 0x0123, + CH_MODE_5_0_1_0 = 0x0105, + CH_MODE_6_0_0_0 = 0x0006, /* 7 channels */ CH_MODE_2_2_2_1 = 0x1222, + CH_MODE_3_0_3_1 = 0x1303, /* chCfg 11 */ CH_MODE_3_2_1_1 = 0x1123, CH_MODE_3_2_2_0 = 0x0223, + CH_MODE_3_0_2_2 = 0x2203, + CH_MODE_5_0_2_0 = 0x0205, + CH_MODE_5_0_1_1 = 0x1105, + CH_MODE_7_0_0_0 = 0x0007, /* 8 channels */ - CH_MODE_3_2_2_1 = 0x1222, /* chCfg 7 */ + CH_MODE_3_2_2_1 = 0x1223, + CH_MODE_3_0_4_1 = 0x1403, /* chCfg 12 */ + CH_MODE_5_0_2_1 = 0x1205, /* chCfg 7 + 14 */ + CH_MODE_5_2_1_0 = 0x0125, CH_MODE_3_2_1_2 = 0x2123, - CH_MODE_2_2_2_2 = 0x2222 + CH_MODE_2_2_2_2 = 0x2222, + CH_MODE_3_0_3_2 = 0x2303, + CH_MODE_8_0_0_0 = 0x0008 } PCM_DMX_CHANNEL_MODE; /* These are the channel configurations linked to the number of output channels give by the user: */ -static const PCM_DMX_CHANNEL_MODE outChModeTable[PCM_DMX_MAX_CHANNELS] = +static const PCM_DMX_CHANNEL_MODE outChModeTable[PCM_DMX_MAX_CHANNELS+1] = { + CH_MODE_UNDEFINED, CH_MODE_1_0_0_0, /* 1 channel */ CH_MODE_2_0_0_0, /* 2 channels */ - CH_MODE_3_0_0_0, /* 3 channels */ - CH_MODE_3_0_1_0, /* 4 channels */ + CH_MODE_3_0_0_0 /* 3 channels */ +#if (PCM_DMX_MAX_CHANNELS > 3) + ,CH_MODE_3_0_1_0, /* 4 channels */ CH_MODE_3_0_2_0, /* 5 channels */ CH_MODE_3_0_2_1, /* 6 channels */ - CH_MODE_3_2_2_0, /* 7 channels */ - CH_MODE_3_2_2_1 /* 8 channels */ + CH_MODE_3_0_3_1, /* 7 channels */ + CH_MODE_3_0_4_1 /* 8 channels */ +#endif }; -static const FIXP_SGL dvbDownmixFactors[8] = +static const FIXP_DMX abMixLvlValueTab[8] = { - FL2FXCONST_SGL(1.0f), - FL2FXCONST_SGL(0.841f), - FL2FXCONST_SGL(0.707f), - FL2FXCONST_SGL(0.596f), - FL2FXCONST_SGL(0.500f), - FL2FXCONST_SGL(0.422f), - FL2FXCONST_SGL(0.355f), - FL2FXCONST_SGL(0.0f) + FL2FXCONST_DMX(0.500f), /* scaled by 1 */ + FL2FXCONST_DMX(0.841f), + FL2FXCONST_DMX(0.707f), + FL2FXCONST_DMX(0.596f), + FL2FXCONST_DMX(0.500f), + FL2FXCONST_DMX(0.422f), + FL2FXCONST_DMX(0.355f), + FL2FXCONST_DMX(0.0f) +}; + +static const FIXP_DMX lfeMixLvlValueTab[16] = +{ /* value, scale */ + FL2FXCONST_DMX(0.7905f), /* 2 */ + FL2FXCONST_DMX(0.5000f), /* 2 */ + FL2FXCONST_DMX(0.8395f), /* 1 */ + FL2FXCONST_DMX(0.7065f), /* 1 */ + FL2FXCONST_DMX(0.5945f), /* 1 */ + FL2FXCONST_DMX(0.500f), /* 1 */ + FL2FXCONST_DMX(0.841f), /* 0 */ + FL2FXCONST_DMX(0.707f), /* 0 */ + FL2FXCONST_DMX(0.596f), /* 0 */ + FL2FXCONST_DMX(0.500f), /* 0 */ + FL2FXCONST_DMX(0.316f), /* 0 */ + FL2FXCONST_DMX(0.178f), /* 0 */ + FL2FXCONST_DMX(0.100f), /* 0 */ + FL2FXCONST_DMX(0.032f), /* 0 */ + FL2FXCONST_DMX(0.010f), /* 0 */ + FL2FXCONST_DMX(0.000f) /* 0 */ }; + +#ifdef PCE_METADATA_ENABLE /* MPEG matrix mixdown: Set 1: L' = (1 + 2^-0.5 + A )^-1 * [L + C * 2^-0.5 + A * Ls]; R' = (1 + 2^-0.5 + A )^-1 * [R + C * 2^-0.5 + A * Rs]; @@ -207,111 +334,176 @@ static const FIXP_SGL dvbDownmixFactors[8] = M = (3 + 2A)^-1 * [L + C + R + A*(Ls + Rs)]; */ - static const FIXP_SGL mpegMixDownIdx2Coef[4] = + static const FIXP_DMX mpegMixDownIdx2Coef[4] = { - FL2FXCONST_SGL(0.70710678f), - FL2FXCONST_SGL(0.5f), - FL2FXCONST_SGL(0.35355339f), - FL2FXCONST_SGL(0.0f) + FL2FXCONST_DMX(0.70710678f), + FL2FXCONST_DMX(0.5f), + FL2FXCONST_DMX(0.35355339f), + FL2FXCONST_DMX(0.0f) }; - static const FIXP_SGL mpegMixDownIdx2PreFact[4] = - { - FL2FXCONST_SGL(0.4142135623730950f), - FL2FXCONST_SGL(0.4530818393219728f), - FL2FXCONST_SGL(0.4852813742385703f), - FL2FXCONST_SGL(0.5857864376269050f) + static const FIXP_SGL mpegMixDownIdx2PreFact[3][4] = + { { /* Set 1: */ + FL2FXCONST_DMX(0.4142135623730950f), + FL2FXCONST_DMX(0.4530818393219728f), + FL2FXCONST_DMX(0.4852813742385703f), + FL2FXCONST_DMX(0.5857864376269050f) + },{ /* Set 2: */ + FL2FXCONST_DMX(0.3203772410170407f), + FL2FXCONST_DMX(0.3693980625181293f), + FL2FXCONST_DMX(0.4142135623730950f), + FL2FXCONST_DMX(0.5857864376269050f) + },{ /* Mono DMX set: */ + FL2FXCONST_DMX(0.2265409196609864f), + FL2FXCONST_DMX(0.25f), + FL2FXCONST_DMX(0.2697521433898179f), + FL2FXCONST_DMX(0.3333333333333333f) } }; +#endif /* PCE_METADATA_ENABLE */ - typedef struct - { - USHORT matrixMixdownIdx; /*!< MPEG mixdown index extracted from PCE. */ - USHORT pseudoSurroundEnable; /*!< Pseudo surround enable flag extracted from PCE. */ - USHORT mixdownAvailable; /*!< Will be set to 1 if we found a valid coefficient. */ - - } MPEG_MIXDOWN_INFO; +#define TYPE_NONE ( 0x0 ) +#define TYPE_DSE_DATA ( 0x1 ) +#define TYPE_PCE_DATA ( 0x2 ) typedef struct { - FIXP_SGL centerMixLevelValue; /*!< DVB mixdown level for the center channel extracted from anc data. */ - FIXP_SGL surroundMixLevelValue; /*!< DVB mixdown level for back channels extracted from anc data. */ - - UCHAR mixLevelsAvail; /*!< Will be set to 1 if we found a valid coefficient. */ + UINT typeFlags; + /* From DSE */ + UCHAR cLevIdx; + UCHAR sLevIdx; + UCHAR dmixIdxA; + UCHAR dmixIdxB; + UCHAR dmixIdxLfe; + UCHAR dmxGainIdx2; + UCHAR dmxGainIdx5; +#ifdef PCE_METADATA_ENABLE + /* From PCE */ + UCHAR matrixMixdownIdx; +#endif + /* Attributes: */ + SCHAR pseudoSurround; /*!< If set to 1 the signal is pseudo surround compatible. The value 0 tells + that it is not. If the value is -1 the information is not available. */ + UINT expiryCount; /*!< Counter to monitor the life time of a meta data set. */ + +} DMX_BS_META_DATA; + +/* Default metadata */ +static const DMX_BS_META_DATA dfltMetaData = { + 0, 2, 2, 2, 2, 15, 0, 0, +#ifdef PCE_METADATA_ENABLE + 0, +#endif + -1, 0 +}; -} DVB_MIXDOWN_LEVELS; +/* Dynamic (user) params: + See the definition of PCMDMX_PARAM for details on the specific fields. */ +typedef struct +{ + UINT expiryFrame; /*!< Linked to DMX_BS_DATA_EXPIRY_FRAME */ + DUAL_CHANNEL_MODE dualChannelMode; /*!< Linked to DMX_DUAL_CHANNEL_MODE */ + PSEUDO_SURROUND_MODE pseudoSurrMode; /*!< Linked to DMX_PSEUDO_SURROUND_MODE */ + SHORT numOutChannelsMin; /*!< Linked to MIN_NUMBER_OF_OUTPUT_CHANNELS */ + SHORT numOutChannelsMax; /*!< Linked to MAX_NUMBER_OF_OUTPUT_CHANNELS */ + UCHAR frameDelay; /*!< Linked to DMX_BS_DATA_DELAY */ +} PCM_DMX_USER_PARAMS; /* Modules main data structure: */ struct PCM_DMX_INSTANCE { - DVB_MIXDOWN_LEVELS dvbMixDownLevels[PCM_DMX_MAX_DELAY_FRAMES+1]; - MPEG_MIXDOWN_INFO mpegMixDownInfo[PCM_DMX_MAX_DELAY_FRAMES+1]; - DUAL_CHANNEL_MODE dualChannelMode; - UINT expiryFrame; - UINT expiryCount; - SHORT numOutputChannels; - UCHAR applyProcessing; - UCHAR frameDelay; + /* Metadata */ + DMX_BS_META_DATA bsMetaData[PCM_DMX_MAX_DELAY_FRAMES+1]; + PCM_DMX_USER_PARAMS userParams; + + UCHAR applyProcessing; /*!< Flag to en-/disable modules processing. + The max channel limiting is done independently. */ }; /* Memory allocation macro */ C_ALLOC_MEM_STATIC(PcmDmxInstance, struct PCM_DMX_INSTANCE, 1) -/** Evaluate a given channel configuration and extract a packed channel mode and generate a channel offset table +/** Evaluate a given channel configuration and extract a packed channel mode. In addition the + * function generates a channel offset table for the mapping to the internal representation. * This function is the inverse to the getChannelDescription() routine. * @param [in] The total number of channels of the given configuration. * @param [in] Array holding the corresponding channel types for each channel. * @param [in] Array holding the corresponding channel type indices for each channel. * @param [out] Array where the buffer offsets for each channel are stored into. - * @returns Returns the packed channel mode. + * @param [out] The generated packed channel mode that represents the given input configuration. + * @returns Returns an error code. **/ static -PCM_DMX_CHANNEL_MODE getChannelMode ( +PCMDMX_ERROR getChannelMode ( const INT numChannels, /* in */ const AUDIO_CHANNEL_TYPE channelType[], /* in */ const UCHAR channelIndices[], /* in */ - UCHAR offsetTable[PCM_DMX_MAX_CHANNELS] /* out */ + UCHAR offsetTable[PCM_DMX_MAX_CHANNELS], /* out */ + PCM_DMX_CHANNEL_MODE *chMode /* out */ ) { - UINT chMode = CH_MODE_UNDEFINED; UCHAR chIdx[PCM_DMX_MAX_CHANNEL_GROUPS][PCM_DMX_MAX_CHANNELS_PER_GROUP]; - UCHAR numChInGrp[PCM_DMX_MAX_CHANNEL_GROUPS]; - int ch, grpIdx, err = 0; + UCHAR numChInGrp[PCM_DMX_MAX_CHANNEL_GROUPS]; /* Total num of channels per group of the input config */ + UCHAR numChFree[PCM_DMX_MAX_CHANNEL_GROUPS]; /* Number of free slots per group in the internal repr. */ + UCHAR hardToPlace[PCM_DMX_MAX_CHANNELS]; /* List of channels not matching the internal repr. */ + UCHAR h2pSortIdx[PCM_DMX_MAX_CHANNELS]; + PCMDMX_ERROR err = PCMDMX_OK; + int ch, grpIdx; + int numChToPlace = 0; FDK_ASSERT(channelType != NULL); FDK_ASSERT(channelIndices != NULL); FDK_ASSERT(offsetTable != NULL); + FDK_ASSERT(chMode != NULL); /* For details see ISO/IEC 13818-7:2005(E), 8.5.3 Channel configuration */ FDKmemclear(numChInGrp, PCM_DMX_MAX_CHANNEL_GROUPS*sizeof(UCHAR)); FDKmemset(offsetTable, 255, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); FDKmemset(chIdx, 255, PCM_DMX_MAX_CHANNEL_GROUPS*PCM_DMX_MAX_CHANNELS_PER_GROUP*sizeof(UCHAR)); + FDKmemset(hardToPlace, 255, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); + FDKmemset(h2pSortIdx, 255, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); + /* Get the restrictions of the internal representation */ + FDKmemcpy(numChFree, maxChInGrp, PCM_DMX_MAX_CHANNEL_GROUPS*sizeof(UCHAR)); + + *chMode = CH_MODE_UNDEFINED; /* Categorize channels */ for (ch = 0; ch < numChannels; ch += 1) { - int i = 0, j, chGrpIdx = channelIndices[ch]; + UCHAR chGrpIdx = channelIndices[ch]; + int i = 0, j; switch (channelType[ch]) { - case ACT_FRONT: case ACT_FRONT_TOP: + chGrpIdx += numChInGrp[CH_GROUP_FRONT]; /* Append after normal plain */ + case ACT_FRONT: grpIdx = CH_GROUP_FRONT; break; - case ACT_SIDE: +#if (PCM_DMX_MAX_CHANNEL_GROUPS > 1) case ACT_SIDE_TOP: + chGrpIdx += numChInGrp[CH_GROUP_SIDE]; /* Append after normal plain */ + case ACT_SIDE: grpIdx = CH_GROUP_SIDE; break; - case ACT_BACK: case ACT_BACK_TOP: + chGrpIdx += numChInGrp[CH_GROUP_REAR]; /* Append after normal plain */ + case ACT_BACK: grpIdx = CH_GROUP_REAR; break; case ACT_LFE: grpIdx = CH_GROUP_LFE; break; +#endif default: - err = -1; - continue; + /* Found a channel that can not be categorized! Most likely due to corrupt input signalling. + The rescue strategy is to append it to the front channels (=> ignore index). + This could cause strange behaviour so return an error to signal it. */ + err = PCMDMX_INVALID_MODE; + grpIdx = CH_GROUP_FRONT; + chGrpIdx = numChannels + numChToPlace; + numChToPlace += 1; + break; } if (numChInGrp[grpIdx] < PCM_DMX_MAX_CHANNELS_PER_GROUP) { @@ -327,76 +519,152 @@ PCM_DMX_CHANNEL_MODE getChannelMode ( } } - /* Compose channel offset table */ +#if (PCM_DMX_MAX_CHANNEL_GROUPS > 1) + FDK_ASSERT( (numChInGrp[CH_GROUP_FRONT]+numChInGrp[CH_GROUP_SIDE] + +numChInGrp[CH_GROUP_REAR]+numChInGrp[CH_GROUP_LFE]) == numChannels); +#else + FDK_ASSERT( numChInGrp[CH_GROUP_FRONT] == numChannels ); +#endif + + /* Compose channel offset table: + * Map all channels to the internal representation. */ + numChToPlace = 0; /* Non-symmetric channels */ if (numChInGrp[CH_GROUP_FRONT] & 0x1) { /* Odd number of front channels -> we have a center channel. In MPEG-4 the center has the index 0. */ offsetTable[CENTER_FRONT_CHANNEL] = chIdx[CH_GROUP_FRONT][0]; + numChFree[CH_GROUP_FRONT] -= 1; } for (grpIdx = 0; grpIdx < PCM_DMX_MAX_CHANNEL_GROUPS; grpIdx += 1) { - int chMapPos, maxChannels = 0; - ch = 0; + int chMapPos = 0; + ch = 0; /* Index of channel within the specific group */ switch (grpIdx) { case CH_GROUP_FRONT: chMapPos = LEFT_FRONT_CHANNEL; - maxChannels = 3; ch = numChInGrp[grpIdx] & 0x1; break; +#if (PCM_DMX_MAX_CHANNEL_GROUPS > 1) case CH_GROUP_SIDE: - chMapPos = LEFT_OUTSIDE_CHANNEL; - maxChannels = 2; break; case CH_GROUP_REAR: chMapPos = LEFT_REAR_CHANNEL; - maxChannels = 2; break; case CH_GROUP_LFE: chMapPos = LOW_FREQUENCY_CHANNEL; - maxChannels = 1; break; +#endif default: - err = -1; + FDK_ASSERT(0); continue; } + /* Map all channels of the group */ for ( ; ch < numChInGrp[grpIdx]; ch += 1) { - if (ch < maxChannels) { + if (numChFree[grpIdx] > 0) { offsetTable[chMapPos] = chIdx[grpIdx][ch]; chMapPos += 1; + numChFree[grpIdx] -= 1; } else { - err = -1; + /* Add to the list of hardship cases considering a MPEG-like sorting order: */ + int pos, sortIdx = grpIdx*PCM_DMX_MAX_CHANNELS_PER_GROUP + channelIndices[chIdx[grpIdx][ch]]; + for (pos = numChToPlace; pos > 0; pos -= 1) { + if (h2pSortIdx[pos-1] > sortIdx) { + hardToPlace[pos] = hardToPlace[pos-1]; + h2pSortIdx[pos] = h2pSortIdx[pos-1]; + } else { + /* Insert channel at the current index/position */ + break; + } + } + hardToPlace[pos] = chIdx[grpIdx][ch]; + h2pSortIdx[pos] = sortIdx; + numChToPlace += 1; } } } - if (err == 0) { - /* Compose the channel mode */ - chMode = (numChInGrp[CH_GROUP_LFE] & 0xF) << 12 - | (numChInGrp[CH_GROUP_REAR] & 0xF) << 8 - | (numChInGrp[CH_GROUP_SIDE] & 0xF) << 4 - | (numChInGrp[CH_GROUP_FRONT] & 0xF); + { /* Assign the hardship cases */ + int chMapPos = 0; + int mappingHeat = 0; + for (ch = 0; ch < numChToPlace; ch+=1) { + int chAssigned = 0; + + /* Just assigning the channels to the next best slot can lead to undesired results (especially for x/x/1.x + configurations). Thus use the MPEG-like sorting index to find the best fitting slot for each channel. + If this is not possible the sorting index will be ignored (mappingHeat >= 2). */ + for ( ; chMapPos < PCM_DMX_MAX_CHANNELS; chMapPos+=1) { + if (offsetTable[chMapPos] == 255) { + int prvSortIdx = 0; + int nxtSortIdx = (CH_GROUP_LFE+1)*PCM_DMX_MAX_CHANNELS_PER_GROUP; + + if (mappingHeat < 2) { + if (chMapPos < LEFT_REAR_CHANNEL) { + /* Got front channel slot */ + prvSortIdx = CH_GROUP_FRONT*PCM_DMX_MAX_CHANNELS_PER_GROUP + chMapPos - CENTER_FRONT_CHANNEL; + nxtSortIdx = CH_GROUP_SIDE *PCM_DMX_MAX_CHANNELS_PER_GROUP; + } + else if (chMapPos < LOW_FREQUENCY_CHANNEL) { + /* Got back channel slot */ + prvSortIdx = CH_GROUP_REAR*PCM_DMX_MAX_CHANNELS_PER_GROUP + chMapPos - LEFT_REAR_CHANNEL; + nxtSortIdx = CH_GROUP_LFE *PCM_DMX_MAX_CHANNELS_PER_GROUP; + } + else if (chMapPos < LEFT_MULTIPRPS_CHANNEL) { + /* Got lfe channel slot */ + prvSortIdx = CH_GROUP_LFE *PCM_DMX_MAX_CHANNELS_PER_GROUP + chMapPos - LOW_FREQUENCY_CHANNEL; + nxtSortIdx = (CH_GROUP_LFE+1)*PCM_DMX_MAX_CHANNELS_PER_GROUP; + } + } + + /* Assign the channel only if its sort index is within the range */ + if ( (h2pSortIdx[ch] >= prvSortIdx) + && (h2pSortIdx[ch] < nxtSortIdx) ) { + offsetTable[chMapPos++] = hardToPlace[ch]; + chAssigned = 1; + break; + } + } + } + if (chAssigned == 0) { + chMapPos = 0; + ch -= 1; + mappingHeat += 1; + continue; + } + } } - return (PCM_DMX_CHANNEL_MODE)chMode; + /* Compose the channel mode */ + *chMode = (PCM_DMX_CHANNEL_MODE)( (numChInGrp[CH_GROUP_FRONT] & 0xF) +#if (PCM_DMX_MAX_CHANNEL_GROUPS > 1) + | (numChInGrp[CH_GROUP_SIDE] & 0xF) << 4 + | (numChInGrp[CH_GROUP_REAR] & 0xF) << 8 + | (numChInGrp[CH_GROUP_LFE] & 0xF) << 12 +#endif + ); + + return err; } /** Generate a channel offset table and complete channel description for a given (packed) channel mode. - * This function is the inverse to the getChannelMode() routine. - * @param [in] The total number of channels of the given configuration. + * This function is the inverse to the getChannelMode() routine but does not support weird channel + * configurations. All channels have to be in the normal height layer and there must not be more + * channels in each group than given by maxChInGrp. + * @param [in] The packed channel mode of the configuration to be processed. * @param [in] Array containing the channel mapping to be used (From MPEG PCE ordering to whatever is required). * @param [out] Array where corresponding channel types for each channels are stored into. * @param [out] Array where corresponding channel type indices for each output channel are stored into. * @param [out] Array where the buffer offsets for each channel are stored into. * @returns None. **/ +static void getChannelDescription ( const PCM_DMX_CHANNEL_MODE chMode, /* in */ - const UCHAR channelMapping[][PCM_DMX_MAX_CHANNELS], /* in */ + const UCHAR channelMapping[][8], /* in */ AUDIO_CHANNEL_TYPE channelType[], /* out */ UCHAR channelIndices[], /* out */ UCHAR offsetTable[PCM_DMX_MAX_CHANNELS] /* out */ @@ -412,15 +680,17 @@ void getChannelDescription ( FDK_ASSERT(offsetTable != NULL); /* Init output arrays */ - FDKmemclear(channelType, PCM_DMX_MAX_CHANNELS*sizeof(AUDIO_CHANNEL_TYPE)); - FDKmemclear(channelIndices, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); + FDKmemclear(channelType, PCM_DMX_MAX_IO_CHANNELS*sizeof(AUDIO_CHANNEL_TYPE)); + FDKmemclear(channelIndices, PCM_DMX_MAX_IO_CHANNELS*sizeof(UCHAR)); FDKmemset(offsetTable, 255, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); /* Extract the number of channels per group */ numChInGrp[CH_GROUP_FRONT] = chMode & 0xF; +#if (PCM_DMX_MAX_CHANNEL_GROUPS > 1) numChInGrp[CH_GROUP_SIDE] = (chMode >> 4) & 0xF; numChInGrp[CH_GROUP_REAR] = (chMode >> 8) & 0xF; numChInGrp[CH_GROUP_LFE] = (chMode >> 12) & 0xF; +#endif /* Summerize to get the total number of channels */ for (grpIdx = 0; grpIdx < PCM_DMX_MAX_CHANNEL_GROUPS; grpIdx += 1) { @@ -428,7 +698,29 @@ void getChannelDescription ( } /* Get the appropriate channel map */ - pChannelMap = channelMapping[numChannels-1]; + switch (chMode) { + case CH_MODE_1_0_0_0: + case CH_MODE_2_0_0_0: + case CH_MODE_3_0_0_0: + case CH_MODE_3_0_1_0: + case CH_MODE_3_0_2_0: + case CH_MODE_3_0_2_1: + pChannelMap = channelMapping[numChannels]; + break; + case CH_MODE_3_0_3_1: + pChannelMap = channelMapping[11]; + break; + case CH_MODE_3_0_4_1: + pChannelMap = channelMapping[12]; + break; + case CH_MODE_5_0_2_1: + pChannelMap = channelMapping[7]; + break; + default: + /* fallback */ + pChannelMap = channelMapping[0]; + break; + } /* Compose channel offset table */ @@ -436,15 +728,17 @@ void getChannelDescription ( if (numChInGrp[CH_GROUP_FRONT] & 0x1) { /* Odd number of front channels -> we have a center channel. In MPEG-4 the center has the index 0. */ - offsetTable[CENTER_FRONT_CHANNEL] = pChannelMap[0]; - channelType[0] = ACT_FRONT; + int mappedIdx = pChannelMap[ch]; + offsetTable[CENTER_FRONT_CHANNEL] = mappedIdx; + channelType[mappedIdx] = ACT_FRONT; + channelIndices[mappedIdx] = 0; ch += 1; } for (grpIdx = 0; grpIdx < PCM_DMX_MAX_CHANNEL_GROUPS; grpIdx += 1) { - AUDIO_CHANNEL_TYPE type; - int chMapPos, maxChannels = 0; - int chIdx = 0; + AUDIO_CHANNEL_TYPE type = ACT_NONE; + int chMapPos = 0, maxChannels = 0; + int chIdx = 0; /* Index of channel within the specific group */ switch (grpIdx) { case CH_GROUP_FRONT: @@ -453,10 +747,11 @@ void getChannelDescription ( maxChannels = 3; chIdx = numChInGrp[grpIdx] & 0x1; break; +#if (PCM_DMX_MAX_CHANNEL_GROUPS > 1) case CH_GROUP_SIDE: + /* Always map side channels to the multipurpose group. */ type = ACT_SIDE; - chMapPos = LEFT_OUTSIDE_CHANNEL; - maxChannels = 2; + chMapPos = LEFT_MULTIPRPS_CHANNEL; break; case CH_GROUP_REAR: type = ACT_BACK; @@ -468,20 +763,646 @@ void getChannelDescription ( chMapPos = LOW_FREQUENCY_CHANNEL; maxChannels = 1; break; +#endif default: break; } - for ( ; (chIdx < numChInGrp[grpIdx]) && (chIdx < maxChannels); chIdx += 1) { - offsetTable[chMapPos] = pChannelMap[ch]; - channelType[ch] = type; - channelIndices[ch] = chIdx; + /* Map all channels in this group */ + for ( ; chIdx < numChInGrp[grpIdx]; chIdx += 1) { + int mappedIdx = pChannelMap[ch]; + if (chIdx == maxChannels) { + /* No space left in this channel group! + Use the multipurpose group instead: */ + chMapPos = LEFT_MULTIPRPS_CHANNEL; + } + offsetTable[chMapPos] = mappedIdx; + channelType[mappedIdx] = type; + channelIndices[mappedIdx] = chIdx; chMapPos += 1; ch += 1; } } } +/** Private helper function for downmix matrix manipulation that initializes + * one row in a given downmix matrix (corresponding to one output channel). + * @param [inout] Pointer to fixed-point parts of the downmix matrix. + * @param [inout] Pointer to scale factor matrix associated to the downmix factors. + * @param [in] Index of channel (row) to be initialized. + * @returns Nothing to return. + **/ +static +void dmxInitChannel( + FIXP_DMX mixFactors[PCM_DMX_MAX_CHANNELS][PCM_DMX_MAX_CHANNELS], + INT mixScales[PCM_DMX_MAX_CHANNELS][PCM_DMX_MAX_CHANNELS], + const unsigned int outCh + ) +{ + unsigned int inCh; + for (inCh=0; inCh < PCM_DMX_MAX_CHANNELS; inCh+=1) { + if (inCh == outCh) { + mixFactors[outCh][inCh] = FL2FXCONST_DMX(0.5f); + mixScales[outCh][inCh] = 1; + } else { + mixFactors[outCh][inCh] = FL2FXCONST_DMX(0.0f); + mixScales[outCh][inCh] = 0; + } + } +} + +/** Private helper function for downmix matrix manipulation that does a reset + * of one row in a given downmix matrix (corresponding to one output channel). + * @param [inout] Pointer to fixed-point parts of the downmix matrix. + * @param [inout] Pointer to scale factor matrix associated to the downmix factors. + * @param [in] Index of channel (row) to be cleared/reset. + * @returns Nothing to return. + **/ +static +void dmxClearChannel( + FIXP_DMX mixFactors[PCM_DMX_MAX_CHANNELS][PCM_DMX_MAX_CHANNELS], + INT mixScales[PCM_DMX_MAX_CHANNELS][PCM_DMX_MAX_CHANNELS], + const unsigned int outCh + ) +{ + FDKmemclear(&mixFactors[outCh], PCM_DMX_MAX_CHANNELS*sizeof(FIXP_DMX)); + FDKmemclear(&mixScales[outCh], PCM_DMX_MAX_CHANNELS*sizeof(INT)); +} + +/** Private helper function for downmix matrix manipulation that applies a source channel (row) + * scaled by a given mix factor to a destination channel (row) in a given downmix matrix. + * Existing mix factors of the destination channel (row) will get overwritten. + * @param [inout] Pointer to fixed-point parts of the downmix matrix. + * @param [inout] Pointer to scale factor matrix associated to the downmix factors. + * @param [in] Index of source channel (row). + * @param [in] Index of destination channel (row). + * @param [in] Fixed-point part of mix factor to be applied. + * @param [in] Scale factor of mix factor to be applied. + * @returns Nothing to return. + **/ +static +void dmxSetChannel( + FIXP_DMX mixFactors[PCM_DMX_MAX_CHANNELS][PCM_DMX_MAX_CHANNELS], + INT mixScales[PCM_DMX_MAX_CHANNELS][PCM_DMX_MAX_CHANNELS], + const unsigned int dstCh, + const unsigned int srcCh, + const FIXP_DMX factor, + const INT scale + ) +{ + int ch; + for (ch=0; ch < PCM_DMX_MAX_CHANNELS; ch+=1) { + if (mixFactors[srcCh][ch] != (FIXP_DMX)0) { + mixFactors[dstCh][ch] = FX_DBL2FX_DMX(fMult(mixFactors[srcCh][ch], factor)); + mixScales[dstCh][ch] = mixScales[srcCh][ch] + scale; + } + } +} + +/** Private helper function for downmix matrix manipulation that adds a source channel (row) + * scaled by a given mix factor to a destination channel (row) in a given downmix matrix. + * @param [inout] Pointer to fixed-point parts of the downmix matrix. + * @param [inout] Pointer to scale factor matrix associated to the downmix factors. + * @param [in] Index of source channel (row). + * @param [in] Index of destination channel (row). + * @param [in] Fixed-point part of mix factor to be applied. + * @param [in] Scale factor of mix factor to be applied. + * @returns Nothing to return. + **/ +static +void dmxAddChannel( + FIXP_DMX mixFactors[PCM_DMX_MAX_CHANNELS][PCM_DMX_MAX_CHANNELS], + INT mixScales[PCM_DMX_MAX_CHANNELS][PCM_DMX_MAX_CHANNELS], + const unsigned int dstCh, + const unsigned int srcCh, + const FIXP_DMX factor, + const INT scale + ) +{ + int ch; + for (ch=0; ch < PCM_DMX_MAX_CHANNELS; ch+=1) { + FIXP_DBL addFact = fMult(mixFactors[srcCh][ch], factor); + if (addFact != (FIXP_DMX)0) { + INT newScale = mixScales[srcCh][ch] + scale; + if (mixFactors[dstCh][ch] != (FIXP_DMX)0) { + if (newScale > mixScales[dstCh][ch]) { + mixFactors[dstCh][ch] >>= newScale - mixScales[dstCh][ch]; + } else { + addFact >>= mixScales[dstCh][ch] - newScale; + newScale = mixScales[dstCh][ch]; + } + } + mixFactors[dstCh][ch] += FX_DBL2FX_DMX(addFact); + mixScales[dstCh][ch] = newScale; + } + } +} + + +/** Private function that creates a downmix factor matrix depending on the input and output + * configuration, the user parameters as well as the given metadata. This function is the modules + * brain and hold all downmix algorithms. + * @param [in] Flag that indicates if inChMode holds a real (packed) channel mode or has been + converted to a MPEG-4 channel configuration index. + * @param [in] Dependent on the inModeIsCfg flag this field hands in a (packed) channel mode or + the corresponding MPEG-4 channel configuration index.of the input configuration. + * @param [in] The (packed) channel mode of the output configuration. + * @param [in] Pointer to structure holding all current user parameter. + * @param [in] Pointer to field holding all current meta data. + * @param [out] Pointer to fixed-point parts of the downmix matrix. Normalized to one scale factor. + * @param [out] The common scale factor of the downmix matrix. + * @returns An error code. + **/ +static +PCMDMX_ERROR getMixFactors ( + const UCHAR inModeIsCfg, + PCM_DMX_CHANNEL_MODE inChMode, + const PCM_DMX_CHANNEL_MODE outChMode, + const PCM_DMX_USER_PARAMS *pParams, + const DMX_BS_META_DATA *pMetaData, + FIXP_DMX mixFactors[PCM_DMX_MAX_CHANNELS][PCM_DMX_MAX_CHANNELS], + INT *pOutScale + ) +{ + PCMDMX_ERROR err = PCMDMX_OK; + INT mixScales[PCM_DMX_MAX_CHANNELS][PCM_DMX_MAX_CHANNELS]; + INT maxScale = 0; + int numInChannel, numOutChannel; + unsigned int outCh, inCh, inChCfg = 0; + unsigned int valid[PCM_DMX_MAX_CHANNELS] = { 0 }; + + FDK_ASSERT(pMetaData != NULL); + FDK_ASSERT(mixFactors != NULL); + /* Check on a supported output configuration */ + FDK_ASSERT( (outChMode == CH_MODE_1_0_0_0) + || (outChMode == CH_MODE_2_0_0_0) + || (outChMode == CH_MODE_3_0_2_1) ); + + if (inModeIsCfg) { + /* Workaround for the ambiguity of the internal channel modes. + Convert channel config to channel mode: */ + inChCfg = (unsigned int)inChMode; + switch (inChCfg) { + case 1: case 2: case 3: +#if (PCM_DMX_MAX_CHANNELS > 3) + case 4: case 5: case 6: +#endif + inChMode = outChModeTable[inChCfg]; + break; + case 11: + inChMode = CH_MODE_3_0_3_1; + break; + case 12: + inChMode = CH_MODE_3_0_4_1; + break; + case 7: case 14: + inChMode = CH_MODE_5_0_2_1; + break; + default: + FDK_ASSERT(0); + } + } + + /* Extract the total number of input channels */ + numInChannel = (inChMode&0xF) + + ((inChMode>> 4)&0xF) + + ((inChMode>> 8)&0xF) + + ((inChMode>>12)&0xF); + /* Extract the total number of output channels */ + numOutChannel = (outChMode&0xF) + + ((outChMode>> 4)&0xF) + + ((outChMode>> 8)&0xF) + + ((outChMode>>12)&0xF); + + /* MPEG ammendment 4 aka ETSI metadata and fallback mode: */ + + + /* Create identity DMX matrix: */ + for (outCh=0; outCh < PCM_DMX_MAX_CHANNELS; outCh+=1) { + dmxInitChannel( mixFactors, mixScales, outCh ); + } + if (((inChMode>>12)&0xF) == 0) { + /* Clear empty or wrongly mapped input channel */ + dmxClearChannel( mixFactors, mixScales, LOW_FREQUENCY_CHANNEL ); + } + + /* FIRST STAGE: */ + if (numInChannel > SIX_CHANNEL) + { /* Always use MPEG equations either with meta data or with default values. */ + FIXP_DMX dMixFactA, dMixFactB; + INT dMixScaleA, dMixScaleB; + int isValidCfg = TRUE; + + /* Get factors from meta data */ + dMixFactA = abMixLvlValueTab[pMetaData->dmixIdxA]; + dMixScaleA = (pMetaData->dmixIdxA==0) ? 1 : 0; + dMixFactB = abMixLvlValueTab[pMetaData->dmixIdxB]; + dMixScaleB = (pMetaData->dmixIdxB==0) ? 1 : 0; + + /* Check if input is in the list of supported configurations */ + switch (inChMode) { + case CH_MODE_3_0_3_1: /* chCfg 11 */ + /* 6.1ch: C' = C; L' = L; R' = R; LFE' = LFE; + Ls' = Ls*dmix_a_idx + Cs*dmix_b_idx; + Rs' = Rs*dmix_a_idx + Cs*dmix_b_idx; */ + dmxClearChannel( mixFactors, mixScales, RIGHT_MULTIPRPS_CHANNEL ); /* clear empty input channel */ + dmxSetChannel( mixFactors, mixScales, LEFT_REAR_CHANNEL, LEFT_REAR_CHANNEL, dMixFactA, dMixScaleA ); + dmxSetChannel( mixFactors, mixScales, LEFT_REAR_CHANNEL, LEFT_MULTIPRPS_CHANNEL, dMixFactB, dMixScaleB ); + dmxSetChannel( mixFactors, mixScales, RIGHT_REAR_CHANNEL, RIGHT_REAR_CHANNEL, dMixFactA, dMixScaleA ); + dmxSetChannel( mixFactors, mixScales, RIGHT_REAR_CHANNEL, LEFT_MULTIPRPS_CHANNEL, dMixFactB, dMixScaleB ); + break; + case CH_MODE_3_2_1_0: + case CH_MODE_3_2_1_1: /* chCfg 11 but with side channels */ + /* 6.1ch: C' = C; L' = L; R' = R; LFE' = LFE; + Ls' = Ls*dmix_a_idx + Cs*dmix_b_idx; + Rs' = Rs*dmix_a_idx + Cs*dmix_b_idx; */ + dmxClearChannel( mixFactors, mixScales, RIGHT_REAR_CHANNEL ); /* clear empty input channel */ + dmxSetChannel( mixFactors, mixScales, RIGHT_REAR_CHANNEL, LEFT_REAR_CHANNEL, dMixFactB, dMixScaleB ); + dmxSetChannel( mixFactors, mixScales, RIGHT_REAR_CHANNEL, RIGHT_MULTIPRPS_CHANNEL, dMixFactA, dMixScaleA ); + dmxSetChannel( mixFactors, mixScales, LEFT_REAR_CHANNEL, LEFT_REAR_CHANNEL, dMixFactB, dMixScaleB ); + dmxSetChannel( mixFactors, mixScales, LEFT_REAR_CHANNEL, LEFT_MULTIPRPS_CHANNEL, dMixFactA, dMixScaleA ); + isValidCfg = FALSE; + err = PCMDMX_INVALID_MODE; + break; + case CH_MODE_5_2_1_0: + case CH_MODE_5_0_1_0: + case CH_MODE_5_0_1_1: + /* Ls' = Cs*dmix_a_idx; + Rs' = Cs*dmix_a_idx; */ + dmxClearChannel( mixFactors, mixScales, RIGHT_REAR_CHANNEL ); /* clear empty input channel */ + dmxSetChannel( mixFactors, mixScales, RIGHT_REAR_CHANNEL, LEFT_REAR_CHANNEL, dMixFactA, dMixScaleA ); + dmxSetChannel( mixFactors, mixScales, LEFT_REAR_CHANNEL, LEFT_REAR_CHANNEL, dMixFactA, dMixScaleA ); + isValidCfg = FALSE; + err = PCMDMX_INVALID_MODE; + break; + case CH_MODE_3_0_4_1: /* chCfg 12 */ + /* 7.1ch Surround Back: C' = C; L' = L; R' = R; LFE' = LFE; + Ls' = Ls*dmix_a_idx + Lsr*dmix_b_idx; + Rs' = Rs*dmix_a_idx + Rsr*dmix_b_idx; */ + dmxSetChannel( mixFactors, mixScales, LEFT_REAR_CHANNEL, LEFT_REAR_CHANNEL, dMixFactA, dMixScaleA ); + dmxSetChannel( mixFactors, mixScales, LEFT_REAR_CHANNEL, LEFT_MULTIPRPS_CHANNEL, dMixFactB, dMixScaleB ); + dmxSetChannel( mixFactors, mixScales, RIGHT_REAR_CHANNEL, RIGHT_REAR_CHANNEL, dMixFactA, dMixScaleA ); + dmxSetChannel( mixFactors, mixScales, RIGHT_REAR_CHANNEL, RIGHT_MULTIPRPS_CHANNEL, dMixFactB, dMixScaleB ); + break; + case CH_MODE_5_0_2_1: /* chCfg 7 || 14 */ + if (inChCfg == 14) { + /* 7.1ch Front Height: C' = C; Ls' = Ls; Rs' = Rs; LFE' = LFE; + L' = L*dmix_a_idx + Lv*dmix_b_idx; + R' = R*dmix_a_idx + Rv*dmix_b_idx; */ + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_FRONT_CHANNEL, dMixFactA, dMixScaleA ); + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_MULTIPRPS_CHANNEL, dMixFactB, dMixScaleB ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_FRONT_CHANNEL, dMixFactA, dMixScaleA ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_MULTIPRPS_CHANNEL, dMixFactB, dMixScaleB ); + } else { + /* 7.1ch Front: Ls' = Ls; Rs' = Rs; LFE' = LFE; + C' = C + (Lc+Rc)*dmix_a_idx; + L' = L + Lc*dmix_b_idx; + R' = R + Rc*dmix_b_idx; + CAUTION: L+R are not at (MPEG) index 1+2. */ + dmxSetChannel( mixFactors, mixScales, CENTER_FRONT_CHANNEL, LEFT_FRONT_CHANNEL, dMixFactA, dMixScaleA ); + dmxSetChannel( mixFactors, mixScales, CENTER_FRONT_CHANNEL, RIGHT_FRONT_CHANNEL, dMixFactA, dMixScaleA ); + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_FRONT_CHANNEL, dMixFactB, dMixScaleB ); + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_MULTIPRPS_CHANNEL, FL2FXCONST_DMX(0.5f), 1 ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_FRONT_CHANNEL, dMixFactB, dMixScaleB ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_MULTIPRPS_CHANNEL, FL2FXCONST_DMX(0.5f), 1 ); + } + break; + default: + /* Nothing to do. Just use the identity matrix. */ + isValidCfg = FALSE; + err = PCMDMX_INVALID_MODE; + break; + } + + /* Add additional DMX gain */ + if ( (isValidCfg == TRUE) + && (pMetaData->dmxGainIdx5 != 0)) + { /* Apply DMX gain 5 */ + FIXP_DMX dmxGain; + INT dmxScale; + INT sign = (pMetaData->dmxGainIdx5 & 0x40) ? -1 : 1; + INT val = pMetaData->dmxGainIdx5 & 0x3F; + + /* 10^(dmx_gain_5/80) */ + dmxGain = FX_DBL2FX_DMX( fLdPow( + FL2FXCONST_DBL(0.830482023721841f), 2, /* log2(10) */ + (FIXP_DBL)(sign*val*(LONG)FL2FXCONST_DBL(0.0125f)), 0, + &dmxScale ) + ); + /* Currently only positive scale factors supported! */ + if (dmxScale < 0) { + dmxGain >>= -dmxScale; + dmxScale = 0; + } + + dmxSetChannel( mixFactors, mixScales, CENTER_FRONT_CHANNEL, CENTER_FRONT_CHANNEL, dmxGain, dmxScale ); + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_FRONT_CHANNEL, dmxGain, dmxScale ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_FRONT_CHANNEL, dmxGain, dmxScale ); + dmxSetChannel( mixFactors, mixScales, LEFT_REAR_CHANNEL, LEFT_REAR_CHANNEL, dmxGain, dmxScale ); + dmxSetChannel( mixFactors, mixScales, RIGHT_REAR_CHANNEL, RIGHT_REAR_CHANNEL, dmxGain, dmxScale ); + dmxSetChannel( mixFactors, mixScales, LOW_FREQUENCY_CHANNEL, LOW_FREQUENCY_CHANNEL, dmxGain, dmxScale ); + } + + /* Mark the output channels */ + valid[CENTER_FRONT_CHANNEL] = 1; + valid[LEFT_FRONT_CHANNEL] = 1; + valid[RIGHT_FRONT_CHANNEL] = 1; + valid[LEFT_REAR_CHANNEL] = 1; + valid[RIGHT_REAR_CHANNEL] = 1; + valid[LOW_FREQUENCY_CHANNEL] = 1; + + /* Update channel mode for the next stage */ + inChMode = CH_MODE_3_0_2_1; + } + + /* SECOND STAGE: */ + if (numOutChannel <= TWO_CHANNEL) { + /* Create DMX matrix according to input configuration */ + switch (inChMode) { + case CH_MODE_2_0_0_0: /* chCfg 2 */ + /* Apply the dual channel mode. */ + switch (pParams->dualChannelMode) { + case CH1_MODE: /* L' = 0.707 * Ch1; + R' = 0.707 * Ch1; */ + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_FRONT_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, LEFT_FRONT_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + break; + case CH2_MODE: /* L' = 0.707 * Ch2; + R' = 0.707 * Ch2; */ + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, RIGHT_FRONT_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_FRONT_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + break; + case MIXED_MODE: /* L' = 0.5*Ch1 + 0.5*Ch2; + R' = 0.5*Ch1 + 0.5*Ch2; */ + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_FRONT_CHANNEL, FL2FXCONST_DMX(0.5f), 0 ); + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, RIGHT_FRONT_CHANNEL, FL2FXCONST_DMX(0.5f), 0 ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, LEFT_FRONT_CHANNEL, FL2FXCONST_DMX(0.5f), 0 ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_FRONT_CHANNEL, FL2FXCONST_DMX(0.5f), 0 ); + break; + default: + case STEREO_MODE: + /* Nothing to do */ + break; + } + break; + case CH_MODE_2_0_1_0: + /* L' = L + 0.707*S; + R' = R + 0.707*S; */ + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_REAR_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, LEFT_REAR_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + break; + case CH_MODE_3_0_0_0: /* chCfg 3 */ + /* L' = L + 0.707*C; + R' = R + 0.707*C; */ + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, CENTER_FRONT_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, CENTER_FRONT_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + break; + case CH_MODE_3_0_1_0: /* chCfg 4 */ + /* L' = L + 0.707*C + 0.707*S; + R' = R + 0.707*C + 0.707*S; */ + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, CENTER_FRONT_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_REAR_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, CENTER_FRONT_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, LEFT_REAR_CHANNEL, FL2FXCONST_DMX(0.707f), 0 ); + break; + case CH_MODE_3_0_2_0: /* chCfg 5 */ + case CH_MODE_3_0_2_1: /* chCfg 6 */ + /* MPEG + ITU + DLB + But because the default downmix equations and coefficients are equal we stick to MPEG. */ + if ( (pMetaData->typeFlags & TYPE_DSE_DATA) + || !(pMetaData->typeFlags & TYPE_PCE_DATA) ) + { + FIXP_DMX cMixLvl, sMixLvl, lMixLvl; + INT cMixScale, sMixScale, lMixScale; + + /* Get factors from meta data */ + cMixLvl = abMixLvlValueTab[pMetaData->cLevIdx]; + cMixScale = (pMetaData->cLevIdx==0) ? 1 : 0; + sMixLvl = abMixLvlValueTab[pMetaData->sLevIdx]; + sMixScale = (pMetaData->sLevIdx==0) ? 1 : 0; + lMixLvl = lfeMixLvlValueTab[pMetaData->dmixIdxLfe]; + if (pMetaData->dmixIdxLfe <= 1) { + lMixScale = 2; + } else if (pMetaData->dmixIdxLfe <= 5) { + lMixScale = 1; + } else { + lMixScale = 0; + } + /* Setup the DMX matrix */ + if ( (pParams->pseudoSurrMode == FORCE_PS_DMX) + || ((pParams->pseudoSurrMode == AUTO_PS_DMX) && (pMetaData->pseudoSurround==1))) + { /* L' = L + C*clev - (Ls+Rs)*slev + LFE*lflev; + R' = R + C*clev + (Ls+Rs)*slev + LFE*lflev; */ + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, CENTER_FRONT_CHANNEL, cMixLvl, cMixScale ); + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_REAR_CHANNEL, -sMixLvl, sMixScale ); + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, RIGHT_REAR_CHANNEL, -sMixLvl, sMixScale ); + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LOW_FREQUENCY_CHANNEL, lMixLvl, lMixScale ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, CENTER_FRONT_CHANNEL, cMixLvl, cMixScale ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, LEFT_REAR_CHANNEL, sMixLvl, sMixScale ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_REAR_CHANNEL, sMixLvl, sMixScale ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, LOW_FREQUENCY_CHANNEL, lMixLvl, lMixScale ); + } + else + { /* L' = L + C*clev + Ls*slev + LFE*llev; + R' = R + C*clev + Rs*slev + LFE*llev; */ + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, CENTER_FRONT_CHANNEL, cMixLvl, cMixScale ); + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_REAR_CHANNEL, sMixLvl, sMixScale ); + dmxAddChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LOW_FREQUENCY_CHANNEL, lMixLvl, lMixScale ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, CENTER_FRONT_CHANNEL, cMixLvl, cMixScale ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_REAR_CHANNEL, sMixLvl, sMixScale ); + dmxAddChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, LOW_FREQUENCY_CHANNEL, lMixLvl, lMixScale ); + } + + /* Add additional DMX gain */ + if ( pMetaData->dmxGainIdx2 != 0 ) + { /* Apply DMX gain 2 */ + FIXP_DMX dmxGain; + INT dmxScale; + INT sign = (pMetaData->dmxGainIdx2 & 0x40) ? -1 : 1; + INT val = pMetaData->dmxGainIdx2 & 0x3F; + + /* 10^(dmx_gain_2/80) */ + dmxGain = FX_DBL2FX_DMX( fLdPow( + FL2FXCONST_DBL(0.830482023721841f), 2, /* log2(10) */ + (FIXP_DBL)(sign*val*(LONG)FL2FXCONST_DBL(0.0125f)), 0, + &dmxScale ) + ); + /* Currently only positive scale factors supported! */ + if (dmxScale < 0) { + dmxGain >>= -dmxScale; + dmxScale = 0; + } + + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_FRONT_CHANNEL, dmxGain, dmxScale ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_FRONT_CHANNEL, dmxGain, dmxScale ); + } + } +#ifdef PCE_METADATA_ENABLE + else { + FIXP_DMX flev, clev, slevLL, slevLR, slevRL, slevRR; + FIXP_DMX mtrxMixDwnCoef = mpegMixDownIdx2Coef[pMetaData->matrixMixdownIdx]; + + if ( (pParams->pseudoSurrMode == FORCE_PS_DMX) + || ((pParams->pseudoSurrMode == AUTO_PS_DMX) && (pMetaData->pseudoSurround==1))) + { /* 3/2 input: L' = (1.707+2*A)^-1 * [L+0.707*C-A*Ls-A*Rs]; + R' = (1.707+2*A)^-1 * [R+0.707*C+A*Ls+A*Rs]; */ + flev = mpegMixDownIdx2PreFact[1][pMetaData->matrixMixdownIdx]; + slevRR = slevRL = FX_DBL2FX_DMX(fMult(flev, mtrxMixDwnCoef)); + slevLL = slevLR = -slevRL; + } + else { + /* 3/2 input: L' = (1.707+A)^-1 * [L+0.707*C+A*Ls]; + R' = (1.707+A)^-1 * [R+0.707*C+A*Rs]; */ + flev = mpegMixDownIdx2PreFact[0][pMetaData->matrixMixdownIdx]; + slevRR = slevLL = FX_DBL2FX_DMX(fMult(flev, mtrxMixDwnCoef)); + slevLR = slevRL = (FIXP_SGL)0; + } + /* common factor */ + clev = FX_DBL2FX_DMX(fMult(flev, mpegMixDownIdx2Coef[0] /* 0.707 */)); + + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_FRONT_CHANNEL, flev, 0 ); + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, CENTER_FRONT_CHANNEL, clev, 0 ); + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, LEFT_REAR_CHANNEL, slevLL, 0 ); + dmxSetChannel( mixFactors, mixScales, LEFT_FRONT_CHANNEL, RIGHT_REAR_CHANNEL, slevLR, 0 ); + + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_FRONT_CHANNEL, flev, 0 ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, CENTER_FRONT_CHANNEL, clev, 0 ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, LEFT_REAR_CHANNEL, slevRL, 0 ); + dmxSetChannel( mixFactors, mixScales, RIGHT_FRONT_CHANNEL, RIGHT_REAR_CHANNEL, slevRR, 0 ); + } +#endif /* PCE_METADATA_ENABLE */ + break; + default: + /* This configuration does not fit to any known downmix equation! */ + err = PCMDMX_INVALID_MODE; + break; + } + /* Mark the output channels */ + FDKmemclear(valid, PCM_DMX_MAX_CHANNELS*sizeof(unsigned int)); + valid[LEFT_FRONT_CHANNEL] = 1; + valid[RIGHT_FRONT_CHANNEL] = 1; + /* Update channel mode for the next stage */ + inChMode = CH_MODE_2_0_0_0; + } + + if (numOutChannel == ONE_CHANNEL) { + FIXP_DMX monoMixLevel; + INT monoMixScale; + +#ifdef PCE_METADATA_ENABLE + if ( (pMetaData->typeFlags & TYPE_PCE_DATA) + && !(pMetaData->typeFlags & TYPE_DSE_DATA) ) + { /* C' = (3+2*A)^-1 * [C+L+R+A*Ls+A+Rs]; */ + monoMixLevel = mpegMixDownIdx2PreFact[2][pMetaData->matrixMixdownIdx]; + monoMixScale = 0; + + dmxClearChannel( mixFactors, mixScales, CENTER_FRONT_CHANNEL ); + mixFactors[CENTER_FRONT_CHANNEL][CENTER_FRONT_CHANNEL] = monoMixLevel; + mixFactors[CENTER_FRONT_CHANNEL][LEFT_FRONT_CHANNEL] = monoMixLevel; + mixFactors[CENTER_FRONT_CHANNEL][RIGHT_FRONT_CHANNEL] = monoMixLevel; + monoMixLevel = FX_DBL2FX_DMX(fMult(monoMixLevel, mpegMixDownIdx2Coef[pMetaData->matrixMixdownIdx])); + mixFactors[CENTER_FRONT_CHANNEL][LEFT_REAR_CHANNEL] = monoMixLevel; + mixFactors[CENTER_FRONT_CHANNEL][RIGHT_REAR_CHANNEL] = monoMixLevel; + } + else +#endif + { /* C' = L + R; [default] */ + monoMixLevel = FL2FXCONST_DMX(0.5f); + monoMixScale = 1; + dmxClearChannel( mixFactors, mixScales, CENTER_FRONT_CHANNEL ); /* C is not in the mix */ + dmxSetChannel( mixFactors, mixScales, CENTER_FRONT_CHANNEL, LEFT_FRONT_CHANNEL, monoMixLevel, monoMixScale ); + dmxAddChannel( mixFactors, mixScales, CENTER_FRONT_CHANNEL, RIGHT_FRONT_CHANNEL, monoMixLevel, monoMixScale ); + } + + /* Mark the output channel */ + FDKmemclear(valid, PCM_DMX_MAX_CHANNELS*sizeof(unsigned int)); + valid[CENTER_FRONT_CHANNEL] = 1; + } + +#define MAX_SEARCH_START_VAL ( -7 ) + + { + LONG chSum[PCM_DMX_MAX_CHANNELS]; + INT chSumMax = MAX_SEARCH_START_VAL; + + /* Determine the current maximum scale factor */ + for (outCh=0; outCh < PCM_DMX_MAX_CHANNELS; outCh+=1) { + if (valid[outCh]!=0) { + for (inCh=0; inCh < PCM_DMX_MAX_CHANNELS; inCh+=1) { + if (mixScales[outCh][inCh] > maxScale) + { /* Store the new maximum */ + maxScale = mixScales[outCh][inCh]; + } + } + } + } + + /* Individualy analyse output chanal levels */ + for (outCh=0; outCh < PCM_DMX_MAX_CHANNELS; outCh+=1) { + chSum[outCh] = MAX_SEARCH_START_VAL; + if (valid[outCh]!=0) { + int ovrflwProtScale = 0; + + /* Accumulate all factors for each output channel */ + chSum[outCh] = 0; + for (inCh=0; inCh < PCM_DMX_MAX_CHANNELS; inCh+=1) { + SHORT addFact = FX_DMX2SHRT(mixFactors[outCh][inCh]); + if ( mixScales[outCh][inCh] <= maxScale ) { + addFact >>= maxScale - mixScales[outCh][inCh]; + } else { + addFact <<= mixScales[outCh][inCh] - maxScale; + } + chSum[outCh] += addFact; + } + if (chSum[outCh] > (LONG)MAXVAL_SGL) { + while (chSum[outCh] > (LONG)MAXVAL_SGL) { + ovrflwProtScale += 1; + chSum[outCh] >>= 1; + } + } else if (chSum[outCh] > 0) { + while ((chSum[outCh]<<1) <= (LONG)MAXVAL_SGL) { + ovrflwProtScale -= 1; + chSum[outCh] <<= 1; + } + } + /* Store the differential scaling in the same array */ + chSum[outCh] = ovrflwProtScale; + } + } + + for (outCh=0; outCh < PCM_DMX_MAX_CHANNELS; outCh+=1) { + if ( (valid[outCh] != 0) + && (chSum[outCh] > chSumMax) ) + { /* Store the new maximum */ + chSumMax = chSum[outCh]; + } + } + maxScale = FDKmax(maxScale+chSumMax, 0); + + /* Normalize all factors */ + for (outCh=0; outCh < PCM_DMX_MAX_CHANNELS; outCh+=1) { + if (valid[outCh]!=0) { + for (inCh=0; inCh < PCM_DMX_MAX_CHANNELS; inCh+=1) { + if (mixFactors[outCh][inCh] != (FIXP_DMX)0) { + if ( mixScales[outCh][inCh] <= maxScale ) { + mixFactors[outCh][inCh] >>= maxScale - mixScales[outCh][inCh]; + } else { + mixFactors[outCh][inCh] <<= mixScales[outCh][inCh] - maxScale; + } + mixScales[outCh][inCh] = maxScale; + } + } + } + } + } + + + /* return the scale factor */ + *pOutScale = maxScale; + + return (err); +} + /** Open and initialize an instance of the PCM downmix module * @param [out] Pointer to a buffer receiving the handle of the new instance. @@ -526,24 +1447,24 @@ PCMDMX_ERROR pcmDmx_Reset ( if (self == NULL) { return (PCMDMX_INVALID_HANDLE); } if (flags & PCMDMX_RESET_PARAMS) { - self->dualChannelMode = STEREO_MODE; - self->numOutputChannels = 0; - self->applyProcessing = 0; - self->frameDelay = 0; - self->expiryFrame = PCMDMX_DFLT_EXPIRY_FRAME; + PCM_DMX_USER_PARAMS *pParams = &self->userParams; + + pParams->dualChannelMode = STEREO_MODE; + pParams->pseudoSurrMode = NEVER_DO_PS_DMX; + pParams->numOutChannelsMax = PCM_DMX_DFLT_MAX_OUT_CHANNELS; + pParams->numOutChannelsMin = PCM_DMX_DFLT_MIN_OUT_CHANNELS; + pParams->frameDelay = 0; + pParams->expiryFrame = PCM_DMX_DFLT_EXPIRY_FRAME; + + self->applyProcessing = 0; } if (flags & PCMDMX_RESET_BS_DATA) { int slot; + /* Init all slots with a default set */ for (slot = 0; slot <= PCM_DMX_MAX_DELAY_FRAMES; slot += 1) { - self->dvbMixDownLevels[slot].centerMixLevelValue = dvbDownmixFactors[2]; /* 0.707 */ - self->dvbMixDownLevels[slot].surroundMixLevelValue = dvbDownmixFactors[0]; /* 1.000 */ - self->dvbMixDownLevels[slot].mixLevelsAvail = 0; - - self->mpegMixDownInfo[slot].mixdownAvailable = 0; + FDKmemcpy(&self->bsMetaData[slot], &dfltMetaData, sizeof(DMX_BS_META_DATA)); } - /* Reset expiry counter */ - self->expiryCount = 0; } return (PCMDMX_OK); @@ -558,8 +1479,8 @@ PCMDMX_ERROR pcmDmx_Reset ( **/ PCMDMX_ERROR pcmDmx_SetParam ( HANDLE_PCM_DOWNMIX self, - PCMDMX_PARAM param, - UINT value + const PCMDMX_PARAM param, + const INT value ) { switch (param) @@ -567,39 +1488,70 @@ PCMDMX_ERROR pcmDmx_SetParam ( case DMX_BS_DATA_EXPIRY_FRAME: if (self == NULL) return (PCMDMX_INVALID_HANDLE); - self->expiryFrame = value; + self->userParams.expiryFrame = (value > 0) ? (UINT)value : 0; break; case DMX_BS_DATA_DELAY: - if (value > PCM_DMX_MAX_DELAY_FRAMES) { + if ( (value > PCM_DMX_MAX_DELAY_FRAMES) + || (value < 0) ) { return (PCMDMX_UNABLE_TO_SET_PARAM); } if (self == NULL) { return (PCMDMX_INVALID_HANDLE); } - self->frameDelay = value; + self->userParams.frameDelay = (UCHAR)value; break; - case NUMBER_OF_OUTPUT_CHANNELS: - switch ((int)value) { /* supported output channels */ - case -1: case 0: case 1: case 2: - case 6: case 8: + case MIN_NUMBER_OF_OUTPUT_CHANNELS: + switch (value) { /* supported output channels */ + case -1: case 0: case ONE_CHANNEL: case TWO_CHANNEL: +#if (PCM_DMX_MAX_OUT_CHANNELS >= 6) + case SIX_CHANNEL: +#endif +#if (PCM_DMX_MAX_OUT_CHANNELS >= 8) + case EIGHT_CHANNEL: +#endif break; default: return (PCMDMX_UNABLE_TO_SET_PARAM); } if (self == NULL) return (PCMDMX_INVALID_HANDLE); - if ((int)value > 0) { - self->numOutputChannels = (int)value; - self->applyProcessing = 1; - } else { - self->numOutputChannels = 0; - self->applyProcessing = 0; + /* Store the new value */ + self->userParams.numOutChannelsMin = (value > 0) ? value : -1; + if ( (value > 0) + && (self->userParams.numOutChannelsMax > 0) + && (value > self->userParams.numOutChannelsMax) ) + { /* MIN > MAX would be an invalid state. Thus set MAX = MIN in this case. */ + self->userParams.numOutChannelsMax = self->userParams.numOutChannelsMin; } break; - case DUAL_CHANNEL_DOWNMIX_MODE: + case MAX_NUMBER_OF_OUTPUT_CHANNELS: + switch (value) { /* supported output channels */ + case -1: case 0: case ONE_CHANNEL: case TWO_CHANNEL: +#if (PCM_DMX_MAX_OUT_CHANNELS >= 6) + case SIX_CHANNEL: +#endif +#if (PCM_DMX_MAX_OUT_CHANNELS >= 8) + case EIGHT_CHANNEL: +#endif + break; + default: + return (PCMDMX_UNABLE_TO_SET_PARAM); + } + if (self == NULL) + return (PCMDMX_INVALID_HANDLE); + /* Store the new value */ + self->userParams.numOutChannelsMax = (value > 0) ? value : -1; + if ( (value > 0) + && (value < self->userParams.numOutChannelsMin) ) + { /* MAX < MIN would be an invalid state. Thus set MIN = MAX in this case. */ + self->userParams.numOutChannelsMin = self->userParams.numOutChannelsMax; + } + break; + + case DMX_DUAL_CHANNEL_MODE: switch ((DUAL_CHANNEL_MODE)value) { case STEREO_MODE: case CH1_MODE: @@ -611,8 +1563,22 @@ PCMDMX_ERROR pcmDmx_SetParam ( } if (self == NULL) return (PCMDMX_INVALID_HANDLE); - self->dualChannelMode = (DUAL_CHANNEL_MODE)value; - self->applyProcessing = 1; + self->userParams.dualChannelMode = (DUAL_CHANNEL_MODE)value; + self->applyProcessing = 1; /* Force processing */ + break; + + case DMX_PSEUDO_SURROUND_MODE: + switch ((PSEUDO_SURROUND_MODE)value) { + case NEVER_DO_PS_DMX: + case AUTO_PS_DMX: + case FORCE_PS_DMX: + break; + default: + return (PCMDMX_UNABLE_TO_SET_PARAM); + } + if (self == NULL) + return (PCMDMX_INVALID_HANDLE); + self->userParams.pseudoSurrMode = (PSEUDO_SURROUND_MODE)value; break; default: @@ -622,87 +1588,239 @@ PCMDMX_ERROR pcmDmx_SetParam ( return (PCMDMX_OK); } - -/** Read the ancillary data transported in DSEs of DVB streams with MPEG-4 content +/** Get one parameter value of one PCM downmix module instance. * @param [in] Handle of PCM downmix module instance. - * @param [in] Pointer to ancillary data buffer. - * @param [in] Size of ancillary data. - * @param [in] Flag indicating wheter the DVB ancillary data is from an MPEG-1/2 or an MPEG-4 stream. + * @param [in] Parameter to be set. + * @param [out] Pointer to buffer receiving the parameter value. * @returns Returns an error code. **/ -PCMDMX_ERROR pcmDmx_ReadDvbAncData ( +PCMDMX_ERROR pcmDmx_GetParam ( HANDLE_PCM_DOWNMIX self, - UCHAR *pAncDataBuf, - UINT ancDataBytes, + const PCMDMX_PARAM param, + INT * const pValue + ) +{ + PCM_DMX_USER_PARAMS *pUsrParams; + + if ( (self == NULL) + || (pValue == NULL) ) { + return (PCMDMX_INVALID_HANDLE); + } + pUsrParams = &self->userParams; + + switch (param) + { + case DMX_BS_DATA_EXPIRY_FRAME: + *pValue = (INT)pUsrParams->expiryFrame; + break; + case DMX_BS_DATA_DELAY: + *pValue = (INT)pUsrParams->frameDelay; + break; + case MIN_NUMBER_OF_OUTPUT_CHANNELS: + *pValue = (INT)pUsrParams->numOutChannelsMin; + break; + case MAX_NUMBER_OF_OUTPUT_CHANNELS: + *pValue = (INT)pUsrParams->numOutChannelsMax; + break; + case DMX_DUAL_CHANNEL_MODE: + *pValue = (INT)pUsrParams->dualChannelMode; + break; + case DMX_PSEUDO_SURROUND_MODE: + *pValue = (INT)pUsrParams->pseudoSurrMode; + break; + default: + return (PCMDMX_UNKNOWN_PARAM); + } + + return (PCMDMX_OK); +} + + +#ifdef DSE_METADATA_ENABLE + +#define MAX_DSE_ANC_BYTES ( 16 ) /* 15 bytes */ +#define ANC_DATA_SYNC_BYTE ( 0xBC ) /* ancillary data sync byte. */ + +/* + * Read DMX meta-data from a data stream element. + */ +PCMDMX_ERROR pcmDmx_Parse ( + HANDLE_PCM_DOWNMIX self, + HANDLE_FDK_BITSTREAM hBs, + UINT ancDataBits, int isMpeg2 ) { - DVB_MIXDOWN_LEVELS *pDownmixLevels = &self->dvbMixDownLevels[0]; + PCMDMX_ERROR errorStatus = PCMDMX_OK; + DMX_BS_META_DATA *pBsMetaData = &self->bsMetaData[0]; - int offset = (isMpeg2) ? 2 : 0; - UCHAR ancDataStatus; + int skip4Dmx = 0, skip4Ext = 0; + int dmxLvlAvail = 0, extDataAvail = 0; + int foundNewData = 0; + UINT minAncBits = ((isMpeg2) ? 5 : 3)*8; - if (self == NULL) { return (PCMDMX_INVALID_HANDLE); } + if ( (self == NULL) + || (hBs == NULL) ) { return (PCMDMX_INVALID_HANDLE); } + + ancDataBits = FDKgetValidBits(hBs); /* sanity checks */ - if (pAncDataBuf == NULL || ancDataBytes < (UCHAR)(3+offset)) { + if ( (ancDataBits < minAncBits) + || (ancDataBits > FDKgetValidBits(hBs)) ) { return (PCMDMX_CORRUPT_ANC_DATA); } + pBsMetaData = &self->bsMetaData[0]; + + if (isMpeg2) { + /* skip DVD ancillary data */ + FDKpushFor(hBs, 16); + } + /* check sync word */ - if (pAncDataBuf[offset] != ANC_DATA_SYNC_BYTE) { + if (FDKreadBits(hBs,8) != ANC_DATA_SYNC_BYTE) { return (PCMDMX_CORRUPT_ANC_DATA); } - offset += 2; - ancDataStatus = pAncDataBuf[offset++]; + /* skip MPEG audio type and Dolby surround mode */ + FDKpushFor(hBs, 4); if (isMpeg2) { - /* skip advanced_dynamic_range_control */ - if (ancDataStatus & 0x80) offset += 3; - /* skip dialog_normalization */ - if (ancDataStatus & 0x40) offset += 1; - /* skip reproduction_level */ - if (ancDataStatus & 0x20) offset += 1; + /* int numAncBytes = */ FDKreadBits(hBs, 4); + /* advanced dynamic range control */ + if (FDKreadBit(hBs)) skip4Dmx += 24; + /* dialog normalization */ + if (FDKreadBit(hBs)) skip4Dmx += 8; + /* reproduction_level */ + if (FDKreadBit(hBs)) skip4Dmx += 8; + } else { + FDKpushFor(hBs, 2); /* drc presentation mode */ + pBsMetaData->pseudoSurround = FDKreadBit(hBs); + FDKpushFor(hBs, 4); /* reserved bits */ } - else { - /* check reserved bits */ - if (ancDataStatus & 0xE8) { return (PCMDMX_CORRUPT_ANC_DATA); } + + /* downmixing levels MPEGx status */ + dmxLvlAvail = FDKreadBit(hBs); + + if (isMpeg2) { + /* scale factor CRC status */ + if (FDKreadBit(hBs)) skip4Ext += 16; + } else { + /* ancillary data extension status */ + extDataAvail = FDKreadBit(hBs); } + /* audio coding and compression status */ + if (FDKreadBit(hBs)) skip4Ext += 16; + /* coarse grain timecode status */ + if (FDKreadBit(hBs)) skip4Ext += 16; + /* fine grain timecode status */ + if (FDKreadBit(hBs)) skip4Ext += 16; + + /* skip the useless data to get to the DMX levels */ + FDKpushFor(hBs, skip4Dmx); + /* downmix_levels_MPEGX */ - if (ancDataStatus & 0x10) + if (dmxLvlAvail) { - int foundNewData = 0; - UCHAR downmixData = pAncDataBuf[offset++]; - - if (downmixData & 0x80) { /* center_mix_level_on */ - pDownmixLevels->centerMixLevelValue = - dvbDownmixFactors[(downmixData >> 4) & 0x07]; + if (FDKreadBit(hBs)) { /* center_mix_level_on */ + pBsMetaData->cLevIdx = FDKreadBits(hBs, 3); foundNewData = 1; } else { - pDownmixLevels->centerMixLevelValue = dvbDownmixFactors[0]; - if (downmixData & 0x70) { return (PCMDMX_CORRUPT_ANC_DATA); } + FDKreadBits(hBs, 3); } - - if (downmixData & 0x08) { /* surround_mix_level_on */ - pDownmixLevels->surroundMixLevelValue = - dvbDownmixFactors[downmixData & 0x07]; + if (FDKreadBit(hBs)) { /* surround_mix_level_on */ + pBsMetaData->sLevIdx = FDKreadBits(hBs, 3); foundNewData = 1; } else { - pDownmixLevels->surroundMixLevelValue = dvbDownmixFactors[0]; - if (downmixData & 0x07) { return (PCMDMX_CORRUPT_ANC_DATA); } + FDKreadBits(hBs, 3); + } + } + + /* skip the useless data to get to the ancillary data extension */ + FDKpushFor(hBs, skip4Ext); + + /* anc data extension (MPEG-4 only) */ + if (extDataAvail) { + int extDmxLvlSt, extDmxGainSt, extDmxLfeSt; + + FDKreadBit(hBs); /* reserved bit */ + extDmxLvlSt = FDKreadBit(hBs); + extDmxGainSt = FDKreadBit(hBs); + extDmxLfeSt = FDKreadBit(hBs); + FDKreadBits(hBs, 4); /* reserved bits */ + + if (extDmxLvlSt) { + pBsMetaData->dmixIdxA = FDKreadBits(hBs, 3); + pBsMetaData->dmixIdxB = FDKreadBits(hBs, 3); + FDKreadBits(hBs, 2); /* reserved bits */ + foundNewData = 1; + } + if (extDmxGainSt) { + pBsMetaData->dmxGainIdx5 = FDKreadBits(hBs, 7); + FDKreadBit(hBs); /* reserved bit */ + pBsMetaData->dmxGainIdx2 = FDKreadBits(hBs, 7); + FDKreadBit(hBs); /* reserved bit */ + foundNewData = 1; + } + if (extDmxLfeSt) { + pBsMetaData->dmixIdxLfe = FDKreadBits(hBs, 4); + FDKreadBits(hBs, 4); /* reserved bits */ + foundNewData = 1; } + } - pDownmixLevels->mixLevelsAvail = foundNewData; + /* final sanity check on the amount of read data */ + if ((INT)FDKgetValidBits(hBs) < 0) { + errorStatus = PCMDMX_CORRUPT_ANC_DATA; } - /* Reset expiry counter */ - self->expiryCount = 0; + if ( (errorStatus == PCMDMX_OK) + && (foundNewData == 1) ) { + /* announce new data */ + pBsMetaData->typeFlags |= TYPE_DSE_DATA; + /* reset expiry counter */ + pBsMetaData->expiryCount = 0; + } - return (PCMDMX_OK); + return (errorStatus); +} + +/* + * Read DMX meta-data from a data stream element. + */ +PCMDMX_ERROR pcmDmx_ReadDvbAncData ( + HANDLE_PCM_DOWNMIX self, + UCHAR *pAncDataBuf, + UINT ancDataBytes, + int isMpeg2 + ) +{ + FDK_BITSTREAM bs; + HANDLE_FDK_BITSTREAM hBs = &bs; + PCMDMX_ERROR errorStatus = PCMDMX_OK; + + if (self == NULL) { return (PCMDMX_INVALID_HANDLE); } + + /* sanity checks */ + if ( (pAncDataBuf == NULL) + || (ancDataBytes == 0) ) { + return (PCMDMX_CORRUPT_ANC_DATA); + } + + FDKinitBitStream (hBs, pAncDataBuf, MAX_DSE_ANC_BYTES, ancDataBytes*8, BS_READER); + + errorStatus = pcmDmx_Parse ( + self, + hBs, + ancDataBytes*8, + isMpeg2 ); + + return (errorStatus); } +#endif /* DSE_METADATA_ENABLE */ +#ifdef PCE_METADATA_ENABLE /** Set the matrix mixdown information extracted from the PCE of an AAC bitstream. * Note: Call only if matrix_mixdown_idx_present is true. * @param [in] Handle of PCM downmix module instance. @@ -717,38 +1835,36 @@ PCMDMX_ERROR pcmDmx_SetMatrixMixdownFromPce ( int pseudoSurroundEnable ) { - MPEG_MIXDOWN_INFO *pMpegMixDownInfo; + DMX_BS_META_DATA *pBsMetaData = &self->bsMetaData[0]; if (self == NULL) { return (PCMDMX_INVALID_HANDLE); } - pMpegMixDownInfo = &self->mpegMixDownInfo[0]; - if (matrixMixdownPresent) { - pMpegMixDownInfo->matrixMixdownIdx = matrixMixdownIdx & 0x03; - pMpegMixDownInfo->pseudoSurroundEnable = pseudoSurroundEnable; + pBsMetaData->pseudoSurround = pseudoSurroundEnable; + pBsMetaData->matrixMixdownIdx = matrixMixdownIdx & 0x03; + pBsMetaData->typeFlags |= TYPE_PCE_DATA; + /* Reset expiry counter */ + pBsMetaData->expiryCount = 0; } - pMpegMixDownInfo->mixdownAvailable = matrixMixdownPresent; - /* Reset expiry counter */ - self->expiryCount = 0; - return (PCMDMX_OK); } +#endif /* PCE_METADATA_ENABLE */ /** Apply down or up mixing. * @param [in] Handle of PCM downmix module instance. - * @param [inout] Pointer to time buffer. Depending on interface configuration, the content of pTimeData is ignored, - * and the internal QMF buffer will be used as input data source. Otherwise, the MPEG Surround processing is - * applied to the timesignal pTimeData. For both variants, the resulting MPEG Surround signal is written into pTimeData. + * @param [inout] Pointer to buffer that hold the time domain signal. * @param [in] Pointer where the amount of output samples is returned into. * @param [inout] Pointer where the amount of output channels is returned into. * @param [in] Flag which indicates if output time data are writtern interleaved or as subsequent blocks. * @param [inout] Array where the corresponding channel type for each output audio channel is stored into. * @param [inout] Array where the corresponding channel type index for each output audio channel is stored into. - * @param [in] Array containing the output channel mapping to be used (From MPEG PCE ordering to whatever is required). + * @param [in] Array containing the out channel mapping to be used (From MPEG PCE ordering to whatever is required). + * @param [out] Pointer on a field receiving the scale factor that has to be applied on all samples afterwards. + * If the handed pointer is NULL scaling is done internally. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_ApplyFrame ( @@ -756,97 +1872,173 @@ PCMDMX_ERROR pcmDmx_ApplyFrame ( INT_PCM *pPcmBuf, UINT frameSize, INT *nChannels, - int fInterleaved, AUDIO_CHANNEL_TYPE channelType[], UCHAR channelIndices[], - const UCHAR channelMapping[][8] + const UCHAR channelMapping[][8], + INT *pDmxOutScale ) { + PCM_DMX_USER_PARAMS *pParam = NULL; PCMDMX_ERROR errorStatus = PCMDMX_OK; DUAL_CHANNEL_MODE dualChannelMode; PCM_DMX_CHANNEL_MODE inChMode; - int numOutChannels; - int numInChannels = *nChannels; - int slot; + PCM_DMX_CHANNEL_MODE outChMode; + INT devNull; /* Just a dummy to avoid a lot of branches in the code */ + int numOutChannels, numInChannels; + int inStride, outStride, offset; + int dmxMaxScale, dmxScale; + int ch, slot; UCHAR inOffsetTable[PCM_DMX_MAX_CHANNELS]; - MPEG_MIXDOWN_INFO mpegMixDownInfo; - DVB_MIXDOWN_LEVELS dvbMixDownLevels; + DMX_BS_META_DATA bsMetaData; - if (self == NULL) { return (PCMDMX_INVALID_HANDLE); } - - if ( (self->expiryFrame > 0) - && (++self->expiryCount > self->expiryFrame) ) - { /* The metadata read from bitstream is too old. */ - errorStatus = pcmDmx_Reset(self, PCMDMX_RESET_BS_DATA); + if ( (self == NULL) + || (nChannels == NULL) + || (channelType == NULL) + || (channelIndices == NULL) + || (channelMapping == NULL) ) { + return (PCMDMX_INVALID_HANDLE); } - FDKmemcpy(&mpegMixDownInfo, &self->mpegMixDownInfo[self->frameDelay], sizeof(MPEG_MIXDOWN_INFO)); - /* Maintain delay line */ - for (slot = self->frameDelay; slot > 0; slot -= 1) { - FDKmemcpy(&self->mpegMixDownInfo[slot], &self->mpegMixDownInfo[slot-1], sizeof(MPEG_MIXDOWN_INFO)); - } - FDKmemcpy(&dvbMixDownLevels, &self->dvbMixDownLevels[self->frameDelay], sizeof(DVB_MIXDOWN_LEVELS)); - /* Maintain delay line */ - for (slot = self->frameDelay; slot > 0; slot -= 1) { - FDKmemcpy(&self->dvbMixDownLevels[slot], &self->dvbMixDownLevels[slot-1], sizeof(DVB_MIXDOWN_LEVELS)); + /* Init the output scaling */ + dmxScale = 0; + if (pDmxOutScale != NULL) { + /* Avoid final scaling internally and hand it to the outside world. */ + *pDmxOutScale = 0; + dmxMaxScale = PCMDMX_MAX_HEADROOM; + } else { + /* Apply the scaling internally. */ + pDmxOutScale = &devNull; /* redirect to temporal stack memory */ + dmxMaxScale = 0; } - if (self->applyProcessing == 0) { return (errorStatus); } + pParam = &self->userParams; + numInChannels = *nChannels; + /* Perform some input sanity checks */ if (pPcmBuf == NULL) { return (PCMDMX_INVALID_ARGUMENT); } if (frameSize == 0) { return (PCMDMX_INVALID_ARGUMENT); } - if (numInChannels == 0) { return (PCMDMX_INVALID_ARGUMENT); } + if ( (numInChannels == 0) + || (numInChannels > PCM_DMX_MAX_IN_CHANNELS) ) + { return (PCMDMX_INVALID_ARGUMENT); } + + /* Check on misconfiguration */ + FDK_ASSERT( (pParam->numOutChannelsMax <= 0) \ + || (pParam->numOutChannelsMax >= pParam->numOutChannelsMin)); + + /* Determine if the module has to do processing */ + if ( (self->applyProcessing == 0) + && ((pParam->numOutChannelsMax <= 0) + || (pParam->numOutChannelsMax >= numInChannels)) + && (pParam->numOutChannelsMin <= numInChannels) ) { + /* Nothing to do */ + return (errorStatus); + } - if (self->numOutputChannels <= 0) { + /* Determine the number of output channels */ + if ( (pParam->numOutChannelsMax > 0) + && (numInChannels > pParam->numOutChannelsMax) ) { + numOutChannels = pParam->numOutChannelsMax; + } + else if (numInChannels < pParam->numOutChannelsMin) { + numOutChannels = pParam->numOutChannelsMin; + } + else { numOutChannels = numInChannels; - } else { - numOutChannels = self->numOutputChannels; } - dualChannelMode = self->dualChannelMode; + + dualChannelMode = pParam->dualChannelMode; /* Analyse input channel configuration and get channel offset * table that can be accessed with the fixed channel labels. */ - inChMode = getChannelMode( + errorStatus = getChannelMode( numInChannels, channelType, channelIndices, - inOffsetTable + inOffsetTable, + &inChMode ); - if (inChMode == CH_MODE_UNDEFINED) { + if ( PCMDMX_IS_FATAL_ERROR(errorStatus) + || (inChMode == CH_MODE_UNDEFINED) ) { /* We don't need to restore because the channel configuration has not been changed. Just exit. */ return (PCMDMX_INVALID_CH_CONFIG); } + /* Set input stride and offset */ + if (fInterleaved) { + inStride = numInChannels; + offset = 1; /* Channel specific offset factor */ + } else { + inStride = 1; + offset = frameSize; /* Channel specific offset factor */ + } + + /* Reset downmix meta data if necessary */ + if ( (pParam->expiryFrame > 0) + && (++self->bsMetaData[0].expiryCount > pParam->expiryFrame) ) + { /* The metadata read from bitstream is too old. */ + PCMDMX_ERROR err = pcmDmx_Reset(self, PCMDMX_RESET_BS_DATA); + FDK_ASSERT(err == PCMDMX_OK); + } + FDKmemcpy(&bsMetaData, &self->bsMetaData[pParam->frameDelay], sizeof(DMX_BS_META_DATA)); + /* Maintain delay line */ + for (slot = pParam->frameDelay; slot > 0; slot -= 1) { + FDKmemcpy(&self->bsMetaData[slot], &self->bsMetaData[slot-1], sizeof(DMX_BS_META_DATA)); + } + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +#ifdef PCM_DOWNMIX_ENABLE if ( numInChannels > numOutChannels ) { /* Apply downmix */ - INT_PCM *pInCF, *pInLF, *pInRF, *pInLO, *pInRO, *pInLR, *pInRR, *pOutL, *pOutR; - FIXP_SGL flev, clev, slev; - - UINT sample; - int inStride, outStride, offset; - int useGuidedDownMix = 0; - UCHAR outOffsetTable[PCM_DMX_MAX_CHANNELS]; - - /* Set I/O strides and offsets */ - if (fInterleaved) { - inStride = numInChannels; - outStride = TWO_CHANNEL; /* The output of STAGE ONE is always STEREO !!! - STAGE TWO creates a downmix to mono if required. */ - offset = 1; /* Channel specific offset factor */ - } else { - inStride = 1; - outStride = 1; - offset = frameSize; /* Channel specific offset factor */ + INT_PCM *pInPcm[PCM_DMX_MAX_IN_CHANNELS] = { NULL }; + INT_PCM *pOutPcm[PCM_DMX_MAX_OUT_CHANNELS] = { NULL }; + FIXP_DMX mixFactors[PCM_DMX_MAX_CHANNELS][PCM_DMX_MAX_CHANNELS]; + UCHAR outOffsetTable[PCM_DMX_MAX_CHANNELS]; + UINT sample; + int chCfg = 0; + int bypScale = 0; + +#if (PCM_DMX_MAX_IN_CHANNELS >= 7) + if (numInChannels > SIX_CHANNEL) { + AUDIO_CHANNEL_TYPE multiPurposeChType[2]; + + /* Get the type of the multipurpose channels */ + multiPurposeChType[0] = channelType[inOffsetTable[LEFT_MULTIPRPS_CHANNEL]]; + multiPurposeChType[1] = channelType[inOffsetTable[RIGHT_MULTIPRPS_CHANNEL]]; + + /* Check if the input configuration is one defined in the standard. */ + switch (inChMode) { + case CH_MODE_5_0_2_1: /* chCfg 7 || 14 */ + /* Further analyse the input config to distinguish the two CH_MODE_5_0_2_1 configs. */ + if ( (multiPurposeChType[0] == ACT_FRONT_TOP) + && (multiPurposeChType[1] == ACT_FRONT_TOP) ) { + chCfg = 14; + } else { + chCfg = 7; + } + break; + case CH_MODE_3_0_3_1: /* chCfg 11 */ + chCfg = 11; + break; + case CH_MODE_3_0_4_1: /* chCfg 12 */ + chCfg = 12; + break; + default: + chCfg = 0; /* Not a known config */ + break; + } } +#endif - /* Get channel description and channel mapping for this - * stages number of output channels (always STEREO). */ + /* Set this stages output stride and channel mode: */ + outStride = (fInterleaved) ? numOutChannels : 1; + outChMode = outChModeTable[numOutChannels]; + + /* Get channel description and channel mapping for the desired output configuration. */ getChannelDescription( - CH_MODE_2_0_0_0, + outChMode, channelMapping, channelType, channelIndices, @@ -854,287 +2046,300 @@ PCMDMX_ERROR pcmDmx_ApplyFrame ( ); /* Now there is no way back because we modified the channel configuration! */ - /* Set channel pointer for input */ - pInCF = &pPcmBuf[inOffsetTable[CENTER_FRONT_CHANNEL]*offset]; - pInLF = &pPcmBuf[inOffsetTable[LEFT_FRONT_CHANNEL]*offset]; - pInRF = &pPcmBuf[inOffsetTable[RIGHT_FRONT_CHANNEL]*offset]; - pInLO = &pPcmBuf[inOffsetTable[LEFT_OUTSIDE_CHANNEL]*offset]; - pInRO = &pPcmBuf[inOffsetTable[RIGHT_OUTSIDE_CHANNEL]*offset]; - pInLR = &pPcmBuf[inOffsetTable[LEFT_REAR_CHANNEL]*offset]; - pInRR = &pPcmBuf[inOffsetTable[RIGHT_REAR_CHANNEL]*offset]; - - /* Set channel pointer for output - Caution: Different channel mapping compared to input */ - pOutL = &pPcmBuf[outOffsetTable[LEFT_FRONT_CHANNEL]*offset]; /* LEFT_FRONT_CHANNEL */ - pOutR = &pPcmBuf[outOffsetTable[RIGHT_FRONT_CHANNEL]*offset]; /* RIGHT_FRONT_CHANNEL */ - - /* Set downmix levels: */ - flev = ATTENUATION_FACTOR_1; /* 0.707 */ - clev = ATTENUATION_FACTOR_1; /* 0.707 */ - slev = ATTENUATION_FACTOR_1; /* 0.707 */ - - if ( dvbMixDownLevels.mixLevelsAvail ) { - clev = dvbMixDownLevels.centerMixLevelValue; - slev = dvbMixDownLevels.surroundMixLevelValue; - useGuidedDownMix = 1; - } - - /* FIRST STAGE: - Always downmix to 2 channel output: */ - switch ( inChMode ) - { - case CH_MODE_2_0_0_0: - case CH_MODE_2_0_0_1: - /* 2/0 input: */ - switch (dualChannelMode) - { - case CH1_MODE: /* L' = 0.707 * Ch1; R' = 0.707 * Ch1 */ - for (sample = 0; sample < frameSize; sample++) { - *pOutL = *pOutR = - (INT_PCM)SATURATE_RIGHT_SHIFT(fMult((FIXP_PCM)*pInLF, flev), DFRACT_BITS-SAMPLE_BITS, SAMPLE_BITS); - - pInLF += inStride; - pOutL += outStride; pOutR += outStride; - } - break; - - case CH2_MODE: /* L' = 0.707 * Ch2; R' = 0.707 * Ch2 */ - for (sample = 0; sample < frameSize; sample++) { - *pOutL = *pOutR = - (INT_PCM)SATURATE_RIGHT_SHIFT(fMult((FIXP_PCM)*pInRF, flev), DFRACT_BITS-SAMPLE_BITS, SAMPLE_BITS); - - pInRF += inStride; - pOutL += outStride; pOutR += outStride; + /* Create the DMX matrix */ + errorStatus = getMixFactors ( + (chCfg>0) ? 1 : 0, + (chCfg>0) ? (PCM_DMX_CHANNEL_MODE)chCfg : inChMode, + outChMode, + pParam, + &bsMetaData, + mixFactors, + &dmxScale + ); + /* No fatal errors can occur here. The function is designed to always return a valid matrix. + The error code is used to signal configurations and matrices that are not conform to any standard. */ + + /* Determine the final scaling */ + bypScale = FDKmin(dmxMaxScale, dmxScale); + *pDmxOutScale += bypScale; + dmxScale -= bypScale; + + { /* Set channel pointer for input. Remove empty cols. */ + int inCh, outCh, map[PCM_DMX_MAX_CHANNELS]; + ch = 0; + for (inCh=0; inCh < PCM_DMX_MAX_CHANNELS; inCh+=1) { + if (inOffsetTable[inCh] != 255) { + pInPcm[ch] = &pPcmBuf[inOffsetTable[inCh]*offset]; + map[ch++] = inCh; } - break; - case MIXED_MODE: /* L' = 0.5*Ch1 + 0.5*Ch2; R' = 0.5*Ch1 + 0.5*Ch2 */ - for (sample = 0; sample < frameSize; sample++) { - *pOutL = *pOutR = (*pInLF >> 1) + (*pInRF >> 1); - - pInLF += inStride; pInRF += inStride; - pOutL += outStride; pOutR += outStride; - } - break; - default: - case STEREO_MODE: - /* nothing to do */ - break; } - break; - - case CH_MODE_3_0_0_0: - /* 3/0 input: L' = L + 0.707*C; R' = R + 0.707*C; */ - for (sample = 0; sample < frameSize; sample++) - { - FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev); -#if (SAMPLE_BITS == 32) - /* left channel */ - *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>1)+tCF, 1, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>1)+tCF, 1, SAMPLE_BITS); -#else - /* left channel */ - *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>1)+tCF, DFRACT_BITS-SAMPLE_BITS-1, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>1)+tCF, DFRACT_BITS-SAMPLE_BITS-1, SAMPLE_BITS); -#endif - pInLF += inStride; pInRF += inStride; pInCF += inStride; - pOutL += outStride; pOutR += outStride; + FDK_ASSERT(ch == numInChannels); + + /* Remove unused cols from factor matrix */ + for (inCh=0; inCh < numInChannels; inCh+=1) { + if (inCh != map[inCh]) { + int outCh; + for (outCh=0; outCh < PCM_DMX_MAX_CHANNELS; outCh+=1) { + mixFactors[outCh][inCh] = mixFactors[outCh][map[inCh]]; + } + } } - break; - /* 2/1 input: not supported! - case CH_MODE_2_0_1_0: */ - - case CH_MODE_3_0_1_0: - if (useGuidedDownMix) { - /* 3/1 input: L' = L + clev*C + 0.707*slev*S; R' = R + clev*C + 0.707*slev*S; */ - slev = FX_DBL2FX_SGL(fMult(flev, slev)); /* 0.707*slef */ - - for (sample = 0; sample < frameSize; sample++) - { - FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev) >> 1; - FIXP_DBL tLR = fMultDiv2((FIXP_PCM)*pInLR, slev) >> 1; -#if (SAMPLE_BITS == 32) - /* left channel */ - *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF+tLR, 2, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tLR, 2, SAMPLE_BITS); -#else - /* left channel */ - *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF-tLR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tLR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); -#endif - pInLF += inStride; pInRF += inStride; pInCF += inStride; pInLR += inStride; - pOutL += outStride; pOutR += outStride; - } - } else { - /* 3/1 input: L' = L + 0.707*C - 0.707*S; R' = R + 0.707*C + 0.707*S */ - for (sample = 0; sample < frameSize; sample++) - { - FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev) >> 1; - FIXP_DBL tLR = fMultDiv2((FIXP_PCM)*pInLR, slev) >> 1; -#if (SAMPLE_BITS == 32) - /* left channel */ - *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF-tLR, 2, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tLR, 2, SAMPLE_BITS); -#else - /* left channel */ - *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF-tLR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tLR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); -#endif - pInLF += inStride; pInRF += inStride; pInCF += inStride; pInLR += inStride; - pOutL += outStride; pOutR += outStride; + /* Set channel pointer for output. Remove empty cols. */ + ch = 0; + for (outCh=0; outCh < PCM_DMX_MAX_CHANNELS; outCh+=1) { + if (outOffsetTable[outCh] != 255) { + pOutPcm[ch] = &pPcmBuf[outOffsetTable[outCh]*offset]; + map[ch++] = outCh; } } - break; - - /* 2/2 input: not supported! - case CH_MODE_2_0_2_0: */ + FDK_ASSERT(ch == numOutChannels); - case CH_MODE_3_0_2_0: /* 5.0ch input */ - case CH_MODE_3_0_2_1: /* 5.1ch input */ - if (useGuidedDownMix) { - /* 3/2 input: L' = L + clev*C + slev*Ls; R' = R + clev*C + slev*Rs; */ - for (sample = 0; sample < frameSize; sample++) - { - FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev) >> 1; - FIXP_DBL tLR = fMultDiv2((FIXP_PCM)*pInLR, slev) >> 1; - FIXP_DBL tRR = fMultDiv2((FIXP_PCM)*pInRR, slev) >> 1; -#if (SAMPLE_BITS == 32) - /* left channel */ - *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF+tLR, 2, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tRR, 2, SAMPLE_BITS); -#else - /* left channel */ - *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF+tLR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tRR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); -#endif - pInLF += inStride; pInRF += inStride; pInCF += inStride; pInLR += inStride; pInRR += inStride; - pOutL += outStride; pOutR += outStride; + /* Remove unused rows from factor matrix */ + for (outCh=0; outCh < numOutChannels; outCh+=1) { + if (outCh != map[outCh]) { + FDKmemcpy(&mixFactors[outCh], &mixFactors[map[outCh]], PCM_DMX_MAX_CHANNELS*sizeof(FIXP_DMX)); } } - else if (mpegMixDownInfo.mixdownAvailable) { - /* 3/2 input: L' = (1.707+A)^-1 * [L+0.707*C+A*Ls]; R'= (1.707+A)^-1 * [R+0.707*C+A*Rs]; */ - FIXP_SGL mtrxMixDwnCoef = mpegMixDownIdx2Coef[mpegMixDownInfo.matrixMixdownIdx]; - FIXP_SGL mtrxMixDwnPreFact = mpegMixDownIdx2PreFact[mpegMixDownInfo.matrixMixdownIdx]; - clev = FX_DBL2FX_SGL(fMult(mtrxMixDwnPreFact, flev /* 0.707 */)); - flev = mtrxMixDwnPreFact; - slev = FX_DBL2FX_SGL(fMult(mtrxMixDwnPreFact, mtrxMixDwnCoef)); - - for (sample = 0; sample < frameSize; sample++) - { - FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev); - FIXP_DBL tLF = fMultDiv2((FIXP_PCM)*pInLF, flev); - FIXP_DBL tRF = fMultDiv2((FIXP_PCM)*pInRF, flev); - FIXP_DBL tLR = fMultDiv2((FIXP_PCM)*pInLR, slev); - FIXP_DBL tRR = fMultDiv2((FIXP_PCM)*pInRR, slev); - -#if (SAMPLE_BITS == 32) - /* left channel */ - *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT(tLF+tCF+tLR, 1, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT(tRF+tCF+tRR, 1, SAMPLE_BITS); -#else - /* left channel */ - *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT(tLF+tCF+tLR, DFRACT_BITS-SAMPLE_BITS-1, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT(tRF+tCF+tRR, DFRACT_BITS-SAMPLE_BITS-1, SAMPLE_BITS); -#endif + } - pInLF += inStride; pInRF += inStride; pInCF += inStride; pInLR += inStride; pInRR += inStride; - pOutL += outStride; pOutR += outStride; - } + /* Sample processing loop */ + for (sample = 0; sample < frameSize; sample++) + { + FIXP_PCM tIn[PCM_DMX_MAX_IN_CHANNELS]; + FIXP_DBL tOut[PCM_DMX_MAX_OUT_CHANNELS] = { (FIXP_DBL)0 }; + int inCh, outCh; + + /* Preload all input samples */ + for (inCh=0; inCh < numInChannels; inCh+=1) { + tIn[inCh] = (FIXP_PCM)*pInPcm[inCh]; + pInPcm[inCh] += inStride; } - else { - /* 3/2 input: L' = L + 0.707*C - 0.707*Ls - 0.707*Rs; R' = R + 0.707*C + 0.707*Ls + 0.707*Rs */ - for (sample = 0; sample < frameSize; sample++) - { - FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev) >> 2; - FIXP_DBL tLR = fMultDiv2((FIXP_PCM)*pInLR, slev) >> 2; - FIXP_DBL tRR = fMultDiv2((FIXP_PCM)*pInRR, slev) >> 2; -#if (SAMPLE_BITS == 32) - /* left channel */ - *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>3)+tCF-tLR-tRR, 3, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>3)+tCF+tLR+tRR, 3, SAMPLE_BITS); + /* Apply downmix coefficients to input samples and accumulate for output */ + for (outCh=0; outCh < numOutChannels; outCh+=1) { + for (inCh=0; inCh < numInChannels; inCh+=1) { + tOut[outCh] += fMult(tIn[inCh], mixFactors[outCh][inCh]); + } + /* Write sample */ +#if (SAMPLE_BITS == DFRACT_BITS) + *pOutPcm[outCh] = (INT_PCM)SATURATE_LEFT_SHIFT(tOut[outCh], dmxScale, SAMPLE_BITS); #else - /* left channel */ - *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>3)+tCF-tLR-tRR, DFRACT_BITS-SAMPLE_BITS-3, SAMPLE_BITS); - /* right channel */ - *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>3)+tCF+tLR+tRR, DFRACT_BITS-SAMPLE_BITS-3, SAMPLE_BITS); + *pOutPcm[outCh] = (INT_PCM)SATURATE_RIGHT_SHIFT(tOut[outCh], DFRACT_BITS-SAMPLE_BITS-dmxScale, SAMPLE_BITS); #endif - pInLF += inStride; pInRF += inStride; pInCF += inStride; pInLR += inStride; pInRR += inStride; - pOutL += outStride; pOutR += outStride; - } + pOutPcm[outCh] += outStride; } - break; - - default: - errorStatus = PCMDMX_INVALID_MODE; - break; } - /* SECOND STAGE: - If desired create a mono donwmix: - Note: Input are always two channels! */ - if (numOutChannels == 1) - { - INT_PCM *pOutC; - FIXP_SGL mlev; - - if (useGuidedDownMix) mlev = FL2FXCONST_SGL(1.0f); else mlev = flev; + /* Update the number of output channels */ + *nChannels = numOutChannels; - /* Output of STAGE ONE = Input of STAGE TWO */ - FDKmemcpy(inOffsetTable, outOffsetTable, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); + } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + else +#endif /* PCM_DOWNMIX_ENABLE */ +#ifdef PCM_CHANNEL_EXTENSION_ENABLE + if ( numInChannels < numOutChannels ) + { /* Apply rudimentary upmix */ + /* Set up channel pointer */ + UINT sample; + UCHAR outOffsetTable[PCM_DMX_MAX_CHANNELS]; + + /* FIRST STAGE + Create a stereo/dual channel signal */ + if (numInChannels == ONE_CHANNEL) + { + INT_PCM *pInPcm[PCM_DMX_MAX_CHANNELS]; + INT_PCM *pOutLF, *pOutRF; - /* Set I/O strides and offsets */ - inStride = outStride; /* output from STAGE ONE */ - outStride = numOutChannels; /* final output */ + /* Set this stages output stride and channel mode: */ + outStride = (fInterleaved) ? TWO_CHANNEL : 1; + outChMode = outChModeTable[TWO_CHANNEL]; /* Get channel description and channel mapping for this - * stages number of output channels (always MONO). */ + * stages number of output channels (always STEREO). */ getChannelDescription( - CH_MODE_1_0_0_0, + outChMode, channelMapping, channelType, channelIndices, outOffsetTable ); + /* Now there is no way back because we modified the channel configuration! */ - /* Set input channel pointer. */ - pInLF = &pPcmBuf[inOffsetTable[LEFT_FRONT_CHANNEL]*offset]; - pInRF = &pPcmBuf[inOffsetTable[RIGHT_FRONT_CHANNEL]*offset]; + /* Set input channel pointer. The first channel is always at index 0. */ + pInPcm[CENTER_FRONT_CHANNEL] = &pPcmBuf[(frameSize-1)*inStride]; /* Considering input mapping could lead to a invalid pointer + here if the channel is not declared to be a front channel. */ - /* Set output channel pointer */ - pOutC = &pPcmBuf[outOffsetTable[CENTER_FRONT_CHANNEL]*offset]; + /* Set output channel pointer (for this stage). */ + pOutLF = &pPcmBuf[outOffsetTable[LEFT_FRONT_CHANNEL]*offset+(frameSize-1)*outStride]; + pOutRF = &pPcmBuf[outOffsetTable[RIGHT_FRONT_CHANNEL]*offset+(frameSize-1)*outStride]; - /* C' = 0.707*L + 0.707*R */ + /* 1/0 input: */ for (sample = 0; sample < frameSize; sample++) { -#if (SAMPLE_BITS == 32) - *pOutC = - (INT_PCM)SATURATE_LEFT_SHIFT(fMultDiv2((FIXP_PCM)*pInLF,mlev)+fMultDiv2((FIXP_PCM)*pInRF,mlev), 1, SAMPLE_BITS); -#else - *pOutC = - (INT_PCM)SATURATE_RIGHT_SHIFT(fMultDiv2((FIXP_PCM)*pInLF,mlev)+fMultDiv2((FIXP_PCM)*pInRF,mlev), DFRACT_BITS-SAMPLE_BITS-1, SAMPLE_BITS); -#endif + /* L' = C; R' = C; */ + *pOutLF = *pOutRF = *pInPcm[CENTER_FRONT_CHANNEL]; - pInLF += inStride; pInRF += inStride; - pOutC += 1; + pInPcm[CENTER_FRONT_CHANNEL] -= inStride; + pOutLF -= outStride; pOutRF -= outStride; } - /* Finished STAGE TWO */ + + /* Prepare for next stage: */ + inStride = outStride; + inChMode = outChMode; + FDKmemcpy(inOffsetTable, outOffsetTable, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); } - /* Update the number of output channels */ - *nChannels = self->numOutputChannels; +#if (PCM_DMX_MAX_OUT_CHANNELS > 2) + /* SECOND STAGE + Extend with zero channels to achieved the desired number of output channels. */ + if (numOutChannels > TWO_CHANNEL) + { + INT_PCM *pIn[PCM_DMX_MAX_CHANNELS] = { NULL }; + INT_PCM *pOut[PCM_DMX_MAX_CHANNELS] = { NULL }; + AUDIO_CHANNEL_TYPE inChTypes[PCM_DMX_MAX_CHANNELS]; + UCHAR inChIndices[PCM_DMX_MAX_CHANNELS]; + UCHAR numChPerGrp[2][PCM_DMX_MAX_CHANNEL_GROUPS]; + int nContentCh = 0; /* Number of channels with content */ + int nEmptyCh = 0; /* Number of channels with content */ + int ch, chGrp, isCompatible = 1; + + /* Do not change the signalling which is the channel types and indices. + Just reorder and add channels. So first save the input signalling. */ + FDKmemcpy(inChTypes, channelType, PCM_DMX_MAX_CHANNELS*sizeof(AUDIO_CHANNEL_TYPE)); + FDKmemcpy(inChIndices, channelIndices, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); + + /* Set this stages output stride and channel mode: */ + outStride = (fInterleaved) ? numOutChannels : 1; + outChMode = outChModeTable[numOutChannels]; + + /* Check if input channel config can be easily mapped to the desired output config. */ + for (chGrp = 0; chGrp < PCM_DMX_MAX_CHANNEL_GROUPS; chGrp += 1) { + numChPerGrp[IN][chGrp] = (inChMode >> (chGrp*4)) & 0xF; + numChPerGrp[OUT][chGrp] = (outChMode >> (chGrp*4)) & 0xF; + + if (numChPerGrp[IN][chGrp] > numChPerGrp[OUT][chGrp]) { + isCompatible = 0; + break; + } + } + if ( isCompatible ) { + /* Get new channel description and channel + * mapping for the desired output channel mode. */ + getChannelDescription( + outChMode, + channelMapping, + channelType, + channelIndices, + outOffsetTable + ); + /* If the input config has a back center channel but the output + config has not, copy it to left and right (if available). */ + if ( (numChPerGrp[IN][CH_GROUP_REAR]%2) + && !(numChPerGrp[OUT][CH_GROUP_REAR]%2) ) { + if (numChPerGrp[IN][CH_GROUP_REAR] == 1) { + inOffsetTable[RIGHT_REAR_CHANNEL] = inOffsetTable[LEFT_REAR_CHANNEL]; + } else if (numChPerGrp[IN][CH_GROUP_REAR] == 3) { + inOffsetTable[RIGHT_MULTIPRPS_CHANNEL] = inOffsetTable[LEFT_MULTIPRPS_CHANNEL]; + } + } + } + else { + /* Just copy and extend the original config */ + FDKmemcpy(outOffsetTable, inOffsetTable, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); + } + + /* Set I/O channel pointer. + Note: The following assignment algorithm clears the channel offset tables. + Thus they can not be used afterwards. */ + for (ch = 0; ch < PCM_DMX_MAX_CHANNELS; ch+=1) { + if ( (outOffsetTable[ch] < 255) + && (inOffsetTable[ch] < 255) ) + { /* Set I/O pointer: */ + pIn[nContentCh] = &pPcmBuf[inOffsetTable[ch]*offset+(frameSize-1)*inStride]; + pOut[nContentCh] = &pPcmBuf[outOffsetTable[ch]*offset+(frameSize-1)*outStride]; + /* Update signalling */ + channelType[outOffsetTable[ch]] = inChTypes[inOffsetTable[ch]]; + channelIndices[outOffsetTable[ch]] = inChIndices[inOffsetTable[ch]]; + inOffsetTable[ch] = 255; + outOffsetTable[ch] = 255; + nContentCh += 1; + } + } + if ( isCompatible ) { + /* Assign the remaining input channels. + This is just a safety appliance. We should never need it. */ + for (ch = 0; ch < PCM_DMX_MAX_CHANNELS; ch+=1) { + if (inOffsetTable[ch] < 255) { + int outCh; + for (outCh = 0 ; outCh < PCM_DMX_MAX_CHANNELS; outCh += 1) { + if (outOffsetTable[outCh] < 255) { + break; + } + } + /* Set I/O pointer: */ + pIn[nContentCh] = &pPcmBuf[inOffsetTable[ch]*offset+(frameSize-1)*inStride]; + pOut[nContentCh] = &pPcmBuf[outOffsetTable[outCh]*offset+(frameSize-1)*outStride]; + /* Update signalling */ + channelType[outOffsetTable[outCh]] = inChTypes[inOffsetTable[ch]]; + channelIndices[outOffsetTable[outCh]] = inChIndices[inOffsetTable[ch]]; + inOffsetTable[ch] = 255; + outOffsetTable[outCh] = 255; + nContentCh += 1; + } + } + /* Set the remaining output channel pointer */ + for (ch = 0; ch < PCM_DMX_MAX_CHANNELS; ch+=1) { + if (outOffsetTable[ch] < 255) { + pOut[nContentCh+nEmptyCh] = &pPcmBuf[outOffsetTable[ch]*offset+(frameSize-1)*outStride]; + /* Expand output signalling */ + channelType[outOffsetTable[ch]] = ACT_NONE; + channelIndices[outOffsetTable[ch]] = nEmptyCh; + outOffsetTable[ch] = 255; + nEmptyCh += 1; + } + } + } + else { + /* Set the remaining output channel pointer */ + for (ch = nContentCh; ch < numOutChannels; ch+=1) { + pOut[ch] = &pPcmBuf[ch*offset+(frameSize-1)*outStride]; + /* Expand output signalling */ + channelType[ch] = ACT_NONE; + channelIndices[ch] = nEmptyCh; + nEmptyCh += 1; + } + } + + /* First copy the channels that have signal */ + for (sample = 0; sample < frameSize; sample+=1) { + INT_PCM tIn[PCM_DMX_MAX_CHANNELS]; + /* Read all channel samples */ + for (ch = 0; ch < nContentCh; ch+=1) { + tIn[ch] = *pIn[ch]; + pIn[ch] -= inStride; + } + /* Write all channel samples */ + for (ch = 0; ch < nContentCh; ch+=1) { + *pOut[ch] = tIn[ch]; + pOut[ch] -= outStride; + } + } + + /* Clear all the other channels */ + for (sample = 0; sample < frameSize; sample++) { + for (ch = nContentCh; ch < numOutChannels; ch+=1) { + *pOut[ch] = (INT_PCM)0; + pOut[ch] -= outStride; + } + } + } +#endif /* if (PCM_DMX_MAX_OUT_CHANNELS > 2) */ + + /* update the number of output channels */ + *nChannels = numOutChannels; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ else +#endif /* PCM_CHANNEL_EXTENSION_ENABLE */ if ( numInChannels == numOutChannels ) { /* Don't need to change the channel description here */ @@ -1143,8 +2348,9 @@ PCMDMX_ERROR pcmDmx_ApplyFrame ( { case 2: { /* Set up channel pointer */ - INT_PCM *pInLF, *pInRF, *pOutL, *pOutR; - FIXP_SGL flev; + INT_PCM *pInPcm[PCM_DMX_MAX_CHANNELS]; + INT_PCM *pOutL, *pOutR; + FIXP_DMX flev; UINT sample; int inStride, outStride, offset; @@ -1160,41 +2366,41 @@ PCMDMX_ERROR pcmDmx_ApplyFrame ( } /* Set input channel pointer */ - pInLF = &pPcmBuf[inOffsetTable[LEFT_FRONT_CHANNEL]*offset]; - pInRF = &pPcmBuf[inOffsetTable[RIGHT_FRONT_CHANNEL]*offset]; + pInPcm[LEFT_FRONT_CHANNEL] = &pPcmBuf[inOffsetTable[LEFT_FRONT_CHANNEL]*offset]; + pInPcm[RIGHT_FRONT_CHANNEL] = &pPcmBuf[inOffsetTable[RIGHT_FRONT_CHANNEL]*offset]; /* Set output channel pointer (same as input) */ - pOutL = pInLF; - pOutR = pInRF; + pOutL = pInPcm[LEFT_FRONT_CHANNEL]; + pOutR = pInPcm[RIGHT_FRONT_CHANNEL]; /* Set downmix levels: */ - flev = ATTENUATION_FACTOR_1; /* 0.707 */ + flev = FL2FXCONST_DMX(0.70710678f); /* 2/0 input: */ switch (dualChannelMode) { case CH1_MODE: /* L' = 0.707 * Ch1; R' = 0.707 * Ch1 */ for (sample = 0; sample < frameSize; sample++) { *pOutL = *pOutR = - (INT_PCM)SATURATE_RIGHT_SHIFT(fMult((FIXP_PCM)*pInLF, flev), DFRACT_BITS-SAMPLE_BITS, SAMPLE_BITS); + (INT_PCM)SATURATE_RIGHT_SHIFT(fMult((FIXP_PCM)*pInPcm[LEFT_FRONT_CHANNEL], flev), DFRACT_BITS-SAMPLE_BITS, SAMPLE_BITS); - pInLF += inStride; + pInPcm[LEFT_FRONT_CHANNEL] += inStride; pOutL += outStride; pOutR += outStride; } break; case CH2_MODE: /* L' = 0.707 * Ch2; R' = 0.707 * Ch2 */ for (sample = 0; sample < frameSize; sample++) { *pOutL = *pOutR = - (INT_PCM)SATURATE_RIGHT_SHIFT(fMult((FIXP_PCM)*pInRF, flev), DFRACT_BITS-SAMPLE_BITS, SAMPLE_BITS); + (INT_PCM)SATURATE_RIGHT_SHIFT(fMult((FIXP_PCM)*pInPcm[RIGHT_FRONT_CHANNEL], flev), DFRACT_BITS-SAMPLE_BITS, SAMPLE_BITS); - pInRF += inStride; + pInPcm[RIGHT_FRONT_CHANNEL] += inStride; pOutL += outStride; pOutR += outStride; } break; case MIXED_MODE: /* L' = 0.5*Ch1 + 0.5*Ch2; R' = 0.5*Ch1 + 0.5*Ch2 */ for (sample = 0; sample < frameSize; sample++) { - *pOutL = *pOutR = (*pInLF >> 1) + (*pInRF >> 1); + *pOutL = *pOutR = (*pInPcm[LEFT_FRONT_CHANNEL] >> 1) + (*pInPcm[RIGHT_FRONT_CHANNEL] >> 1); - pInLF += inStride; pInRF += inStride; + pInPcm[LEFT_FRONT_CHANNEL] += inStride; pInPcm[RIGHT_FRONT_CHANNEL] += inStride; pOutL += outStride; pOutR += outStride; } break; @@ -1254,23 +2460,37 @@ PCMDMX_ERROR pcmDmx_GetLibInfo( LIB_INFO *info ) if (i == FDK_MODULE_LAST) { return PCMDMX_UNKNOWN; } - info += i; /* Add the library info */ - info->module_id = FDK_PCMDMX; - info->version = LIB_VERSION(PCMDMX_LIB_VL0, PCMDMX_LIB_VL1, PCMDMX_LIB_VL2); - LIB_VERSION_STRING(info); - info->build_date = PCMDMX_LIB_BUILD_DATE; - info->build_time = PCMDMX_LIB_BUILD_TIME; - info->title = PCMDMX_LIB_TITLE; + info[i].module_id = FDK_PCMDMX; + info[i].version = LIB_VERSION(PCMDMX_LIB_VL0, PCMDMX_LIB_VL1, PCMDMX_LIB_VL2); + LIB_VERSION_STRING(info+i); + info[i].build_date = PCMDMX_LIB_BUILD_DATE; + info[i].build_time = PCMDMX_LIB_BUILD_TIME; + info[i].title = PCMDMX_LIB_TITLE; /* Set flags */ - info->flags = 0 + info[i].flags = 0 +#ifdef PCM_DOWNMIX_ENABLE | CAPF_DMX_BLIND /* At least blind downmixing is possible */ + #ifdef PCE_METADATA_ENABLE | CAPF_DMX_PCE /* Guided downmix with data from MPEG-2/4 Program Config Elements (PCE). */ + #ifdef ARIB_MIXDOWN_ENABLE + | CAPF_DMX_ARIB /* PCE guided downmix with slightly different equations and levels. */ + #endif + #endif /* PCE_METADATA_ENABLE */ + #ifdef DSE_METADATA_ENABLE | CAPF_DMX_DVB /* Guided downmix with data from DVB ancillary data fields. */ + #endif +#endif /* PCM_DOWNMIX_ENABLE */ +#ifdef PCM_CHANNEL_EXTENSION_ENABLE + | CAPF_DMX_CH_EXP /* Simple upmixing by dublicating channels or adding zero channels. */ +#endif ; + /* Add lib info for FDK tools (if not yet done). */ + FDK_toolsGetLibInfo(info); + return PCMDMX_OK; } -- cgit v1.2.3 From 603f48ab99ce76f552f4f6f85d06b8c5b94c698e Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Mon, 30 Dec 2013 16:01:08 -0800 Subject: AAC Decoder: introduce time domain limiter Introduce time domain limiter. The module is per default enabled for all AAC-LC and HE-AAC v1/2 streams. For all ER-AAC-LD and ER-AAC-ELD streams the limiter is disabled per default. The feature can be en- or disabled via dynamic API parameter. Note that the limiter introduces an additional output delay which depends on the module parameters and the streams sampling rate. Bug 9428126 Change-Id: I299a072340b33e2c324facbd347a72c8de3d380e --- documentation/aacDecoder.pdf | 4265 ++++++++++++++++++------------------ libAACdec/include/aacdecoder_lib.h | 10 + libAACdec/src/aacdec_drc.cpp | 50 +- libAACdec/src/aacdec_drc.h | 5 +- libAACdec/src/aacdec_drc_types.h | 1 + libAACdec/src/aacdecoder.cpp | 7 + libAACdec/src/aacdecoder.h | 7 + libAACdec/src/aacdecoder_lib.cpp | 91 +- libPCMutils/include/limiter.h | 233 ++ libPCMutils/src/limiter.cpp | 498 +++++ libPCMutils/src/pcmutils_lib.cpp | 2 +- 11 files changed, 3072 insertions(+), 2097 deletions(-) create mode 100644 libPCMutils/include/limiter.h create mode 100644 libPCMutils/src/limiter.cpp (limited to 'libPCMutils/src/pcmutils_lib.cpp') diff --git a/documentation/aacDecoder.pdf b/documentation/aacDecoder.pdf index 4b94b75..d388576 100644 --- a/documentation/aacDecoder.pdf +++ b/documentation/aacDecoder.pdf @@ -438,7 +438,7 @@ xÚ…V[ 1¤Í% ¬šŻXß߯JQ¤Ĺ& íÄPuLôsżöŠÁ+őşŹ˛QşgF(¨H¶Îbľ¦§jUŤ=—&Čwź˙âU`ĺżPŢÇP^< ÓŞ1čHeDĹÓÄ.€Ř^&`¸r”Ç’ő3ín]¶&qÍ ó¶ăŔëŰđüőbö˘ sŻňjąćÂ5™ĆLsO¸+}jZOVS1mq78>´<ě +uŮ[âRÄFK_ĹSÇä<€,»W;‚®Ô5Ń ¤šz`Â8äˇó9đ {‡¶]çůšÍ®_¬KWX«÷[0?1mn˛-®˛%dšF‚ăÓř܉j -D®Ö–°µ¶šź\»\¶ŔwÉ4˘˙N\Ě™śj*ö.\h\©KΤťÖ ď8lhhš’˘şµí9Üŕ˛Îęf%ř¬şŃ=Ww{j•Q•:Ůçîu~Ňć'¨•Vv€»>,äůvŮÉë^ «Š=‹đ=k÷ ¬ŃŞ÷ O°łĺÚ°al\ó˙nqŔ[]ا±‰H‰Óu™Á¦^§đÖű ˙ŕvľ‹c’Ň´đds;Ç!„‰i`„łoűĂâ?pDE˙ +D®Ö–°µ¶šź\»\¶ŔwÉ4˘˙N\Ě™śj*ö.\h\©KΤťÖ ď8lhhš’˘şµí9Üŕ˛Îęf%ř¬şŃ=Ww{j•Q•:Ůçîu~Ňć'¨•Vv€»>,äůvŮÉë^ «Š=‹đ=k÷ ¬ŃŞ÷ O°łĺÚ°al\ó˙nqŔ[]ا±‰H‰Óu™Á¦^§đÖű ˙ŕvľ‹c’ŇtíÉçv<ŽCÓŔ$g7Ţö‡Ĺp{F endstream endobj 286 0 obj << @@ -1184,16 +1184,16 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 367 0 obj << -/Length 1005 +/Length 1001 /Filter /FlateDecode >> stream -xÚíšM“˘FÇď~Š>ĘBżŇ}dÔŮqËč™\&[‹=.UŠF™J6ź>Í‹:Ú¨»Ěl%"§®j¤iüźWÚ3`­;żőË=B@X‚!üg lŕ0hQ?Oí(2>űfÜ‚‚©›˛ŮÎhč÷†ţ8˝Öęů­?[P]˛Ěĺ` -ÂEëéł ¦jţ#°-,8ř+űŐ„Ő8ăÖo-»ŘK~˙zV,ämw‡_íRˇ–ćŔAjÎAůf-dĂ„Úí`™d»Ú. žLćđ¶eÔ¶k=!N];´ŰLëřŐhBő*…xÍ™śżD‰$ňxi -áÍA~Gş¬ ~ âXÎ;ËřŰF3Ť2s’çI:Ią:‘pÜh´Yľ%k@Úţ;qK®ŔŤ‹­X‹Ő<Šgeî9¬^Pß#´ “+ŚĘřq0Ű/­Ňś&x;dC~^ 9ŽţŃĘ »U÷ęT#Šr˘ńËâ.şa(7›Ç8J4#†jií±á×Řîľ%R·xŚń] Hv;y -ŞQŤ —PäéŽâ`ąIÎŘ0'´1^Śí€ů·ŰË$źˇFj¨)jŽN­ÔńaŘ8ľK,yÎrU¸˝~<ŤBť$A˘Ax -ˇ8DiňŰJ^ąőţ(QQş¬ÖË´u1×:\4UËřUË&-­eYa-8ąąz…_`yô©Ŕdy3ŢDÜ",Ç›vÝlő„űHiÖD -qwľ,dśI´ŚőŔD n+Ç‘Ď—<đ űO,AČáűt,>2müáT†Ë©\OćѨżů5ßÂ~3ž|–k‡z•ŠříŘŚ¸d3Yę 3ÔH­Ű•I N‹7,7á:Z•˝_&Xť=ŇČý cJů˘ßÔëÇßcAŚńZ2}Z -ÎKđfN;«®›ú‡N·×™tŢCěë\Q­ś{5=fŠ<6vzî@ó Ô©G1V‘ÖIÝÇZbQ“„+Q#:µţĐ÷4hWG~2»í—řţx˘¸Ťş˝IĎóRŚ#ďęD÷“Q±=Şţ°ďźĺ@ŢmßÎt>Ą+zŁG˙ÓŁ?ůÝPmwĐď^kq˙~ČĚŮ.’ąmd*źż#źăÝN"‡+&rx—Č=¸Ăî 7هĺK˘‡s}YHeÝ‘Bw˝X©lť‹,ÓÝ®wY…„ŕš”aU%FŽk…"Ćz§ceřjsŢ*a•”Uź \ĎýU+¨ ­eHĄUí”vz˙‡{#=k–ôşşTo ¬˘ĺŇťĺAŘ-:‚nv$ř őłj˙÷S€—Ť÷T>ËćŘÂ6úŃSŮ˙Q‰Ł +xÚíšM“˘FÇď~Š>ĘBżwuvÜ2şA&—É–Ĺ"ăRĄh”©dóéÓĽ¨ŁŤşËĚV"ręŞFšöÇ˙yĄm06řĐşóZżÜ#¤%bŔ{ŇśA‹"Ľ)xjG‘ńŮű0”LÝ”ÍvFCŻ7ôĆéµVĎkýŮ‚ę’ `v?ĺÇ‹ÖÓgLŐüG`[X +đWö« «qĆ­ßZv±—üţő¬XČÝîżÚ¤R--GjŽŁ|3Ě‚˛aBLí¶żL˛]m—O&ă˘m&µíZDĘS׎€@í6dÓ:~5šP˝J)_s¦ç/QâúIxĽ4…đć ż#]VĐ ľúqÎ;ËřŰF3Ť2ă Éó$yA2\ť‚Hn4Z¬Ř’5 m˙ť8%WâĆĹV,ŹýĹjĹł2w‹8«ÔwÄmĂ +Ł2~ěĎ6ÇK«4§IŢćź×ţ"G˙h +„ÝŞ{ĺŐ˘śhü˛¸ó§N„›Íc%š€Cµ´öŠŘđklwß’P·xŚń] Hv;y +ŞQ”Ť —PéŽâ`ąIÎŘ° ´1^Śí€y†°ŰËÄźźˇF%j¨)j\§Vęř0lß%–"gą*Ü^?žFN’ Ů <…P"Ě4ům^ąőţ(QQş¬ÖË´u1×r!›Şĺ |‹Şe“–ÖaYa-ąązE\`yô©Ŕdy3ŢDÂ",Ç›vÝlő„űHiÖD +qwĽ,Â8ń“hë‰ÜVŽ#ź/yŕA÷źX’Ă÷É->2müűÁ4 –Óp=™G_ ˘ţć×| ű͸ás¸ă@ŻR‘¸›‘—l!KBt†©u»aâ+¦Óâ ‡›`­ĘŢ/“¬Îé d„~Đ1Ą|ŃŽoęőăď± ĆD-™ľ -†–%x3§ťUÇIýC§ŰëL:÷ˇ?öt®¨Vνš3E ;=g yPĘëQŚ!\‰ÖIÝÇZbQ“‡ŠÔN­?ô\ ÚUĆ‘źĚnű%ľ?ž(nŁnoŇsÝăČ˝:ŃýdTlŹŞ?ě{§Aq(ˇíŰ™üŕSş˘7zô>=z“ß 5Ńvýîµ÷ď‡Ě<‘mŕ"™Ű¶A¦áówäsŁŰIäpĹDďągŘô&űđˇÜ`Iôŕ5ĚBN鎺ëĹJeë\d™îvý¸Ë*$פ «*1r\+1Ö=;(Ă7•ó’˛ęŕ“ˇ€ă:żj¤µ ©´ŞťŇÂNď_â`o¤gÍ’^W—ęmÁW´\şł\ßşEGЉ®źřBý¬Ú˙ýŕeă=&•ŹÇDz¶°Ť~ôTöżbx¦ endstream endobj 366 0 obj << @@ -1461,13 +1461,14 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 379 0 obj << -/Length 430 +/Length 428 /Filter /FlateDecode >> stream -xÚĺ—ËnÂ0E÷ůŠY&‹¸c;ŽíeKµŞú€ě(ŞRpQ$m„ú÷5/ ⨢馔Ő(ăxćęčú…0„®w•xĆ@ł’7Đ2¦D0 -É~ëá>iß'ý`ÜBD#kj§®Ç˛,[Ą˝vâ}x«,]’H.`4óC„±Íß®,×Í bÜĆ)ô˝'·b6ó‹É¶Po'ŹďÉŁBŰŇ -$ł9É6:$±‚ BĘúi:ş6ŁůŘ/—ůč:-Ó›<+×Bwť`Ú"> Bř·C¤µ ń”Qô™Ľ¨Ţ<Fd“^Pá/«Ý¸>;bv.±MěéĚ1ťběd—ŁjÄ'vůt˛é´ÚBDôtWăŃSŤĄtvMŮ)Śąú,͢ÚJósóŞt—˝Ţäosgß˙ëxŽv“nä&] «_&ťŐňRędí¤ىbŞCBď&w¶,{ţ㽪!;ę°ë›ňquuHíčÜbţŻ¨q¬PŰÄęBq‘ýôýđ]Ľ’ď +xÚĺ—]OÂ0†ď÷+Îĺv±zÚ®k{)(b@awhĚ„J–ŔĐąÄřď-_ ¬‹Ńé…ŕŐÉN×sŢĽ¨Ţ2żCdłaPáżU»q}*ÄT#» —Ř&vŠtáN1v´Ë±źŘĺÓÉćój Ńă]Ťżo±E)]„W¦ěĆ´ŢKóZmĄůńzL7ňŞtť=v󧥳ď˙u<_v“nä&] kT&]ÔňRęźŮ‰bŞCBg“;[–=OwŻâŘŚuŘŤLyłş:¤ö@tn1?mj›X}@(N8˛ďľ>^ë’é endstream endobj 378 0 obj << @@ -3350,18 +3351,14 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 736 0 obj << -/Length 1198 +/Length 1132 /Filter /FlateDecode >> stream -xÚµX[s›F~ׯŕf"Ľ®}Ŕh±•r ·'Ă »š‘p*á4m§˙˝gąÄş#açiWhŮď\ľýÎđ( áfpť ®BS65˘ É`"A×°¬,$3á^Ôe, ‰ŠÄ,›ÎňéÓ,_Ą‹ůIA˘üGýŹ3_äő,Ęň•„ 1/¦ü‘F ,,}NŢX2řs€ ¸BQuY§Ş0]î?#aĎß H¦¦!üU­Z - -ˇ0.„xđa€‹ë÷WŹÍFQëÝđcE6‘.čžé¤vIJ¸Ív:bv:ńăI‘¤!1aŁÔ¶Yec "ÜWîüR{…ľ+ďš»đ0± -ŘZ7Žëtâť8z7ÎŤ5öS;đ“Ż ÜtÄGK‹‰dRva˝…»ńµDŐn¬ë>X‰§łF)‹j'Ł.»Od#É@âťkź3:×8P)ś¨´>UiľZ=­ŇĽťp‡›t)HVŔ•Ył.łUyČ@őÉ‹ĺŰűl;3z€‰ű$)á’iěY®[Yp-a$N‡u’^äk=Ë˙Xá1—yĚOâ.4úĘĽuŃĂŕô¨ć˙m­kÇ+GQĂ(•P*2Ö) ^ľÄ•‚›ő&Ťŕ×?ŔIQŧć'˙g-DyAŰ’ĺ!!˛¦©lŇď!ę®K*´âyy,VµÓMBx>BÉ$˘Yޡŕü{lCV4óp’CŰKIN’tě',rд쎍NĆő85k4©ŽŚ›Ú·–ď3·÷‚ë$—™ çZ8Ď -ñÓEűřćA-Ú†‹;p0î…cý~)Κšj3H“Ç’Ű  -¸‡€F ]A'©#éŠX?­Ĺć´!Ҭé„ů“ Í~.—n0 b Ń ‚šşěŽą]¤Ź“·íáýůóÂĹ1xŘu1×?xNęüĆó[XŐŃ3’¶3/d7qĘüębuívz9+’ Ş ‚ť[E‘†čĎ*:ëĽ,çĹcýăkÍ…*fËĽämü+„–cŮTURjĘȆŠ*¤ÖÎs1-çOĹzk‡ÝFB“jT…KGätÁrÇţŻq±»=^¶(Q7ď îŃ‘«Ń‘×~15mULGp5ó˝«úé?jŠ -9rYúRDą1ŰŰ´ő‘˛aÉ:_<Ľ«“1‘­^¸r°˛3U“uˇ&ZP4ęE[…Ô¤]óE"H|~ŔfŢ>*üv[AĚ‹˛aÁüźÜÁçĐk¨č˛ -}ĺ&żxćŮvizŮb:_,˛Őß ă Šő¬5ŻędA _qĹŃŢ€1H{c~€17ů>açM ŁîćG6çĹ,ççř{“L`ÚbŇ6ńm×}-w)´ż31dM#gp·k.b &šŚ©ąEAóʢ§˘‹„ů"_ćEůóîÖçkŔýW0Ţ'›Ô‹ó2¬Ä{•-wmŞÖröMAŹË“6Ń–‡CľěăNôľ©)?8ŮxI›ń•{¶µm5…öˇž|ăú–-žĎ¦Ń:ď‘h űýú¶U8wjĺží~Ž3¨LˇÄ]ř5îĄ'Şk +xÚµÉrŰ8†ďz +ÉŞĆÂőE‚¶n!)ϤśJ‘hŹŞd:#Ë•ĚLÍ»§Á%±dË”čř. ľîĆŹn€XąV°r6ŁÓ€RĹAŽIMĄ¸R¬X&A%J±P.U í„XťÍć‹r~»(×bµü˘éXE5o‚ĺŞl®˛ňŞ\kÄVËj.™Ě&*%ÚçâÝŁżG¨X!5Ĺ°Ĺ e~3şüŚ•<§`Ä[ůV÷şQtĘ ])ůčĂ·7߯ŻŰ˛ÎöŔBtä`K±(<łhăëJ›=ásOLă|š¦I¦™X-¸/<Ź×6vĺ˛vçmăţ®clżi{ěâˇ=!&ÂşŐĎ ^Žó;8gî$^™ě“„—­«BÔBs\öáţ3ň±ĆŚ~Öx«s‘q××ĺîĘoϲn5÷a5©–ŹöĂô ¦Ż)*dH?äâ×FDł=L·Ç¨ăŘ8W®®Ţ4s1…$[pýAČ Yp…ŰhAám:mĹą϶ĎŤbőţJ›ĺ\—G„±¬6­–˙–ŕ9D^'ş… 8śoéKĆh9[Á0íjľ\­fëZĹA›«ÎČxő˙H‡Ż·O–«ň¦¬6ŰĘŰý e3Ä0=ö'Ô ·g endstream endobj 735 0 obj << @@ -3370,7 +3367,7 @@ endobj /Resources 734 0 R /MediaBox [0 0 595.276 841.89] /Parent 609 0 R -/Annots [ 654 0 R 655 0 R 656 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R 713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 739 0 R 730 0 R ] +/Annots [ 654 0 R 655 0 R 656 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R 713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R ] >> endobj 654 0 obj << /Type /Annot @@ -3383,2575 +3380,2658 @@ endobj /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 711.57 259.922 721.757] +/Rect [113.91 711.489 259.922 721.676] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af61dc054946b313e1780cf604ca833c6) >> >> endobj 656 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 695.604 348.948 705.79] +/Rect [113.91 695.442 348.948 705.629] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af16b1992a2a415168ab96228671ef337) >> >> endobj 698 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 679.637 261.237 689.824] +/Rect [113.91 679.395 261.237 689.582] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a77f722abc6c05f1abf1f51c0d11bf7ec) >> >> endobj 699 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 663.671 255.14 673.858] +/Rect [113.91 663.348 255.14 673.535] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a516287ad9b64c230200191fdd60361e1) >> >> endobj 700 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 647.705 229.995 657.891] +/Rect [113.91 647.301 229.995 657.488] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41abb11196531beac7285326a5394db0329) >> >> endobj 701 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 631.738 224.883 641.925] +/Rect [113.91 631.254 224.883 641.441] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a8bf90eccdaf6063e299f9415c8bd5d1a) >> >> endobj 702 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 615.772 234.846 625.959] +/Rect [113.91 615.207 234.846 625.394] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a856cdca9aa719c292b7c351cec03ae06) >> >> endobj 703 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 599.806 255.469 609.992] +/Rect [113.91 599.16 255.469 609.347] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a65820f534b99b1529510720eeaafc861) >> >> endobj 704 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 583.839 294.004 594.026] +/Rect [113.91 583.113 294.004 593.3] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a72f0dd3698012cdf8b20dd6f0b5de626) >> >> endobj 705 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 567.873 305.152 578.06] +/Rect [113.91 567.066 305.152 577.252] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aea6be518456d203d68898efd236a6769) >> >> endobj 706 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 551.563 232.076 562.093] +/Rect [113.91 550.675 232.076 561.205] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae2ac2caa02bbffb8ace0fa87ad5ffc05) >> >> endobj 707 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.538 512.657 220.58 523.187] +/Rect [138.538 511.607 220.58 522.138] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88) >> >> endobj 708 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 497.034 279.638 507.221] +/Rect [113.91 495.904 279.638 506.09] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6e3fa0b7d247c98f132edd55187f9c0c) >> >> endobj 709 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 481.068 325.964 491.254] +/Rect [113.91 479.857 325.964 490.043] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aee866642a3f335e7874a82939ad0c135) >> >> endobj 710 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 465.101 309.217 475.288] +/Rect [113.91 463.81 309.217 473.996] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) >> >> endobj 711 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 449.135 289.292 459.322] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5cec20e1dd4ac89472ad60d3d0c8b5c1) >> +/Rect [113.91 447.763 251.862 457.949] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab011b48e5d9f5648c400ee632c151197) >> >> endobj 712 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 433.169 293.167 443.355] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5e080429e4eaec068ba64c17152ee805) >> +/Rect [113.91 431.716 280.216 441.902] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ad2733233519a726ef7501d89918921c5) >> >> endobj 713 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 417.202 236.151 427.389] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a28dd853ab4339011893a933020ac5ab8) >> +/Rect [113.91 415.669 279.887 425.855] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a55c37bcd32cb04728f48e1b2896967f7) >> >> endobj 714 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 401.236 242.607 411.423] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6056e5b76cc6a00078388445b1f1cfa1) >> +/Rect [113.91 399.622 289.292 409.808] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5cec20e1dd4ac89472ad60d3d0c8b5c1) >> >> endobj 715 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 385.27 278.164 395.457] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a65284784865f22d79700dc268f84e374) >> +/Rect [113.91 383.575 293.167 393.761] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5e080429e4eaec068ba64c17152ee805) >> >> endobj 716 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 369.304 260.52 379.49] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af24d28dac8b5de47c00c578712d0591e) >> +/Rect [113.91 367.528 236.151 377.714] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a28dd853ab4339011893a933020ac5ab8) >> >> endobj 717 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 353.337 275.224 363.524] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a4392100c924c0f20a706f55bc7ab3931) >> +/Rect [113.91 351.481 242.607 361.667] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6056e5b76cc6a00078388445b1f1cfa1) >> >> endobj 718 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 337.027 224.943 347.558] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a605a8fed5c5754dffc63775cc702aae7) >> +/Rect [113.91 335.433 278.164 345.62] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a65284784865f22d79700dc268f84e374) >> >> endobj 719 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 321.405 218.657 331.591] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af84565b78a6ae180e316dd612a0877a7) >> +/Rect [113.91 319.386 260.52 329.573] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af24d28dac8b5de47c00c578712d0591e) >> >> endobj 720 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 305.095 253.237 315.625] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aa1a5a121f8b03708d9fdcc06f6e882fb) >> +/Rect [113.91 303.339 275.224 313.526] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a4392100c924c0f20a706f55bc7ab3931) >> >> endobj 721 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [176.92 222.217 289.367 232.747] -/A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> +/Rect [113.91 286.949 224.943 297.479] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a605a8fed5c5754dffc63775cc702aae7) >> >> endobj 722 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [290.609 222.217 393.841 232.747] -/A << /S /GoTo /D (aacdecoder__lib_8h_a8f33403449b41e6a9deda6cb1e07d386) >> +/Rect [113.91 271.245 218.657 281.432] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af84565b78a6ae180e316dd612a0877a7) >> >> endobj 723 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.4 222.217 513.996 232.747] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> +/Rect [113.91 254.855 253.237 265.385] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aa1a5a121f8b03708d9fdcc06f6e882fb) >> >> endobj 724 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [176.737 171.355 289.185 181.886] +/Rect [176.92 171.598 289.367 182.128] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj 725 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [290.244 171.355 394.023 181.886] -/A << /S /GoTo /D (aacdecoder__lib_8h_a404dd0b9b627d3e9ab765dba98be3eec) >> +/Rect [290.609 171.598 393.841 182.128] +/A << /S /GoTo /D (aacdecoder__lib_8h_a8f33403449b41e6a9deda6cb1e07d386) >> >> endobj 726 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.4 171.355 513.996 181.886] +/Rect [398.4 171.598 513.996 182.128] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 727 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [189.738 120.494 302.186 131.024] +/Rect [176.737 120.575 289.185 131.105] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj 728 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [316.246 120.494 408.27 131.024] -/A << /S /GoTo /D (aacdecoder__lib_8h_afb42ea8892dd828264bd2f6147e0559f) >> +/Rect [290.244 120.575 394.023 131.105] +/A << /S /GoTo /D (aacdecoder__lib_8h_a404dd0b9b627d3e9ab765dba98be3eec) >> >> endobj 729 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [462.759 120.494 513.996 131.024] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> ->> endobj -739 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 108.165 183.579 119.069] +/Rect [398.4 120.575 513.996 131.105] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj -730 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [226.965 108.165 309.007 119.069] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88) >> ->> endobj 737 0 obj << /D [735 0 R /XYZ 89 770.89 null] >> endobj 738 0 obj << -/D [735 0 R /XYZ 90 240.819 null] +/D [735 0 R /XYZ 90 190.281 null] >> endobj 734 0 obj << /Font << /F22 292 0 R /F23 293 0 R /F44 607 0 R /F14 446 0 R >> /ProcSet [ /PDF /Text ] >> endobj -789 0 obj << -/Length 1980 +793 0 obj << +/Length 1995 /Filter /FlateDecode >> stream -xÚŐY[ŹŰ¶~ß_! •šI]űćř’lë˝Ôö9@‘-˶PYr%ą›=żţ 9”VŇÚ/68Áy"E‡Ăą|śˇ,ckXƇ«÷‹«wĆŚ€.sŤĹĆ,Ăs)q5kă“ÉXďËâ7ó€PÇEjt'QŻĎËeáqĄĄ(ă,•¤WăĹŐßW(-*vŽG<îáţęÓËXĂřo†ExŕŠjoŘŚC›ó«?®,-ÚąEć ‘©ĺ›ű†G=âW%ágĆ%NµÎřÔw,Ëś^ßţ>ż—ő¬”2ßjqgŠŽŇ€šA϶Ěár4ŢŤĆłĺx6“wł×së™)D8ŠÂ5łuŻOÍzůňCTNň(z˙XFEW:XĹÍĎ–c…YZ”/JÇĚŹŰŃtĽě+ăřÄv&Hŕ¸x|-˝ľ»•4\%›_І˙şľ]H’wj7őJâÓÚćź-‹#UKű6 |ZŃęÓÁAhGSŘľ›Ř6H¸®-—÷Ąő\ŕا6a®‡|@O(Ú&ďqĎŚ´ł­”ŢT7N‹x­‡×Q­ŁĽš(Ł<‰^Ńc–yÜô¨on€‚Rj’“b=‰×:]ź1âÚ ZNço÷­Ŕö*ă˝`Ł3K]íUň´Ë»C”vĄÜĄ -fŰů=řŞk™‹ĺâĎűqOÍ•ąH‹çNăhëey9Ů—MŻP˝4żŰLĹc”_lU°%ő:6Uň*~B·  -8iĢiAăü`{ŮNđ(°żiła–B±íLČ“=t…’›Ióťç×9eŘf¬?f'‚Ýq‰˝oÇ:«h¦6źÚ\Ďü˘™#ruĽ'‰ŇmąS”®ůĺb\°=âŔ­Ńrˇń×C‡q™<k‹Éý”:Ź8XîtçÉŁŕcĄ—DQÄé?6ą4†xŔŹBŚuśÍQKöae5$̇ę j Ë[Üć%J#ö7ÇŻĎ—ÎoÔŇ_TZ˙ŔNA­ŇRÄi7ŹSl6«îTäŹúó´őmîš‹]\hşE‰ţ>JŘ×[l”đĐąąčŰzżTĎΔR sßó!lCąă_=j™Q©ËĂ©TnLŕµe%kYÔzĐ´B·Q’ś:˝śç^€2qĎ7§É`qĂ]–rě!.wH›f8§ý•’_~€® ö®7H¦śC”hô´ Wď«ä—t±Ţ -ÂÓv("ŽdGÍ`z×ss0?gŰĘWĺĆ*]B¬Ó78&dRkü(3}EmČ„éXCËÉ©DßuNŹŐfAB8VŃŢůđÇâŞgůoÁUąĽ«Ź&]I<ë;€)î„řyćÖ<‡¨Ü#Ś˙ -D=Ľ‡pfŽ çK€µ\1Ź˙U űŤĽÎł‰M˝×H¦Ż+ŚIĽľÄ™(čÝBńIĎvLi°>çô) ༆쟥A -śĘçđë ˘Ť?Ă?5­z-´ĐĚE)p˛J!ŰăbD’ăדŰŃ3pë86Ŕ­^ż9¦aUuĂ?KĺĄĹ;UMpe"+?‹c(a‡_ZFp]ˇç“LŢVÍ”Ş ë7ÔD­Zn z¦&Š#çҬÄÍ1Iäĺáűć<Ó4zýńjĄ7؉RĄe˙(f@kˇ8yđ¦®tń'‹x×ČÚŞ<ćiqŠČĄ€’Ű– -fpDPß3_TóE† ËťBqÉĽj±)Ž«.A¨Vń;č„™m4aR´—Ę]ńÂîsł‹§ĚăíNč!+âşë¶upŇŻę*,¸×·ă -¨  Gwš<ŐŢŞßüX@‡ĄÎ[Ö·Ęl'ąŘGĎĘWćx—Aű÷©ŹF—÷Ă›SPĘmТýŞyŃăŕXűh&{ď5ş—šDâúK·€ÜSl_Qo3‡ŘÓ¬ŐĘÖiDZĺ2 ®Ëpéű·döĹ~¦¶ýGşxŻ_đ:)gŁľJ˛":eÍďTNq©¦«7ŻľQÔĚÉB‰ˇíä áŻČ°” «g L˙o%ł”fU\Ľ×€á-6Ýřa?ëĆĎ ľˇ=b{ő˛†|Ę3;˙8G€‹" cĎź¸ľ©Bťżś;ĚnĎ:ÍŻď٦küĎĽjđş4TáüÓxő’™¦×ď—×·“»¸Ëx@eŻÁ]™N\ž·2J‡žy”lĹ]ŻU]®q“‘3»€`éŔÔ6p -Ë7ú¶M®7ń%ĎP Ô;ŠJ'U>0ŠŠ0ŹU‚Ů9+ä#KÜÖůČdô{ öiŔ‚7„†äc#K{j‡ÚEbÝ®'‰Ţ·uŘsâxţ“ü¬–_®KĎý)čüyčś@1ŞUńӺŠNن Đĺp:űx=×—ˇf!_c|g8ď­Ap&©ÂŽŰšżBţ µâ0‰DŽ ¸C§·ř"Ȥ=ŹŘM Ů+4)>ąć..Ę,×í -Ż:d>Cq”*ÔűUŹ=A+oÔ§ˇ8UŠň‰)NŹˇ>˝¤w2ËěXŞęAáś’śś6‡ ńݦąŘ·Íuw;¦8N/6—~đ¸\.3—*¸t†ŁJˇ*ÉŠkÇ—Y¶|¨ŐšŞő‚ů¶â0Ęę…a$éâíđďţó9á{í˙°˙ĎÉI +xÚĹY[ŹŁ8~Ż_´R‡Ć6×}KçR]3u›$»ŇŞ»9„$h d€LuíŻßcC€$Ő)U©űÉĆ>>w>6–¶Ö,íúęÓěęăR-0—şÚlĄ–ćąÄt(ŃfKí‹N©ńmö»ĆX`ÇErt'‘ŃŁŽĄłpżŤŇ’—q– +Ň«ŃěęŻ+”–F$;Ç3=ćháöęË7K[Âřďše˛Ŕמ$ŐVł)6ѦW^YJµs-ŞĚ*Ë5mćkńL桂_)u¤6Ő2íKϱ,ýöćţŹéăh0˙¬f…’ůZi;‘tÄ%Dď÷ ŰŇóáhđ0MćŁÉD żŽĘqEźžË¨8J-°‹RKp×Ôú—<|»ąO‰cú¤ĆŻ–ĹŞĺ}Ű |RŃějë.Mťž@—v’çşJžUn0OŹTÖ,¤ßd7N‹xy*™â’(ĺ‰ZaPK߯ âë«·çÖŰS+°˝*v/„čĚR·‰R»(íj!¸‹ šMú÷ÓGHU×ŇgóŮG†ś+sžÇ9ŁěÚey9ޖͤ˝4XÝňç(/Ţ‚R_ÉŹ«ŔŔ'cX”< # +ż4\¶ĽlÇo†lĄ°‰čzÂ…aO]Ą„0˝łę\9§° ąÓźű“[ÝqMz?Ţé´˘Z}ds=ýŰńQrHž$J×ĺFRşú·‹QÁöLjĚ eÇčű.‰Ă¸LžµE…<éÎ=b–Ő9$|,Ô’/Ä)„<{žđŁ/ńbgÓ]Ć‚}XE D€úÓ4Ddy‹Ű´Dmřön˙ýxéôN.ý ÷ %Đâä×.-yśFK ŹSl96‹N”çĎęó°őlćęłM\(ŞEŤţÚ ŘW"VRyčÜ=Ž®{¶’—ŞŮ‰t +t vm($ţ× –•Š±0Nžčp^Ż-/+]ˢö˘ĺŞ}Š’¤e}€Ö‹yć¨ó|ý¶/Ěîp¸ËRŚ=ĹĺiÓ Gâ´·ú‹𵉽›’Éä%=-ćŐrĄţ‚.VÚ*ġŠ8’íŰĂqôţôĂ)ëą*ËâˇNťgP—/ńŁĚÔéµ,R{ #'¦uŇe`ś«Ă‚„`VŃAŢéŕ×VXžĺżWĹň®Âí&éjâYď¦( ńóLˇuQÜm řŻ@ÔÝ'ŘÎPxĂvľX+ŔÓřQ˛?¨ę<Ű´‰÷ÍdŮőo‰1<‰—8µĹ]Ż]Ś ŰŃEŔzŚ‘C ŔX Ůż‰€8¨ćđk'w;Â?9­6(ôZhˇó’ă$Ô” B¶Ĺ/Ä Çď'Ĺ‘3pë86Ŕ­ZżÚ§au©în˙,‡ě”7‚],ĘXńYěCüR:Bęr5źdâ´jŽ ľ0Pp XŻá&bŐzŃ‘›BŽKłVű$‡‡ďëÓLѨőkÄ«…ţ´áĄ¬Ęţ–Ě€ V'řv”öLŰ«—5ŕ:*ĎHţu‰ÇD`:”?oýĐ…Şz9gĚÎκȯOŮfjü´‡Ô».ÝŞ`˙mĽx)L·7źć7÷ㇰKY`RB_»˘¸ĽjĄÄtrćA˛µď’xŘ(oĺr#®2óŚHĽ8P)¬°|­gۦϔ«=“PÍ Ü;ŚJ'U50ŚŠ0ŹwUyٱŞŘKĚVŐČxř‡ŃüpFń†ŇPz¬ÄĹž‡*ˇ6_¶o“¦’Ű23fú°kýi­żX—žűëÔů‹Ą,p|jOücŮbFA­!r n'źo¦ę(ô/pLÂĹSL€Ź ç“5ÎÔ"U5ŘÉZýźP<ĂEqDF˘bOř3v¨ô +EŠď-ľ‰‹2ËAűzWňęžß *yŐKOĐŞľ—Óď‹ŞľŚ ńľ§{(OŹčť˛2Ű—ňꀿk„ćílîţ+ô™É,úÚ_…˙« endstream endobj -788 0 obj << +792 0 obj << /Type /Page -/Contents 789 0 R -/Resources 787 0 R +/Contents 793 0 R +/Resources 791 0 R /MediaBox [0 0 595.276 841.89] /Parent 609 0 R -/Annots [ 731 0 R 732 0 R 733 0 R 791 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 792 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R ] +/Annots [ 730 0 R 731 0 R 732 0 R 795 0 R 733 0 R 768 0 R 769 0 R 770 0 R 796 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 797 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R ] >> endobj -731 0 obj << +730 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [185.554 714.544 298.002 725.448] +/Rect [189.738 714.591 302.186 725.121] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj +731 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [316.246 714.591 408.27 725.121] +/A << /S /GoTo /D (aacdecoder__lib_8h_afb42ea8892dd828264bd2f6147e0559f) >> +>> endobj 732 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [307.877 714.544 416.648 725.448] -/A << /S /GoTo /D (aacdecoder__lib_8h_a15da43e47179e3ca7b58d6b08620533e) >> +/Rect [462.759 714.591 513.996 725.121] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> +>> endobj +795 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.91 702.262 183.579 713.166] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 733 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [462.759 714.544 513.996 725.448] +/Rect [226.965 702.262 309.007 713.166] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88) >> +>> endobj +768 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.554 664.107 298.002 675.011] +/A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> +>> endobj +769 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.877 664.107 416.648 675.011] +/A << /S /GoTo /D (aacdecoder__lib_8h_a15da43e47179e3ca7b58d6b08620533e) >> +>> endobj +770 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [462.759 664.107 513.996 675.011] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj -791 0 obj << +796 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 702.589 183.579 713.493] +/Rect [113.91 652.152 183.579 663.056] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj -766 0 obj << +771 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [183.116 665.089 298.712 675.993] +/Rect [183.116 613.998 298.712 624.901] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj -767 0 obj << +772 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [306.149 665.089 381.715 675.993] +/Rect [306.149 613.998 381.715 624.901] /A << /S /GoTo /D (aacdecoder__lib_8h_ac8580fe563e79afe695d7b0b32ea0fed) >> >> endobj -768 0 obj << +773 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [178.254 615.634 290.702 626.538] +/Rect [178.254 563.888 290.702 574.792] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj -769 0 obj << +774 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [293.278 615.634 392.505 626.538] +/Rect [293.278 563.888 392.505 574.792] /A << /S /GoTo /D (aacdecoder__lib_8h_a6016435b8679d2793078b10ecaf3d05d) >> >> endobj -770 0 obj << +775 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.4 615.634 513.996 626.538] +/Rect [398.4 563.888 513.996 574.792] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj -771 0 obj << +776 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [180.74 533.675 293.188 544.205] +/Rect [180.74 481.275 293.188 491.805] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj -772 0 obj << +777 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [298.25 533.675 366.085 544.205] +/Rect [298.25 481.275 366.085 491.805] /A << /S /GoTo /D (aacdecoder__lib_8h_a6d508fce68c364f5dabc9195e701ecf8) >> >> endobj -773 0 obj << +778 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [374.469 533.675 490.065 544.205] +/Rect [374.469 481.275 490.065 491.805] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj -774 0 obj << +779 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [196.154 451.343 308.602 461.873] +/Rect [196.154 398.288 308.602 408.818] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj -775 0 obj << +780 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [329.078 451.343 438.945 461.873] +/Rect [329.078 398.288 438.945 408.818] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj -776 0 obj << +781 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [462.759 451.343 513.996 461.873] +/Rect [462.759 398.288 513.996 408.818] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj -792 0 obj << +797 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.91 439.014 183.579 449.918] +/Rect [113.91 385.959 183.579 396.863] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj -777 0 obj << +782 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [196.181 401.888 272.863 412.418] +/Rect [196.181 348.178 272.863 358.709] /A << /S /GoTo /D (aacdecoder__lib_8h_acca8f4cf9757885d6c654de37a43072f) >> >> endobj -778 0 obj << +783 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [276.679 401.888 392.275 412.418] +/Rect [276.679 348.178 392.275 358.709] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj -779 0 obj << +784 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [176.176 364.387 229.635 374.918] +/Rect [176.176 310.024 229.635 320.554] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj -780 0 obj << +785 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [237.606 364.387 350.8 374.918] +/Rect [237.606 310.024 350.8 320.554] /A << /S /GoTo /D (aacdecoder__lib_8h_a60aa42cb3ddc804b44ce61d877d0501e) >> >> endobj -781 0 obj << +786 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [354.616 364.387 470.212 374.918] +/Rect [354.616 310.024 470.212 320.554] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj -782 0 obj << +787 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [143.272 350.07 190.76 359.975] +/Rect [143.272 295.379 190.76 305.284] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj -783 0 obj << +788 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [195.265 326.887 294.073 337.418] +/Rect [195.265 271.869 294.073 282.399] /A << /S /GoTo /D (aacdecoder__lib_8h_a620b5a8c5d7ddd1b525aae1895963e16) >> >> endobj -784 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.291 161.085 240.793 171.989] -/A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> ->> endobj -785 0 obj << +789 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.315 93.195 239.817 104.099] +/Rect [124.291 105.15 240.793 116.054] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj -790 0 obj << -/D [788 0 R /XYZ 89 770.89 null] +794 0 obj << +/D [792 0 R /XYZ 89 770.89 null] >> endobj 182 0 obj << -/D [788 0 R /XYZ 90 290.48 null] +/D [792 0 R /XYZ 90 234.84 null] >> endobj 186 0 obj << -/D [788 0 R /XYZ 90 230.396 null] +/D [792 0 R /XYZ 90 174.462 null] >> endobj 668 0 obj << -/D [788 0 R /XYZ 90 206.068 null] +/D [792 0 R /XYZ 90 150.133 null] >> endobj 190 0 obj << -/D [788 0 R /XYZ 90 206.068 null] +/D [792 0 R /XYZ 90 150.133 null] >> endobj 665 0 obj << -/D [788 0 R /XYZ 257.47 152.283 null] +/D [792 0 R /XYZ 257.47 96.348 null] >> endobj -194 0 obj << -/D [788 0 R /XYZ 90 136.165 null] ->> endobj -666 0 obj << -/D [788 0 R /XYZ 443.182 96.348 null] ->> endobj -787 0 obj << -/Font << /F22 292 0 R /F23 293 0 R /F14 446 0 R /F44 607 0 R >> +791 0 obj << +/Font << /F22 292 0 R /F23 293 0 R /F44 607 0 R /F14 446 0 R >> /ProcSet [ /PDF /Text ] >> endobj -799 0 obj << -/Length 1559 +805 0 obj << +/Length 1534 /Filter /FlateDecode >> stream -xÚĹXkoŰ6ýî_!`@!3ˇ¨G±nH§I›Úť­l(şBP,:ŃjK™$ŻË~ý.˛%G¶`Ř>˘(ňňŢs/Ť­[ [oo˘ÁËsJ­…ő¬ha…Řň=‚8%V”ZźmgH9¶“džŠy‘Š2^f7Ž‹mt§żśgKˇ[S±ĄC[äsŮ局ؔ9_˘wQ4řc@`Ulµ -÷‘ϸ5_ >ÁV -ýď,ŚXXßÔ¨•ĺRĎĄ5ü<Ŕ=¦đęÓŤÇ"ć ĆŘţ.żaLsăáɉù}z6:ŤĎŻ®gş—JÁ,k™ĹÖşyĆęů2ą…Á!·E©Ň‘”·&¤éŰőY ¤Î Rúy^&+đ‚cř3WG†_9Cű¬ĐÖó˘ÖŤy‘WŘ0Ý¡Üţ&_<;sťßŻký–&u‚ŔËÁÉuu§'Č —µ(o’ükĄJŠum&r;ËäA¤Ň!-!(ä\G›¬Ó¬Ţ" í"Ă(˘ÜkăíĹűrMu§űd¸|nŕ×c¸ž#3źŘłě6O–z‘$w”­ĚŔ -]7™iTu)’•nK¬őČ4« Cu–Że6ęÇă6Ň©śŠę!źëa`pűAĎÎrH¬YőB^ipr1U•”Ćâ~řý6üĽţ€Ú—ł źśŤâŃtę0lO¦mŐőZVI€&>XWVEYö,M`Ën3Fa«–Q6UĽső ü/Ď iŮaŘ፝{V‚…Ü°đRřÄZ€béLQĆUť”őÖŹ/˛CŠ=ĐŢř¸[”!Ş$GŤ˙aŹ[Áq·DžĘ%ŚcÔź€rŰćí•~Ă[7:[ač1ŇÝ’yYčéµy‚:úM;ˇŰŕIQVOŢ»Ţcň0âIň\Ž/ŁăÔń@¶}r„:r}żKą¦#ţS©‚ťŕůÔÉň¬î'Žô˘! €™ä?#ÎŽS˙m¤ Y˛ĚţNę¬ČźJźŽöř=ôqIźÉuôń:ŠqăöÉŐĺŮ>ů’ÍĂ -Ál‡A°Žaë?J”úüúµ~š“Hęa4<ĸ»ŤŁ©ÁF9 P¶6tŇójŐÓî!¶ű!Ů˙xuS-§í«lIŹnĘ^-B~ěnEŚÂPîx0mş‰˝(_u¦nMt”‡‚€IŮGo}ó¶:±»|;(ź ěni\<Š ĎץH‘ÖíISzĂ—Ým©”Ř€­ ©î]yúČđ˘b™NXCăŰpč z"YžśÇF _pú|:(q9âÁ&Ň ‘Ük?JQŻË\Ç×WWşu_¨RWňă™ÁgądĆ‚ĂA6~íŤňzü~Uâŕ6â°7C[šEňhsC¸\•I^ÝŕzÝč…|ąKRÝN—EžUFödß}YÜ,ĹJ‹¸ëąČĹlçH2ŰVß»ĺ6“¶ż˛ş%Npîż[WćĂB4´ß^Íąş5nî‹›»ů“Ń%đו(ŽĆ“ë·ń›ËhvBwAîw0Ôä8¸ýĘÄśE3ŞXl:Yň— ş=̤ť©Mq|†»˙*¦ĎýSéßGÂă +xÚĹXmoŰ6ţî_!`@!3KŠz-Ö Yě´iS»ł• EWŠD'jeÉ“äuŮŻßńE˛äȱSlŘCEďž{řđh¬ÝjX{5ú9=ż0MÍGľc:Z°Ň|¬ąA¶I´ Ń>ę."ĆŘ´±EqÂâ"aeĄ7†…ut'ż\¤“­[±Ň žÎňw9Ô#şIŤOÁ›Ń4ý1"°*ÖXĹv‘Km-^Ź>~ÂZýo4Ś¨ďi_Ũµf™ž™¶ý2ÂŹzl«k¶#™Ć`Śőďö;Ćf®<<;3l[?źLĎĂóůě|zv%ű ÷ ÓŽa¬ŤM QË—v/˛čV^ĄIĆRŢŞ ŻFÚÇ«‰ÂJ>/Ęh ~Ř~DÍ•ń€áƬ'…´žµlÄE^Ą`Cu3Ă´őŻň%Í7[5*‰ęI “˘ťł([łĽF*.ł%Čë˘EŹ˘uqu˝|-{Í“±ňí#XÁ€'cea"#…É+ht°âÝ-VľŁ§Ń\đ¦ŕ˛,śÜVwr:«Yyĺ_*9{Plk5ŃÖ–E÷,áńh AľíČhŁm’ÜŰѶŽ˘}9 ˛Ó:lď1a/>Ŕ9ĆM—čËô6Ź2ąH”ÂVĂAčşIUŁŞK­e›#-G&iů©Ó|ËsQߎ­#™Č«îóXĂÄÖďĺě4‡tŔšUp[^5{"fU•ĘâIŕŰŕ{¦~ą řůdN b}ľŕH›–Ó±I<Ś0qÁ¶°ĘĘr`aâćYͬXFŘŃ*ÄĹl4ŕ?ż ¤c‡z`Çněü8°,DP^B‚CéPJuČť9.Ę°ŞŁ˛Ţůńě™Ŕulb”ÓîĂ{Ü-“"Sł˙Ă·Ľăn±<áK(Ç Ą?I)SoJńÎŤŢF;˘”ô·Ă»(.•Öę Ęô[Ý+ĹNČ6xR”Ő‰ÔqR‡‡Sçrv'ŽÇ›KŽÇC–ëö‰Ă‘ġÄ=•8>ŘńžNś4OëaÚp/ÚxIěľ ţw´Ůsę˙ w!Ť˛ôď¨N‹üČăÇň8yć×Áűë üŐ ÔÖĎ®.'‡řă:7珏¦{üu,÷AšÄç—/ĺSťA\ ĂůŰN­îPnŃ6Kź?¸"#ůŐ–"ŰzÂA=”5ę"ę &ͱdŇęw’Ć{Ó•ě­ďě'µl6g;˙~cXß®xŃŔ XńťźXQšWrÄźü¤?‘«h˝ÉXĄŚ®j1 †ĹQ–ĄůíáCXŚßÂăˇÓí„2hÇ99ŃlHG‘ëÓíšş.0\Kżß°„­$Ę“"ŢňúP˛yŔ]¤…-~Öę®%8ň·qÝ«`T’ ‹ËŔđˇ*í™#âŘ;˛b:( ”öjĚëłŮäjîJ%ľÎcăPÄŃą4Ő×4ĘÎvn@úf„¬!¶‡!i‰Ľ®©Ŕ–óîˇUv„§©ő&%¨ĺÇţVÄČ÷ůÎĄá&ň˘|Ń›¸3ĐÓhrÉGŘ6[ĎśťJě/Ţ É%[­ÍŠţqĽ-Y˘n0ó¦ŕ†/ű›R¨°*ü:ŰQÜ·ňäáUÉŘ>.˝°ĆĘ·1±vč@d Ęó‹đÝôd NžŹJ,Ů^ékm¤%«·eΔłë+uăܢÄĺěxbđiÎyŃBđxŤ_2Jëa”׳·łąf›=öqŰŠvŞ€ö)Ę$U»^…—đ,VňąÍżä…¸Ž©pC¨Šü{[zcdUkŮŠÔ®vwL}]É6cüĘ«`u/C,·/ź˙tPB™nźMEÂo-ˇ`›,‘÷‘ö°‹łŮňý\A.?ĚÎ…4XŤ4ĚGŃŽf?Ř,.Ue”W›Ż­Zđ—»(‘ îtYäiĄDŹ÷mĘâ&ck)!ŕ®c! Ó˝i˙ź Ć/jĄuGšŕÔS4~ł­Ô‡khßűón‹í=±ýŁňţ_E2ĹćS˙)útK¸ endstream endobj -798 0 obj << +804 0 obj << /Type /Page -/Contents 799 0 R -/Resources 797 0 R +/Contents 805 0 R +/Resources 803 0 R /MediaBox [0 0 595.276 841.89] /Parent 609 0 R -/Annots [ 786 0 R 795 0 R 796 0 R 802 0 R ] +/Annots [ 790 0 R 800 0 R 801 0 R 802 0 R 808 0 R ] >> endobj -786 0 obj << +790 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [124.215 702.457 240.717 713.361] +/Rect [123.315 702.47 239.817 713.374] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj -795 0 obj << +800 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [123.918 633.884 240.42 644.788] +/Rect [124.215 646.321 240.717 657.224] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj -796 0 obj << +801 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [456.692 416.208 513.996 427.112] +/Rect [123.918 578.216 240.42 589.12] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 802 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [89.004 404.627 153.511 415.157] +/Rect [456.692 361.948 513.996 372.852] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj -800 0 obj << -/D [798 0 R /XYZ 89 770.89 null] +808 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.004 350.366 153.511 360.897] +/A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> +>> endobj +806 0 obj << +/D [804 0 R /XYZ 89 770.89 null] +>> endobj +194 0 obj << +/D [804 0 R /XYZ 90 739.935 null] +>> endobj +666 0 obj << +/D [804 0 R /XYZ 443.182 705.623 null] >> endobj 198 0 obj << -/D [798 0 R /XYZ 90 739.935 null] +/D [804 0 R /XYZ 90 689.29 null] >> endobj 667 0 obj << -/D [798 0 R /XYZ 121.033 693.655 null] +/D [804 0 R /XYZ 121.033 637.518 null] >> endobj 202 0 obj << -/D [798 0 R /XYZ 90 677.24 null] +/D [804 0 R /XYZ 90 621.559 null] >> endobj 663 0 obj << -/D [798 0 R /XYZ 144.445 625.082 null] +/D [804 0 R /XYZ 144.445 569.414 null] >> endobj 206 0 obj << -/D [798 0 R /XYZ 90 608.293 null] +/D [804 0 R /XYZ 90 553.081 null] >> endobj 618 0 obj << -/D [798 0 R /XYZ 221.735 556.508 null] +/D [804 0 R /XYZ 221.735 501.31 null] >> endobj 210 0 obj << -/D [798 0 R /XYZ 90 539.719 null] +/D [804 0 R /XYZ 90 484.977 null] >> endobj 664 0 obj << -/D [798 0 R /XYZ 243.891 487.935 null] +/D [804 0 R /XYZ 243.891 433.205 null] >> endobj 214 0 obj << -/D [798 0 R /XYZ 90 471.146 null] +/D [804 0 R /XYZ 90 416.873 null] >> endobj 218 0 obj << -/D [798 0 R /XYZ 90 390.991 null] +/D [804 0 R /XYZ 90 337.187 null] >> endobj 669 0 obj << -/D [798 0 R /XYZ 90 363.993 null] +/D [804 0 R /XYZ 90 310.201 null] >> endobj 222 0 obj << -/D [798 0 R /XYZ 90 363.993 null] +/D [804 0 R /XYZ 90 310.201 null] >> endobj 226 0 obj << -/D [798 0 R /XYZ 90 340.036 null] +/D [804 0 R /XYZ 90 286.257 null] >> endobj 670 0 obj << -/D [798 0 R /XYZ 90 313.278 null] +/D [804 0 R /XYZ 90 259.511 null] >> endobj 230 0 obj << -/D [798 0 R /XYZ 90 313.278 null] +/D [804 0 R /XYZ 90 259.511 null] >> endobj 671 0 obj << -/D [798 0 R /XYZ 107.713 232.033 null] +/D [804 0 R /XYZ 107.713 180.512 null] >> endobj 672 0 obj << -/D [798 0 R /XYZ 107.713 216.065 null] +/D [804 0 R /XYZ 107.713 165.449 null] >> endobj 673 0 obj << -/D [798 0 R /XYZ 107.713 200.097 null] +/D [804 0 R /XYZ 107.713 150.385 null] >> endobj 674 0 obj << -/D [798 0 R /XYZ 107.713 172.174 null] +/D [804 0 R /XYZ 107.713 123.367 null] >> endobj 675 0 obj << -/D [798 0 R /XYZ 107.713 156.207 null] +/D [804 0 R /XYZ 107.713 108.303 null] >> endobj -434 0 obj << -/D [798 0 R /XYZ 107.713 128.284 null] ->> endobj -676 0 obj << -/D [798 0 R /XYZ 107.713 112.316 null] ->> endobj -677 0 obj << -/D [798 0 R /XYZ 107.713 96.348 null] ->> endobj -797 0 obj << -/Font << /F22 292 0 R /F23 293 0 R /F46 801 0 R /F11 444 0 R /F14 446 0 R >> +803 0 obj << +/Font << /F22 292 0 R /F23 293 0 R /F46 807 0 R /F11 444 0 R /F14 446 0 R >> /ProcSet [ /PDF /Text ] >> endobj -805 0 obj << -/Length 2163 +811 0 obj << +/Length 1993 /Filter /FlateDecode >> stream -xÚŐY[s«¶~ĎŻŕĎts@âúHlśăÖÁ©ítN§íx­ÄLmp7ÍżďZş`Ŕ;6»;=Ó>$–ô}ZwLíE3µ»›ŰĺÍĆ„h¸ÄŐ–ĎZ`jžk±´ĺFűI'öŕ—ĺ·Ąa9ÜÄĄătÇźcęŁ|}Üł¬JŞ4ĎpéM´ĽůíĆ‚•¦fńÇ9žáQG[ďo~úĹÔ6 ˙V3 řÚ+_µ×lBáw§-nľż1ĺÖĚćm·±EË2 bÚšG@汣0¸Ž>\Ť˘áj˙0đ=śNF«˙†ńhńŤ©'bÚ|śmÔő´ĺV"Ű&ŮFˇ<$eÉ6b\ĺňW-|>fkŽžĎÖÉn'FŻËÔ“RLŇl`›úďâčÉ.•ŹúŮtĚřq:…_Ëčě±ů“Ú$ Ó=‡ü/fó5őe4Z…xü _ąĽÝˇśÂ.v¸ÝQ· Śů1ŰÔHÚř×yöłi’—c‘śhH%î,ŻÄ <yQ±Í rG}Žgó{ľŰË8=×°]ď çSZ•UÁ’˝BYě“ę+ČWőÍűbl°Łŕ +ŠĽĂ‚•é.eŮš)UÍwLn 7˛‡á,Oî.‚ň-r ÓˇČ+Ö°ŻA"Ţ*€XבÜ?N–Ż/'Ópŕ™úŹŃüňAůńj_yź€ŠÚXL’áčy&E»äŤBöśB;Ă -i ţ$yÚÉĺ9`~ůxřÄ4čťoř6zËŔSów÷;VࢿľÁŁĆŃôúŃbÁ†Ú6G)Ő×ŔBĆv8±Ď}®@·ČRđ/…gÇý“Ű:Äá“#l MŠ"É^†#ô¨_«í_DË"ĽN⻹0䋇Ŕ¦ýŔnk˝íęe˛?đc;:𡤶N‘$€@Ŕ0,©Ô}çW•R/"ýQ©&Łp·óU»wĂ6Ď.Üýwů¶w ~-WÂ<Ľ_Ť!pC śL/§ –á‘nHń U(’=«w_>ŕ8î6âŠÜµ§?1q­d•ZMôHj;^•qŐWÉÂŔŇŹRŇČ(<=?VBš? W~yč„´}äĘźÖa»µQSßä¬Ë.XŽţGZV_Ąqć±D˙9[ÍŁĹí#vs95± G´Úü‚óÝ°uľá›†IĆŘwíY"-Ń“\±°JP5ľÁąŁ—©‹ž˘î)ŘoǔܰĽ†Î)—J?×nóŘÔGte/* Ż¦{RłĂŐ_°®$YŻé*ÍŇjĹŁáŠAÖ|Šú…ź»Sđ$ďĺTôą»ypËy/”‹3ë -tłDK•şVź!jY6’Uň@HvŹ™P@đ•ş&Đ ëY$îă=hŇÖQOXÄ…î*X‘ČN(đňşĺ•%ÚčŘ‹W"Ú52L°tÇ (+q›'ěob–Vâ)<ÂSÔŢ8„úR®âžeşU©“ZmÓĺ[Y1™Ě®‹¤Ü~p”‹ţ·ŚâĹdKy64ĺ…B8şňlÓ¨ÓaЦ–b‡5¶bĄB *–•ÜîÄÂ7i˘d8f'ëŮĺ‰TáNŻyśé)ălżE8Č·Ó“Ş·;/…ţžÜţfŁh5†XÔWA=Ď°Ú¶;źrFąéŔ¸YëŔTF—Ł\ɡřDFpęŕ—G`Ë6•ňňŁň*7éřĂmźWěĎSßćN*ú7ňŔşQęŁ5z8ö¤Ô‚ś!pĎKČE7ĺŹŕqŇĄ©šľÖ¨RÖŰ+{•ďč“Wq•¸ťÍľ»śVQĂňë¤$Ä„Ú´Ď›(Dü”翊YťZŕ¤L_˛d·CŞ?ŮQN ®4śĚ„—ś­R›žŰvO˙€cď:˛‡y4š —ŕÉ.Wr.„‘ş<}€•®+ľY— -G€\H鞼kK€µ;rž¸X „A]éáŐiŽçóŞŞ9—ŰR˦†9ŻxRV˝Őĺ1ć,;&š4Q§_ţşnUű*‘-­"G˙|ŞĂ?¶´^nÔ9¶á{uÍÂ>ŕFĽ Â@ łŻü„ô”)Ăĺ±EĽ^o…”#§Ę`AĐpŢ ÔTQ)Cuť‚É:V§đüWŃ<_Ą™’&ËŐńË mÔ#ôIͲ#ă -üJ·HÚ,CQ –¶Y†Łč?—ĺMŁ»pc%ĽÁfşˇ}Ë>Ö@—ó%Ëpý: ß%č;B±F© -ěęád“T‰IňqX»"śpÚqpj¨ ‰ă~ľQôŻ÷!‹[Áň•"Ĺ!5·pu„ž›'źŽ(kźŽŘŽEzŻ¨8ĎřŢiŽß.jßöÖ×ĘÜổYĽ€R:őĚdl˛Śnńb»uńb{P ' ’^żŔŢ Ö ŠaéÔĄ YĚD75Ô‚6;PÄc–şň -˙sl?ü0í›úAQa›v‡1®»ŰúĂŻaSĄÉÝ&Ţk‘VËÚß;v˝'ő~—Żc¨ď™y÷ËşO j’/ý°ţ'ťů!î +xÚŐY]s«6}ĎŻŕĎ4$ńőčŘ$uëŘ©M:í´w<Ä( S\Ŕ˝Íżď®>Ř ömŇ;íChŹÎîž•măÁ°Ť«ł‹řěŰKBŚĐ +=âń˝Ú†ď9–K#NŤ_MÂźâď JCËq]$z/ł ś×6ÇĹz÷Äó:©ł"ǡgQ|öÇ™#mĂŻs}˧®±~:űő“m¤Đ˙˝a[4 ŚĎbÔ“Á…ëĆXžýxf«ĄŮí%2ŻµDDZ-b3Ă'Đ繢ápŕąćh5ŽF«Ů|Ŕl3^EłůíŐw«‹IĽ+ÓŻ“iű}.±\×׶ŏʴ,ßîjy{7 ¶ą»׼çĄě+“\ŢzTqŻFgueí}±cÁąţäąăY¶Č'Éz•ňőŞzÎ×+^–EąâyÚyŹľÂ?9ŐďNÍň¬VS«:)ëţÉÁ!t“ŮOŔ5‡ÓÉxőÝp6žF˝Č1fQ/8@î1ÉSMmRU<•÷uˇ®zŕý._ âÖ:ŮläÝçc›IĄ÷·óO?ŮdęUżŮ®=»ťNáęÁZ-ňM›ogËŰ››ůb@4Ńx5Ŕű%…úiCýöŤ‡é®ž.Ť,vyÚŇ`]äżŮ6yŘ•É ™2K/ç‹k±Ü~C}Ďbޡ Íë’'OÚĚň)©ßiúÔÉ{-N5"d…Â#„ł(‡ćU¶Éxľćš­ĹćMS 8ys˘›Ń|v9ąęµ*ĽHźQ۲¨yËÇ>ÄůŐ“7éúv:p3žL‡ß6‰ý;XÄoRÍuQ‚U”9ŕ4q)#f‘«®MňŚáűî‹RöÁJŔ÷F˛·‚’ÜmÔp4ŻÂ`ńx·=ů XĂ(áX!$:ńíÓö°řĆŽ ¬Î˘éń˝%ÄuÝŽRj®†śo°ÁăŽŔŘČ31Ąl继;yĎL@IŘKl"÷°enRBN{ŕÎ1¬ľ—ď_†Ërx}3ťĚ®Ň—{óU!ëňžyf•Q«öÍ;.źUĽ¶×ÄŚßń©Ę®Ö ÇÜ©ž–°đµp ”póMAµë„X´»ç:¤6É»łPŰL ľŹ.8®ůWVŐďcÇ,‰1†ÎW‹hŁ‡ Ąçô+d¶Ó0(Ĺ"«†FÎyŠËö)Ď ëNŤ„"’§ß`Ű5«LćF_csJţÇ.ăĄp-żE:V)č±.mBb4{Đb›FîNcĚKLY˙Äż^Ĺ_ާ%RďRÔńb8[ę8zeŮiľ8¦,iŔ\»~Vč­ŠoÍ6"Órđ“ĽV;ş:Ůĺ’„kýLę Ńq=‰ëxÓ6ĺđËčD»™ÝÓvERĄPćóŁ(() Ń©€g˛ż–IŻĄ5ÁÝ]‚*¨jůÎdřgŮĘjů‘é)ň±,w[IaŠ%šJŽíAr »Ľl»z®j®díşLŞÇŹNvŃĎq4[Nć3ˇESQ4 Ç˝™ŹŮVHÝ=u4„xŰ@Č4„Ř+iPóĽÎ'>+?E±áÚ{ňgS$i·˛­´?†_©/Ňłű&ź_ŢT?oůaYô㕤óq´ş„”t*E}ßb!íş^@¤Â{ŕľ]÷@S%™ť)l J.Đ!°«H.ł5}Ĺ‹‘ľ:Xşe{žÚO.APűuě»ŕ)ŞŁvl?Y˝ŹÓŻ€;ZŚNÄÔíz‡U +¨Ň4Ő1 ^§Âš.ń6@Á˛~<˛XőŤ“– ĹĹ|ţCżľ˘–4ędÚÚf‡‡؉qř®(~—­Fc`ŁĘňdłA°Ď™Otŕ‚'­Ŕ-éŕvWÓQË÷ş.ůŐ7ţ„`vłĆ“Q Ѭż¬ó ™4µę $Şl]‹ŐzT´ŔóŐaî˝Ç `DdżĐđĐ-Í„›¦ěçÓ7čł.í<`ČQ!J!Ďęç¦VFń˛á*¨)/uŰIćź{âŁ>ĎJÔWY`Ś~)ĘßçŽuć¨˙čÎeVŕ7ĺĂqä‚ĐäQĘŢŃ OtŘ–Y{ý({…éTű,t´"8Đšj,UÂnÔ!x­ëtŢ˙ çéĺQś)iĂěRçŔ iÁ ˝­Ú„ľdGŇŔěŞäWIf¨4eifŘëpŻšů/Á|BąNfXÇ2áLWcôpuî‡ĺPżjr,/h˛úU‚ŃĂ%Ë•şÄS>l¤IťČ;>Ţ6ÁvĽy97"P'×{ýÜč?EN9•ą0©V\Ň€ 3¨+‰nż„őć7ĹzW–@|ŤĹˇđ{ăĽübŮ„ůnŔ>VÇŕ +ßôéx¶„şz8>QĎ0´Ć~ĂĽ¦Ša>”ĹÉŔ)# +hĂä$Ö0aSĂ@gK +@KJÔ"mHd"íFMĹ–Ż%ţxńÓôTŐłŮd‚ľŹÍ/‰˘śÍ4™÷Ďĺń`^×˝ÂŢŐ«ď˝zĐ©éß:Ř˙3€JŘ&_úćß;•wß endstream endobj -804 0 obj << +810 0 obj << /Type /Page -/Contents 805 0 R -/Resources 803 0 R +/Contents 811 0 R +/Resources 809 0 R /MediaBox [0 0 595.276 841.89] /Parent 609 0 R >> endobj -806 0 obj << -/D [804 0 R /XYZ 89 770.89 null] +812 0 obj << +/D [810 0 R /XYZ 89 770.89 null] +>> endobj +434 0 obj << +/D [810 0 R /XYZ 107.713 729.972 null] +>> endobj +676 0 obj << +/D [810 0 R /XYZ 107.713 713.894 null] +>> endobj +677 0 obj << +/D [810 0 R /XYZ 107.713 697.817 null] >> endobj 678 0 obj << -/D [804 0 R /XYZ 107.713 729.972 null] +/D [810 0 R /XYZ 107.713 681.739 null] >> endobj 679 0 obj << -/D [804 0 R /XYZ 107.713 715.912 null] +/D [810 0 R /XYZ 107.713 665.661 null] >> endobj 680 0 obj << -/D [804 0 R /XYZ 107.713 701.852 null] +/D [810 0 R /XYZ 107.713 649.584 null] >> endobj 681 0 obj << -/D [804 0 R /XYZ 107.713 687.792 null] +/D [810 0 R /XYZ 107.713 633.506 null] >> endobj 682 0 obj << -/D [804 0 R /XYZ 107.713 673.732 null] +/D [810 0 R /XYZ 107.713 617.428 null] >> endobj 683 0 obj << -/D [804 0 R /XYZ 107.713 659.671 null] +/D [810 0 R /XYZ 107.713 601.351 null] >> endobj 684 0 obj << -/D [804 0 R /XYZ 107.713 633.656 null] +/D [810 0 R /XYZ 107.713 573.318 null] >> endobj 685 0 obj << -/D [804 0 R /XYZ 107.713 607.641 null] +/D [810 0 R /XYZ 107.713 545.285 null] >> endobj 686 0 obj << -/D [804 0 R /XYZ 107.713 581.626 null] +/D [810 0 R /XYZ 107.713 517.252 null] >> endobj 687 0 obj << -/D [804 0 R /XYZ 107.713 567.565 null] +/D [810 0 R /XYZ 107.713 501.175 null] >> endobj 688 0 obj << -/D [804 0 R /XYZ 107.713 541.55 null] +/D [810 0 R /XYZ 107.713 473.142 null] >> endobj 689 0 obj << -/D [804 0 R /XYZ 107.713 515.535 null] +/D [810 0 R /XYZ 107.713 445.109 null] >> endobj 690 0 obj << -/D [804 0 R /XYZ 107.713 501.475 null] +/D [810 0 R /XYZ 107.713 429.032 null] >> endobj 691 0 obj << -/D [804 0 R /XYZ 107.713 487.415 null] +/D [810 0 R /XYZ 107.713 412.954 null] >> endobj 692 0 obj << -/D [804 0 R /XYZ 107.713 473.355 null] +/D [810 0 R /XYZ 107.713 396.876 null] >> endobj 693 0 obj << -/D [804 0 R /XYZ 107.713 447.339 null] +/D [810 0 R /XYZ 107.713 368.843 null] >> endobj 694 0 obj << -/D [804 0 R /XYZ 107.713 421.324 null] +/D [810 0 R /XYZ 107.713 340.811 null] >> endobj 695 0 obj << -/D [804 0 R /XYZ 107.713 395.309 null] +/D [810 0 R /XYZ 107.713 312.778 null] >> endobj 696 0 obj << -/D [804 0 R /XYZ 107.713 381.249 null] +/D [810 0 R /XYZ 107.713 296.7 null] >> endobj 697 0 obj << -/D [804 0 R /XYZ 107.713 355.233 null] +/D [810 0 R /XYZ 107.713 268.667 null] +>> endobj +739 0 obj << +/D [810 0 R /XYZ 107.713 240.635 null] >> endobj 740 0 obj << -/D [804 0 R /XYZ 107.713 329.218 null] +/D [810 0 R /XYZ 107.713 212.602 null] >> endobj 741 0 obj << -/D [804 0 R /XYZ 107.713 303.203 null] +/D [810 0 R /XYZ 107.713 184.569 null] >> endobj 742 0 obj << -/D [804 0 R /XYZ 107.713 277.187 null] +/D [810 0 R /XYZ 107.713 156.536 null] >> endobj 743 0 obj << -/D [804 0 R /XYZ 107.713 251.172 null] +/D [810 0 R /XYZ 107.713 140.459 null] >> endobj 744 0 obj << -/D [804 0 R /XYZ 107.713 237.112 null] +/D [810 0 R /XYZ 107.713 112.426 null] >> endobj 745 0 obj << -/D [804 0 R /XYZ 107.713 211.097 null] ->> endobj -746 0 obj << -/D [804 0 R /XYZ 107.713 197.037 null] ->> endobj -747 0 obj << -/D [804 0 R /XYZ 107.713 182.977 null] ->> endobj -748 0 obj << -/D [804 0 R /XYZ 107.713 168.916 null] ->> endobj -749 0 obj << -/D [804 0 R /XYZ 107.713 154.856 null] ->> endobj -750 0 obj << -/D [804 0 R /XYZ 107.713 128.841 null] ->> endobj -751 0 obj << -/D [804 0 R /XYZ 107.713 102.826 null] ->> endobj -752 0 obj << -/D [804 0 R /XYZ 90 96.348 null] +/D [810 0 R /XYZ 107.713 96.348 null] >> endobj -803 0 obj << -/Font << /F22 292 0 R /F46 801 0 R /F23 293 0 R >> +809 0 obj << +/Font << /F22 292 0 R /F46 807 0 R /F23 293 0 R >> /ProcSet [ /PDF /Text ] >> endobj -814 0 obj << -/Length 2276 +818 0 obj << +/Length 2267 /Filter /FlateDecode >> stream -xÚĺY[sëĆ ~÷ŻĐ[ÉiÄCîňęNTY9uĆ·ë¤Íśd<´´˛8#‘*IŐÇýőXr%SŽ›´/í“ö‚°Xŕ@ůŁ§‘?úxöçůهď„e^‹x4_Ť2”ĉ`4_Žľ8‰¸cůNž/–jQ-Uý°)ÝĐwĽ5í|WlŤ>©•ŞÝ uTąŔĄX¦#"÷—ů÷głůŮßĎęŹ-%JĽDFŁĹöěË/ţh ëߏ|OféčYSmGˇđ»Ýźýpćż©±€i":Ť˝Đî8đ}4ŮoIąÉÄŤ"gz1›>ÜąIčL>M®Q3`'-vţh,B/ô™ś‚«N‰€&Ťjۢ|˘É.Żó­jUÝxú¶FÝ#]Çľ—e1HĽT„$aŞ:o«úüŕhĎ"Ś-"đÄh¤žő*Ćp±‡»éőĂíçůÝçůĂĺÍ|öéj6qłČůqvq¬’}ß ^ ŘŇĚ€‰;–AčTűv·oq9[7pŕâ4ůŮŹüŕ܇2uŠ®ĽQą+|ç.lŞeO´T+7ÇŮoZ‚ť0v|}4sĘŞ%Aš2ŁšpµHz~Á đ˛("µe »c;id^(řŤÁNék;]|vĂČ™\=L˙2ąą™]Ă]ß^Ě޲–/ :k]¨ź}_”Şˇ«¬+WDÎ3™ ]+ZíĽ'»şZ¨¦ˇ@ôŚ&Şho±ÎKc„,ődzd„RmŘőŠ§2ß4Ú_ĐaĐóýĐľx^ŮŁcŹU»>`Ŕ‘Íż¨0żđjͧžŇ°ŕi­ň–Ďć7űś5ßVeE#ă_˝:4^Ő,šŁ»ň°Lń_•)eĘ˙ŚĚG¶ó¶řÚˇH˙@¬GÓ?Á•› ç4˙–áöpę{áYZ+}€Ă$1 ţ*P/ô˛404Ó5cţßdśyqĽŻčůŠ_Ź\™€8‘rč&'!Îîőäîîňćă›Aë OťŞ·ŮR除VŽ†ŤEU¶yQ64Łä$ ”%´Ô= -ŚÁBFcËYAÇN ŻÍůX´M ¸=™ Â(µŃRR„‡ ÄňÍ•Ň1Ë‹}]«˛ÝĽĐ´TJK@’Ş4«mő¤ÚµÖfĎ‚$RĐ%a 0tĽ¤Ü[ŇVo˝HνRěĘX|ÖO\…~úx6ú˘p•§ă`ÔuÓÇ ®PâP}Ř÷=ˇI1Ôř >Sí ^lÂb«˘‚ 7>8´eŽ)™Í'$!HOLgĂ“Ĺ€hruů -Y!`ĹH±K®< ž;_ćm~Ô7 @6nwuÔbđf{ŞöÝ7ďŞzUŰąžýŐĄV ŕzsş‰’>[J_ôMśâ•1ÂúÎŃanPˇŻC0°My <úľíE8Č`Ôu¶@\1ŘXyfy3důßÚ·‰ R›Ř®ÍqbZh¸×QSĐ—I0ÚVúóaWŻă™ŞäĄ>ę3$+¤çÄłP×ó§dśöŤé†ŐŽ™î®˙ú»ŰÉ®Kd桠[ď*ČśťŞWUŤźżZȉ¨GRŤ›O\Ń•üŇ Ŕ©î 鯶(LŚE»rÓ,X^ź#4?0ĺ@ÉĎ‘OvfQ,)XIÜăF¸‘ظ7»ŞĹ °Ú醋ŚLIÂm™-Şoa•MĘĽrZD=˘ÝÔStKč2· -s“^ˇ/0Čő˙NOfŁĂ[ńŞ%úĘ°i:A˘´hnů Ä ^ár±"f}‰©WĂń¨ŕ´Ŕęý%f—–Ž˙L´ŕôďţ—ö/ą¤cA +xÚíYŰră¸}÷Wč-de…Áű¤ň ‘9łŢH˛ckr©Ů--AŠÔ’P<ŢŻßn\xłFŢI&•—ĽX ݧ»h:ÚŤččĂŐ»ĺŐ›÷ŚŤb,-·ŁŽÂŔ!>sFËÍč“Ç3źZişŢđuąáŐ*ĎmŹZdŻFŢg9W­{ľĺ•íD/Öظ‘c1ßţiůĂU˛ĽúůĘ]éČ‘»ř! ]´>\}ú‰Ž6Đ˙Ă7ŽFOrÖaä1~óŃĂŐźŻ¨¶v-÷‚ŽĺŽC ŁŢ(dĐ2e>X˝łWiż©HWĽŞĘjU‹´Ҭáşđgěř$p]µŔdbľ5]]'ÓŐdż6ó­‰íűÖ˙LVÉý=‚q{ß[Pu»¶ya>z/]”…¬ć¸ÜżlÇ·xĄA”Şćş«"+vęYěőp'Ëó´zVŹč™jíÓb“Ă|2°¦‡ÔŘŁ.W7‹er?K&vě[I®/2/dÄ‹™a,bŹ]dzʓ8ž„jŔklůÖŹÔ§Î[{ěą‘•ŕoÎS<}W›v҆o1i¤§\ŔŁóń‹ĘWc«(őĘr \ŔpŇw ü>'ű{ŕr_ĎŻ.H×m˛÷l5ý~˛X$3Úüö:ąsB9 T×üGJYÁkĺĘ^Ą‚@+ö6”Á‡cU®y]«7`ŇBTޱ5ş!Ž @(x®y—íŠ4Ż%YdÁrI{jâëšł.b:HK±ď- ‹IÝ&C¬kJjęŃ™Ł$ç6vôĆÓŠ§ÂÔ)4§T[~( ť1 ąZsT{[•:ZŽĆĺó{˛˙ęžěěžî·ŮóQă|Č>7)¤= mGÝÁĚŽ™ő;őüG-·úŹ”ř*™9^‡±.…\††±ŔW÷LĘóH5ňdş×šď÷ŽI8ża]Ö®Ë^Ź\7„íXtľ¸vň› ÜůäîîfńábĐRFXcé­Éj‘űBh¸‘×R'”D®ÔSăÎËCk~—|PŽŘ‘0HŽZ<m,WÂBňť&´¦Ń_mlŘŽ yÚ7ećµ!ŐŁňßŇ,ëěf~c•,lěy7K. Z8Y(·Ô°ôŃXÜ%yŢŃ·¦+;dÂ(T0‡ę‰Ł~Ť 8““(Ç ‚<ěëî%3lŤlVşEYŚµPÚđ<}nTµ\ď7+‹şŹPÉĄüzťŐ_°#ÓÚhÇ (ęů“%ĘÜ8ĂśÎ" }@+duHźkt”ĚŤPR 3TŇëňrm#e Ór Ö +f.ë +Ęd˘a*s1j4*Łéěţű›‡Ąšaťî:ĹČ(żŠ +ŕ×+Á5®OűF+îϡU-kťő˛ş%ýÎČqY”>ólť‰ü űź•~Ctu‰S·89ú§ŐňfžĽ&”˘6“<¦Á ¦c—fşzJ…H×˙Ä6TýěŔUŻä +üäű(Š†~jŘşEŞvÔ‘ ,ęźEf.”AÇ×ŐĄÖQ3ŮüăÇŇ0¶B„‡ŐĎ1/őĹ}w±oü=\‡&żmŹP'xvř2Ż„NíY Š±ćjHĂęĐ„ 4úpCG“Ľ=âG’J}Ä}ú +âÚ +śýý;ÜŇđʸ3Aa®|Pqľ ôó›Ĺ p^ľ‹F ÝF4Ěł";ŕ%ĘŃl®š®çÉ«&ö©+4š+×RÄĂŹ=ëFĎÝg»=ĽŻď錸΀̍ďMÂho·TßnńV‡ůLçô´ÉĘľrú®§Ěęěp<[RUvűlýâDÓ#$ľ9›żÇ¬ďÁ‘IEuĘÁ@Břťi°o ŇńTq©*<őť»Ű›BÔą}Á°R¤–*|R7 R§ýfs(Đ„Îä뾢ějţ—p>f˘ o_¬]ž‚Ů”Ë<DĆ4?ˇ1̵L÷úTUĽŔ¤- Îĺ8Ą,LŻ(w\ěĄíđ¤ +ÎPNBäńFńB µčů®c=p®©Ś_«ťţÄx˙ájôI. k›Śń9hć“ż] XG}tŰYat?3a¬UFSťľtQIş0·—„Ţ}ě)3uÔ¤‡Í ËÔÔM?1§ë}Ƈߴ4ăŮú†zNEvn$-tÖöĎ´€˘)íŇDő\ë^ciąWëTělx…Ť›8M5tçp!ÖKČŘWS?«i-oŰ=ü—žăÔTŤąŕ9#Î… €ynÔ´•eȨЅtWײ’ŕHgxRg-<ü•b=—Ęqé´Rőó ŻĐd7ěnˇ“! k¬šÝ2˝~9c˙±ËTEńĽRůá(žU_'Ě˝ŔPÉóUÔsőkŕ¤v”ę2¶n 3A9Ŕ Îr]Á`~¶UĂDŞľđăS­F[*Išzňłl×s':Źe%L)ĚEv†ť}"ę‚˝UńŻľ+űA÷c\ ‰([2<–ŘŮIpA7ŢB#†ý@Q.ˇ‹ĽĺJ¨‰Ýjv Îa¨‚0TôT ţOĹ˙9ýŻĄbS †˙ĆŠ@ŽSöµ˙ĹúĄ+Ž endstream endobj -813 0 obj << +817 0 obj << /Type /Page -/Contents 814 0 R -/Resources 812 0 R +/Contents 818 0 R +/Resources 816 0 R /MediaBox [0 0 595.276 841.89] -/Parent 817 0 R -/Annots [ 807 0 R 816 0 R 808 0 R 809 0 R 810 0 R ] +/Parent 821 0 R +/Annots [ 813 0 R 820 0 R ] >> endobj -807 0 obj << +813 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [457.05 466.557 513.996 477.461] +/Rect [457.05 218.263 513.996 229.167] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5e080429e4eaec068ba64c17152ee805) >> >> endobj -816 0 obj << +820 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [128.635 455.578 256.256 465.506] +/Rect [128.635 207.284 256.256 217.212] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5e080429e4eaec068ba64c17152ee805) >> >> endobj -808 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [246.806 312.84 363.667 323.744] -/A << /S /GoTo /D (structCStreamInfo_aae39329c51fe206a8aee33daba2fe1db) >> +819 0 obj << +/D [817 0 R /XYZ 89 770.89 null] >> endobj -809 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [384.723 312.84 510.679 323.744] -/A << /S /GoTo /D (structCStreamInfo_aa35e5be20f99be29ce12f9f41bf4d50e) >> +746 0 obj << +/D [817 0 R /XYZ 107.713 729.972 null] >> endobj -810 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [314.704 274.924 493.961 285.828] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5e080429e4eaec068ba64c17152ee805) >> +747 0 obj << +/D [817 0 R /XYZ 107.713 714.339 null] >> endobj -815 0 obj << -/D [813 0 R /XYZ 89 770.89 null] +748 0 obj << +/D [817 0 R /XYZ 107.713 698.707 null] +>> endobj +749 0 obj << +/D [817 0 R /XYZ 107.713 671.119 null] +>> endobj +750 0 obj << +/D [817 0 R /XYZ 107.713 643.531 null] +>> endobj +751 0 obj << +/D [817 0 R /XYZ 90 633.122 null] >> endobj 234 0 obj << -/D [813 0 R /XYZ 90 739.935 null] +/D [817 0 R /XYZ 90 618.69 null] >> endobj 476 0 obj << -/D [813 0 R /XYZ 107.713 661.694 null] +/D [817 0 R /XYZ 107.713 534.999 null] >> endobj -753 0 obj << -/D [813 0 R /XYZ 107.713 633.681 null] +752 0 obj << +/D [817 0 R /XYZ 107.713 507.411 null] >> endobj 477 0 obj << -/D [813 0 R /XYZ 107.713 549.645 null] +/D [817 0 R /XYZ 107.713 424.648 null] +>> endobj +753 0 obj << +/D [817 0 R /XYZ 107.713 397.06 null] >> endobj 754 0 obj << -/D [813 0 R /XYZ 107.713 521.633 null] +/D [817 0 R /XYZ 107.713 328.09 null] >> endobj 755 0 obj << -/D [813 0 R /XYZ 107.713 236.059 null] +/D [817 0 R /XYZ 107.713 300.502 null] >> endobj -812 0 obj << -/Font << /F22 292 0 R /F23 293 0 R /F46 801 0 R /F14 446 0 R >> +756 0 obj << +/D [817 0 R /XYZ 107.713 272.914 null] +>> endobj +816 0 obj << +/Font << /F22 292 0 R /F46 807 0 R /F23 293 0 R /F14 446 0 R >> /ProcSet [ /PDF /Text ] >> endobj -821 0 obj << -/Length 2657 +827 0 obj << +/Length 2666 /Filter /FlateDecode >> stream -xÚĄY[sâĆ~÷ŻŕíŞ ÝŃVť ˛MŽ ^Ŕ{ęÔ&EÉŇŞ‰čŻóëO÷ôŚ.ő&ŮJsiµfzľţş{`ý€ nŻ®7WnLsŕëľkşÍnŕłçşcM<ř˘™îđ×ÍĎËňuĂqŕ%1z“¤|82¦Íň¨>ň¬ -«$ĎPô*Ř\ý~e€$Bťăéžĺ ˘ăŐ—_Ů †ńźL·üńŕEH¶iÁ3¬Ż>]±ŢҬÎŇ Ó×]Ëxđô=“V2ţ8Yľ©mI +ň 폡éhaZsęŞá¨. -XgúJÝŚóÇÔÎ35Zĺ{^xA˝—¤:ČńĐfjŃ!Ě2žŇ(ŽöµâY‰{C;VuÁőáȶ,mÍą0 ٢ŘKŁ¬nŻ_„řd2´™6ÝŽ„‘Ů`dşf[{ś>lć‹íňióř´ŮNď&‹Epż–ÉJ¨g ŰÍp+ĐČňŠSˤÇ3Os4ČËĐu4\–ájË,nyějáĐdŇfI>§ňőd'źYY…Y¤FKzFyö cć¶_Zz•:ĘútĘ‹Š:Ç:­’Ö€0’×Ő©®ôFĄŹ™MK´Ě&řŘ›´hŇ€Ť8Žŕ[ËFÇäk’í –©ĺ;z†Ď+uJŽ’ŕϤ\O8Ĺd¨h¨Yśč4{$l‹A°/5bŽ“B•$r~ľ^~Sę¶í»#ëâŮÎp{“˛Ma]xŠŹtĚ'p -ÝçWzV%Yć»ęeh0-,¤?Ň D¤~Ét&Î ĚŃJŽEȶS;…Exäb»/Â.~źű®d*0µţäEN­g„S]‘ňň¦iOú›Ţ€Ę΀Ń9ľé h§\ř-´^’TBíYÚ§äҶ Da×ĘtrËiá,°ôć ĹóGd ěşóXMěÔ1ɇÇŕ–Zk ˇĽÎâć•Zńč;+ Ł(/bř°”pâ ÇjăęLdśJ-ÉipbÓáRS’šă´‚Ă]Ö„9µ[‹“R˛tä–€V’,Ç2§"ŹxY6& 4âvc§µŔ…3íÚăć0…|{˝˝ž/†–ŁM† ĺi5ąßÔżľţÍ@ÜĐ{Xřpc»ťŕ12|Ý6=x:şëČŕN·Óĺb€Ć‡`s·śť©9‹Ažî0CĹÁ6SĐ‚."¦ ?R{Vă†Đ’Çt|#ŤućŮýSdňÍő‰G•´.ň&éEPň…Ež” -6ősY%UMśĄLYr9­¶şXÎ×Acµ7,!őxŻ1Öö’y’ ś˙”§a_{Ç’ •ŕśZ{™ě›vĚÓđµď"y&—µCňůI˙l­óĹ&XýŘ ĎVÓíőrąŢlo€.yĹđ÷¶\˝{ŕ–©ŹÇÍĎ^łđD`×ŐVa¶G~t=mšgU‘§`6Ç/ŚÂ”âHí?G•7 şŁ† 4•—U#¶bÎH¦ńĆRÁNÇvěľżĚd BŰüAzč(×~ű;Đp»*ů6ž#`=Žb zŕ=\JIµ6@UV Žx.4'9'ĺ·ĂÓ)MH…C„Ű]YĚŁ<ľś?lă:Šq›”Ä˝n-öďZAÇS»"?R‹Ńî.ÎłáW4‹{Ą¦°‘|łµ‹Ü™cČXÝô¨ęvuJď]U!ń¦ŮÚ˝»=—¶wö‘µ ÄÍ&X< mIŹ›ůrń·îúő[o€nR tŰv;@÷ŃĄş@}j@ŠYAŽ\‡Ť5`+LgľŰ?óĆz±¸”awÝ„éPRŤŠ]×ölŤFŐ†)˘ŞśD0Ť"ě”ľ"íńüŘѬ‚›`‰mďĎÁý»ćwlݵý·<y¤âh¶ć·aŻ›áS?ÁĐ\&¦ßq(t"ůBÚI|S‘6{]Ţ@tH:ËŃM¨{ÇŇS€™ëÔ#Ëö5t„Q Hŕ4ŤÎń{fUň§HŹADđR{ĹO%5EšSL7ťřš|Í’yŽż VC"G…1Şh0¬ă$—ZeŻ ˘U^r˝,/ )Ą•™žK®íy”[c_ `„˛„áŘ—\äy=.ˇÁ´â"’\ŚyÍ$Ët–B,#-C÷ŹŻ/Qeç0v{ŠĎsÖ^–ÇÚüśŇŐP:“ł*F^6![„ YˇEđc>rL†ľŁ}ţdaŹ«`˝ňzź¨\ĐčĽńÓ÷•§ţ¸ë)ĚDfôaÖd˛ )ęŻĎ×$[Bľ• OH5NUń«ô ŰŐ}Ü·{”O¦w"re"ô[‚…ÜĐ Vę ¬±¨şpXćö>ť9 ű¸¦Ę} šUٸßD—µ˘oVŇŚľB |ç†cXĚéűPýĂçĂâ•şqX…ÔBžĆx©ŕAŕ©h”śőƶ;ZÓQóŐŹlj·tÇšhMyRs­ .ý¶t’5K,áýŞPbö:•± =g™Âw Ů)Č[}˙éźn¶÷Ë!čúď#=‚÷Ł1(ńǶů§:Ś qł$+ʤ-Ś„O©Ě¶fżQët^ŤĽdré»:„…~0RĄĹ“*,DîßIć+ĎŹě•ď—ĽPVI('˛xJ×h˝Öeç+{ŁL W)ŔÚßîů]Ňą6HjÓÖš=r=Q‡­ßűÔ_CŠŮG -»XŰ2QŰľŹ¦»¬ˇB2:†)et¬GĆcm’Ęm´R‚c¨žČđ|x\SŞČđx=ÓĽĘłű÷„„C7Ľ3j”÷©ÝdKŇY©.;ÔÍ·p"oľţąĂmgö÷Ádµ˝F¤>ÝÜ|ÇĺlO·ŕŇÓ”‡¸xĎě"zPů`Ă‚dh K ęR–IQ’Ë7Eť O(ćłRŢ„Bę`^ĚÂşL)̆ň)ćžî~ß°-Ó•U¨®UŰS¤¬VFhŢÁm‹ÍSX–ę:1ÜUměWT×˝'U÷OęP:FČ'$šäuyţ•oFaKâ˙4ĐvLq~ÝçCަ3ŕ±EO7tČw tf«ł¨˝hxóOĂŮ?ŕצ­[NGŹnHM÷óĹÖŹ;ŚĂ>˘Ä H0]΂Ő6X­Đß°`Ŕé0ŚftŰIÍ`_·”^ű‚č@ËYs7YĚî­T.uÓJ{Ŕ5L(ćÍi%O—ţtaS&¦c% @Ľ¤ÎčČÄüë%UÓ!uRbOÓ»‰\›awĄ|ťMÜoáďŇWmÝ·ÁSU ß]ú®1ÖmÇxł…ŢWA™a¸ÝŻ^ř"¶šú´„ţŇÇ Ů憂¦I¨ëé8G÷y(ş„đ­şom.Ą:™Oß<ĺGÁŚgtŇ]ÉAÎčŠOř¦÷#]ŐÓ={Ů{űĆó˛Ŕ\Äěŕĺ="󙞲,“{4,łpěôű‘ -uő(V ě˝uą^sšsďÄć7·ăßłr˙şęÜţŠĎ˙n[şĹĚżűoă˙ŚóxĎ +xÚĄY[oăĆ~ĎŻđŰ‘µ˘»¬}ČEŮu±±sbďâŰÂP¬q,YruéĆýő%‡]%í6OâĚp¨^>’’1zŁŹgW«łó[ËzŕYŢhµĆČ÷LݵĚŃ*}Ó,oüŰęç‘mşéş°IÎŢ&©O,×ĐnňM˝YUIž!ëY¸:űýĚNcdJq®Żű¶;ÚěĎľýfŚb˙ydčv0}—\ű‘cŮđLGËł˙ž˝ŁŮťŁ™V {¶9ňářťdľ;†¶ +/ä1ŤŃÄtt×ôiŃÔÇ“©çh«śÖ±]mł‹˛L¤4(“§,JÓ${±Łýj¸†Ľ˝xâ;<|<Y×ËŞŃ~–mó‹‹Ă5 ZŤ§†v<ŢF'}“âŁ,~Ušd”8Ëâd#Ęx6łąˇ©` +yĂďI +·±_ËňŠGOOŰçqň«aX"-ř®©]Ʊ‰GěŐ‘ŘX%%-´ňHŚŻ´D;=`¨v´Đč*AR—c×ŐľÜĚëÉĐŻ?]Îçáçőę—űđââŤw˝ZĎóP˛ g· G›mÁÝl[«Đ’H˘"Ú‹J8t´?Ćh<­y5)éů +fÜe U•o_·®_Ň ×÷×wë»Ë˙­_V÷_VkľĹňÔî¸ĺ1 ˝j*Ś™GŽťRTDT9?wjîFTs±Aőبü'o ü]˝Ŕ0Î/H˙@"ڢȭŘđřî>üHÔ˛.ŠĽ·%IEŽXBxč˝kžß:^'*'f ;–O_7ü€Îjóܨ¶Ó(źÚ ł@!Í]ôśěë=\"&«÷Źx3¤Árň Żŕ‰ş:ÔŃĘ©A=®çIďÁé4Ç«¨Ë‰é*m«o&ňŰöÉH´ŻőůµAŮ&§p‚ATÇIN¤zóşč_ľ1Ű'ĎgM%wiŇŘlň"žôŞĂű&Ü×ŕMÉ<9î9–G'sGqTEd6ĺŃŘRŢ“¤ŃŁÂë$;u5 BĽČ.ńŇUëRÄ}_Ť6»D ř?Ʀ« Ĺ^5®§®Śt!Ę:­ĘAž0=͸ŔX·´›¤äóÚÖ b„m!¨ëB04¬$ÄMÂÁ®ĽelrČOIVž@PĘŔČś3Ň´¸Ł¨ +éF‰Ť7H%$)uđş&ÜŇšNJng/ Ř“,¸śáű©.dn-‰đ©}^˘Ř`OžńTδ‡Ţĺ9qoň,­ĆoUJ&&iam„íó,ş~Łct#™&†1o(C™ÓŽˇĚ@;b›ű’–"z”ŕE"'Î:éf’-=Iý Ł±L¶ęDq¬N ;öD%íl„”efţ>ŚÍ/ç] ÄŘ©ľ ßkAĂgĐđ»  +4|ż›aAâĚ6gĂI†%ňóÉ«}âl«OůšDݬիmQhŰ– €‚‰IÎČW cĐĐ“ZhŔčG%ňĘ°hźç–n2g–g‘ĄGZ+śN¶$ b·Š˛ŤšŚĹö§HUÖ‡C^°źî‡’6:\u•AăN‘KĄ×ŔěŐ0TÓČśPăup A.tž©Ů*őí¤łÁçĄĂkÚcÁ¬Ŕ}®DVJťâT‹{@ŇR7j`WµËd(iČĚ<›˙mA3ĄBVPB˘,z< +Ψś˛ÓCŁŽM Ż<ő“ě“ŚĎĆ®rTŇłgɡp|·]˙¶ipˇ†˝áŘ´ąŰâôoNĐzľv ýK‘§Xi:…›ľY!×Vâó¦’ůX·DxSyY5lOcĚŔń4ŃX*w1mÝqť~ĽÜpBÝ˙Ž= TčÁ¸} Nhş=ďF;‚cÄq»ŕ Sě“=©ĺ*±NŰAÉĎ^rŤ1Ăâo Úgą5?9ŐÄH ZpBW!n““’¸7¬éó‰©d\Úůž(Öđvqžý ^Ń +îH¤ÔďlőÂ7sMÎĐ-ź·­SÚovEE„›V«÷라ä}n-qµ +ç_ĆĂăj¶˙°Ł{îĘŹĽ}Gw@(;şăxG÷ łutäę:ş%f5r5Ú®ˇ×WJ˝\\rÚ]6i:b¨Q١ÚľŁń÷Jľ0eTU“H¤Q€Ý=}'—±,­yŢgš‡đ6|Ä֟ïáç7Őď:şç/qęH…3@¶ęwŕ®ňŰv·íŽBlˇ1§N †i§đMeŮěwqY0 É,¶«[ÖÉǶž¬äŚNO1±ť@Ă@”ŕ ‚–18~ŻŁ¬Jţ”ĺ1°H\“_˛Äˇ$R–é°dč–_Q¬Ů\—áü÷ô +<%kTkZZ4÷ćť$#·Ń×qŞŁšŞ ođYy2 ›v mhżem-›xAä ľÇU şá4`,ňýS‹`Ya,1Á¤A +NçôMZu(¤EYĽ/F>…—ăŔŐľţUŘÝýC¸\x˝ THt_DŠ*R¬`ÚŤÇBfrŢ~´NŮ}˝"Ţę-ů#†ĹěuĹGŽ ÇÓ`zú1c(°Ľ“…Ç…Đ˙ĺ'^8Č-MbW  aOé‰×ÔöŮ&äVĎRsĐůçµÍAĐdĎhY_ś¤źĺĽgŔ‡e؆ŰSŽˇű‡×GĹ‘†ô)ůç*Ĺ_WŽ‰§˘Y +V”#Ű6Ŕ±“1~±âZÇŞ~âÝÂťŃd$Ů,9ęýµáž%f÷ż:Ş”˝N9´vćľ«ČNCŢĘëúĺé_Ô©­Ű†őŁ?Q˙× ßď endstream endobj -820 0 obj << +826 0 obj << /Type /Page -/Contents 821 0 R -/Resources 819 0 R +/Contents 827 0 R +/Resources 825 0 R /MediaBox [0 0 595.276 841.89] -/Parent 817 0 R -/Annots [ 811 0 R 823 0 R 818 0 R 824 0 R ] +/Parent 821 0 R +/Annots [ 814 0 R 815 0 R 822 0 R 823 0 R 829 0 R 824 0 R 830 0 R ] >> endobj -811 0 obj << +814 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [483.072 726.819 513.996 737.723] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5cec20e1dd4ac89472ad60d3d0c8b5c1) >> +/Rect [246.806 712.302 363.667 723.206] +/A << /S /GoTo /D (structCStreamInfo_aae39329c51fe206a8aee33daba2fe1db) >> >> endobj -823 0 obj << +815 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [128.635 714.864 278.402 725.768] -/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5cec20e1dd4ac89472ad60d3d0c8b5c1) >> +/Rect [384.723 712.302 510.679 723.206] +/A << /S /GoTo /D (structCStreamInfo_aa35e5be20f99be29ce12f9f41bf4d50e) >> >> endobj -818 0 obj << +822 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.704 673.875 493.961 684.779] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5e080429e4eaec068ba64c17152ee805) >> +>> endobj +823 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.428 649.544 513.996 660.448] +/Rect [483.072 474.052 513.996 484.956] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5cec20e1dd4ac89472ad60d3d0c8b5c1) >> +>> endobj +829 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 462.097 278.402 473.001] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5cec20e1dd4ac89472ad60d3d0c8b5c1) >> >> endobj 824 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [128.635 639.646 183.758 648.493] +/Rect [388.428 394.636 513.996 405.54] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5cec20e1dd4ac89472ad60d3d0c8b5c1) >> >> endobj -822 0 obj << -/D [820 0 R /XYZ 89 770.89 null] +830 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [128.635 384.738 183.758 393.585] +/A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5cec20e1dd4ac89472ad60d3d0c8b5c1) >> >> endobj -756 0 obj << -/D [820 0 R /XYZ 107.713 585.529 null] +828 0 obj << +/D [826 0 R /XYZ 89 770.89 null] >> endobj 757 0 obj << -/D [820 0 R /XYZ 107.713 528.468 null] +/D [826 0 R /XYZ 107.713 633.477 null] >> endobj 758 0 obj << -/D [820 0 R /XYZ 107.713 476.951 null] +/D [826 0 R /XYZ 107.713 327.766 null] >> endobj 759 0 obj << -/D [820 0 R /XYZ 107.713 449.345 null] +/D [826 0 R /XYZ 107.713 267.136 null] >> endobj 760 0 obj << -/D [820 0 R /XYZ 107.713 397.828 null] +/D [826 0 R /XYZ 107.713 214.192 null] >> endobj 761 0 obj << -/D [820 0 R /XYZ 107.713 346.311 null] +/D [826 0 R /XYZ 107.713 185.158 null] >> endobj 762 0 obj << -/D [820 0 R /XYZ 107.713 289.25 null] ->> endobj -763 0 obj << -/D [820 0 R /XYZ 107.713 261.644 null] +/D [826 0 R /XYZ 107.713 132.214 null] >> endobj -238 0 obj << -/D [820 0 R /XYZ 90 233.092 null] ->> endobj -765 0 obj << -/D [820 0 R /XYZ 90 208.764 null] ->> endobj -242 0 obj << -/D [820 0 R /XYZ 90 208.764 null] ->> endobj -819 0 obj << -/Font << /F22 292 0 R /F23 293 0 R /F46 801 0 R /F14 446 0 R >> +825 0 obj << +/Font << /F22 292 0 R /F23 293 0 R /F46 807 0 R >> /ProcSet [ /PDF /Text ] >> endobj -827 0 obj << -/Length 1335 +833 0 obj << +/Length 1454 /Filter /FlateDecode >> stream -xÚĺX[wŁ6~÷ŻŕÎ Ş„—G×öîf›[mďS6'c9Ń)†,ŕ\úë;ş@ŤCČn“öô´OşŤFÍ7ß `ëĆÂÖÇŃĎËŃO<ĎŠQxµÜX1¶Â€ ćką¶.íÇő¶“$]ó´Xóň:+ÇÇ6şŐ+DĆuoÎ7ĽtHdó<•SŤí…ÎŐňóh¶}8[DťÂBRfĄŰŃĺ¶Ö0˙ŮÂĆ‘ő ¤¶–ďQh3k1úu„ÍŤńţÍý`ďćBB­ĐąĐÓ׿«Kuzł ¬Ąű{ŕV”đE!ň P¶Ô…±[7+ÇĂönăxĚŢ4"%Oą3÷"żéHßőiŞoyłďŰŽW5_›=y*˛,)źôpťÔF Ďř–ç5:° cµkLp C¸qZ%~çfC×cďhvkZĆó›Úŕ˘ŘĽŻÝśş4Bő-ף2c÷ś×;ŔłójĐü…8†'‹f(ł˛,Ś}äęěĂ#‰Kcäšř@ yŽK0ĆöÉńŮ/‹‹Ůäú“ăRŰă±Ă=ąžÎ&çÓŮüz6ź;Űçs˝ 15515ÎÓ)<Ŕq.j˝ö3,/aŃŃ'(fLúi|6=™]íFąľq7$ŕq|čGW<Ű8ŰG=Ćy…¬Ť„/“OcŁř{R`9† #őcÚsŞěŃF¦‚:@°ŢP‚Úó}ćt˘µůš.¶á‰ÚG€ëĹ1Š„ŹŹ¨kaůř"ɤŢa€D8a«ĹqĐ…ę…|Ś¤L¶BŻ‹Ö"˝µĘŁĂNöĹ/@ŰcŤžÜ&ů:㯍ÖŐ!šďÜF3f[‰z.#ř–ň$Sţ{«3şv[Ľ0-BžQ\_ęd°îşzúkPúWŃíˇ=©ę^bˇë¶rhXn’˙ÓÓŽË`÷÷˛Ąňq—ÍzăźákńOCaH»ń?ĺn’eEšÔ dY“ąŞbW¦Ľęş=Éuűr`‰ĽŞąüűř /¦ďÂôźŕ‡gČÄa¨éyÁ›‘y/Cbč‡é÷%bź &bßď@´Č!Ży7óäAoýŹ$â´Č7—đ:Ah_ő¦_č0Ú“®jíű/ÇgËĺĚGŚ´”¨ëľFźú°ż–a9{ĽËD*ę (“FˇĽ›ňĐ®äzB±Żě´••żKŞJŞrč¦L$(ô`Ľ[‹bqÇS!Ő¦ ô˘ôţx1ŃyHNeGÓ˘.y˛=Ý=¶Ű$Tp&RÉâT)9’źEž´ˇND®˛ …$’€¨Ş†+‘ëD'ű= Báry+*łŰ´˛ľĄÖIěŤ"v>˝}t}݇8Öťyórp!űIú›JáuĄ÷KkÔ‡€®mR7—«+etŐgj») í.ą“BaĐ̨űČÎÉŘ!„ŘËS˝ľ§OďňBöňBKÜ]©‹ËIxG¤{Ç˝¬Ýu™äŐ]QÖíęŇJEŐsöţYúr‘š)vuÇ4Ă0'ç&Y5ů˛aR‹Âda2`n·}–óy7m€)FצIÂmĆ)ŔŞ˛É”ĆZlŞŇĎbň?­?%© Vś‹|ú¬â¤a ś"[ů˛Ý啸Q)Gémbä+:µŞŁWłJŘ6k„şřxI›Şy…ö·;u§PŐ4XŚ(źť03lňJĄ ČÁ‹™ô7ď0ŚŰÔr2ôAß}%°hÖžj^ cŐŹun˙ Üv˙á?©ÎÄŢŹţ’ú6ćż +xÚÝX[s›8~÷ŻŕfÖŞ.Ëľ9¶Ó¦›´®ăÎ>´ŹrÂ,†pŇô×ďlÇI›ÎNg…5źjóG#ÇăöxůáâtyţŢ˙žéÇt^›ŐČ0°ž0ŽÂŔ…Wµ˘ÚĆŃ‹¤(ň˘uż’füs Şŕa˘v"˛ôč¶Č#Y–Iv­çk%R&XĂĐCśűÖ0DH¨5ÉźÎl,ŤÎ$5™Hő,–+ŢŠMZ!˝ńl}›&˛4ΦŻőčr¦n˛ŘX!Š*iú §QI‡pű›ÉrĺE FÂś6÷MĂ»–íI+E%vÝÝ‘¶çg!U4Óܡܾ7Öë‰,¶>¦Ş“ÜR†$D.Uw X)*r—Ëé;‡a{tr>=ŽŚ<̔蠳 lľń °G©qăŐ$)Ĺ•*µ«®§j–Żôóbv©QĎTz}ęŰ#Çwí;%E$i-Cc‡ âŕ +A!÷´yÖäwŐ€Ô”®AÇ}RÝÇIąą˝Í‹ęçøM¦ăĺř|:š/OR?žž>Qr®Ź(0Á§R(ă}ÚE>Ě®’J ]V‡Řk=˝r(¶7+ˇ•4_ŞŞgU¬Téi* Şn|ß^ÜH˝jb¤ăJ¨ŹBŔ¨,×6Ý'©fY‰ZXÚ¶¬…YÍd·[lŢŠ˛”&ĆbŐňFu“ÔԟݩZ‚Ô›}MRD¦Ö>Ń[“|Sîji„ĹI‰"–qťÇšéµ;´Î ‘Ç<rÝ-ß#î ĆŔl›,Ş’<ÓÂ&y´YQ˘^jämóuM]ÄxGŽęµ¤ółw]Îo ć,T(á +%€‘÷“é|9ťĎU˝˝źë×Đk&¦×Ś˛h~˝–•~Ą8ˇÎ´xýôĽ˝›śO—F¸‘­-íw + +ÓiĄLk.ýă€S” źÍNâ!q@gO,żĹ0"^«ôăřÍČŘFÜî®aŇöťĎ3ő;¤ŐEˇŰnĽ­ +Uw‡ô’ąśěąĐÓ +ÂńşZhT#Ö-ů.)!ĺ[A@ÓzS·Ň‡ĚĺĐű‰ŚkAťb´<“ Ţ#(8Q<ěâ[¦r]3ăťt-b†Č džguË,ÄZVŠ »_?Âq<+ć´—cD2ý&€F8+Ť{4¬'7PŘéÓťJÉęQlŤ°cuy~›Í3ŘŢéÍ5%Ö”óĚ(›íą~^Ë'š‚Q®-v·č<°^ÍňšďűjŤI{_ź"™h*lI¸9.Ôú]ČŻYV-˙ Řvň¤]čĺ©)‘#8éÔĘ/p»u-•ŮuÓá÷ňýBżűEĆh!nżĘćĘ +qYyÔýĄ5Ý«Łć·«’Ŕ˝0Pí#ę…ÝnCU·9˒ߡÝ<żG<ÂÖ´ŮÓ®fµnůh·`üHĂ;Ö Ü§: CpÖď*üpIQrŹCt§.¸ą°<«%ř˙§–p żÇú ůqľU¸×]C˝·®$c§Qh+^@™—-BöHîcęv÷˝zř9(ýVÄÇźu§°'qűNĂsă4o®Ű5Ă 9|ý\>cĚC.îóŮÁúď@ţŃ“ ‡“ żS˙9pcŽDŐ@sí*d™oŠ¨ů—ŁI»0W”Ç +ÉŕĆ–EňYü îµŤ-/äö_đĂ2±ŻYŽäç‘iLżS…ˇ0Ôýn÷ĎĽ€!†éŹţ—÷/Ł€ ë endstream endobj -826 0 obj << +832 0 obj << /Type /Page -/Contents 827 0 R -/Resources 825 0 R +/Contents 833 0 R +/Resources 831 0 R /MediaBox [0 0 595.276 841.89] -/Parent 817 0 R +/Parent 821 0 R >> endobj -828 0 obj << -/D [826 0 R /XYZ 89 770.89 null] +834 0 obj << +/D [832 0 R /XYZ 89 770.89 null] +>> endobj +763 0 obj << +/D [832 0 R /XYZ 107.713 729.972 null] >> endobj 764 0 obj << -/D [826 0 R /XYZ 90 665.784 null] +/D [832 0 R /XYZ 107.713 676.332 null] +>> endobj +765 0 obj << +/D [832 0 R /XYZ 107.713 650.093 null] +>> endobj +238 0 obj << +/D [832 0 R /XYZ 90 622.157 null] +>> endobj +767 0 obj << +/D [832 0 R /XYZ 90 597.828 null] +>> endobj +242 0 obj << +/D [832 0 R /XYZ 90 597.828 null] +>> endobj +766 0 obj << +/D [832 0 R /XYZ 90 416.158 null] >> endobj 246 0 obj << -/D [826 0 R /XYZ 90 651.627 null] +/D [832 0 R /XYZ 90 402.333 null] >> endobj 437 0 obj << -/D [826 0 R /XYZ 90 477.186 null] +/D [832 0 R /XYZ 90 234.901 null] >> endobj 250 0 obj << -/D [826 0 R /XYZ 90 463.029 null] +/D [832 0 R /XYZ 90 221.077 null] >> endobj 415 0 obj << -/D [826 0 R /XYZ 90 332.767 null] ->> endobj -254 0 obj << -/D [826 0 R /XYZ 90 318.61 null] +/D [832 0 R /XYZ 90 96.348 null] >> endobj -416 0 obj << -/D [826 0 R /XYZ 90 96.348 null] ->> endobj -825 0 obj << -/Font << /F22 292 0 R /F46 801 0 R /F23 293 0 R /F14 446 0 R >> +831 0 obj << +/Font << /F22 292 0 R /F46 807 0 R /F23 293 0 R /F14 446 0 R >> /ProcSet [ /PDF /Text ] >> endobj -831 0 obj << -/Length 2006 +837 0 obj << +/Length 1924 /Filter /FlateDecode >> stream -xÚ­XIsŰĆľëWŕôV…Č,,©ĘA«íÄOv$:ÇĄ’C±DŃűő鞀ÓV^Nfzz›îŻ»ÁĽ{ŹyŻNÎ'?\ áĄA‰Č[lĽ”yqÄ%¸·X{}‘Ě>-~ö¤L®˛«WYnfsˇQ®Úť)Ýde¤'—‹“Ď'(™Ç-;±TŢjwňńóÖ°ţłÇ™&ŢŁĄÚyˇđ̽ۓ_OŘQŐ|Ć‚”Đ3Pł9gŚůoß\˙rűţňüîől.ĄôOOgJůçw—çď..oî.onf’ůďnp[řZŻ.ĚŞ\›ęŽžW•Ţ:ú;SŚ¬ŽysÎl·B_ź^_Ľ˝ĽsÜs$ţá*ŚĘr!$M;‡Ő&ßĚ8óż'Ň‘]B˛÷ě›ëĹÝűó˙dapwtż3&§Ä˛ •ŃĂb&c?Ű™ Ýč)ŃJ‘ůŞ,ę®5QŤ î Ű“7Žńmö?3Ĺ|.Y„ęŔťťÓRT(®††ęűzĘo!ř-ŮÓ)îäP ÎŁ@HéÍq wş&;[p•V8‚MťÎÔCżúďZw’¬´#·.2Äč+«?śŠHa˙ç̧Lén††ś<·’{oNŚt°¦"ŁnÜĎĐĎz4>Ž$Di©ČN) ě×ôU”´;yGÝ -6 ¤ Vw€šđ]Y™NwĹvFTЉü°ˇ!@řÜvHŔú™ă‹ÝeĘj˘O:’ę†éşÝ-mQĹ‹ÚĐsжŘbNÖâ|R7Ŕˇěđ0~itZ»ň˝uţĆĘN{ÔŔË“q/KcśTŰ˝ěł]ĹÉ8€\ -Č.fBö¬—“é°— Gęâćłõ'"Ĺ -Ž·ę$ŘĚ„ĺ®ó˛“gב…}̴ƉuâŰHx›´@ŁW«˛ZOfITŤľ(ë]Ů®ZX|¦BŤéfŃQőž˘‚‚×÷‚aO˝xŘă˙pÖ Ý¬Ç‡ł^<őË•©Łż\٨™zeš+[nŚ9sˇË”›ű"H†ţ…_°ˇľéěx<2%ß0őH®fŕáŞ3rb$n,úę/Lł ‰Ĺx2zešî_Ą10ęş•:[›‰öjXdľŢÉţËOd ™xéŻüż1Â.¶ +xÚĹXYsŰF~ׯŔÓ.XeNćŔ™Ş<ČŰ‘l-Iď‹ăRA (˘4ŽČÚ_żÝÓ€a&ňŞjźćęéc¦űëžáֽŭ_Ď^oÎ~ş”Ň +YčIĎÚě¬[ľ'+…µŮZźlĚ>oŢYJ…L¸.lŇł—i–ĚćŇĺöE7I^GuZäHz¶Üś}9@É-ˇŮą>ó•kĹgź>sk óď,ÎTXŹšęÁr¤‚6łÖg˙:ă'U“0ô%)á3Đ“9łąŕśŰWoß˙¶ľY.nßĚćĘqíóó™ëÚ‹Ű‹ĺâĂĹru»\­fŠŰV¸ěŘQ_$q±MĘŰE‘˙ÎąĽ_EŹ´őwîr˛ÚgĘłćB°l×Bßśżż¸ZŢî†9˙téx=e…TĚ®9°*Év3ÁíWD:°K +ć»AKůqńćÜ0NŹ +.€Ă„ˇ…Ő„Tě©–&.ňÝ'8Ď·?OÉUă2čQW5ÝéÇ·ď7Ě]‡ą˘s,Éďë}ËŠ}Čdv…!R=˘ąrC8ceÍĄĂ”ńňë!Kă´ÎžŕBuÓ7Ô” MÔ{ÓŮŇŇŕ΢ŞJó{DÔ”ŃL¸ö# ΛmZ¬Iś"۸uZÄŰ?_/´Âz˘(śÖu™D×Í×nş +ş 2Y_k&ŻŕP=‰6ÔQš'[¦9¶™âđ.ÍŁňÉôg’ŰÍn&]{¦ź1ňËÍ>­ĚnÓ–É—&-‰§°w¨)N_ß,ť;ÔŹr#qŐžn°Ĺ O&uEűŃ×@Ľ˘şU®®´ŃŐŔTŹLŤ`·ľýdö‚nFëť«ó™ÂŢ\ÓzŹíLë=őň‚(Ň|~§ÇI8GF˝·;Z¦ë‡‰şŚňęP”u'P+­YT˛ű˛Hą@ĎM=u‹Wf +dýŠââ膄vzR_´ŕs„[Ôµw%#C ¦^tW¸„§†ť¬2sÝE!ŘT ů€2 ¶-ZŽboÎYrI— é“17x×Q=$uRVÝG.C ĎC8’€qWő€l$ąĐĂą€I‡Ű Rş‹UěázłdlÄ@üÜđš 8‚Ú)ů»Ňé đ¦HóZĂďéKÁŰ&ŻŇ{8Š÷‘ˇĹ­RôŞř-!± \C4ôŹďqCtHRşoĂuRśÝp.’î0Ě šś>1H%ˇťő©3S‚qŢĄ–+˘'źÜŢ''B`l˘‹ví©NŞÓľę„ĚĘ8k@J¬’ş)Łňꤷő=Ô”˲lc ýŤM¤¦ąđI¤„3('Ü©rB©“ĺ„’ýr‚ÚK 4ÚúRĺDp̦'Ë ÉT—Ą!“ßŢ,®'ę '`‚űQOÎŐ1‡ÍLůvú\Du4%ÚUĚSr\QřŽ=]P€ +üH^Ćëô?ÉóąâsÜŃ>·lACŁűjęÜ 9–aß«W„đTŁz…®Ü„LŢb>ĂŃţ`+Ć}ń"€-˙Ď€-'ść”".gÇFÜýlš |…é¦mRnxUe»4+Nź™2@ážß}7uˇv!ţ:­ŹĹ@’m[ÍZhn«‰‘•ĺĎ”O$s +8αBđř‡)-ČŠnŢ/–çWT ăÚ/żP+~ĆŇ ]V“(Ăw ëę(”Ą¦d$˘,ĺôe]^}\ż1’€@K‚V˘$.í‹´ŠŁrK“iN—¶ŕTXrǾ̚jOş~"÷¨$˙¨Ú—w>ăm’EOú^Nl—c;¦ÎK©mŔ¦gŕĎĘ<`MŔÖśŔłß’Ö +˘µ¦ĹÔ0Ű‚}Pb¤yS4.ç.€ć*©žňx_9 "‘Aé!đdöć +†ETM•°y'U…%Š‡ď“y3ŠĹAŃř#yX˝Dö&ň°tĺ©<ŚË˝<|i‚XR† t'ÓíLŘSw"YżĐ#^=çx Ż-8)O˝çźąÁżç[ř<ĘÂD|Jž 'äŠÎäNČŔb Dˇ˙‹uĹřoýh‹˛t;e(Ôˇű×? ‚9|”©ŤS„n/Ó…^‹–˙D·¨h˝Ť."h!ľÉ30g`9ôŽo[Z HÇ…]Y9ÂhčŚňŮI1ô ŕ8ž˝ˇíŔ±Éăö×möE®˙Nx~pH1Ż)ŘUďiÖ ôôcÚ¬Đot3ôĆAbS€Bóă± ©Ń‰ľyçŔ\jäć…!Ú5YĆ×…ˇ1K÷etgČ÷Qť Ł?ń€:f†0Ž&-¦óUŇŁŃj@h—4Gź Đ)Đr$ńŽéuMŹ5I?#˙3€[«‚ę˝ţc@®5ÍD† ą«’/ dAšŽőŰW𥠇đD9Eá˙ř„eezż7‘|(Ş´÷ő`ÚŁÁ-޶˙w]5·ö`~źzú¨pČŤWšŤ:żţÝź†ŕ)\ĹÔ­ţ Ö­ţ¨nďÉ÷łÇ.žYş¶ˇţmĺęŽőřG=P j˘ç~¨˙p¦üą endstream endobj -830 0 obj << +836 0 obj << /Type /Page -/Contents 831 0 R -/Resources 829 0 R +/Contents 837 0 R +/Resources 835 0 R /MediaBox [0 0 595.276 841.89] -/Parent 817 0 R +/Parent 821 0 R >> endobj -832 0 obj << -/D [830 0 R /XYZ 89 770.89 null] +838 0 obj << +/D [836 0 R /XYZ 89 770.89 null] +>> endobj +254 0 obj << +/D [836 0 R /XYZ 90 739.935 null] +>> endobj +416 0 obj << +/D [836 0 R /XYZ 90 518.483 null] >> endobj 258 0 obj << -/D [830 0 R /XYZ 90 739.935 null] +/D [836 0 R /XYZ 90 504.007 null] >> endobj 435 0 obj << -/D [830 0 R /XYZ 90 494.849 null] +/D [836 0 R /XYZ 90 259.431 null] >> endobj 262 0 obj << -/D [830 0 R /XYZ 90 478.74 null] ->> endobj -793 0 obj << -/D [830 0 R /XYZ 90 166.593 null] ->> endobj -266 0 obj << -/D [830 0 R /XYZ 90 150.485 null] +/D [836 0 R /XYZ 90 244.954 null] >> endobj -829 0 obj << -/Font << /F22 292 0 R /F46 801 0 R /F14 446 0 R /F23 293 0 R >> +835 0 obj << +/Font << /F22 292 0 R /F46 807 0 R /F14 446 0 R /F23 293 0 R >> /ProcSet [ /PDF /Text ] >> endobj -837 0 obj << -/Length 943 +843 0 obj << +/Length 1450 /Filter /FlateDecode >> stream -xÚĹVMoŰ8˝űWđ(ËQŹ‰c'iŰ먇"- ٦¶”Jrů÷;)Ż¤(ö6X´'’93oć=rzD].ŁÁÇ1cHa°E¤’Ĺ‚Q­Ń#1u=&Ç«µ^Ąkť-vŰĄë?™?ăíN›Ů\otćŇĐŃÉŞüđ:LąßŁOQ4ř1 ŕ• ZyK.Đj?xřNĐľBs˘ż«]{ä3ăÝţ1y3ňPaB|$9ÇDšŕg.…ŔłxŻ ťĺU];Ç~Đ0BC,‰BŚD0c%×»Më,8ćÍ3 -ó „?Őî›8Y×ůH7fĽ¸(ó54 ›EłŘ&y—ÉjŰoĹäYePVnžÇ.Ď´ľ|)t~*dY˸٠z - úĎâ쥮ę&Ĺ'ËüSA»z˙Ź0›ß"@ ţ4ůăÄŽ»]şŠ ˝6ËcyŞU^d‡0Nź†ęL•Ş°rů~˘Úě«6`~X­tžźĺ+mňUőňU9ĂűÂÜÔńţHĐ×D¤.Ő€ľ&bË˝Ä"¨·´éßă¤ňnU@Ąss1ąş-ŕ†Â^Ť†Ó«ŃĽ‡ě…ś2ĹŁ+!ÚWs' ę”ç/@dLľ&Ľ©RůLeŹö˝š_ĐCU„2oN›vö÷Săößdéľ­€řߤ"±ĎĂ?÷†˝ý^|§Apđ+ĄýeĐväUOaű‰†j3ýă óR­ď,—©DŻüľ‹ź’>%ě Wżb>ë¤ęjî3߉ć“űŮt^&;ZD_gŁâű sżCű"‹“ü9ÍŠńľřĐ#`žşš_Ę·éµa(OE’dÓÍ]üb)Ö±'’źÓ %&aGPwăž=ß ý¦ç¤C´fROöS -Kĺ×ÉžjbÖÇíňĺąĂŘĄ]ň#iűJÓć˝·ÝéŔ:§ĺ–ąn“rĚ űŐýpçýO +xÚĹXKsŰ6ľëWđVh&b‚ŕă۲ă4c»˛ÚKšń@dqʇÂG\÷×weR¦•8“¶űüľ]RÔąw¨s19YN~>÷<'văŔ śĺƉ©Ěs–kç# ]6ťy‚)“µJʵŞî˛t5ő)q·xržf +W µQŐ”ED‰Ţ +xÄO?-ßOćËÉç «ÔaĆŠÝ 'É'?Qg űďęň8rŚTîř‡gćÜN~ťPë1í{î=Ď…Ś;ˇ{ˇ‡îŻ¦%íFű(QŐmú·2uš Ľ§Ć\81÷ŤôĚŁś”ýô‰š2AţjTUČ OŇb×6¸ěĚy‚čLA\8YnÓE¤IĐ}›«Â^ÂźTęs›VjmU©D¶µ5n3ŻµĎŇŤgŹxíÁĘ +®B`ÎĚóÝŔťcn,ŇlMAb’N)6e•Ë&- ÜkJýŚH"ł¤ÍdcEíťHÇ®#ŞU3”ßť<Ĺ +€x»!'[Uj(lÚp[ę@ľč›2Íä*łBkŮHëd˝×•&[<5iBť…‰“#ÜĚ ő0ţ Ďš‡­±üáÉAĹĚŢTPYŁŠĽ5öawŮ•uť‚Ď Ĺ şśůäşµ71J™ďŮT2WZůF_Yýi]Ôr6%°Ĺ˛•ˇŕ +ő˛ĚXŢg“>wödBýšŕÁýTçąĐ eŚuú °2”PLđŞĆĎu/4IŤi„öŞ~Ca€"GĐÄ"7¤1¸ąTpĽ:ŻŞ˛ęY+cűĐ$ñ5ó™ëE|?u]á†ÓŁ”’—WżÜŢĚOďŢéÄ +ňö­.âéÝŮüôúlľ¸›/SNÉőŹaRźŮI}ˇšsČę¤Ă®0ÄśÎ`PżnLÎyčň`÷woŻÎ>Ěď¬5k #^Ź»>,-Źj•™Qűf$X l(˘Nň·Ë«% +1ż/®Äa'ŹŐ+ŢÉěΧ᪠ňą]Aa=©Ě +ńA; ©Á›®>÷cľP`ĐßĂ.ˇm¦k»Ý {đ4ečč{Á1‚»q`Qhý¸Ń9•zś€â!_hŹ@z˝âq 0Řçţť,ÖÝ»]Ç/€Đőt4äş‘zşkŮÖŔ e?/ßKî™:Ćť{7ĄÉň°9`ł©R;˛ŚâÄô„/űF2Ö7~`yŹU6Ý Śţ­óşţŤô­IÓ˛{çďu’éę˛0AÚTcFĂÉÝĺŐůő›ŁŢó˝×Đ9-L)ÇĹ_#2‡±ČČB·L%«Ç®Ş›ň"f?ć— ?~YŘg–•‰®˘WóLů6Ä©ŻŽBÇ&Ö0ňż©6@jéf=¬Ű$Quý:ŔĆŁ€ŤÉémSNć{„>G"±Kö‰ó!|ţu"CüŹ1Ö- XřÍsĆŕŐWó¶ëÍ [ňKŔ2űâÂĹŕ±Hú“»ş·ßŢ‹‹‰óŃÔ@§ ŁÂÎo{ÝS•ů=ß<Ă<7ě?źaűa˙ňĽÂřŽÁÁnţ0HěŹ#=Úę/U7jý˝ő:(Ĺáo-w9ő^űSË?ěŠ endstream endobj -836 0 obj << +842 0 obj << /Type /Page -/Contents 837 0 R -/Resources 835 0 R +/Contents 843 0 R +/Resources 841 0 R /MediaBox [0 0 595.276 841.89] -/Parent 817 0 R -/Annots [ 833 0 R 834 0 R ] +/Parent 821 0 R +/Annots [ 839 0 R 840 0 R ] >> endobj -833 0 obj << +839 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [105.88 386.397 159.339 395.244] +/Rect [105.88 190.371 159.339 199.217] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj -834 0 obj << +840 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [200.495 291.427 253.953 320.493] +/Rect [200.495 104.574 253.953 133.64] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj -838 0 obj << -/D [836 0 R /XYZ 89 770.89 null] +844 0 obj << +/D [842 0 R /XYZ 89 770.89 null] >> endobj -794 0 obj << -/D [836 0 R /XYZ 90 635.059 null] +798 0 obj << +/D [842 0 R /XYZ 90 590.315 null] +>> endobj +266 0 obj << +/D [842 0 R /XYZ 90 575.878 null] +>> endobj +799 0 obj << +/D [842 0 R /XYZ 90 411.162 null] >> endobj 270 0 obj << -/D [836 0 R /XYZ 90 614.72 null] +/D [842 0 R /XYZ 90 396.725 null] >> endobj 436 0 obj << -/D [836 0 R /XYZ 90 462.814 null] +/D [842 0 R /XYZ 90 259.733 null] >> endobj 274 0 obj << -/D [836 0 R /XYZ 90 442.476 null] +/D [842 0 R /XYZ 90 245.296 null] >> endobj 414 0 obj << -/D [836 0 R /XYZ 90 278.615 null] ->> endobj -278 0 obj << -/D [836 0 R /XYZ 90 258.276 null] ->> endobj -478 0 obj << -/D [836 0 R /XYZ 90 96.348 null] +/D [842 0 R /XYZ 90 96.348 null] >> endobj -835 0 obj << -/Font << /F22 292 0 R /F46 801 0 R /F23 293 0 R /F14 446 0 R >> +841 0 obj << +/Font << /F22 292 0 R /F46 807 0 R /F23 293 0 R /F14 446 0 R >> /ProcSet [ /PDF /Text ] >> endobj -841 0 obj << -/Length 553 +847 0 obj << +/Length 732 /Filter /FlateDecode >> stream -xÚ•TMo›@˝ó+öR™Ě~{tmÜ$M×ć–FÚ$µdCk“ôďgř4XÔRO«…·óŢĽ7»Č^˛/ÖçČş™ Á Ox,za™ďqĐ‚łhËžl‰ÎstϤ4Ŕµ¦CŐ×ůnź:®ĐhĎňÍŰ!ÍŠ¤ŘĺY µÂČúcqB"ăU9í/5۬§gd[ú~Ϥ Řß -u`JHZ÷lm}·đŞ4A[_Ô"| ťŔąărD´î_×Ëpß:®äž=™8ZŰÓxNgá*W+G˘ý¸Ş'Éf–nňmzŚ×i±t8ÚÉ19Ô? FÇő¤´7yv** ”©8s9CNTn'‹ŮC7T S‰ľ™+Ż'ť Jř­}§t˙R~Şˇ._-˛¦Żś>“ÄKÇWöd5ů6FĹ KęwŮÔŹT€JŽđÜ-˘‘˛ĘIçř{˛KÇÄS&ĽO.ň${ WaĆ(ć -E–šL!ÔüyÖŚÖi—˝¶c¶­ŁŞ7UOiA[2Şˇk§ćBŹ‹Dä‘Ż%ę˘.+ś§ĎU†–࣡ä@-{^0÷›ä¤×9AŮ)´§#˝üJ˛í>˝lb@ď6µ\®\;ÇzŤ_ŇÝĐ]^Ôłîz®‰‹Ľ^¶n§ĹuMĹľŠn ţĄb8#*ŢAź¨Ęő•†€®ŹK×ČŁµŞ¶J‹·cY1;] ˘^ór„ÇcŢ(Łr_ľ_‰âźŻ8mEx +xÚ˝UMs›0˝ó+t„™˘čÁѵq“4µ]Lť4ăˇ6I =>ŕÔ1µVÚ+?,NLwu|â…e\´+•ö„Ă™ąNAŐSĐľSCč÷ÚkmSƱ`­¸óxw_ěó +ŁXI·‰¬Ë7:ŐEV K sŚľő•˘ {n+‡CIŞŻŢS§ßťBa÷uřS´;ö͉ÁL¨űž1qÁ3˘kLB]?M´.ómňĐ<·™k• ůßćd'#ľ‡ąÓvâ=Éź“č”·u.›J ]{ëP}ŢíĽĄSŰ®őľy\ ŁĐOQ´2x EĄoĹ“Ĺ` ˛ ŹQHě2čŘČaęĂ/íÎÎϲT×/'Ń-}ţw9ć„}ô/ţ欲 endstream endobj -840 0 obj << +846 0 obj << /Type /Page -/Contents 841 0 R -/Resources 839 0 R +/Contents 847 0 R +/Resources 845 0 R /MediaBox [0 0 595.276 841.89] -/Parent 817 0 R +/Parent 821 0 R >> endobj -842 0 obj << -/D [840 0 R /XYZ 89 770.89 null] +848 0 obj << +/D [846 0 R /XYZ 89 770.89 null] +>> endobj +278 0 obj << +/D [846 0 R /XYZ 90 739.935 null] +>> endobj +478 0 obj << +/D [846 0 R /XYZ 90 596.203 null] >> endobj 282 0 obj << -/D [840 0 R /XYZ 90 739.935 null] +/D [846 0 R /XYZ 90 581.632 null] >> endobj -839 0 obj << -/Font << /F22 292 0 R /F46 801 0 R /F23 293 0 R >> +845 0 obj << +/Font << /F22 292 0 R /F46 807 0 R /F23 293 0 R >> /ProcSet [ /PDF /Text ] >> endobj -889 0 obj << -/Length 773 +895 0 obj << +/Length 786 /Filter /FlateDecode >> stream -xÚÍIŹÚ0†ďü -©¤YČvtŇqld;Ó˘QeѶ#UŚÄph˙}ť…Š%ť‰Á9 Ęç DxAIźÝ]#j‡ UŐ@›Ś†YŹë~U]Ť)4…y-Ź(mĄĆçoň†•W8GJ©˛Âő®î6fßd QŻ9CY‘ -•X’ŤĂrŽ 2eÝNVÇáIS\ô)ĆRŮ ŁŞbu‘ulOXÍťí€zÝń*¸D<šPĘ…V¨őf6ďžî2ĄĄJλ8;ô 1ú Ëô8÷ +xÚÍ[oÚ0†ďůľL¤‘ĺ ą4‰YŮN7TM+l«4Q‰r±ýű9* +]¦äP>çŃűú;8&řL0™g×™}ŚmŘ®1™N, ľŔţÄ1L×b´d·ŮţÖżŠOŻA*Âř¶ź`왆e•·C¨»¦Ę’A,S$4ĘăĄblŚ-KĹNËŰ×ëÇÍöńyłÝË_OßňPăç‡ęi&°Ŕ>dţ…ÍGŕal{¦fűohÔz5ë1"JHÔ5˙ u˲4ˇŽ%b,˙Ź˛VŮĽ`SëJµ°\ďÔu}XËí~˙Ľ—ŰÝćeŇ ĘËa˝?´Ş‹ŰĐł…7rČm KąřŤüůoţÝQ!3˘Řô´{: Ŕ¤Śţ-JČ˝n9žqÉ­ĄwÝ!MŢAZ@a4‰řŚĺ=+Nć˝2„")tkŞQÉ/{Ó}Sµ­>˝#4˙.$"4›/ä,ĽU§ˇN-oĺĆŹĎ„¤±nRUö|O[uGScÎRlµKxźµř”‡éSS»Çá@p8G‰`*c}âj0Áť§Ó±MĽüQĂÖ•nŐQÓ<Áhż[5Í'A¸*w0z»c.Ž+Ŕv|Ă5'Ŕł}Ă›z-+ĺW€A `Q’©L!Y +„QŠČi<‹nmd÷ŻČVQńb\`ÍtËÔ˛8F¬;°:ą$|IËĆUWZ`r›Šő†‰ŻHx#0§ˇXąSíU "źIwÓ:ž-Ź©1ꞧ•}ż;ă‚÷ąÂőş‘ÎyĆŤSĎ*Ł<żŚ +Ő”K>™+Ç7-ő DDËóiwÎ"&cĘŇă{š ´>őú"á %uvWŤ¨2TV!.2F5®÷(đUu{Lˇ9Lȵ<˘D”•_ľÉV^á *ĄŇ ç»R$¸Úu“AŹz-Š’P¨Ä”l¦Kś9«vÚ°:źĹĄ?ĹX(+aTUĚN22/ĺ «¸łPŰŻü&â)ĐĄ\ô +UŁŢÁâÝÓýJ†4UIŔy•‡$FHj8ţ endstream endobj -888 0 obj << +894 0 obj << /Type /Page -/Contents 889 0 R -/Resources 887 0 R +/Contents 895 0 R +/Resources 893 0 R /MediaBox [0 0 595.276 841.89] -/Parent 891 0 R -/Annots [ 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R ] +/Parent 897 0 R +/Annots [ 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R ] >> endobj -843 0 obj << +849 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 608.529 193.242 618.716] /A << /S /GoTo /D (page.26) >> >> endobj -844 0 obj << +850 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 584.593 193.242 594.78] -/A << /S /GoTo /D (page.24) >> +/A << /S /GoTo /D (page.25) >> >> endobj -845 0 obj << +851 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 560.658 193.242 570.844] -/A << /S /GoTo /D (page.24) >> +/A << /S /GoTo /D (page.25) >> >> endobj -846 0 obj << +852 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 536.722 193.242 546.909] /A << /S /GoTo /D (page.24) >> >> endobj -847 0 obj << +853 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 512.786 193.242 522.973] /A << /S /GoTo /D (page.24) >> >> endobj -848 0 obj << +854 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 488.851 193.242 499.037] /A << /S /GoTo /D (page.24) >> >> endobj -849 0 obj << +855 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 464.915 193.242 475.102] /A << /S /GoTo /D (page.24) >> >> endobj -850 0 obj << +856 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 440.979 193.242 451.166] /A << /S /GoTo /D (page.24) >> >> endobj -851 0 obj << +857 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 417.044 193.242 427.23] /A << /S /GoTo /D (page.24) >> >> endobj -852 0 obj << +858 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 393.108 193.242 403.295] -/A << /S /GoTo /D (page.23) >> +/A << /S /GoTo /D (page.24) >> >> endobj -853 0 obj << +859 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 369.172 193.242 379.359] /A << /S /GoTo /D (page.24) >> >> endobj -854 0 obj << +860 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 345.237 193.242 355.423] -/A << /S /GoTo /D (page.23) >> +/A << /S /GoTo /D (page.24) >> >> endobj -855 0 obj << +861 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 321.301 193.242 331.488] /A << /S /GoTo /D (page.24) >> >> endobj -856 0 obj << +862 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 297.365 193.242 307.552] /A << /S /GoTo /D (page.24) >> >> endobj -857 0 obj << +863 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 273.43 193.242 283.616] /A << /S /GoTo /D (page.23) >> >> endobj -858 0 obj << +864 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 249.494 193.242 259.681] /A << /S /GoTo /D (page.23) >> >> endobj -859 0 obj << +865 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 225.558 193.242 235.745] /A << /S /GoTo /D (page.23) >> >> endobj -860 0 obj << +866 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 201.623 193.242 211.809] /A << /S /GoTo /D (page.24) >> >> endobj -861 0 obj << +867 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 177.687 193.242 187.874] /A << /S /GoTo /D (page.24) >> >> endobj -862 0 obj << +868 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 153.751 193.242 163.938] /A << /S /GoTo /D (page.24) >> >> endobj -863 0 obj << +869 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 129.816 193.242 140.002] -/A << /S /GoTo /D (page.23) >> +/A << /S /GoTo /D (page.24) >> >> endobj -864 0 obj << +870 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 105.88 193.242 116.067] /A << /S /GoTo /D (page.23) >> >> endobj -865 0 obj << +871 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 620.497 409.724 630.684] /A << /S /GoTo /D (page.24) >> >> endobj -866 0 obj << +872 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 596.559 409.724 606.746] -/A << /S /GoTo /D (page.24) >> +/A << /S /GoTo /D (page.25) >> >> endobj -867 0 obj << +873 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 572.622 409.724 582.809] -/A << /S /GoTo /D (page.24) >> +/A << /S /GoTo /D (page.25) >> >> endobj -868 0 obj << +874 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 548.684 409.724 558.871] /A << /S /GoTo /D (page.24) >> >> endobj -869 0 obj << +875 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 524.747 409.724 534.934] /A << /S /GoTo /D (page.23) >> >> endobj -870 0 obj << +876 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 500.809 409.724 510.996] /A << /S /GoTo /D (page.23) >> >> endobj -871 0 obj << +877 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 476.872 409.724 487.058] /A << /S /GoTo /D (page.24) >> >> endobj -872 0 obj << +878 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 452.934 409.724 463.121] /A << /S /GoTo /D (page.24) >> >> endobj -873 0 obj << +879 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 417.042 409.724 427.228] /A << /S /GoTo /D (page.24) >> >> endobj -874 0 obj << +880 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 393.104 409.724 403.291] /A << /S /GoTo /D (page.24) >> >> endobj -875 0 obj << +881 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 369.167 409.724 379.353] /A << /S /GoTo /D (page.24) >> >> endobj -876 0 obj << +882 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 333.274 409.724 343.461] /A << /S /GoTo /D (page.24) >> >> endobj -877 0 obj << +883 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 309.336 409.724 319.523] /A << /S /GoTo /D (page.24) >> >> endobj -878 0 obj << +884 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 273.444 409.724 283.63] /A << /S /GoTo /D (page.24) >> >> endobj -879 0 obj << +885 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 249.506 409.724 259.693] /A << /S /GoTo /D (page.24) >> >> endobj -880 0 obj << +886 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 225.569 409.724 235.755] /A << /S /GoTo /D (page.24) >> >> endobj -881 0 obj << +887 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 201.631 409.724 211.818] /A << /S /GoTo /D (page.24) >> >> endobj -882 0 obj << +888 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 177.694 409.724 187.88] /A << /S /GoTo /D (page.24) >> >> endobj -883 0 obj << +889 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 153.756 409.724 163.943] /A << /S /GoTo /D (page.24) >> >> endobj -884 0 obj << +890 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 129.819 409.724 140.005] /A << /S /GoTo /D (page.26) >> >> endobj -885 0 obj << +891 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 105.881 409.724 116.068] /A << /S /GoTo /D (page.26) >> >> endobj -890 0 obj << -/D [888 0 R /XYZ 89 770.89 null] +896 0 obj << +/D [894 0 R /XYZ 89 770.89 null] >> endobj -887 0 obj << +893 0 obj << /Font << /F22 292 0 R /F23 293 0 R >> /ProcSet [ /PDF /Text ] >> endobj -966 0 obj << -/Length 1122 +973 0 obj << +/Length 1131 /Filter /FlateDecode >> stream -xÚÍZ[sŁ6~÷ŻĐ#ĚÔT€ÁöŁ ÂfWVi2éŽĆMÜ43Ygęxf§˙ľâ’Ćř’@,Ű}Ö9źľs“t Á€`ڛޯ‘〱5ö?Á‚ˇo[žcqn ×1ż‹/ŔCk m5©|Ó_zXôţîď!°ËÉŢĐş¸űŃ»ýÁ˝z˙@ËŹŔĎňW?ŔŔqŐřxď[6€¸@l¨ž 5ťJď|~wż¸{ľ_¬äÓăćÖ_ż”8*«‡ ›öŔmßń ářő÷JčŰ•Üľm[cĎ«ä"TČ -dČÉp„¦–_aR.ßíXü&–$ĂS.15]Ď@‚Ďd‹”,HdĎČ`†(ĹD¦ąČr!űµwX#ĎnÎNŇ°‚\ÉöŹÇěuÄś ëW5jľËˇF<1ýĎůibQteYL§˙H1ŚL[ůţ/f¶oI$IZDŕoY5`v±8Y(^ś64ň(ş F…8“±âEĘ´ZÉmŹ¤b…Íb.´’át„ŞšČů ř;"’óŮ%9P«×!;şAfŽ1”h1ha…}r‚x ˇÚed‚Ĺ, ;'<–Q5–Ű´mŰćŘ5Đ[ v\/ÜaPŞĄĘůRŤóő\.V«ç•\,ďO"÷e=_­Ź“ĽIM vxÇá7Wv×MCCŞfŞÔ-#(X·[<.׺ąŘŮŠ ·51˝*7ġ,I™¤é×ăüâ |µŃ - >x>aE>‰â©>?ˇ‡RöČHŐ±Wy„™>4„F%iń,ÔI'ͧ39‰×GŃǶt[ŰRmNe©dť¨˝Žď7ú`Öu‹k‹ĆMáĚA㊧ͱx+ş22‡ĹDOÔżüŁ*AëLŇ${{Ží[‘|×µ|gpP“ćü"(W‘B]5§!» ĚTÜčMYňű7ŕÓŹkĐm˙˙ž BJ o“şö í®™!Ęł´JF'a·ˇ€ßĐ6ńłwinÇĄĺô+­›Tź#ć”çŮërTVG¦çUćŐ— ¶•>ťđţÁóf}Łń©jŘÂ:M8ű@ŹwßŃĘމö(eI˝ó?őę_ LyśŇş>¨Ľ Jfu™‚ÂSăú<÷ě ŢdžϮŹ†.¬CWéťĎźž<=/ä·—?ÍmX˙VáP_k$lÚC}×· 7¨żWŠPßQrűŽcŤ}_ÉĹx)+” %#1a„†D¦ä–¤Őö÷˝ŁK°‰%+Č”KBMĎ7đ$%Z [R„™ŚĘĺgśĘp†)%©ĚKQ”Bökď°Fľłův–G +˛’śŹŮo‰9M˛D&±é8Ž!„9ö őőŤI¶‡Đŕňŕ:˛ďGá0’ĚĐsA<ľ[ąXíq\«ą‚¶xzĎůŮÄtEB§˙H ?'2đë[]-Ę>g±LóetýQ¨…°Ë%ó-0˘H(Cŕ…ɉéŘFÇšá [Ôé˛cËą^$^sb+l–pˇ‚ŰBő§—ě@Ó’Ď®iÜ«şAaŽ]3ś].‹ÉDA¬B¨v™1ËŁ–ąÂ>Đ~ ÂZ5[Şm©ş–÷@mą_{‡A [•óWXçosůĽXüXČçקNäţ|›/ŢNI4¦&„îĽ1Ä›€•Ý›Ó0hDÆTÍ$¨Ô-cr6[¸_^_Ţts±&ó&v $¬ŰŞÉŔiÉŠ”IžßčczC>4ZQJ:Î'l™OâdŞO%$’ÂtFF]=Wy„™mŤJňĺg§ĽśÎä$Ľ]UŘ^‘ëÖ`ä˘Ŕó¬ŔěŞT Xg)NčŮëgkeG˘=ÎYVwţ]ďţ°Čť ”'9­+ä(Žę2G]ăú8-á{ĆZÍzŹÚč:ćVÝőö{SG> endobj -886 0 obj << +892 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 727.536 193.242 737.723] /A << /S /GoTo /D (page.26) >> >> endobj -892 0 obj << +898 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 703.626 193.242 713.812] /A << /S /GoTo /D (page.26) >> >> endobj -893 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 679.715 193.242 689.902] -/A << /S /GoTo /D (page.26) >> ->> endobj -894 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 643.85 193.242 654.037] -/A << /S /GoTo /D (page.25) >> ->> endobj -895 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 619.94 193.242 630.126] -/A << /S /GoTo /D (page.25) >> ->> endobj -896 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 596.029 193.242 606.216] -/A << /S /GoTo /D (page.25) >> ->> endobj -897 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 572.119 193.242 582.306] -/A << /S /GoTo /D (page.25) >> ->> endobj -898 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 548.209 193.242 558.395] -/A << /S /GoTo /D (page.25) >> ->> endobj 899 0 obj << /Type /Annot /Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 524.298 193.242 534.485] -/A << /S /GoTo /D (page.26) >> +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.287 679.715 193.242 689.902] +/A << /S /GoTo /D (page.27) >> >> endobj 900 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 500.388 193.242 510.575] -/A << /S /GoTo /D (page.26) >> +/Rect [181.287 643.85 193.242 654.037] +/A << /S /GoTo /D (page.25) >> >> endobj 901 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 476.478 193.242 486.664] -/A << /S /GoTo /D (page.23) >> +/Rect [181.287 619.94 193.242 630.126] +/A << /S /GoTo /D (page.25) >> >> endobj 902 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 452.567 193.242 462.754] -/A << /S /GoTo /D (page.22) >> +/Rect [181.287 596.029 193.242 606.216] +/A << /S /GoTo /D (page.25) >> >> endobj 903 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 428.657 193.242 438.844] -/A << /S /GoTo /D (page.22) >> +/Rect [181.287 572.119 193.242 582.306] +/A << /S /GoTo /D (page.25) >> >> endobj 904 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 404.747 193.242 414.933] -/A << /S /GoTo /D (page.22) >> +/Rect [181.287 548.209 193.242 558.395] +/A << /S /GoTo /D (page.26) >> >> endobj 905 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 380.836 193.242 391.023] -/A << /S /GoTo /D (page.23) >> +/Rect [181.287 524.298 193.242 534.485] +/A << /S /GoTo /D (page.25) >> >> endobj 906 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 356.926 193.242 367.113] -/A << /S /GoTo /D (page.24) >> +/Rect [181.287 500.388 193.242 510.575] +/A << /S /GoTo /D (page.25) >> >> endobj 907 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [234.159 333.016 246.114 343.202] -/A << /S /GoTo /D (page.26) >> +/Rect [181.287 476.478 193.242 486.664] +/A << /S /GoTo /D (page.25) >> >> endobj 908 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [253.476 321.06 265.432 331.247] -/A << /S /GoTo /D (page.24) >> +/Rect [181.287 452.567 193.242 462.754] +/A << /S /GoTo /D (page.26) >> >> endobj 909 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [230.084 309.105 242.039 319.292] -/A << /S /GoTo /D (page.24) >> +/Rect [181.287 428.657 193.242 438.844] +/A << /S /GoTo /D (page.27) >> >> endobj 910 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [232.853 297.15 244.808 307.337] -/A << /S /GoTo /D (page.24) >> +/Rect [181.287 404.747 193.242 414.933] +/A << /S /GoTo /D (page.23) >> >> endobj 911 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [222.164 285.195 234.119 295.382] -/A << /S /GoTo /D (page.24) >> +/Rect [181.287 380.836 193.242 391.023] +/A << /S /GoTo /D (page.22) >> >> endobj 912 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [222.891 273.24 234.846 283.426] -/A << /S /GoTo /D (page.24) >> +/Rect [181.287 356.926 193.242 367.113] +/A << /S /GoTo /D (page.22) >> >> endobj 913 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [225.66 261.285 237.615 271.471] -/A << /S /GoTo /D (page.24) >> +/Rect [181.287 333.016 193.242 343.202] +/A << /S /GoTo /D (page.23) >> >> endobj 914 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [281.929 249.329 293.885 259.516] -/A << /S /GoTo /D (page.24) >> +/Rect [181.287 309.105 193.242 319.292] +/A << /S /GoTo /D (page.23) >> >> endobj 915 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [207.967 237.374 219.922 247.561] -/A << /S /GoTo /D (page.24) >> +/Rect [181.287 285.195 193.242 295.382] +/A << /S /GoTo /D (page.25) >> >> endobj 916 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [210.736 225.419 222.691 235.606] -/A << /S /GoTo /D (page.23) >> +/Rect [234.159 261.285 246.114 271.471] +/A << /S /GoTo /D (page.26) >> >> endobj 917 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [269.885 213.464 281.84 223.651] -/A << /S /GoTo /D (page.24) >> +/Rect [253.476 249.329 265.432 259.516] +/A << /S /GoTo /D (page.25) >> >> endobj 918 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [250.508 201.509 262.463 211.695] -/A << /S /GoTo /D (page.23) >> +/Rect [230.084 237.374 242.039 247.561] +/A << /S /GoTo /D (page.25) >> >> endobj 919 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [270.452 189.554 282.408 199.74] +/Rect [232.853 225.419 244.808 235.606] /A << /S /GoTo /D (page.24) >> >> endobj 920 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [256.814 177.598 268.769 187.785] +/Rect [222.164 213.464 234.119 223.651] /A << /S /GoTo /D (page.24) >> >> endobj 921 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [258.109 165.643 270.064 175.83] -/A << /S /GoTo /D (page.23) >> +/Rect [222.891 201.509 234.846 211.695] +/A << /S /GoTo /D (page.24) >> >> endobj 922 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [178.817 153.688 190.772 163.875] -/A << /S /GoTo /D (page.23) >> +/Rect [225.66 189.554 237.615 199.74] +/A << /S /GoTo /D (page.24) >> >> endobj 923 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [251.783 141.733 263.738 151.92] -/A << /S /GoTo /D (page.23) >> +/Rect [281.929 177.598 293.885 187.785] +/A << /S /GoTo /D (page.24) >> >> endobj 924 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [232.316 129.778 244.271 139.964] +/Rect [207.967 165.643 219.922 175.83] /A << /S /GoTo /D (page.24) >> >> endobj 925 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [228.002 117.823 239.957 128.009] +/Rect [210.736 153.688 222.691 163.875] /A << /S /GoTo /D (page.24) >> >> endobj 926 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [248.017 105.867 259.972 116.054] +/Rect [269.885 141.733 281.84 151.92] /A << /S /GoTo /D (page.24) >> >> endobj 927 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [212.938 93.195 224.893 104.099] -/A << /S /GoTo /D (page.23) >> +/Rect [250.508 129.778 262.463 139.964] +/A << /S /GoTo /D (page.24) >> >> endobj 928 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [432.189 726.819 444.144 737.723] -/A << /S /GoTo /D (page.23) >> +/Rect [270.452 117.823 282.408 128.009] +/A << /S /GoTo /D (page.24) >> >> endobj 929 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [469.629 715.581 481.584 725.768] +/Rect [256.814 105.867 268.769 116.054] /A << /S /GoTo /D (page.24) >> >> endobj 930 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [402.342 691.671 414.297 701.857] -/A << /S /GoTo /D (page.24) >> +/Rect [258.109 93.912 270.064 104.099] +/A << /S /GoTo /D (page.23) >> >> endobj 931 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [345.336 669.2 357.291 677.947] -/A << /S /GoTo /D (page.24) >> +/Rect [395.298 727.536 407.253 737.723] +/A << /S /GoTo /D (page.23) >> >> endobj 932 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [476.234 655.805 488.189 665.992] -/A << /S /GoTo /D (page.24) >> +/Rect [468.264 715.581 480.219 725.768] +/A << /S /GoTo /D (page.23) >> >> endobj 933 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [345.336 633.235 357.291 642.081] -/A << /S /GoTo /D (page.23) >> +/Rect [448.797 703.626 460.752 713.812] +/A << /S /GoTo /D (page.24) >> >> endobj 934 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [433.126 619.94 445.081 630.126] -/A << /S /GoTo /D (page.23) >> +/Rect [444.483 691.671 456.438 701.857] +/A << /S /GoTo /D (page.24) >> >> endobj 935 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [476.224 607.984 488.179 618.171] +/Rect [464.498 679.715 476.453 689.902] /A << /S /GoTo /D (page.24) >> >> endobj 936 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [476.075 596.029 488.03 606.216] +/Rect [429.42 667.043 441.375 677.947] /A << /S /GoTo /D (page.24) >> >> endobj 937 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [434.989 572.119 446.944 582.306] -/A << /S /GoTo /D (page.24) >> +/Rect [432.189 655.088 444.144 665.992] +/A << /S /GoTo /D (page.23) >> >> endobj 938 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [345.336 549.648 357.291 558.395] +/Rect [469.629 643.85 481.584 654.037] /A << /S /GoTo /D (page.24) >> >> endobj 939 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [390.725 524.298 402.68 534.485] -/A << /S /GoTo /D (page.24) >> +/Rect [402.342 619.94 414.297 630.126] +/A << /S /GoTo /D (page.25) >> >> endobj 940 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [456.468 500.388 468.424 510.575] -/A << /S /GoTo /D (page.24) >> +/Rect [345.336 597.369 357.291 606.216] +/A << /S /GoTo /D (page.25) >> >> endobj 941 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [497.106 488.433 509.061 498.619] +/Rect [476.234 584.074 488.189 594.261] /A << /S /GoTo /D (page.24) >> >> endobj 942 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [427.179 464.522 439.134 474.709] -/A << /S /GoTo /D (page.24) >> +/Rect [345.336 561.504 357.291 570.35] +/A << /S /GoTo /D (page.23) >> >> endobj 943 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [474.411 452.567 486.366 462.754] -/A << /S /GoTo /D (page.24) >> +/Rect [433.126 548.209 445.081 558.395] +/A << /S /GoTo /D (page.23) >> >> endobj 944 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [413.101 428.657 425.056 438.844] +/Rect [476.224 536.253 488.179 546.44] /A << /S /GoTo /D (page.24) >> >> endobj 945 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [409.534 404.747 421.49 414.933] +/Rect [476.075 524.298 488.03 534.485] /A << /S /GoTo /D (page.24) >> >> endobj 946 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [426.142 380.836 438.097 391.023] +/Rect [434.989 500.388 446.944 510.575] /A << /S /GoTo /D (page.24) >> >> endobj 947 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [475.726 368.881 487.681 379.068] +/Rect [345.336 477.917 357.291 486.664] /A << /S /GoTo /D (page.24) >> >> endobj 948 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [492.653 356.926 504.608 367.113] -/A << /S /GoTo /D (page.26) >> +/Rect [390.725 452.567 402.68 462.754] +/A << /S /GoTo /D (page.24) >> >> endobj 949 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [457.096 344.971 469.051 355.157] -/A << /S /GoTo /D (page.26) >> +/Rect [456.468 428.657 468.424 438.844] +/A << /S /GoTo /D (page.24) >> >> endobj 950 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [489.713 333.016 501.668 343.202] -/A << /S /GoTo /D (page.26) >> +/Rect [497.106 416.702 509.061 426.888] +/A << /S /GoTo /D (page.24) >> >> endobj 951 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [475.009 321.06 486.964 331.247] -/A << /S /GoTo /D (page.26) >> +/Rect [427.179 392.791 439.134 402.978] +/A << /S /GoTo /D (page.24) >> >> endobj 952 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [433.146 309.105 445.101 319.292] -/A << /S /GoTo /D (page.26) >> +/Rect [474.411 380.836 486.366 391.023] +/A << /S /GoTo /D (page.24) >> >> endobj 953 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [379.647 285.195 391.602 295.382] -/A << /S /GoTo /D (page.25) >> +/Rect [413.101 356.926 425.056 367.113] +/A << /S /GoTo /D (page.24) >> >> endobj 954 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [345.336 262.625 357.291 271.471] -/A << /S /GoTo /D (page.25) >> +/Rect [409.534 333.016 421.49 343.202] +/A << /S /GoTo /D (page.24) >> >> endobj 955 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [345.336 238.714 357.291 247.561] -/A << /S /GoTo /D (page.25) >> +/Rect [426.142 309.105 438.097 319.292] +/A << /S /GoTo /D (page.24) >> >> endobj 956 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [395.148 213.464 407.104 223.651] -/A << /S /GoTo /D (page.25) >> +/Rect [475.726 297.15 487.681 307.337] +/A << /S /GoTo /D (page.24) >> >> endobj 957 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.127 201.509 506.082 211.695] -/A << /S /GoTo /D (page.25) >> +/Rect [492.653 285.195 504.608 295.382] +/A << /S /GoTo /D (page.26) >> >> endobj 958 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [439.432 189.21 451.387 199.74] +/Rect [457.096 273.24 469.051 283.426] /A << /S /GoTo /D (page.26) >> >> endobj 959 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [467.726 177.598 479.681 187.785] +/Rect [489.713 261.285 501.668 271.471] /A << /S /GoTo /D (page.26) >> >> endobj 960 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.768 153.688 409.724 163.875] +/Rect [475.009 249.329 486.964 259.516] /A << /S /GoTo /D (page.26) >> >> endobj 961 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.768 129.778 409.724 139.964] +/Rect [433.146 237.374 445.101 247.561] /A << /S /GoTo /D (page.27) >> >> endobj 962 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.768 105.867 409.724 116.054] -/A << /S /GoTo /D (page.27) >> +/Rect [379.647 213.464 391.602 223.651] +/A << /S /GoTo /D (page.25) >> >> endobj -967 0 obj << -/D [965 0 R /XYZ 89 770.89 null] +963 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.705 201.509 506.66 211.695] +/A << /S /GoTo /D (page.25) >> >> endobj 964 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [466.351 189.554 478.306 199.74] +/A << /S /GoTo /D (page.25) >> +>> endobj +965 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.376 177.598 506.331 187.785] +/A << /S /GoTo /D (page.25) >> +>> endobj +966 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 155.028 357.291 163.875] +/A << /S /GoTo /D (page.26) >> +>> endobj +967 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.336 131.118 357.291 139.964] +/A << /S /GoTo /D (page.25) >> +>> endobj +968 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [395.148 105.867 407.104 116.054] +/A << /S /GoTo /D (page.25) >> +>> endobj +969 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.127 93.912 506.082 104.099] +/A << /S /GoTo /D (page.25) >> +>> endobj +974 0 obj << +/D [972 0 R /XYZ 89 770.89 null] +>> endobj +971 0 obj << /Font << /F22 292 0 R /F23 293 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1043 0 obj << -/Length 861 +1051 0 obj << +/Length 883 /Filter /FlateDecode >> stream -xÚĹ™Ńr˘0†ďyŠ\ęĚ– ‰€^RÔ–Ž«.ŕÎÎt;ĹÔ2ŕ -;ÝîÓo@ZQPŔ ^ĹAýţ˙$'ç$ -Á@pÇÝšÜ×!B Ç÷$$óô %‘ĚxliăţŕgűÉ|óËô{ńGOąÉýćú!ţ˛(ó2˝âź XĐçň¸×oń§V 0]`pß9¸g§ŚľF"e´µ,{AlA6s×ynw`‹ýűŘŘ,'úo[HNŢß -aË˝áŽŰO¸Űq¸±V${ďă¸1CÇukŐďVÓż#ápCČí{H‚+ű9Ďš÷âg]0$Eď” śçÂ7ÄZ]ËHU®pŔÍł«(Jť÷ę¤?Đç]ŹLô"Ďxź ÷Ý&XJť«#ý^3Ě"Ęçˇ,o2Vʨ6Ţp43îϤeŁŐĆćąS—µ6m÷PKŃ•oEÄÎI{©V<»o…Mĺ"¤tŇd©yNX±ügŞ®3iŮ UßűEU–şŐÄÖ[m.S]˘6ŻQÉŻX=a©ú}&ź(ĆËÚIź»ĘZu˛&Ţ™°lÔ §QöXtµŮŢ+ăţh0ßmó¨î˛U[ÍHę7sůFź@m¬™uuŠ›ĚĚéĚś˙h Xl)#­_‘XtDűš‡t~\ĂÇřĎJ}µ<Ź¸ÁQyµô&¤rކµZ»D·BrqQt LÉćô˝ne?Ľ¤BĽ,&RĎN?§—‘ł·‰óŃ&›šĐ -8ńÄA6wTôŹ$Y´ -ŐP‡#@‚ÄwşHóęËâó cá37ŮIƱAň FÖ5q˘Şü7TXg(áÄËćxKö٢±ak°A^˘Ü1śŚ^Ľ?«[kˇŘ6 ‚=Čş’KŕĘ;‹Aewt!häaťší.lůˇĺ^ZĂä­“©ÓĽ…c׋ ľŻ #măG[ŰeÄĄ‹tîomGb÷°âě: ´/ČÚĄcµ©aĹt»¤tzz“z×T¤ź•±©řrďuGĹĎą -ŕ.r®‚ŤxHs3·Çk8Č\8_ŠLS­#ĺѧÚo’ŮëçĹ%ZzĘyÍ˙ňG1 -Ś‡ěu1Źé%©â˙z˙Ęyąř +xÚĹ™]s˘0†ďůąÔ™-’z‰Š-Şpwgş†bj™Ap…N·űë7µ~ń¦é >çÍÉÉ{’‚)€ŕ†ëXÜ÷>B Í·%$ë´!%‘¬ xlhžú«ůdÝkóËô{Ë0NžrŞĹýáúaůeQće,wĆ=>A0ˇĎďäq»Ţ—oÍŔ5ÂtôÉ=ppC^"@ú?Śč(Ł4¨˘4ŻaŁk?Ü÷m}ŘÄbăç(TăŰRO*d1Í7xĽB"l )ű< H˙\ ßĹM˛5ę©]»««ŠawšlŚűý|¶ĽÉľRíÇí7ś…­nωť/3»ń¶´z{’˝í{ω6ţő<*´ŔŰ#C¬MF×#rQađB45ś¦ 6Ţ/ą$éŘ_83¶i•“Ń÷|˙’ńéĆč/é|Ä$bşíŇ:tďY ^B¦Ů(ŻÂŚÄ™]JHY®°ĹÝ·zź~KÝvŘS [5ŚäÁ0×jqO=ܸŐL+Ź‡ +󆮪čĚx}}lŢ2›­6°NMť´5ۨˇĘ}Q<*ooÇ+é°HűbĆ\ö"v´ÍĆÂŚ»Ö%J/ܱĐuË?vÜżKz,`Ć,‘_ÎĘŚ:ś“€Ě$ń(©‡®vĂŁ‹}« zşjmóÄw«ůŹffţÍĘľ)PhCÜplŤĆ–ýŁ)Đ[‚˘k˝’ÄĽćś,v}=Y:Z,ulÓˇ< ŢfÝW' ß-ĽÉ©XTÓ™Í}b819x<> endobj -963 0 obj << +970 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 727.536 193.242 737.723] +/Rect [222.951 727.192 234.906 737.723] +/A << /S /GoTo /D (page.26) >> +>> endobj +975 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.245 715.581 263.2 725.768] /A << /S /GoTo /D (page.27) >> >> endobj -968 0 obj << +976 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 703.531 193.242 713.718] +/Rect [181.287 691.671 193.242 701.857] /A << /S /GoTo /D (page.27) >> >> endobj -969 0 obj << +977 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.287 667.76 193.242 677.947] +/A << /S /GoTo /D (page.27) >> +>> endobj +978 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.287 643.85 193.242 654.037] +/A << /S /GoTo /D (page.27) >> +>> endobj +979 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.287 619.94 193.242 630.126] +/A << /S /GoTo /D (page.27) >> +>> endobj +980 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 679.526 193.242 689.713] +/Rect [181.287 596.029 193.242 606.216] /A << /S /GoTo /D (page.28) >> >> endobj -970 0 obj << +981 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 655.522 193.242 665.708] +/Rect [181.287 572.119 193.242 582.306] /A << /S /GoTo /D (page.28) >> >> endobj -971 0 obj << +982 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 631.517 193.242 641.703] +/Rect [181.287 548.209 193.242 558.395] /A << /S /GoTo /D (page.29) >> >> endobj -972 0 obj << +983 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 607.512 193.242 617.699] +/Rect [181.287 524.298 193.242 534.485] /A << /S /GoTo /D (page.29) >> >> endobj -973 0 obj << +984 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [161.362 595.51 173.317 605.696] -/A << /S /GoTo /D (page.19) >> +/Rect [181.287 500.388 193.242 510.575] +/A << /S /GoTo /D (page.29) >> >> endobj -974 0 obj << +985 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [224.366 583.507 236.321 593.694] -/A << /S /GoTo /D (page.23) >> +/Rect [161.362 488.433 173.317 498.619] +/A << /S /GoTo /D (page.19) >> >> endobj -975 0 obj << +986 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [200.963 571.505 212.919 581.691] -/A << /S /GoTo /D (page.22) >> +/Rect [224.366 476.478 236.321 486.664] +/A << /S /GoTo /D (page.23) >> >> endobj -976 0 obj << +987 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [206.493 559.502 218.448 569.689] +/Rect [200.963 464.522 212.919 474.709] /A << /S /GoTo /D (page.22) >> >> endobj -977 0 obj << +988 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [191.001 547.5 202.956 557.686] +/Rect [206.493 452.567 218.448 462.754] /A << /S /GoTo /D (page.22) >> >> endobj -978 0 obj << +989 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [182.692 535.497 194.647 545.684] +/Rect [191.001 440.612 202.956 450.799] /A << /S /GoTo /D (page.23) >> >> endobj -979 0 obj << +990 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [193.96 523.495 205.915 533.682] -/A << /S /GoTo /D (page.24) >> +/Rect [182.692 428.657 194.647 438.844] +/A << /S /GoTo /D (page.23) >> >> endobj -980 0 obj << +991 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [215.698 511.493 227.653 521.679] -/A << /S /GoTo /D (page.26) >> +/Rect [193.96 416.702 205.915 426.888] +/A << /S /GoTo /D (page.25) >> >> endobj -981 0 obj << +992 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [215.15 499.49 227.105 509.677] +/Rect [215.698 404.747 227.653 414.933] /A << /S /GoTo /D (page.27) >> >> endobj -982 0 obj << +993 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [188.599 487.488 200.555 497.674] +/Rect [215.15 392.791 227.105 402.978] /A << /S /GoTo /D (page.27) >> >> endobj -983 0 obj << +994 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [211.145 474.768 223.1 485.672] +/Rect [188.599 380.836 200.555 391.023] /A << /S /GoTo /D (page.27) >> >> endobj -984 0 obj << +995 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [221.785 463.483 233.74 473.67] +/Rect [211.145 368.164 223.1 379.068] /A << /S /GoTo /D (page.27) >> >> endobj -985 0 obj << +996 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [179.753 451.48 191.708 461.667] +/Rect [221.785 356.926 233.74 367.113] /A << /S /GoTo /D (page.28) >> >> endobj -986 0 obj << +997 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [220.689 438.761 232.644 449.665] +/Rect [179.753 344.971 191.708 355.157] /A << /S /GoTo /D (page.28) >> >> endobj -987 0 obj << +998 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [210.726 427.476 222.682 437.662] +/Rect [220.689 332.298 232.644 343.202] /A << /S /GoTo /D (page.29) >> >> endobj -988 0 obj << +999 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [225.112 415.473 237.067 425.66] +/Rect [210.726 321.06 222.682 331.247] /A << /S /GoTo /D (page.29) >> >> endobj -989 0 obj << +1000 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.484 402.753 199.439 413.657] +/Rect [225.112 309.105 237.067 319.292] /A << /S /GoTo /D (page.29) >> >> endobj -990 0 obj << +1001 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [203.942 391.468 215.897 401.655] +/Rect [187.484 296.433 199.439 307.337] /A << /S /GoTo /D (page.29) >> >> endobj -991 0 obj << +1002 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.942 285.195 215.897 295.382] +/A << /S /GoTo /D (page.30) >> +>> endobj +1003 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [227.514 379.466 239.469 389.653] +/Rect [227.514 273.24 239.469 283.426] /A << /S /GoTo /D (page.23) >> >> endobj -992 0 obj << +1004 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [205.945 367.464 217.9 377.65] +/Rect [205.945 261.285 217.9 271.471] /A << /S /GoTo /D (page.23) >> >> endobj -993 0 obj << +1005 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [185.462 355.461 197.417 365.648] +/Rect [185.462 249.329 197.417 259.516] /A << /S /GoTo /D (page.23) >> >> endobj -994 0 obj << +1006 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [201.661 343.459 213.616 353.645] +/Rect [201.661 237.374 213.616 247.561] /A << /S /GoTo /D (page.23) >> >> endobj -995 0 obj << +1007 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 319.454 193.242 329.64] +/Rect [181.287 213.464 193.242 223.651] /A << /S /GoTo /D (page.29) >> >> endobj -996 0 obj << +1008 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.287 295.449 193.242 305.636] -/A << /S /GoTo /D (page.29) >> +/Rect [181.287 189.554 193.242 199.74] +/A << /S /GoTo /D (page.30) >> >> endobj -997 0 obj << +1009 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.377 271.444 177.332 281.631] +/Rect [165.377 165.643 177.332 175.83] /A << /S /GoTo /D (page.16) >> >> endobj -998 0 obj << +1010 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.377 247.439 177.332 257.626] +/Rect [165.377 141.733 177.332 151.92] /A << /S /GoTo /D (page.16) >> >> endobj -999 0 obj << +1011 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.377 223.434 177.332 233.621] +/Rect [165.377 117.823 177.332 128.009] /A << /S /GoTo /D (page.16) >> >> endobj -1000 0 obj << +1012 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.377 199.43 177.332 209.616] +/Rect [165.377 93.912 177.332 104.099] /A << /S /GoTo /D (page.16) >> >> endobj -1001 0 obj << +1013 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.377 164.675 177.332 174.861] +/Rect [381.858 715.581 393.813 725.768] /A << /S /GoTo /D (page.16) >> >> endobj -1002 0 obj << +1014 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.377 129.92 177.332 140.106] +/Rect [381.858 681.708 393.813 691.895] /A << /S /GoTo /D (page.16) >> >> endobj -1003 0 obj << +1015 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [145.451 117.917 157.407 128.104] +/Rect [361.933 669.753 373.888 679.939] /A << /S /GoTo /D (page.15) >> >> endobj -1004 0 obj << +1016 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [184.186 105.915 196.141 116.101] +/Rect [400.667 657.798 412.623 667.984] /A << /S /GoTo /D (page.16) >> >> endobj -1005 0 obj << +1017 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [175.329 93.195 187.284 104.099] +/Rect [391.81 645.125 403.766 656.029] /A << /S /GoTo /D (page.16) >> >> endobj -1006 0 obj << +1018 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [416.159 726.819 428.114 737.723] +/Rect [416.159 633.17 428.114 644.074] /A << /S /GoTo /D (page.16) >> >> endobj -1007 0 obj << +1019 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [342.566 715.505 354.521 725.692] +/Rect [342.566 621.932 354.521 632.119] /A << /S /GoTo /D (page.16) >> >> endobj -1008 0 obj << +1020 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [359.173 703.474 371.128 713.661] +/Rect [359.173 609.977 371.128 620.164] /A << /S /GoTo /D (page.16) >> >> endobj -1009 0 obj << +1021 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.503 690.726 400.458 701.63] +/Rect [388.503 597.305 400.458 608.208] /A << /S /GoTo /D (page.16) >> >> endobj -1010 0 obj << +1022 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [366.924 678.695 378.88 689.599] +/Rect [366.924 585.349 378.88 596.253] /A << /S /GoTo /D (page.16) >> >> endobj -1011 0 obj << +1023 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [357.36 667.381 369.315 677.568] +/Rect [357.36 574.112 369.315 584.298] /A << /S /GoTo /D (page.16) >> >> endobj -1012 0 obj << +1024 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.874 654.633 410.829 665.537] +/Rect [398.874 561.439 410.829 572.343] /A << /S /GoTo /D (page.16) >> >> endobj -1013 0 obj << +1025 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [349.211 642.602 361.166 653.506] +/Rect [349.211 549.484 361.166 560.388] /A << /S /GoTo /D (page.16) >> >> endobj -1014 0 obj << +1026 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [370.78 631.288 382.735 641.475] +/Rect [370.78 538.246 382.735 548.433] /A << /S /GoTo /D (page.16) >> >> endobj -1015 0 obj << +1027 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [413.957 619.257 425.912 629.444] +/Rect [413.957 526.291 425.912 536.477] /A << /S /GoTo /D (page.17) >> >> endobj -1016 0 obj << +1028 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [386.849 606.509 398.804 617.413] +/Rect [386.849 513.618 398.804 524.522] /A << /S /GoTo /D (page.17) >> >> endobj -1017 0 obj << +1029 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [385.186 595.195 397.141 605.382] +/Rect [385.186 502.38 397.141 512.567] /A << /S /GoTo /D (page.17) >> >> endobj -1018 0 obj << +1030 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [415.621 583.164 427.576 593.35] +/Rect [415.621 490.425 427.576 500.612] /A << /S /GoTo /D (page.17) >> >> endobj -1019 0 obj << +1031 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [418.141 571.133 430.097 581.319] +/Rect [418.141 478.47 430.097 488.657] /A << /S /GoTo /D (page.17) >> >> endobj -1020 0 obj << +1032 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [391.034 558.385 402.989 569.288] +/Rect [391.034 465.798 402.989 476.702] /A << /S /GoTo /D (page.17) >> >> endobj -1021 0 obj << +1033 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.35 546.353 409.305 557.257] +/Rect [397.35 453.843 409.305 464.746] /A << /S /GoTo /D (page.17) >> >> endobj -1022 0 obj << +1034 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.254 534.322 400.209 545.226] +/Rect [388.254 441.887 400.209 452.791] /A << /S /GoTo /D (page.17) >> >> endobj -1023 0 obj << +1035 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [356.404 522.291 368.359 533.195] +/Rect [356.404 429.932 368.359 440.836] /A << /S /GoTo /D (page.17) >> >> endobj -1024 0 obj << +1036 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [376.877 510.26 388.832 521.164] +/Rect [376.877 417.977 388.832 428.881] /A << /S /GoTo /D (page.17) >> >> endobj -1025 0 obj << +1037 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.858 475.689 393.813 485.875] +/Rect [381.858 384.821 393.813 395.008] /A << /S /GoTo /D (page.16) >> >> endobj -1026 0 obj << +1038 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.858 451.627 393.813 461.813] +/Rect [381.858 360.911 393.813 371.098] /A << /S /GoTo /D (page.16) >> >> endobj -1027 0 obj << +1039 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.858 427.565 393.813 437.751] +/Rect [381.858 337.001 393.813 347.187] /A << /S /GoTo /D (page.16) >> >> endobj -1028 0 obj << +1040 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.858 392.276 393.813 402.462] +/Rect [381.858 303.128 393.813 313.314] /A << /S /GoTo /D (page.16) >> >> endobj -1029 0 obj << +1041 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.858 368.214 393.813 378.4] +/Rect [381.858 279.217 393.813 289.404] /A << /S /GoTo /D (page.16) >> >> endobj -1030 0 obj << +1042 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.768 332.925 409.724 343.111] +/Rect [397.768 245.344 409.724 255.531] /A << /S /GoTo /D (page.23) >> >> endobj -1031 0 obj << +1043 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.768 297.636 409.724 307.822] +/Rect [397.768 211.471 409.724 221.658] /A << /S /GoTo /D (page.23) >> >> endobj -1032 0 obj << +1044 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.768 273.574 409.724 283.76] +/Rect [397.768 187.561 409.724 197.748] /A << /S /GoTo /D (page.23) >> >> endobj -1033 0 obj << +1045 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.768 249.511 409.724 259.698] +/Rect [397.768 163.651 409.724 173.837] /A << /S /GoTo /D (page.23) >> >> endobj -1034 0 obj << +1046 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.858 214.223 393.813 224.409] +/Rect [381.858 129.778 393.813 139.964] /A << /S /GoTo /D (page.17) >> >> endobj -1035 0 obj << +1047 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.858 190.16 393.813 200.347] +/Rect [381.858 105.867 393.813 116.054] /A << /S /GoTo /D (page.17) >> >> endobj -1036 0 obj << +1052 0 obj << +/D [1050 0 R /XYZ 89 770.89 null] +>> endobj +1049 0 obj << +/Font << /F22 292 0 R /F23 293 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1062 0 obj << +/Length 298 +/Filter /FlateDecode +>> +stream +xÚ˝”MKĂ@†ďű+ć‚Ygw»ŮěŃÖZRD°Ť ÄB˛­…d“ôß›&Uü<6§Yćă}ffa¶€0'“ś_qšjŹ{n@#(ŹQÉ„)DŽŹÖá„FŞ‘µEť7¸ąśÝd’'rđ#°®X*Ş„„$'Ń!mý @*´/]Vc.Z›ÁŠÜüÔřĐĂöÍ%(ŢZĹ{îtŐT&λ)Î:|Ď­¶Ç–s‘Ë%:Lă˝>¸¬—sŁZĘ^Î>ç×EÝ\$‰©ë;»kęnŘźR˙‹ě˝“Ă‘ŹNŃÄŮxů?Ů7ć¤`ŢĘ1ż—+§Ź±µ& lşKĚ`óľa»ˇ÷Ąę›ËŞx@ä™jżuś—™YĆÍ żŮŻ'ŔT ˙ëxµă  +endstream +endobj +1061 0 obj << +/Type /Page +/Contents 1062 0 R +/Resources 1060 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 897 0 R +/Annots [ 1048 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R ] +>> endobj +1048 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.858 166.098 393.813 176.285] +/Rect [165.377 727.536 177.332 737.723] /A << /S /GoTo /D (page.17) >> >> endobj -1037 0 obj << +1053 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.858 142.036 393.813 152.223] +/Rect [165.377 703.626 177.332 713.812] /A << /S /GoTo /D (page.17) >> >> endobj -1038 0 obj << +1054 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.858 117.974 393.813 128.161] +/Rect [165.377 679.715 177.332 689.902] /A << /S /GoTo /D (page.17) >> >> endobj -1039 0 obj << +1055 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.858 93.912 393.813 104.099] +/Rect [165.377 655.805 177.332 665.992] /A << /S /GoTo /D (page.17) >> >> endobj -1044 0 obj << -/D [1042 0 R /XYZ 89 770.89 null] ->> endobj -1041 0 obj << -/Font << /F22 292 0 R /F23 293 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1050 0 obj << -/Length 256 -/Filter /FlateDecode ->> -stream -xÚµ’1OĂ0…w˙ŠS‰šóąŽă•RŞt@˘őP)t· %iH+!ţ=®] - ™Nľw÷Ţgéö€0gw–Ý>á&Ąě ‚NW$ŔVP$r2ÚŘHÜ đKˇ›?ŢĎÖgÍ,{cç>‚ËJs-lVl*ß_ri2xS LHúZĂŠ=1ü"Ż@Č?5ĹČnúR¶­«ó¶zÝşc ^'c!¸Q*ÎMW§Ţ•MŢî70˘őű ărΠ“ÂDč‹ĽÍ/v_±v”aňŃąźąé0ąýá‘j7äGÉۉ,Ú˦«Ý˛< řW˝>žLr‰ôßŰůăň¤/ -endstream -endobj -1049 0 obj << -/Type /Page -/Contents 1050 0 R -/Resources 1048 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 891 0 R -/Annots [ 1040 0 R 1045 0 R 1046 0 R 1047 0 R ] ->> endobj -1040 0 obj << +1056 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.377 715.581 177.332 725.768] +/Rect [165.377 621.932 177.332 632.119] /A << /S /GoTo /D (page.17) >> >> endobj -1045 0 obj << +1057 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.377 691.671 177.332 701.857] +/Rect [165.377 598.022 177.332 608.208] /A << /S /GoTo /D (page.17) >> >> endobj -1046 0 obj << +1058 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.377 667.76 177.332 677.947] +/Rect [165.377 574.112 177.332 584.298] /A << /S /GoTo /D (page.17) >> >> endobj -1047 0 obj << +1059 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [165.377 633.887 177.332 644.074] +/Rect [165.377 540.239 177.332 550.425] /A << /S /GoTo /D (page.17) >> >> endobj -1051 0 obj << -/D [1049 0 R /XYZ 89 770.89 null] +1063 0 obj << +/D [1061 0 R /XYZ 89 770.89 null] >> endobj -1048 0 obj << +1060 0 obj << /Font << /F22 292 0 R /F23 293 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1053 0 obj +1065 0 obj [556 167 333 611 278 333 333 0 333 606 0 611 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 389 555 500 500 833 778 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 832 667 667 667 722 667 667 722 778 389 500 667 611 889 722 722 611 722 667 556 611 722 667 889 667 611 611 333 278 333 570 500 333 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 500 389 389 278 556 444 667 500 444 389] endobj -1054 0 obj +1066 0 obj [500 500 167 333 556 278 333 333 0 333 675 0 556 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 214 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389] endobj -1055 0 obj +1067 0 obj [500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8] endobj -1056 0 obj +1068 0 obj [500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8] endobj -1057 0 obj +1069 0 obj [777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6] endobj -1058 0 obj +1070 0 obj [769.8] endobj -1059 0 obj +1071 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj -1060 0 obj +1072 0 obj [556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000 333 980 389 333 722 0 0 722 0 333 500 500 500 500 200 500 333 760 276 500 564 333 760 333 400 564 300 300 333 500 453 250 333 300 310 500 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444] endobj -1061 0 obj +1073 0 obj [556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444] endobj -1062 0 obj << +1074 0 obj << /Length1 1648 /Length2 9497 /Length3 0 @@ -6006,7 +6086,7 @@ V ‘yť([>$óňfE`Ô­cKă·żńâşŢh˛—Ëkyv}Öę©’‰;ş®Bi¨…Bě$jqÉŘ“±=S˙,@ÔÍ´„€ŢŞÓ_ŐWöABš?ú‰Y– ‰9¶¸ŹNučŕŘe…+*ÉĽIiDQ­Wµ4ďűS[˛µĐJď–w Ö: ľé!Wň $cćłt~ %÷ŔJŇŹś„Ú˝ţĂöt endstream endobj -1063 0 obj << +1075 0 obj << /Type /FontDescriptor /FontName /MCOYWV+CMMI10 /Flags 4 @@ -6018,9 +6098,9 @@ endobj /StemV 72 /XHeight 431 /CharSet (/A/B/C/D/E/F/I/N/O/P/R/S/T/U/Z/greater/less) -/FontFile 1062 0 R +/FontFile 1074 0 R >> endobj -1064 0 obj << +1076 0 obj << /Length1 1542 /Length2 8229 /Length3 0 @@ -6062,7 +6142,7 @@ T µ@Ď‹ÉřĚÇmW”Źů=j5Ľ,[ă˙GíőĂ endstream endobj -1065 0 obj << +1077 0 obj << /Type /FontDescriptor /FontName /VYDKHY+CMR10 /Flags 4 @@ -6074,9 +6154,9 @@ endobj /StemV 69 /XHeight 431 /CharSet (/eight/equal/five/four/one/seven/six/three/two/zero) -/FontFile 1064 0 R +/FontFile 1076 0 R >> endobj -1066 0 obj << +1078 0 obj << /Length1 1425 /Length2 6103 /Length3 0 @@ -6110,7 +6190,7 @@ Mqj oö‡|šě€$Żî+lťĹéůŚ#»ŮŢ*”łnäľ*.qĐďŤf!-«+~ôIŰŞqhŤŮ6ŇÖÜŚoĘlĆę8H c˘"ąŠŔ« Ą„gŞĆ:­|ą#}^ćJĘ„xM=l^ŕšNĐJ–Z­p!ő?}Áw endstream endobj -1067 0 obj << +1079 0 obj << /Type /FontDescriptor /FontName /NBBWCW+CMSY10 /Flags 4 @@ -6122,9 +6202,9 @@ endobj /StemV 40 /XHeight 431 /CharSet (/asteriskmath/bar) -/FontFile 1066 0 R +/FontFile 1078 0 R >> endobj -1068 0 obj << +1080 0 obj << /Length1 1399 /Length2 5955 /Length3 0 @@ -6164,7 +6244,7 @@ P5C çÔ_WçI‘”bŻ'꽲I¤Ż‹pŰ'ró©Ů}ćÝ!ńË=›šŐDLÎQTŃ>śĺKńnoęÉđ5ˇÔV5Čă Ě·řÖG¸F#2ÍvĽŮ2*ľDzV?f04Á_h–-ąs$Ďślot*!ĹĹĽ"äŤůĚśµ%Ó [ŔVĽŢ$±ÜDÜĘőiEÉŃQ/bsfĂĎ®“43:¤ś€öE˘ţÚG”sW%Ý`Ť 3q‘zĆŘ9śzN§źőş¶Ř—*Á">’őÎő\N‹jmśy89¬ń}E9wÚnYµ:’ř'¸HČßml$ú¬äer endstream endobj -1069 0 obj << +1081 0 obj << /Type /FontDescriptor /FontName /LAJUWJ+CMSY7 /Flags 4 @@ -6176,9 +6256,9 @@ endobj /StemV 49 /XHeight 431 /CharSet (/logicaland) -/FontFile 1068 0 R +/FontFile 1080 0 R >> endobj -1070 0 obj << +1082 0 obj << /Length1 1612 /Length2 13615 /Length3 0 @@ -6239,7 +6319,7 @@ L ŁöoZY“ŐřÍbž§«q¤s–Ž ÝFGDĺŇ;ë˛ ś‘Íf>\Đ»0NqĆŽËýGĘí“:oS#cÇ ł~čâŢ·jVFýż6 ů.=ęŠ 'řÜëeŇĺ`ß‘Fő±Ňů§{Čc’lýZâ瀊\¸ź›W“2e’Çy'­&‹ß5¬ßrňJ *öŻÝ’\Ě~±Ś=łKp´”í™îkÓú4Šńc˝ÜmyÖR| ÇµëS#ú”oÓJ‘™'ńxşFĹ*/d=|]¶ČçÝ(&xě śÜy&]—­÷żG" x^dáXM±Ť›w Ů:Y+—™*ü@+Hv(üÄ‘3+. ę.'¬0~˘‹nŰb¨ şÚ´Hń°/jć|]ęKꥮ˝ćŐ:zĺbJwîŮ°㧽`ňÇCüćúĄBBíą®VŻ‰óŐčú–'µ§őşwN&ÜvżřµQbArňúJ,ř“·´ČE6P˝6řÚvv O¸cůë’§ŻĹ˘5]b›ŤJH0Ě” Ż %6ô§P‹S˝čuł_Îs­xťEşęÓšU7Ëę»?w rÖÖ.F&ZTYqq»ńˇEČi@€Y‘÷Ź›E´'şµĐđ€=™ţKlR~^ä·D&qí©Ü®cÄ{Ś›‚~Ľjź2—C-Ŕ`>rV\-,±MĎJ6ęÎąkĚnUß <¸‚o–ΠKćxé9˛±§Plí]öŚöĺ˙ˇç´ endstream endobj -1071 0 obj << +1083 0 obj << /Type /FontDescriptor /FontName /IIWFZB+NimbusMonL-Regu /Flags 4 @@ -6251,9 +6331,9 @@ endobj /StemV 41 /XHeight 426 /CharSet (/B/C/D/E/F/G/I/K/L/N/O/R/S/T/U/V/W/Z/a/b/braceleft/c/colon/comma/d/e/equal/f/g/greater/h/i/l/less/m/n/numbersign/o/one/p/parenleft/parenright/period/q/quotedbl/r/s/semicolon/t/two/u/underscore/y/z/zero) -/FontFile 1070 0 R +/FontFile 1082 0 R >> endobj -1072 0 obj << +1084 0 obj << /Length1 1626 /Length2 16381 /Length3 0 @@ -6336,7 +6416,7 @@ wu} p'Ótţ}怒íâ#† %Jě.TäĆűä2ĽÖlFßZü}"ß?X¤:eÇÚC?µ´çϵp˝I[Źx Rđ¶î´Ą Jó.`oŰůuPď.˝Mh ßô»łÔĹa0űA|ĎŃLÂŃ^jśA×Ý´J¤JlÖîąîíQÎ#ŻÜ<s@ź%{J{ĎYÂ?ÁÂąóĂÝ™…mm$-ÓÎ.Y§v2ĺŻËµuW¸OüĂü¬LęTZ†[PLÖĄ¦ÎHpŐžĘn9FÝK 뻜„ż^’0Őř´ä†TwANÜ%u6^HĺˇT»ČŚľDĽ:ÓŚrŐ%yˇ‘2ČČYÇź\őĺ2Ló°ZKĺźz!Ôî± ç—¦Ó¨f݇†3ĆZp×T>¬ßţźLłýR§í¬$ľĹLŃ“xîL{şZiI“βŇâ©nÉÍzΡl4G>Zاű°4ĎI~›]˝Ńŕ¦9*sý°NvĚ3›Ŕ4Ź÷_»Bŕ§ęt‘ ĂT–ś3kFüů ¨ŽěQĎÔúCS¬>˘ÁýŘ­·Ccę7tSÚ%‚\Ś _?}Ť%$‹çąo$=nńr oK•p­S´ĎM@‡2˙{Ö*!L<ęĘŇŢ˝@uÖëqgÇŽvk/Ü Â¤7×بů§+îPŤF¤EIáđ€Ľ?p‚3łČŇÓEY;ŤsOE«¦ŁT]Ľ–ŠÂŤvk*P?±ŻhJîQ–Ó¤ŐćX"Ŕ˝2Wć‰ ŞËĆpłt•ýIů A÷¬*,…¤ůňů3÷§đšfÜĂp¶ö!.Ńśç•šďĹd ÷0”áGö&nĘ~Ůy;_××:“%Í%‹ĐÜkűÓu®I-ł˘_ŔQ\ ŠdŞ”ÉÄ2u}Ő¨Ş±ß\î± °)Ď:şĎ}—…ę­NtÂş|µ´‰PWÔ‘ęK×Ęfń€¶°;ă‚ŘQ…<1Ů’›ĺËÁYÜÝ}_ţËj7vA)ĐŕĄέmŢ‹"čź`ń̦ÚR–Ác9®Ĺ+Ľŕ”KŐ›·¦h˛fü `Eô}-ŕtĘCmt_Ú®G‘*@źj–;’U3kxŘ·ĚF^Ŕą$S ,>g”©˛6«¬~*-źĎżoËäîbď=qč…:k¦•zčfhm0É«.®Ž0ŃÂB˝°Á*Ń×ńšXM endstream endobj -1073 0 obj << +1085 0 obj << /Type /FontDescriptor /FontName /LHHNFJ+NimbusRomNo9L-Medi /Flags 4 @@ -6348,9 +6428,9 @@ endobj /StemV 140 /XHeight 461 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/X/Y/a/ampersand/b/c/colon/comma/d/e/eight/equal/f/fi/five/fl/four/g/h/i/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/q/question/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 1072 0 R +/FontFile 1084 0 R >> endobj -1074 0 obj << +1086 0 obj << /Length1 1642 /Length2 13106 /Length3 0 @@ -6413,7 +6493,7 @@ Z Ť–ŽORľŽ˝‹´ş ÁĚW$ź yĂ+Çe×33ôŘ­Ź"ôLź7˛ăĹůČw45®Gîůő0{ ë|úů›‘°ÎvjF–ĹW0o—^łÁ{VÂIȆcV1‚.lÇőż¶ ŞŤÂb=\G_˝ŇUäkÄ˙řZi"Ű:q/[“Ňân%?V‡×—ěJ·‰qgÚę^dY l7 <=‹˛X_9¨C¶T5vdĐĆÓJ?…Yí/'§QsY¶WBÄnOÔ»XPýAí endstream endobj -1075 0 obj << +1087 0 obj << /Type /FontDescriptor /FontName /XTTWYM+NimbusRomNo9L-MediItal /Flags 4 @@ -6425,9 +6505,9 @@ endobj /StemV 120 /XHeight 462 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/a/b/bracketleft/bracketright/c/comma/d/e/f/fl/g/h/i/l/m/n/o/p/r/s/t/u/underscore/v/x/y/z) -/FontFile 1074 0 R +/FontFile 1086 0 R >> endobj -1076 0 obj << +1088 0 obj << /Length1 1630 /Length2 19012 /Length3 0 @@ -6511,7 +6591,7 @@ W *˙ŻżqľŘę‰nëŔ ç(A?¦Ńeö(!zŹî_F̳﯅uČykt™Ö«ýóŞ^!ŃZ|e.*ORÍů~¸b}•ŢŻŇCM endstream endobj -1077 0 obj << +1089 0 obj << /Type /FontDescriptor /FontName /OQYQQG+NimbusRomNo9L-Regu /Flags 4 @@ -6523,9 +6603,9 @@ endobj /StemV 85 /XHeight 450 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/adieresis/ampersand/b/braceleft/braceright/bracketleft/bracketright/bullet/c/colon/comma/d/e/eight/equal/exclam/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/plus/q/question/quotedbl/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 1076 0 R +/FontFile 1088 0 R >> endobj -1078 0 obj << +1090 0 obj << /Length1 1647 /Length2 12791 /Length3 0 @@ -6596,7 +6676,7 @@ Q –öé‚ąŁ]Vn·çĎž`ĆFź×R[AĂ`k~»Ĺ~ăTF!1Ó ÜýăęÝËÝÜŤ˝!!ďża`$‡˙řŽ¶žÖŐ˘dUż7çsźż¤WÔÔqhaqŮĆ>(µŚ şĽqÄHâ &ĂŻfuŁ>ÍË1¶RŚVőĽ­qłć:?ho˙áĘąŃ[Dž¨ďŞ˙¦KZÁ*ş`=]Ät{ŇBISHcÜĐovß’,¸Oť§L±+gŃ®ÚĘŁŐĚöťĄM{ŔééN®űSrSçů…`Ę\^.z ŃwŞ 5©Čokgdç­űĐ×1íXŚś$kÄŠ˙mi­”śÔŞßfż`E†´]tŃŻ‹­qLPú˙Á3{ endstream endobj -1079 0 obj << +1091 0 obj << /Type /FontDescriptor /FontName /YODDGY+NimbusRomNo9L-ReguItal /Flags 4 @@ -6608,9 +6688,9 @@ endobj /StemV 78 /XHeight 441 /CharSet (/A/B/C/D/E/F/G/I/L/M/O/P/R/S/T/V/a/b/c/comma/d/e/f/fi/four/g/h/hyphen/i/k/l/m/n/o/p/parenleft/parenright/period/q/quoteright/r/s/t/u/underscore/v/w/x/y/z) -/FontFile 1078 0 R +/FontFile 1090 0 R >> endobj -1052 0 obj << +1064 0 obj << /Type /Encoding /Differences [2/fi/fl 33/exclam/quotedbl/numbersign 38/ampersand/quoteright/parenleft/parenright 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft 93/bracketright 95/underscore 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft 125/braceright 149/bullet 228/adieresis] >> endobj @@ -6618,148 +6698,148 @@ endobj /Type /Font /Subtype /Type1 /BaseFont /MCOYWV+CMMI10 -/FontDescriptor 1063 0 R +/FontDescriptor 1075 0 R /FirstChar 60 /LastChar 90 -/Widths 1057 0 R +/Widths 1069 0 R >> endobj 445 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VYDKHY+CMR10 -/FontDescriptor 1065 0 R +/FontDescriptor 1077 0 R /FirstChar 48 /LastChar 61 -/Widths 1056 0 R +/Widths 1068 0 R >> endobj 446 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NBBWCW+CMSY10 -/FontDescriptor 1067 0 R +/FontDescriptor 1079 0 R /FirstChar 3 /LastChar 106 -/Widths 1055 0 R +/Widths 1067 0 R >> endobj 443 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LAJUWJ+CMSY7 -/FontDescriptor 1069 0 R +/FontDescriptor 1081 0 R /FirstChar 94 /LastChar 94 -/Widths 1058 0 R +/Widths 1070 0 R >> endobj 410 0 obj << /Type /Font /Subtype /Type1 /BaseFont /IIWFZB+NimbusMonL-Regu -/FontDescriptor 1071 0 R +/FontDescriptor 1083 0 R /FirstChar 34 /LastChar 123 -/Widths 1059 0 R -/Encoding 1052 0 R +/Widths 1071 0 R +/Encoding 1064 0 R >> endobj 292 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LHHNFJ+NimbusRomNo9L-Medi -/FontDescriptor 1073 0 R +/FontDescriptor 1085 0 R /FirstChar 2 /LastChar 122 -/Widths 1061 0 R -/Encoding 1052 0 R +/Widths 1073 0 R +/Encoding 1064 0 R >> endobj -801 0 obj << +807 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XTTWYM+NimbusRomNo9L-MediItal -/FontDescriptor 1075 0 R +/FontDescriptor 1087 0 R /FirstChar 3 /LastChar 122 -/Widths 1053 0 R -/Encoding 1052 0 R +/Widths 1065 0 R +/Encoding 1064 0 R >> endobj 293 0 obj << /Type /Font /Subtype /Type1 /BaseFont /OQYQQG+NimbusRomNo9L-Regu -/FontDescriptor 1077 0 R +/FontDescriptor 1089 0 R /FirstChar 2 /LastChar 228 -/Widths 1060 0 R -/Encoding 1052 0 R +/Widths 1072 0 R +/Encoding 1064 0 R >> endobj 607 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YODDGY+NimbusRomNo9L-ReguItal -/FontDescriptor 1079 0 R +/FontDescriptor 1091 0 R /FirstChar 2 /LastChar 122 -/Widths 1054 0 R -/Encoding 1052 0 R +/Widths 1066 0 R +/Encoding 1064 0 R >> endobj 294 0 obj << /Type /Pages /Count 6 -/Parent 1080 0 R +/Parent 1092 0 R /Kids [286 0 R 297 0 R 326 0 R 366 0 R 378 0 R 381 0 R] >> endobj 390 0 obj << /Type /Pages /Count 6 -/Parent 1080 0 R +/Parent 1092 0 R /Kids [384 0 R 392 0 R 403 0 R 424 0 R 439 0 R 449 0 R] >> endobj 473 0 obj << /Type /Pages /Count 6 -/Parent 1080 0 R +/Parent 1092 0 R /Kids [464 0 R 497 0 R 511 0 R 516 0 R 522 0 R 526 0 R] >> endobj 535 0 obj << /Type /Pages /Count 6 -/Parent 1080 0 R +/Parent 1092 0 R /Kids [532 0 R 537 0 R 562 0 R 584 0 R 589 0 R 594 0 R] >> endobj 609 0 obj << /Type /Pages /Count 6 -/Parent 1080 0 R -/Kids [603 0 R 658 0 R 735 0 R 788 0 R 798 0 R 804 0 R] +/Parent 1092 0 R +/Kids [603 0 R 658 0 R 735 0 R 792 0 R 804 0 R 810 0 R] >> endobj -817 0 obj << +821 0 obj << /Type /Pages /Count 6 -/Parent 1080 0 R -/Kids [813 0 R 820 0 R 826 0 R 830 0 R 836 0 R 840 0 R] +/Parent 1092 0 R +/Kids [817 0 R 826 0 R 832 0 R 836 0 R 842 0 R 846 0 R] >> endobj -891 0 obj << +897 0 obj << /Type /Pages /Count 4 -/Parent 1081 0 R -/Kids [888 0 R 965 0 R 1042 0 R 1049 0 R] +/Parent 1093 0 R +/Kids [894 0 R 972 0 R 1050 0 R 1061 0 R] >> endobj -1080 0 obj << +1092 0 obj << /Type /Pages /Count 36 -/Parent 1082 0 R -/Kids [294 0 R 390 0 R 473 0 R 535 0 R 609 0 R 817 0 R] +/Parent 1094 0 R +/Kids [294 0 R 390 0 R 473 0 R 535 0 R 609 0 R 821 0 R] >> endobj -1081 0 obj << +1093 0 obj << /Type /Pages /Count 4 -/Parent 1082 0 R -/Kids [891 0 R] +/Parent 1094 0 R +/Kids [897 0 R] >> endobj -1082 0 obj << +1094 0 obj << /Type /Pages /Count 40 -/Kids [1080 0 R 1081 0 R] +/Kids [1092 0 R 1093 0 R] >> endobj -1083 0 obj << +1095 0 obj << /Type /Outlines /First 3 0 R /Last 175 0 R @@ -6960,7 +7040,7 @@ endobj 175 0 obj << /Title 176 0 R /A 173 0 R -/Parent 1083 0 R +/Parent 1095 0 R /Prev 75 0 R /First 179 0 R /Last 179 0 R @@ -7137,7 +7217,7 @@ endobj 75 0 obj << /Title 76 0 R /A 73 0 R -/Parent 1083 0 R +/Parent 1095 0 R /Prev 67 0 R /Next 175 0 R /First 79 0 R @@ -7152,7 +7232,7 @@ endobj 67 0 obj << /Title 68 0 R /A 65 0 R -/Parent 1083 0 R +/Parent 1095 0 R /Prev 59 0 R /Next 75 0 R /First 71 0 R @@ -7167,7 +7247,7 @@ endobj 59 0 obj << /Title 60 0 R /A 57 0 R -/Parent 1083 0 R +/Parent 1095 0 R /Prev 31 0 R /Next 67 0 R /First 63 0 R @@ -7218,7 +7298,7 @@ endobj 31 0 obj << /Title 32 0 R /A 29 0 R -/Parent 1083 0 R +/Parent 1095 0 R /Prev 15 0 R /Next 59 0 R /First 35 0 R @@ -7247,7 +7327,7 @@ endobj 15 0 obj << /Title 16 0 R /A 13 0 R -/Parent 1083 0 R +/Parent 1095 0 R /Prev 3 0 R /Next 31 0 R /First 19 0 R @@ -7269,512 +7349,516 @@ endobj 3 0 obj << /Title 4 0 R /A 1 0 R -/Parent 1083 0 R +/Parent 1095 0 R /Next 15 0 R /First 7 0 R /Last 11 0 R /Count -2 >> endobj -1084 0 obj << +1096 0 obj << /Names [(Doc-Start) 291 0 R (INTRO) 387 0 R (INTRO_DecoderBasics) 389 0 R (INTRO_SCOPE) 388 0 R (Item.1) 409 0 R (Item.2) 411 0 R] /Limits [(Doc-Start) (Item.2)] >> endobj -1085 0 obj << +1097 0 obj << /Names [(Item.3) 412 0 R (Item.4) 427 0 R (Item.5) 429 0 R (Item.6) 430 0 R (Item.7) 431 0 R (Item.8) 432 0 R] /Limits [(Item.3) (Item.8)] >> endobj -1086 0 obj << +1098 0 obj << /Names [(LIBUSE) 406 0 R (LIBUSE_BufferSystem) 433 0 R (LIBUSE_Calling_Sequence) 408 0 R (LIBUSE_InterfaceDescritpion) 407 0 R (OutputFormat) 467 0 R (OutputFormat_ExamplesArib) 503 0 R] /Limits [(LIBUSE) (OutputFormat_ExamplesArib)] >> endobj -1087 0 obj << +1099 0 obj << /Names [(OutputFormat_ExamplesStereo) 472 0 R (OutputFormat_ExamplesSurround) 501 0 R (OutputFormat_OutputFormatChange) 470 0 R (OutputFormat_OutputFormatExample) 471 0 R (OutputFormat_OutputFormatObtaining) 468 0 R (aacdecoder__lib_8h) 413 0 R] /Limits [(OutputFormat_ExamplesStereo) (aacdecoder__lib_8h)] >> endobj -1088 0 obj << -/Names [(aacdecoder__lib_8h_a15da43e47179e3ca7b58d6b08620533e) 793 0 R (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) 416 0 R (aacdecoder__lib_8h_a388a21070208ec23217c4ff8f8d98754) 618 0 R (aacdecoder__lib_8h_a404dd0b9b627d3e9ab765dba98be3eec) 765 0 R (aacdecoder__lib_8h_a4666e424f482470e872827f66399454a) 668 0 R (aacdecoder__lib_8h_a6016435b8679d2793078b10ecaf3d05d) 415 0 R] -/Limits [(aacdecoder__lib_8h_a15da43e47179e3ca7b58d6b08620533e) (aacdecoder__lib_8h_a6016435b8679d2793078b10ecaf3d05d)] ->> endobj -1089 0 obj << -/Names [(aacdecoder__lib_8h_a60aa42cb3ddc804b44ce61d877d0501e) 436 0 R (aacdecoder__lib_8h_a620b5a8c5d7ddd1b525aae1895963e16) 794 0 R (aacdecoder__lib_8h_a6d508fce68c364f5dabc9195e701ecf8) 435 0 R (aacdecoder__lib_8h_a8bc17277db0f7651065f62d66f92ed9f) 666 0 R (aacdecoder__lib_8h_a8f33403449b41e6a9deda6cb1e07d386) 764 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88) 752 0 R] -/Limits [(aacdecoder__lib_8h_a60aa42cb3ddc804b44ce61d877d0501e) (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88)] ->> endobj -1090 0 obj << -/Names [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a28dd853ab4339011893a933020ac5ab8) 756 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a4392100c924c0f20a706f55bc7ab3931) 760 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5cec20e1dd4ac89472ad60d3d0c8b5c1) 754 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5e080429e4eaec068ba64c17152ee805) 755 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6056e5b76cc6a00078388445b1f1cfa1) 757 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a605a8fed5c5754dffc63775cc702aae7) 761 0 R] -/Limits [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a28dd853ab4339011893a933020ac5ab8) (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a605a8fed5c5754dffc63775cc702aae7)] ->> endobj -1091 0 obj << -/Names [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a65284784865f22d79700dc268f84e374) 758 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6e3fa0b7d247c98f132edd55187f9c0c) 476 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aa1a5a121f8b03708d9fdcc06f6e882fb) 763 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) 477 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aee866642a3f335e7874a82939ad0c135) 753 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af24d28dac8b5de47c00c578712d0591e) 759 0 R] -/Limits [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a65284784865f22d79700dc268f84e374) (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af24d28dac8b5de47c00c578712d0591e)] ->> endobj -1092 0 obj << -/Names [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af84565b78a6ae180e316dd612a0877a7) 762 0 R (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) 669 0 R (aacdecoder__lib_8h_abc8ebc3d720699fe1d7c27eccd3da051) 667 0 R (aacdecoder__lib_8h_ac2c358d4ac0d7747cae32f9f45c20f71) 663 0 R (aacdecoder__lib_8h_ac8580fe563e79afe695d7b0b32ea0fed) 414 0 R (aacdecoder__lib_8h_acca8f4cf9757885d6c654de37a43072f) 437 0 R] -/Limits [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af84565b78a6ae180e316dd612a0877a7) (aacdecoder__lib_8h_acca8f4cf9757885d6c654de37a43072f)] ->> endobj -1093 0 obj << -/Names [(aacdecoder__lib_8h_ae09502f250437ee519971ca3a95ac9e0) 665 0 R (aacdecoder__lib_8h_af59d78a4583ca81ccb2675dce592b812) 664 0 R (aacdecoder__lib_8h_afb42ea8892dd828264bd2f6147e0559f) 478 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) 670 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a0357ce81d9d62cc106c752121fc9dc8a) 694 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a0bd193ee6a8c3151c5c6469f7e455a8e) 685 0 R] -/Limits [(aacdecoder__lib_8h_ae09502f250437ee519971ca3a95ac9e0) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a0bd193ee6a8c3151c5c6469f7e455a8e)] ->> endobj -1094 0 obj << -/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a20cdc26726b22cb44143b4e440441e0f) 695 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a242d8bc09683a84b578546663dda36fa) 678 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a42c5cbc358ada7261ba3d609c33ec3a5) 690 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a45662b23139ca5807ed6fe3b8940dc40) 740 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4a877298c7076e5ef4dd848912ab1d48) 674 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4dbbe3b38d0dfb444fdc3a7adae2f807) 687 0 R] -/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a20cdc26726b22cb44143b4e440441e0f) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4dbbe3b38d0dfb444fdc3a7adae2f807)] ->> endobj -1095 0 obj << -/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4dff2410394a6ffdf0f95ec66cbd0107) 680 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a516287ad9b64c230200191fdd60361e1) 744 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a5bc4e4af77d94fa08beb54def8f01f7f) 684 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a60690e0dbc450f62f83548fa484716ab) 689 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a65820f534b99b1529510720eeaafc861) 748 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a71440b5535812faf92a0fe99275dd5f0) 671 0 R] -/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4dff2410394a6ffdf0f95ec66cbd0107) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a71440b5535812faf92a0fe99275dd5f0)] ->> endobj -1096 0 obj << -/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a72f0dd3698012cdf8b20dd6f0b5de626) 749 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a77f722abc6c05f1abf1f51c0d11bf7ec) 743 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a7ea36c43c374f751f65be033057e3888) 679 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a856cdca9aa719c292b7c351cec03ae06) 747 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a8aa244ce1ae08763dde378161df0652f) 688 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a8bf90eccdaf6063e299f9415c8bd5d1a) 746 0 R] -/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a72f0dd3698012cdf8b20dd6f0b5de626) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a8bf90eccdaf6063e299f9415c8bd5d1a)] ->> endobj -1097 0 obj << -/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a95dafb71a0623fbeb0715e46b7a189c7) 682 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a97113255d01bdf3cc7104dd411f40949) 683 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa14848134610eea96115c59a6b944921) 697 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa86450161814b428d08b620188302fbc) 677 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41abb11196531beac7285326a5394db0329) 745 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac12235e2fee27efdcc78f2946f86e4ab) 693 0 R] -/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a95dafb71a0623fbeb0715e46b7a189c7) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac12235e2fee27efdcc78f2946f86e4ab)] ->> endobj -1098 0 obj << -/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac806692e8a98e9baca1bca5f7d9df0cd) 676 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac8bc8e0a106154098f730ba596c43c50) 692 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41acb4252bc9a6eeee71738af951850379c) 696 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ad8e91a23786bc032e507dfbd036f63c4) 434 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41adbb894fd8e900c4993f57ae88f8aee1a) 675 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae2ac2caa02bbffb8ace0fa87ad5ffc05) 751 0 R] -/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac806692e8a98e9baca1bca5f7d9df0cd) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae2ac2caa02bbffb8ace0fa87ad5ffc05)] ->> endobj -1099 0 obj << -/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae36383b7f8b4f36072eb60a303c439c3) 691 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae6d7add4f73779b26c859900f710c34f) 681 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aea6be518456d203d68898efd236a6769) 750 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af16b1992a2a415168ab96228671ef337) 742 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af1e591927344a1a91c49b87efe3fb0b9) 673 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af61dc054946b313e1780cf604ca833c6) 741 0 R] -/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae36383b7f8b4f36072eb60a303c439c3) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af61dc054946b313e1780cf604ca833c6)] ->> endobj 1100 0 obj << -/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41afbf7d7d96fdf87cb5f7541348a597b48) 686 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41afdf896f1fefa0b962ef99c6cb2681027) 672 0 R (chapter*.1) 328 0 R (chapter.1) 2 0 R (chapter.2) 14 0 R (chapter.3) 30 0 R] -/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41afbf7d7d96fdf87cb5f7541348a597b48) (chapter.3)] +/Names [(aacdecoder__lib_8h_a15da43e47179e3ca7b58d6b08620533e) 798 0 R (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) 416 0 R (aacdecoder__lib_8h_a388a21070208ec23217c4ff8f8d98754) 618 0 R (aacdecoder__lib_8h_a404dd0b9b627d3e9ab765dba98be3eec) 767 0 R (aacdecoder__lib_8h_a4666e424f482470e872827f66399454a) 668 0 R (aacdecoder__lib_8h_a6016435b8679d2793078b10ecaf3d05d) 415 0 R] +/Limits [(aacdecoder__lib_8h_a15da43e47179e3ca7b58d6b08620533e) (aacdecoder__lib_8h_a6016435b8679d2793078b10ecaf3d05d)] >> endobj 1101 0 obj << -/Names [(chapter.4) 58 0 R (chapter.5) 66 0 R (chapter.6) 74 0 R (chapter.7) 174 0 R (figure.2.1) 442 0 R (page.1) 386 0 R] -/Limits [(chapter.4) (page.1)] +/Names [(aacdecoder__lib_8h_a60aa42cb3ddc804b44ce61d877d0501e) 436 0 R (aacdecoder__lib_8h_a620b5a8c5d7ddd1b525aae1895963e16) 799 0 R (aacdecoder__lib_8h_a6d508fce68c364f5dabc9195e701ecf8) 435 0 R (aacdecoder__lib_8h_a8bc17277db0f7651065f62d66f92ed9f) 666 0 R (aacdecoder__lib_8h_a8f33403449b41e6a9deda6cb1e07d386) 766 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88) 751 0 R] +/Limits [(aacdecoder__lib_8h_a60aa42cb3ddc804b44ce61d877d0501e) (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88)] >> endobj 1102 0 obj << -/Names [(page.10) 518 0 R (page.11) 524 0 R (page.12) 528 0 R (page.13) 534 0 R (page.14) 539 0 R (page.15) 564 0 R] -/Limits [(page.10) (page.15)] +/Names [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a28dd853ab4339011893a933020ac5ab8) 758 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a4392100c924c0f20a706f55bc7ab3931) 762 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a55c37bcd32cb04728f48e1b2896967f7) 755 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5cec20e1dd4ac89472ad60d3d0c8b5c1) 756 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a5e080429e4eaec068ba64c17152ee805) 757 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6056e5b76cc6a00078388445b1f1cfa1) 759 0 R] +/Limits [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a28dd853ab4339011893a933020ac5ab8) (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6056e5b76cc6a00078388445b1f1cfa1)] >> endobj 1103 0 obj << -/Names [(page.16) 586 0 R (page.17) 591 0 R (page.18) 596 0 R (page.19) 605 0 R (page.2) 394 0 R (page.20) 660 0 R] -/Limits [(page.16) (page.20)] +/Names [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a605a8fed5c5754dffc63775cc702aae7) 763 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a65284784865f22d79700dc268f84e374) 760 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6e3fa0b7d247c98f132edd55187f9c0c) 476 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aa1a5a121f8b03708d9fdcc06f6e882fb) 765 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab011b48e5d9f5648c400ee632c151197) 753 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) 477 0 R] +/Limits [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a605a8fed5c5754dffc63775cc702aae7) (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568)] >> endobj 1104 0 obj << -/Names [(page.21) 737 0 R (page.22) 790 0 R (page.23) 800 0 R (page.24) 806 0 R (page.25) 815 0 R (page.26) 822 0 R] -/Limits [(page.21) (page.26)] +/Names [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ad2733233519a726ef7501d89918921c5) 754 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aee866642a3f335e7874a82939ad0c135) 752 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af24d28dac8b5de47c00c578712d0591e) 761 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af84565b78a6ae180e316dd612a0877a7) 764 0 R (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) 669 0 R (aacdecoder__lib_8h_abc8ebc3d720699fe1d7c27eccd3da051) 667 0 R] +/Limits [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ad2733233519a726ef7501d89918921c5) (aacdecoder__lib_8h_abc8ebc3d720699fe1d7c27eccd3da051)] >> endobj 1105 0 obj << -/Names [(page.27) 828 0 R (page.28) 832 0 R (page.29) 838 0 R (page.3) 405 0 R (page.30) 842 0 R (page.31) 890 0 R] -/Limits [(page.27) (page.31)] +/Names [(aacdecoder__lib_8h_ac2c358d4ac0d7747cae32f9f45c20f71) 663 0 R (aacdecoder__lib_8h_ac8580fe563e79afe695d7b0b32ea0fed) 414 0 R (aacdecoder__lib_8h_acca8f4cf9757885d6c654de37a43072f) 437 0 R (aacdecoder__lib_8h_ae09502f250437ee519971ca3a95ac9e0) 665 0 R (aacdecoder__lib_8h_af59d78a4583ca81ccb2675dce592b812) 664 0 R (aacdecoder__lib_8h_afb42ea8892dd828264bd2f6147e0559f) 478 0 R] +/Limits [(aacdecoder__lib_8h_ac2c358d4ac0d7747cae32f9f45c20f71) (aacdecoder__lib_8h_afb42ea8892dd828264bd2f6147e0559f)] >> endobj 1106 0 obj << -/Names [(page.32) 967 0 R (page.33) 1044 0 R (page.34) 1051 0 R (page.4) 426 0 R (page.5) 441 0 R (page.6) 451 0 R] -/Limits [(page.32) (page.6)] +/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) 670 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a0357ce81d9d62cc106c752121fc9dc8a) 694 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a0bd193ee6a8c3151c5c6469f7e455a8e) 685 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a20cdc26726b22cb44143b4e440441e0f) 695 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a242d8bc09683a84b578546663dda36fa) 678 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a42c5cbc358ada7261ba3d609c33ec3a5) 690 0 R] +/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a42c5cbc358ada7261ba3d609c33ec3a5)] >> endobj 1107 0 obj << -/Names [(page.7) 466 0 R (page.8) 499 0 R (page.9) 513 0 R (section*.2) 565 0 R (section*.3) 606 0 R (section*.4) 608 0 R] -/Limits [(page.7) (section*.4)] +/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a45662b23139ca5807ed6fe3b8940dc40) 739 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4a877298c7076e5ef4dd848912ab1d48) 674 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4dbbe3b38d0dfb444fdc3a7adae2f807) 687 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4dff2410394a6ffdf0f95ec66cbd0107) 680 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a516287ad9b64c230200191fdd60361e1) 743 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a5bc4e4af77d94fa08beb54def8f01f7f) 684 0 R] +/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a45662b23139ca5807ed6fe3b8940dc40) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a5bc4e4af77d94fa08beb54def8f01f7f)] >> endobj 1108 0 obj << -/Names [(section*.5) 661 0 R (section*.6) 662 0 R (section*.7) 738 0 R (section.1.1) 6 0 R (section.1.2) 10 0 R (section.2.1) 18 0 R] -/Limits [(section*.5) (section.2.1)] +/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a60690e0dbc450f62f83548fa484716ab) 689 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a65820f534b99b1529510720eeaafc861) 747 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a71440b5535812faf92a0fe99275dd5f0) 671 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a72f0dd3698012cdf8b20dd6f0b5de626) 748 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a77f722abc6c05f1abf1f51c0d11bf7ec) 742 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a7ea36c43c374f751f65be033057e3888) 679 0 R] +/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a60690e0dbc450f62f83548fa484716ab) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a7ea36c43c374f751f65be033057e3888)] >> endobj 1109 0 obj << -/Names [(section.2.2) 22 0 R (section.2.3) 26 0 R (section.3.1) 34 0 R (section.3.2) 38 0 R (section.3.3) 42 0 R (section.4.1) 62 0 R] -/Limits [(section.2.2) (section.4.1)] +/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a856cdca9aa719c292b7c351cec03ae06) 746 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a8aa244ce1ae08763dde378161df0652f) 688 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a8bf90eccdaf6063e299f9415c8bd5d1a) 745 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a95dafb71a0623fbeb0715e46b7a189c7) 682 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a97113255d01bdf3cc7104dd411f40949) 683 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa14848134610eea96115c59a6b944921) 697 0 R] +/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a856cdca9aa719c292b7c351cec03ae06) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa14848134610eea96115c59a6b944921)] >> endobj 1110 0 obj << -/Names [(section.5.1) 70 0 R (section.6.1) 78 0 R (section.7.1) 178 0 R (structCStreamInfo) 474 0 R (structCStreamInfo_a1f2571c63e5f1db6e4d1537e37310568) 581 0 R (structCStreamInfo_a239e02305ca579866e527f4a512b1fdc) 577 0 R] -/Limits [(section.5.1) (structCStreamInfo_a239e02305ca579866e527f4a512b1fdc)] +/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa86450161814b428d08b620188302fbc) 677 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41abb11196531beac7285326a5394db0329) 744 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac12235e2fee27efdcc78f2946f86e4ab) 693 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac806692e8a98e9baca1bca5f7d9df0cd) 676 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac8bc8e0a106154098f730ba596c43c50) 692 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41acb4252bc9a6eeee71738af951850379c) 696 0 R] +/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa86450161814b428d08b620188302fbc) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41acb4252bc9a6eeee71738af951850379c)] >> endobj 1111 0 obj << -/Names [(structCStreamInfo_a24cea6707207c95269162847beaa0b7d) 569 0 R (structCStreamInfo_a28c5ba6424b0975f7074b8e1e217a7a3) 575 0 R (structCStreamInfo_a36fa897b242eebb936d99010a8c580be) 506 0 R (structCStreamInfo_a47fa73a2c1269f30d1439e90c7652f49) 567 0 R (structCStreamInfo_a4d64654dd9d366c5ea41a89d1972534d) 571 0 R (structCStreamInfo_a5d5f38d670deaa5abf887c3b580df1cd) 566 0 R] -/Limits [(structCStreamInfo_a24cea6707207c95269162847beaa0b7d) (structCStreamInfo_a5d5f38d670deaa5abf887c3b580df1cd)] +/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ad8e91a23786bc032e507dfbd036f63c4) 434 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41adbb894fd8e900c4993f57ae88f8aee1a) 675 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae2ac2caa02bbffb8ace0fa87ad5ffc05) 750 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae36383b7f8b4f36072eb60a303c439c3) 691 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae6d7add4f73779b26c859900f710c34f) 681 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aea6be518456d203d68898efd236a6769) 749 0 R] +/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ad8e91a23786bc032e507dfbd036f63c4) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aea6be518456d203d68898efd236a6769)] >> endobj 1112 0 obj << -/Names [(structCStreamInfo_a6e431a6f8aeca62ffb7741b3ec068f7b) 572 0 R (structCStreamInfo_a73484dc9e2406a34c5dddf16b3cf6d0c) 576 0 R (structCStreamInfo_a7362ae2c2b9bd37a103e575c271f3120) 582 0 R (structCStreamInfo_a8a9699c8f4e00893127a7e49161bbd0d) 580 0 R (structCStreamInfo_a8ffd4db9d615e545a5e8cb51990965fc) 574 0 R (structCStreamInfo_aa35e5be20f99be29ce12f9f41bf4d50e) 505 0 R] -/Limits [(structCStreamInfo_a6e431a6f8aeca62ffb7741b3ec068f7b) (structCStreamInfo_aa35e5be20f99be29ce12f9f41bf4d50e)] +/Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af16b1992a2a415168ab96228671ef337) 741 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af1e591927344a1a91c49b87efe3fb0b9) 673 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af61dc054946b313e1780cf604ca833c6) 740 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41afbf7d7d96fdf87cb5f7541348a597b48) 686 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41afdf896f1fefa0b962ef99c6cb2681027) 672 0 R (chapter*.1) 328 0 R] +/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af16b1992a2a415168ab96228671ef337) (chapter*.1)] >> endobj 1113 0 obj << -/Names [(structCStreamInfo_aae39329c51fe206a8aee33daba2fe1db) 504 0 R (structCStreamInfo_aaf23a4756ee1a1b36f0b7d104d3f9882) 568 0 R (structCStreamInfo_ab28c53f72c8c1a9c4adf5d7e84bcc78b) 578 0 R (structCStreamInfo_ac1388034d207ca6075fc0883d39eea1a) 475 0 R (structCStreamInfo_ae8a7599cb585fdb0ff5446b0a6abb9c8) 579 0 R (structCStreamInfo_af5c2c8b545a6cc3e5aac82e25a2edea0) 570 0 R] -/Limits [(structCStreamInfo_aae39329c51fe206a8aee33daba2fe1db) (structCStreamInfo_af5c2c8b545a6cc3e5aac82e25a2edea0)] +/Names [(chapter.1) 2 0 R (chapter.2) 14 0 R (chapter.3) 30 0 R (chapter.4) 58 0 R (chapter.5) 66 0 R (chapter.6) 74 0 R] +/Limits [(chapter.1) (chapter.6)] >> endobj 1114 0 obj << -/Names [(structCStreamInfo_afa21b3685d93a877cab4aa884524cb67) 573 0 R (subsection.3.3.1) 46 0 R (subsection.3.3.2) 50 0 R (subsection.3.3.3) 54 0 R (subsection.6.1.1) 82 0 R (subsection.6.1.2) 86 0 R] -/Limits [(structCStreamInfo_afa21b3685d93a877cab4aa884524cb67) (subsection.6.1.2)] +/Names [(chapter.7) 174 0 R (figure.2.1) 442 0 R (page.1) 386 0 R (page.10) 518 0 R (page.11) 524 0 R (page.12) 528 0 R] +/Limits [(chapter.7) (page.12)] >> endobj 1115 0 obj << -/Names [(subsection.7.1.1) 182 0 R (subsection.7.1.2) 186 0 R (subsection.7.1.3) 218 0 R (subsection.7.1.4) 226 0 R (subsection.7.1.5) 238 0 R (subsubsection.6.1.2.1) 90 0 R] -/Limits [(subsection.7.1.1) (subsubsection.6.1.2.1)] +/Names [(page.13) 534 0 R (page.14) 539 0 R (page.15) 564 0 R (page.16) 586 0 R (page.17) 591 0 R (page.18) 596 0 R] +/Limits [(page.13) (page.18)] >> endobj 1116 0 obj << -/Names [(subsubsection.6.1.2.10) 126 0 R (subsubsection.6.1.2.11) 130 0 R (subsubsection.6.1.2.12) 134 0 R (subsubsection.6.1.2.13) 138 0 R (subsubsection.6.1.2.14) 142 0 R (subsubsection.6.1.2.15) 146 0 R] -/Limits [(subsubsection.6.1.2.10) (subsubsection.6.1.2.15)] +/Names [(page.19) 605 0 R (page.2) 394 0 R (page.20) 660 0 R (page.21) 737 0 R (page.22) 794 0 R (page.23) 806 0 R] +/Limits [(page.19) (page.23)] >> endobj 1117 0 obj << -/Names [(subsubsection.6.1.2.16) 150 0 R (subsubsection.6.1.2.17) 154 0 R (subsubsection.6.1.2.18) 158 0 R (subsubsection.6.1.2.19) 162 0 R (subsubsection.6.1.2.2) 94 0 R (subsubsection.6.1.2.20) 166 0 R] -/Limits [(subsubsection.6.1.2.16) (subsubsection.6.1.2.20)] +/Names [(page.24) 812 0 R (page.25) 819 0 R (page.26) 828 0 R (page.27) 834 0 R (page.28) 838 0 R (page.29) 844 0 R] +/Limits [(page.24) (page.29)] >> endobj 1118 0 obj << -/Names [(subsubsection.6.1.2.21) 170 0 R (subsubsection.6.1.2.3) 98 0 R (subsubsection.6.1.2.4) 102 0 R (subsubsection.6.1.2.5) 106 0 R (subsubsection.6.1.2.6) 110 0 R (subsubsection.6.1.2.7) 114 0 R] -/Limits [(subsubsection.6.1.2.21) (subsubsection.6.1.2.7)] +/Names [(page.3) 405 0 R (page.30) 848 0 R (page.31) 896 0 R (page.32) 974 0 R (page.33) 1052 0 R (page.34) 1063 0 R] +/Limits [(page.3) (page.34)] >> endobj 1119 0 obj << -/Names [(subsubsection.6.1.2.8) 118 0 R (subsubsection.6.1.2.9) 122 0 R (subsubsection.7.1.2.1) 190 0 R (subsubsection.7.1.2.2) 194 0 R (subsubsection.7.1.2.3) 198 0 R (subsubsection.7.1.2.4) 202 0 R] -/Limits [(subsubsection.6.1.2.8) (subsubsection.7.1.2.4)] +/Names [(page.4) 426 0 R (page.5) 441 0 R (page.6) 451 0 R (page.7) 466 0 R (page.8) 499 0 R (page.9) 513 0 R] +/Limits [(page.4) (page.9)] >> endobj 1120 0 obj << -/Names [(subsubsection.7.1.2.5) 206 0 R (subsubsection.7.1.2.6) 210 0 R (subsubsection.7.1.2.7) 214 0 R (subsubsection.7.1.3.1) 222 0 R (subsubsection.7.1.4.1) 230 0 R (subsubsection.7.1.4.2) 234 0 R] -/Limits [(subsubsection.7.1.2.5) (subsubsection.7.1.4.2)] +/Names [(section*.2) 565 0 R (section*.3) 606 0 R (section*.4) 608 0 R (section*.5) 661 0 R (section*.6) 662 0 R (section*.7) 738 0 R] +/Limits [(section*.2) (section*.7)] >> endobj 1121 0 obj << -/Names [(subsubsection.7.1.5.1) 242 0 R (subsubsection.7.1.5.10) 278 0 R (subsubsection.7.1.5.11) 282 0 R (subsubsection.7.1.5.2) 246 0 R (subsubsection.7.1.5.3) 250 0 R (subsubsection.7.1.5.4) 254 0 R] -/Limits [(subsubsection.7.1.5.1) (subsubsection.7.1.5.4)] +/Names [(section.1.1) 6 0 R (section.1.2) 10 0 R (section.2.1) 18 0 R (section.2.2) 22 0 R (section.2.3) 26 0 R (section.3.1) 34 0 R] +/Limits [(section.1.1) (section.3.1)] >> endobj 1122 0 obj << -/Names [(subsubsection.7.1.5.5) 258 0 R (subsubsection.7.1.5.6) 262 0 R (subsubsection.7.1.5.7) 266 0 R (subsubsection.7.1.5.8) 270 0 R (subsubsection.7.1.5.9) 274 0 R] -/Limits [(subsubsection.7.1.5.5) (subsubsection.7.1.5.9)] +/Names [(section.3.2) 38 0 R (section.3.3) 42 0 R (section.4.1) 62 0 R (section.5.1) 70 0 R (section.6.1) 78 0 R (section.7.1) 178 0 R] +/Limits [(section.3.2) (section.7.1)] >> endobj 1123 0 obj << -/Kids [1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R] -/Limits [(Doc-Start) (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88)] +/Names [(structCStreamInfo) 474 0 R (structCStreamInfo_a1f2571c63e5f1db6e4d1537e37310568) 581 0 R (structCStreamInfo_a239e02305ca579866e527f4a512b1fdc) 577 0 R (structCStreamInfo_a24cea6707207c95269162847beaa0b7d) 569 0 R (structCStreamInfo_a28c5ba6424b0975f7074b8e1e217a7a3) 575 0 R (structCStreamInfo_a36fa897b242eebb936d99010a8c580be) 506 0 R] +/Limits [(structCStreamInfo) (structCStreamInfo_a36fa897b242eebb936d99010a8c580be)] >> endobj 1124 0 obj << -/Kids [1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R] -/Limits [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a28dd853ab4339011893a933020ac5ab8) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a71440b5535812faf92a0fe99275dd5f0)] +/Names [(structCStreamInfo_a47fa73a2c1269f30d1439e90c7652f49) 567 0 R (structCStreamInfo_a4d64654dd9d366c5ea41a89d1972534d) 571 0 R (structCStreamInfo_a5d5f38d670deaa5abf887c3b580df1cd) 566 0 R (structCStreamInfo_a6e431a6f8aeca62ffb7741b3ec068f7b) 572 0 R (structCStreamInfo_a73484dc9e2406a34c5dddf16b3cf6d0c) 576 0 R (structCStreamInfo_a7362ae2c2b9bd37a103e575c271f3120) 582 0 R] +/Limits [(structCStreamInfo_a47fa73a2c1269f30d1439e90c7652f49) (structCStreamInfo_a7362ae2c2b9bd37a103e575c271f3120)] >> endobj 1125 0 obj << -/Kids [1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R] -/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a72f0dd3698012cdf8b20dd6f0b5de626) (page.1)] +/Names [(structCStreamInfo_a8a9699c8f4e00893127a7e49161bbd0d) 580 0 R (structCStreamInfo_a8ffd4db9d615e545a5e8cb51990965fc) 574 0 R (structCStreamInfo_aa35e5be20f99be29ce12f9f41bf4d50e) 505 0 R (structCStreamInfo_aae39329c51fe206a8aee33daba2fe1db) 504 0 R (structCStreamInfo_aaf23a4756ee1a1b36f0b7d104d3f9882) 568 0 R (structCStreamInfo_ab28c53f72c8c1a9c4adf5d7e84bcc78b) 578 0 R] +/Limits [(structCStreamInfo_a8a9699c8f4e00893127a7e49161bbd0d) (structCStreamInfo_ab28c53f72c8c1a9c4adf5d7e84bcc78b)] >> endobj 1126 0 obj << -/Kids [1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R] -/Limits [(page.10) (section*.4)] +/Names [(structCStreamInfo_ac1388034d207ca6075fc0883d39eea1a) 475 0 R (structCStreamInfo_ae8a7599cb585fdb0ff5446b0a6abb9c8) 579 0 R (structCStreamInfo_af5c2c8b545a6cc3e5aac82e25a2edea0) 570 0 R (structCStreamInfo_afa21b3685d93a877cab4aa884524cb67) 573 0 R (subsection.3.3.1) 46 0 R (subsection.3.3.2) 50 0 R] +/Limits [(structCStreamInfo_ac1388034d207ca6075fc0883d39eea1a) (subsection.3.3.2)] >> endobj 1127 0 obj << -/Kids [1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R] -/Limits [(section*.5) (structCStreamInfo_af5c2c8b545a6cc3e5aac82e25a2edea0)] +/Names [(subsection.3.3.3) 54 0 R (subsection.6.1.1) 82 0 R (subsection.6.1.2) 86 0 R (subsection.7.1.1) 182 0 R (subsection.7.1.2) 186 0 R (subsection.7.1.3) 218 0 R] +/Limits [(subsection.3.3.3) (subsection.7.1.3)] >> endobj 1128 0 obj << -/Kids [1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R] -/Limits [(structCStreamInfo_afa21b3685d93a877cab4aa884524cb67) (subsubsection.7.1.2.4)] +/Names [(subsection.7.1.4) 226 0 R (subsection.7.1.5) 238 0 R (subsubsection.6.1.2.1) 90 0 R (subsubsection.6.1.2.10) 126 0 R (subsubsection.6.1.2.11) 130 0 R (subsubsection.6.1.2.12) 134 0 R] +/Limits [(subsection.7.1.4) (subsubsection.6.1.2.12)] >> endobj 1129 0 obj << -/Kids [1120 0 R 1121 0 R 1122 0 R] -/Limits [(subsubsection.7.1.2.5) (subsubsection.7.1.5.9)] +/Names [(subsubsection.6.1.2.13) 138 0 R (subsubsection.6.1.2.14) 142 0 R (subsubsection.6.1.2.15) 146 0 R (subsubsection.6.1.2.16) 150 0 R (subsubsection.6.1.2.17) 154 0 R (subsubsection.6.1.2.18) 158 0 R] +/Limits [(subsubsection.6.1.2.13) (subsubsection.6.1.2.18)] >> endobj 1130 0 obj << -/Kids [1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1128 0 R] -/Limits [(Doc-Start) (subsubsection.7.1.2.4)] +/Names [(subsubsection.6.1.2.19) 162 0 R (subsubsection.6.1.2.2) 94 0 R (subsubsection.6.1.2.20) 166 0 R (subsubsection.6.1.2.21) 170 0 R (subsubsection.6.1.2.3) 98 0 R (subsubsection.6.1.2.4) 102 0 R] +/Limits [(subsubsection.6.1.2.19) (subsubsection.6.1.2.4)] >> endobj 1131 0 obj << -/Kids [1129 0 R] -/Limits [(subsubsection.7.1.2.5) (subsubsection.7.1.5.9)] +/Names [(subsubsection.6.1.2.5) 106 0 R (subsubsection.6.1.2.6) 110 0 R (subsubsection.6.1.2.7) 114 0 R (subsubsection.6.1.2.8) 118 0 R (subsubsection.6.1.2.9) 122 0 R (subsubsection.7.1.2.1) 190 0 R] +/Limits [(subsubsection.6.1.2.5) (subsubsection.7.1.2.1)] >> endobj 1132 0 obj << -/Kids [1130 0 R 1131 0 R] -/Limits [(Doc-Start) (subsubsection.7.1.5.9)] +/Names [(subsubsection.7.1.2.2) 194 0 R (subsubsection.7.1.2.3) 198 0 R (subsubsection.7.1.2.4) 202 0 R (subsubsection.7.1.2.5) 206 0 R (subsubsection.7.1.2.6) 210 0 R (subsubsection.7.1.2.7) 214 0 R] +/Limits [(subsubsection.7.1.2.2) (subsubsection.7.1.2.7)] >> endobj 1133 0 obj << -/Dests 1132 0 R +/Names [(subsubsection.7.1.3.1) 222 0 R (subsubsection.7.1.4.1) 230 0 R (subsubsection.7.1.4.2) 234 0 R (subsubsection.7.1.5.1) 242 0 R (subsubsection.7.1.5.10) 278 0 R (subsubsection.7.1.5.11) 282 0 R] +/Limits [(subsubsection.7.1.3.1) (subsubsection.7.1.5.11)] >> endobj 1134 0 obj << +/Names [(subsubsection.7.1.5.2) 246 0 R (subsubsection.7.1.5.3) 250 0 R (subsubsection.7.1.5.4) 254 0 R (subsubsection.7.1.5.5) 258 0 R (subsubsection.7.1.5.6) 262 0 R (subsubsection.7.1.5.7) 266 0 R] +/Limits [(subsubsection.7.1.5.2) (subsubsection.7.1.5.7)] +>> endobj +1135 0 obj << +/Names [(subsubsection.7.1.5.8) 270 0 R (subsubsection.7.1.5.9) 274 0 R] +/Limits [(subsubsection.7.1.5.8) (subsubsection.7.1.5.9)] +>> endobj +1136 0 obj << +/Kids [1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R] +/Limits [(Doc-Start) (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88)] +>> endobj +1137 0 obj << +/Kids [1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R] +/Limits [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a28dd853ab4339011893a933020ac5ab8) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a5bc4e4af77d94fa08beb54def8f01f7f)] +>> endobj +1138 0 obj << +/Kids [1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R] +/Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a60690e0dbc450f62f83548fa484716ab) (chapter.6)] +>> endobj +1139 0 obj << +/Kids [1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R] +/Limits [(chapter.7) (page.9)] +>> endobj +1140 0 obj << +/Kids [1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R] +/Limits [(section*.2) (structCStreamInfo_ab28c53f72c8c1a9c4adf5d7e84bcc78b)] +>> endobj +1141 0 obj << +/Kids [1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R] +/Limits [(structCStreamInfo_ac1388034d207ca6075fc0883d39eea1a) (subsubsection.7.1.2.1)] +>> endobj +1142 0 obj << +/Kids [1132 0 R 1133 0 R 1134 0 R 1135 0 R] +/Limits [(subsubsection.7.1.2.2) (subsubsection.7.1.5.9)] +>> endobj +1143 0 obj << +/Kids [1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R] +/Limits [(Doc-Start) (subsubsection.7.1.2.1)] +>> endobj +1144 0 obj << +/Kids [1142 0 R] +/Limits [(subsubsection.7.1.2.2) (subsubsection.7.1.5.9)] +>> endobj +1145 0 obj << +/Kids [1143 0 R 1144 0 R] +/Limits [(Doc-Start) (subsubsection.7.1.5.9)] +>> endobj +1146 0 obj << +/Dests 1145 0 R +>> endobj +1147 0 obj << /Type /Catalog -/Pages 1082 0 R -/Outlines 1083 0 R -/Names 1133 0 R +/Pages 1094 0 R +/Outlines 1095 0 R +/Names 1146 0 R /PageMode/UseOutlines/PageLabels<>2<>6<>]>> /OpenAction 285 0 R >> endobj -1135 0 obj << +1148 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords() -/CreationDate (D:20130815104144+02'00') -/ModDate (D:20130815104144+02'00') +/CreationDate (D:20130815104149+02'00') +/ModDate (D:20130815104149+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref -0 1136 +0 1149 0000000000 65535 f 0000000015 00000 n -0000173981 00000 n -0000461564 00000 n +0000173975 00000 n +0000463974 00000 n 0000000060 00000 n 0000000146 00000 n -0000174150 00000 n -0000461494 00000 n +0000174144 00000 n +0000463904 00000 n 0000000193 00000 n 0000000244 00000 n -0000174267 00000 n -0000461423 00000 n +0000174261 00000 n +0000463833 00000 n 0000000291 00000 n 0000000391 00000 n -0000177856 00000 n -0000461298 00000 n +0000177850 00000 n +0000463708 00000 n 0000000437 00000 n 0000000532 00000 n -0000178026 00000 n -0000461224 00000 n +0000178020 00000 n +0000463634 00000 n 0000000580 00000 n 0000000685 00000 n -0000178143 00000 n -0000461137 00000 n +0000178137 00000 n +0000463547 00000 n 0000000733 00000 n 0000000843 00000 n -0000183369 00000 n -0000461063 00000 n +0000183363 00000 n +0000463473 00000 n 0000000891 00000 n 0000000986 00000 n -0000212075 00000 n -0000460937 00000 n +0000212069 00000 n +0000463347 00000 n 0000001032 00000 n 0000001165 00000 n -0000212245 00000 n -0000460863 00000 n +0000212239 00000 n +0000463273 00000 n 0000001213 00000 n 0000001434 00000 n -0000212363 00000 n -0000460776 00000 n +0000212357 00000 n +0000463186 00000 n 0000001482 00000 n 0000001681 00000 n -0000212481 00000 n -0000460665 00000 n +0000212475 00000 n +0000463075 00000 n 0000001729 00000 n 0000001882 00000 n -0000218507 00000 n -0000460591 00000 n +0000218501 00000 n +0000463001 00000 n 0000001935 00000 n 0000001992 00000 n -0000218625 00000 n -0000460504 00000 n +0000218619 00000 n +0000462914 00000 n 0000002045 00000 n 0000002135 00000 n -0000221354 00000 n -0000460430 00000 n +0000221348 00000 n +0000462840 00000 n 0000002188 00000 n 0000002324 00000 n -0000222987 00000 n -0000460304 00000 n +0000222981 00000 n +0000462714 00000 n 0000002370 00000 n 0000002455 00000 n -0000223043 00000 n -0000460243 00000 n +0000223037 00000 n +0000462653 00000 n 0000002503 00000 n 0000002583 00000 n -0000224573 00000 n -0000460117 00000 n +0000224567 00000 n +0000462527 00000 n 0000002629 00000 n 0000002709 00000 n -0000224629 00000 n -0000460056 00000 n +0000224623 00000 n +0000462466 00000 n 0000002757 00000 n 0000002832 00000 n -0000230489 00000 n -0000459929 00000 n +0000230483 00000 n +0000462339 00000 n 0000002878 00000 n 0000003003 00000 n -0000230602 00000 n -0000459831 00000 n +0000230596 00000 n +0000462241 00000 n 0000003051 00000 n 0000003224 00000 n -0000230715 00000 n -0000459757 00000 n +0000230709 00000 n +0000462167 00000 n 0000003277 00000 n 0000003407 00000 n -0000232141 00000 n -0000459644 00000 n +0000232135 00000 n +0000462054 00000 n 0000003460 00000 n 0000003618 00000 n -0000232254 00000 n -0000459570 00000 n +0000232248 00000 n +0000461980 00000 n 0000003676 00000 n 0000003773 00000 n -0000232372 00000 n -0000459483 00000 n +0000232366 00000 n +0000461893 00000 n 0000003831 00000 n 0000003923 00000 n -0000232490 00000 n -0000459394 00000 n +0000232484 00000 n +0000461804 00000 n 0000003981 00000 n 0000004099 00000 n -0000232608 00000 n -0000459303 00000 n +0000232602 00000 n +0000461713 00000 n 0000004158 00000 n 0000004201 00000 n -0000232727 00000 n -0000459211 00000 n +0000232721 00000 n +0000461621 00000 n 0000004260 00000 n 0000004323 00000 n -0000232846 00000 n -0000459119 00000 n +0000232840 00000 n +0000461529 00000 n 0000004382 00000 n 0000004475 00000 n -0000232964 00000 n -0000459027 00000 n +0000232958 00000 n +0000461437 00000 n 0000004534 00000 n 0000004602 00000 n -0000233083 00000 n -0000458935 00000 n +0000233077 00000 n +0000461345 00000 n 0000004661 00000 n 0000004719 00000 n -0000233202 00000 n -0000458843 00000 n +0000233196 00000 n +0000461253 00000 n 0000004778 00000 n 0000004881 00000 n -0000233319 00000 n -0000458751 00000 n +0000233313 00000 n +0000461161 00000 n 0000004941 00000 n 0000004994 00000 n -0000235086 00000 n -0000458659 00000 n +0000235080 00000 n +0000461069 00000 n 0000005054 00000 n 0000005127 00000 n -0000235205 00000 n -0000458567 00000 n +0000235199 00000 n +0000460977 00000 n 0000005187 00000 n 0000005300 00000 n -0000235324 00000 n -0000458475 00000 n +0000235318 00000 n +0000460885 00000 n 0000005360 00000 n 0000005443 00000 n -0000235442 00000 n -0000458383 00000 n +0000235436 00000 n +0000460793 00000 n 0000005503 00000 n 0000005586 00000 n -0000235561 00000 n -0000458291 00000 n +0000235555 00000 n +0000460701 00000 n 0000005646 00000 n 0000005764 00000 n -0000235680 00000 n -0000458199 00000 n +0000235674 00000 n +0000460609 00000 n 0000005824 00000 n 0000005947 00000 n -0000235799 00000 n -0000458107 00000 n +0000235793 00000 n +0000460517 00000 n 0000006007 00000 n 0000006100 00000 n -0000235918 00000 n -0000458015 00000 n +0000235912 00000 n +0000460425 00000 n 0000006160 00000 n 0000006263 00000 n -0000236037 00000 n -0000457923 00000 n +0000236031 00000 n +0000460333 00000 n 0000006323 00000 n 0000006411 00000 n -0000236156 00000 n -0000457831 00000 n +0000236150 00000 n +0000460241 00000 n 0000006471 00000 n 0000006534 00000 n -0000237218 00000 n -0000457753 00000 n +0000237212 00000 n +0000460163 00000 n 0000006594 00000 n 0000006672 00000 n -0000243193 00000 n -0000457635 00000 n +0000243187 00000 n +0000460045 00000 n 0000006719 00000 n 0000006840 00000 n -0000243307 00000 n -0000457531 00000 n +0000243301 00000 n +0000459941 00000 n 0000006889 00000 n 0000007081 00000 n -0000270529 00000 n -0000457452 00000 n +0000270974 00000 n +0000459862 00000 n 0000007135 00000 n 0000007266 00000 n -0000270585 00000 n -0000457320 00000 n +0000271030 00000 n +0000459730 00000 n 0000007320 00000 n 0000007451 00000 n -0000270699 00000 n -0000457241 00000 n +0000271144 00000 n +0000459651 00000 n 0000007510 00000 n 0000007611 00000 n -0000270817 00000 n -0000457148 00000 n +0000274185 00000 n +0000459558 00000 n 0000007670 00000 n 0000007771 00000 n -0000273683 00000 n -0000457055 00000 n +0000274304 00000 n +0000459465 00000 n 0000007830 00000 n 0000007921 00000 n -0000273802 00000 n -0000456962 00000 n +0000274422 00000 n +0000459372 00000 n 0000007980 00000 n 0000008066 00000 n -0000273920 00000 n -0000456869 00000 n +0000274541 00000 n +0000459279 00000 n 0000008125 00000 n 0000008234 00000 n -0000274039 00000 n -0000456776 00000 n +0000274659 00000 n +0000459186 00000 n 0000008293 00000 n 0000008392 00000 n -0000274158 00000 n -0000456697 00000 n +0000274778 00000 n +0000459107 00000 n 0000008451 00000 n 0000008560 00000 n -0000274215 00000 n -0000456565 00000 n +0000274835 00000 n +0000458975 00000 n 0000008614 00000 n 0000008750 00000 n -0000274329 00000 n -0000456500 00000 n +0000274949 00000 n +0000458910 00000 n 0000008809 00000 n 0000008925 00000 n -0000274386 00000 n -0000456368 00000 n +0000275006 00000 n +0000458778 00000 n 0000008979 00000 n 0000009163 00000 n -0000274500 00000 n -0000456289 00000 n +0000275120 00000 n +0000458699 00000 n 0000009222 00000 n 0000009341 00000 n -0000283385 00000 n -0000456210 00000 n +0000283188 00000 n +0000458620 00000 n 0000009400 00000 n 0000009491 00000 n -0000288227 00000 n -0000456091 00000 n +0000290670 00000 n +0000458501 00000 n 0000009545 00000 n 0000009686 00000 n -0000288341 00000 n -0000456012 00000 n +0000290784 00000 n +0000458422 00000 n 0000009745 00000 n 0000009881 00000 n -0000290157 00000 n -0000455919 00000 n +0000290898 00000 n +0000458329 00000 n 0000009940 00000 n 0000010081 00000 n -0000290271 00000 n -0000455826 00000 n +0000291012 00000 n +0000458236 00000 n 0000010140 00000 n 0000010251 00000 n -0000290385 00000 n -0000455733 00000 n +0000293416 00000 n +0000458143 00000 n 0000010310 00000 n 0000010441 00000 n -0000292870 00000 n -0000455640 00000 n +0000293530 00000 n +0000458050 00000 n 0000010500 00000 n 0000010641 00000 n -0000292984 00000 n -0000455547 00000 n +0000293644 00000 n +0000457957 00000 n 0000010700 00000 n 0000010806 00000 n -0000293097 00000 n -0000455454 00000 n +0000295921 00000 n +0000457864 00000 n 0000010865 00000 n 0000011011 00000 n -0000294868 00000 n -0000455361 00000 n +0000296035 00000 n +0000457771 00000 n 0000011070 00000 n 0000011206 00000 n -0000294981 00000 n -0000455268 00000 n +0000296149 00000 n +0000457678 00000 n 0000011265 00000 n 0000011416 00000 n -0000295095 00000 n -0000455175 00000 n +0000297361 00000 n +0000457585 00000 n 0000011476 00000 n 0000011582 00000 n -0000296128 00000 n -0000455096 00000 n +0000297475 00000 n +0000457506 00000 n 0000011642 00000 n 0000011768 00000 n 0000012855 00000 n @@ -7783,9 +7867,9 @@ xref 0000156440 00000 n 0000011820 00000 n 0000156383 00000 n -0000453224 00000 n -0000453580 00000 n -0000453936 00000 n +0000455634 00000 n +0000455990 00000 n +0000456346 00000 n 0000124715 00000 n 0000156780 00000 n 0000156661 00000 n @@ -7815,823 +7899,836 @@ xref 0000161450 00000 n 0000161614 00000 n 0000161774 00000 n -0000163584 00000 n +0000163580 00000 n 0000161994 00000 n 0000157734 00000 n 0000156821 00000 n 0000161937 00000 n -0000163748 00000 n -0000163912 00000 n -0000164076 00000 n -0000164240 00000 n -0000164402 00000 n -0000164566 00000 n -0000164731 00000 n -0000164894 00000 n -0000165059 00000 n -0000165224 00000 n -0000165389 00000 n -0000165554 00000 n -0000165719 00000 n -0000165884 00000 n -0000166048 00000 n -0000166213 00000 n -0000166377 00000 n -0000166542 00000 n -0000166693 00000 n -0000166847 00000 n -0000167006 00000 n -0000167165 00000 n -0000167329 00000 n -0000167493 00000 n -0000167656 00000 n -0000167820 00000 n -0000167984 00000 n -0000168147 00000 n -0000168311 00000 n -0000168470 00000 n -0000168634 00000 n -0000168793 00000 n -0000168957 00000 n -0000169121 00000 n -0000169280 00000 n -0000170250 00000 n -0000169443 00000 n -0000163165 00000 n +0000163744 00000 n +0000163908 00000 n +0000164072 00000 n +0000164236 00000 n +0000164398 00000 n +0000164562 00000 n +0000164727 00000 n +0000164890 00000 n +0000165055 00000 n +0000165220 00000 n +0000165385 00000 n +0000165550 00000 n +0000165715 00000 n +0000165880 00000 n +0000166044 00000 n +0000166209 00000 n +0000166373 00000 n +0000166538 00000 n +0000166689 00000 n +0000166843 00000 n +0000167002 00000 n +0000167161 00000 n +0000167325 00000 n +0000167489 00000 n +0000167652 00000 n +0000167816 00000 n +0000167980 00000 n +0000168143 00000 n +0000168307 00000 n +0000168466 00000 n +0000168630 00000 n +0000168789 00000 n +0000168953 00000 n +0000169117 00000 n +0000169276 00000 n +0000170244 00000 n +0000169439 00000 n +0000163161 00000 n 0000162079 00000 n -0000170414 00000 n -0000170578 00000 n -0000170741 00000 n -0000170904 00000 n -0000171068 00000 n -0000171231 00000 n -0000171395 00000 n -0000171559 00000 n -0000171724 00000 n -0000171889 00000 n -0000170039 00000 n -0000169528 00000 n -0000172193 00000 n -0000172074 00000 n -0000171974 00000 n -0000174323 00000 n -0000173806 00000 n -0000172234 00000 n -0000173925 00000 n -0000174036 00000 n -0000174093 00000 n -0000174205 00000 n -0000454054 00000 n -0000174810 00000 n -0000174635 00000 n -0000174408 00000 n -0000174754 00000 n -0000177060 00000 n -0000177220 00000 n -0000177414 00000 n -0000177607 00000 n -0000181156 00000 n -0000181351 00000 n -0000181804 00000 n -0000178370 00000 n -0000176897 00000 n -0000174882 00000 n -0000177800 00000 n -0000177912 00000 n -0000177969 00000 n -0000178082 00000 n -0000178199 00000 n -0000453050 00000 n -0000178256 00000 n -0000178313 00000 n -0000243250 00000 n -0000295038 00000 n -0000290328 00000 n -0000290441 00000 n -0000181998 00000 n -0000182193 00000 n -0000182388 00000 n -0000182582 00000 n -0000182777 00000 n -0000184759 00000 n -0000183425 00000 n -0000180938 00000 n -0000178468 00000 n -0000182972 00000 n -0000183028 00000 n -0000181578 00000 n -0000183085 00000 n -0000183141 00000 n -0000183198 00000 n -0000183255 00000 n -0000183312 00000 n -0000274867 00000 n -0000292927 00000 n -0000294924 00000 n -0000290214 00000 n -0000207640 00000 n -0000184625 00000 n -0000183523 00000 n -0000207522 00000 n -0000207578 00000 n -0000452906 00000 n -0000452472 00000 n -0000452617 00000 n -0000452761 00000 n -0000197648 00000 n -0000208217 00000 n -0000208042 00000 n -0000207812 00000 n -0000208161 00000 n -0000210279 00000 n -0000210438 00000 n -0000210823 00000 n -0000211051 00000 n -0000211278 00000 n -0000211473 00000 n -0000211666 00000 n -0000211825 00000 n -0000214552 00000 n -0000214779 00000 n -0000215233 00000 n -0000212598 00000 n -0000210076 00000 n -0000208289 00000 n -0000212019 00000 n -0000212131 00000 n -0000212188 00000 n -0000210631 00000 n -0000212301 00000 n -0000212419 00000 n -0000212537 00000 n -0000454172 00000 n -0000230545 00000 n -0000235380 00000 n -0000283442 00000 n -0000283566 00000 n -0000295152 00000 n -0000215393 00000 n -0000215586 00000 n -0000215779 00000 n -0000215970 00000 n -0000216196 00000 n -0000216388 00000 n -0000216616 00000 n -0000217070 00000 n -0000217228 00000 n -0000217420 00000 n -0000217613 00000 n -0000217805 00000 n -0000218032 00000 n -0000218260 00000 n -0000219878 00000 n -0000220106 00000 n -0000220561 00000 n -0000218742 00000 n -0000214269 00000 n -0000212683 00000 n -0000218451 00000 n -0000215006 00000 n -0000218563 00000 n -0000216844 00000 n -0000218681 00000 n -0000235975 00000 n -0000235856 00000 n -0000233376 00000 n -0000220721 00000 n -0000220914 00000 n -0000221107 00000 n -0000221410 00000 n -0000219691 00000 n -0000218840 00000 n -0000221298 00000 n -0000220334 00000 n -0000221916 00000 n -0000221741 00000 n -0000221508 00000 n -0000221860 00000 n -0000222617 00000 n -0000222777 00000 n -0000223099 00000 n -0000222470 00000 n -0000221988 00000 n -0000222931 00000 n -0000223587 00000 n -0000223412 00000 n -0000223184 00000 n -0000223531 00000 n -0000224202 00000 n -0000224363 00000 n -0000224685 00000 n -0000224055 00000 n -0000223659 00000 n -0000224517 00000 n -0000454290 00000 n -0000225171 00000 n -0000224996 00000 n -0000224770 00000 n -0000225115 00000 n -0000226372 00000 n -0000226566 00000 n -0000226760 00000 n -0000226954 00000 n -0000227147 00000 n -0000227340 00000 n -0000227533 00000 n -0000227726 00000 n -0000227920 00000 n -0000228113 00000 n -0000228307 00000 n -0000228500 00000 n -0000228694 00000 n -0000228888 00000 n -0000229081 00000 n -0000229275 00000 n -0000229467 00000 n -0000229660 00000 n -0000229853 00000 n -0000230047 00000 n -0000230240 00000 n -0000230771 00000 n -0000226073 00000 n -0000225243 00000 n -0000230433 00000 n -0000230658 00000 n -0000236213 00000 n -0000232310 00000 n -0000236094 00000 n -0000232546 00000 n -0000232784 00000 n -0000232665 00000 n -0000232428 00000 n -0000232197 00000 n -0000233021 00000 n -0000233140 00000 n -0000233259 00000 n -0000232902 00000 n -0000235499 00000 n -0000235737 00000 n -0000235262 00000 n -0000235618 00000 n -0000235143 00000 n -0000233437 00000 n -0000231966 00000 n -0000230895 00000 n -0000232085 00000 n -0000234835 00000 n -0000236274 00000 n -0000234696 00000 n -0000233522 00000 n -0000235030 00000 n -0000237003 00000 n -0000237275 00000 n -0000236864 00000 n -0000236385 00000 n -0000237162 00000 n -0000238321 00000 n -0000242716 00000 n -0000242783 00000 n -0000242943 00000 n -0000245176 00000 n -0000243478 00000 n -0000238159 00000 n -0000237361 00000 n -0000243137 00000 n -0000243364 00000 n -0000453756 00000 n -0000243421 00000 n -0000454408 00000 n -0000239231 00000 n -0000239361 00000 n -0000239501 00000 n -0000239788 00000 n -0000240193 00000 n -0000240397 00000 n -0000240418 00000 n -0000242694 00000 n -0000273977 00000 n -0000245371 00000 n -0000245566 00000 n -0000245761 00000 n -0000245955 00000 n -0000246150 00000 n -0000246345 00000 n -0000246540 00000 n -0000246735 00000 n -0000246961 00000 n -0000247188 00000 n -0000247415 00000 n -0000247639 00000 n -0000247866 00000 n -0000248093 00000 n -0000248319 00000 n -0000248546 00000 n -0000248771 00000 n -0000248998 00000 n -0000249225 00000 n -0000249449 00000 n -0000249676 00000 n -0000249903 00000 n -0000250129 00000 n -0000250356 00000 n -0000250583 00000 n -0000250810 00000 n -0000251037 00000 n -0000251264 00000 n -0000251491 00000 n -0000251718 00000 n -0000251944 00000 n -0000252170 00000 n -0000252397 00000 n -0000252623 00000 n -0000252850 00000 n -0000255063 00000 n -0000255290 00000 n -0000255516 00000 n -0000253246 00000 n -0000244757 00000 n -0000243630 00000 n -0000253076 00000 n -0000253132 00000 n -0000253189 00000 n -0000273858 00000 n -0000274096 00000 n -0000270756 00000 n -0000270874 00000 n -0000273740 00000 n -0000270642 00000 n -0000274272 00000 n -0000274443 00000 n -0000274557 00000 n -0000274619 00000 n -0000274681 00000 n -0000274743 00000 n -0000274805 00000 n -0000274929 00000 n -0000274991 00000 n -0000277595 00000 n -0000277657 00000 n -0000277719 00000 n -0000277781 00000 n -0000277843 00000 n -0000277905 00000 n -0000277967 00000 n -0000278029 00000 n -0000278091 00000 n -0000278153 00000 n -0000278215 00000 n -0000278276 00000 n -0000278338 00000 n -0000278400 00000 n -0000278462 00000 n -0000278524 00000 n -0000278586 00000 n -0000278648 00000 n -0000278710 00000 n -0000278772 00000 n -0000255742 00000 n -0000255969 00000 n -0000256195 00000 n -0000256422 00000 n -0000256649 00000 n -0000256876 00000 n -0000257103 00000 n -0000257330 00000 n -0000257556 00000 n -0000257783 00000 n -0000257977 00000 n -0000258204 00000 n -0000258431 00000 n -0000258658 00000 n -0000258885 00000 n -0000259112 00000 n -0000259339 00000 n -0000259566 00000 n -0000259792 00000 n -0000260017 00000 n -0000260244 00000 n -0000260471 00000 n -0000260698 00000 n -0000260925 00000 n -0000261119 00000 n -0000261314 00000 n -0000261507 00000 n -0000261702 00000 n -0000261897 00000 n -0000262090 00000 n -0000262285 00000 n -0000262479 00000 n -0000262868 00000 n -0000265679 00000 n -0000265874 00000 n -0000266069 00000 n -0000263176 00000 n -0000254636 00000 n -0000253357 00000 n -0000263063 00000 n -0000263119 00000 n -0000262674 00000 n -0000278834 00000 n -0000278896 00000 n -0000278958 00000 n -0000279020 00000 n -0000279082 00000 n -0000279144 00000 n -0000279206 00000 n -0000279268 00000 n -0000279330 00000 n -0000279392 00000 n -0000279454 00000 n -0000279516 00000 n -0000279578 00000 n -0000283504 00000 n -0000283628 00000 n -0000283690 00000 n -0000287732 00000 n -0000287794 00000 n -0000287856 00000 n -0000287918 00000 n -0000287980 00000 n -0000288042 00000 n -0000288104 00000 n -0000288165 00000 n -0000290100 00000 n -0000288284 00000 n -0000266458 00000 n -0000266653 00000 n -0000266848 00000 n -0000267043 00000 n -0000267238 00000 n -0000267431 00000 n -0000267625 00000 n -0000267819 00000 n -0000268014 00000 n -0000268209 00000 n -0000268404 00000 n -0000268793 00000 n -0000268988 00000 n -0000269183 00000 n -0000269343 00000 n -0000269536 00000 n -0000269731 00000 n -0000269889 00000 n -0000270084 00000 n -0000270279 00000 n -0000272849 00000 n -0000270935 00000 n -0000265348 00000 n -0000263287 00000 n -0000270473 00000 n -0000266264 00000 n -0000268599 00000 n -0000293040 00000 n -0000294811 00000 n -0000273044 00000 n -0000273238 00000 n -0000275052 00000 n -0000272686 00000 n -0000271046 00000 n -0000273627 00000 n -0000453400 00000 n -0000273433 00000 n -0000279634 00000 n -0000277420 00000 n -0000275176 00000 n -0000277539 00000 n -0000282260 00000 n -0000282715 00000 n -0000282908 00000 n -0000283101 00000 n -0000286764 00000 n -0000283752 00000 n -0000282089 00000 n -0000279732 00000 n -0000283329 00000 n -0000282487 00000 n -0000454526 00000 n -0000287220 00000 n -0000288398 00000 n -0000286601 00000 n -0000283863 00000 n -0000287676 00000 n -0000286992 00000 n -0000287448 00000 n -0000290497 00000 n -0000289925 00000 n -0000288509 00000 n -0000290044 00000 n -0000293154 00000 n -0000292695 00000 n +0000170408 00000 n +0000170572 00000 n +0000170735 00000 n +0000170898 00000 n +0000171062 00000 n +0000171225 00000 n +0000171389 00000 n +0000171553 00000 n +0000171718 00000 n +0000171883 00000 n +0000170033 00000 n +0000169524 00000 n +0000172187 00000 n +0000172068 00000 n +0000171968 00000 n +0000174317 00000 n +0000173800 00000 n +0000172228 00000 n +0000173919 00000 n +0000174030 00000 n +0000174087 00000 n +0000174199 00000 n +0000456464 00000 n +0000174804 00000 n +0000174629 00000 n +0000174402 00000 n +0000174748 00000 n +0000177054 00000 n +0000177214 00000 n +0000177408 00000 n +0000177601 00000 n +0000181150 00000 n +0000181345 00000 n +0000181798 00000 n +0000178364 00000 n +0000176891 00000 n +0000174876 00000 n +0000177794 00000 n +0000177906 00000 n +0000177963 00000 n +0000178076 00000 n +0000178193 00000 n +0000455460 00000 n +0000178250 00000 n +0000178307 00000 n +0000243244 00000 n +0000296206 00000 n +0000291069 00000 n +0000293473 00000 n +0000181992 00000 n +0000182187 00000 n +0000182382 00000 n +0000182576 00000 n +0000182771 00000 n +0000184753 00000 n +0000183419 00000 n +0000180932 00000 n +0000178462 00000 n +0000182966 00000 n +0000183022 00000 n +0000181572 00000 n +0000183079 00000 n +0000183135 00000 n +0000183192 00000 n +0000183249 00000 n +0000183306 00000 n +0000277860 00000 n +0000293587 00000 n +0000296092 00000 n +0000290955 00000 n +0000207634 00000 n +0000184619 00000 n +0000183517 00000 n +0000207516 00000 n +0000207572 00000 n +0000455316 00000 n +0000454882 00000 n +0000455027 00000 n +0000455171 00000 n +0000197642 00000 n +0000208211 00000 n +0000208036 00000 n +0000207806 00000 n +0000208155 00000 n +0000210273 00000 n +0000210432 00000 n +0000210817 00000 n +0000211045 00000 n +0000211272 00000 n +0000211467 00000 n +0000211660 00000 n +0000211819 00000 n +0000214546 00000 n +0000214773 00000 n +0000215227 00000 n +0000212592 00000 n +0000210070 00000 n +0000208283 00000 n +0000212013 00000 n +0000212125 00000 n +0000212182 00000 n +0000210625 00000 n +0000212295 00000 n +0000212413 00000 n +0000212531 00000 n +0000456582 00000 n +0000230539 00000 n +0000235374 00000 n +0000283244 00000 n +0000283368 00000 n +0000297418 00000 n +0000215387 00000 n +0000215580 00000 n +0000215773 00000 n +0000215964 00000 n +0000216190 00000 n +0000216382 00000 n +0000216610 00000 n +0000217064 00000 n +0000217222 00000 n +0000217414 00000 n +0000217607 00000 n +0000217799 00000 n +0000218026 00000 n +0000218254 00000 n +0000219872 00000 n +0000220100 00000 n +0000220555 00000 n +0000218736 00000 n +0000214263 00000 n +0000212677 00000 n +0000218445 00000 n +0000215000 00000 n +0000218557 00000 n +0000216838 00000 n +0000218675 00000 n +0000235969 00000 n +0000235850 00000 n +0000233370 00000 n +0000220715 00000 n +0000220908 00000 n +0000221101 00000 n +0000221404 00000 n +0000219685 00000 n +0000218834 00000 n +0000221292 00000 n +0000220328 00000 n +0000221910 00000 n +0000221735 00000 n +0000221502 00000 n +0000221854 00000 n +0000222611 00000 n +0000222771 00000 n +0000223093 00000 n +0000222464 00000 n +0000221982 00000 n +0000222925 00000 n +0000223581 00000 n +0000223406 00000 n +0000223178 00000 n +0000223525 00000 n +0000224196 00000 n +0000224357 00000 n +0000224679 00000 n +0000224049 00000 n +0000223653 00000 n +0000224511 00000 n +0000456700 00000 n +0000225165 00000 n +0000224990 00000 n +0000224764 00000 n +0000225109 00000 n +0000226366 00000 n +0000226560 00000 n +0000226754 00000 n +0000226948 00000 n +0000227141 00000 n +0000227334 00000 n +0000227527 00000 n +0000227720 00000 n +0000227914 00000 n +0000228107 00000 n +0000228301 00000 n +0000228494 00000 n +0000228688 00000 n +0000228882 00000 n +0000229075 00000 n +0000229269 00000 n +0000229461 00000 n +0000229654 00000 n +0000229847 00000 n +0000230041 00000 n +0000230234 00000 n +0000230765 00000 n +0000226067 00000 n +0000225237 00000 n +0000230427 00000 n +0000230652 00000 n +0000236207 00000 n +0000232304 00000 n +0000236088 00000 n +0000232540 00000 n +0000232778 00000 n +0000232659 00000 n +0000232422 00000 n +0000232191 00000 n +0000233015 00000 n +0000233134 00000 n +0000233253 00000 n +0000232896 00000 n +0000235493 00000 n +0000235731 00000 n +0000235256 00000 n +0000235612 00000 n +0000235137 00000 n +0000233431 00000 n +0000231960 00000 n +0000230889 00000 n +0000232079 00000 n +0000234829 00000 n +0000236268 00000 n +0000234690 00000 n +0000233516 00000 n +0000235024 00000 n +0000236997 00000 n +0000237269 00000 n +0000236858 00000 n +0000236379 00000 n +0000237156 00000 n +0000238315 00000 n +0000242710 00000 n +0000242777 00000 n +0000242937 00000 n +0000245170 00000 n +0000243472 00000 n +0000238153 00000 n +0000237355 00000 n +0000243131 00000 n +0000243358 00000 n +0000456166 00000 n +0000243415 00000 n +0000456818 00000 n +0000239225 00000 n +0000239355 00000 n +0000239495 00000 n +0000239782 00000 n +0000240187 00000 n +0000240391 00000 n +0000240412 00000 n +0000242688 00000 n +0000274598 00000 n +0000245365 00000 n +0000245560 00000 n +0000245755 00000 n +0000245949 00000 n +0000246144 00000 n +0000246339 00000 n +0000246534 00000 n +0000246729 00000 n +0000246955 00000 n +0000247182 00000 n +0000247409 00000 n +0000247633 00000 n +0000247860 00000 n +0000248087 00000 n +0000248313 00000 n +0000248540 00000 n +0000248765 00000 n +0000248992 00000 n +0000249219 00000 n +0000249443 00000 n +0000249670 00000 n +0000249897 00000 n +0000250123 00000 n +0000250350 00000 n +0000250577 00000 n +0000250804 00000 n +0000251031 00000 n +0000251258 00000 n +0000251485 00000 n +0000251712 00000 n +0000251938 00000 n +0000252164 00000 n +0000252391 00000 n +0000252617 00000 n +0000252844 00000 n +0000254975 00000 n +0000255202 00000 n +0000255429 00000 n +0000253240 00000 n +0000244751 00000 n +0000243624 00000 n +0000253070 00000 n +0000253126 00000 n +0000253183 00000 n +0000274479 00000 n +0000274716 00000 n +0000271201 00000 n +0000274242 00000 n +0000274360 00000 n +0000271087 00000 n +0000274892 00000 n +0000275063 00000 n +0000275177 00000 n +0000275239 00000 n +0000275301 00000 n +0000275363 00000 n +0000275425 00000 n +0000277922 00000 n +0000277984 00000 n +0000278046 00000 n +0000278108 00000 n +0000278170 00000 n +0000278232 00000 n +0000278294 00000 n +0000278356 00000 n +0000278418 00000 n +0000278480 00000 n +0000278542 00000 n +0000278604 00000 n +0000278666 00000 n +0000278728 00000 n +0000278790 00000 n +0000278852 00000 n +0000278914 00000 n +0000278976 00000 n +0000279038 00000 n +0000279100 00000 n +0000279162 00000 n +0000279222 00000 n +0000255656 00000 n +0000255883 00000 n +0000256109 00000 n +0000256336 00000 n +0000256563 00000 n +0000256790 00000 n +0000257016 00000 n +0000257241 00000 n +0000257468 00000 n +0000257695 00000 n +0000257889 00000 n +0000258115 00000 n +0000258342 00000 n +0000258568 00000 n +0000258795 00000 n +0000259022 00000 n +0000259249 00000 n +0000259476 00000 n +0000259703 00000 n +0000259930 00000 n +0000260157 00000 n +0000260383 00000 n +0000260609 00000 n +0000260836 00000 n +0000261063 00000 n +0000261290 00000 n +0000261517 00000 n +0000261711 00000 n +0000261906 00000 n +0000262099 00000 n +0000262294 00000 n +0000262489 00000 n +0000265345 00000 n +0000265540 00000 n +0000265734 00000 n +0000266123 00000 n +0000262795 00000 n +0000254564 00000 n +0000253351 00000 n +0000262682 00000 n +0000262738 00000 n +0000279284 00000 n +0000279346 00000 n +0000279408 00000 n +0000279470 00000 n +0000279532 00000 n +0000279594 00000 n +0000279656 00000 n +0000282821 00000 n +0000282883 00000 n +0000282945 00000 n +0000283007 00000 n +0000283069 00000 n +0000283131 00000 n +0000283306 00000 n +0000283430 00000 n +0000283491 00000 n +0000283552 00000 n +0000283614 00000 n +0000288304 00000 n +0000288366 00000 n +0000288428 00000 n +0000288490 00000 n +0000288552 00000 n +0000288614 00000 n +0000290484 00000 n +0000290546 00000 n 0000290608 00000 n -0000292814 00000 n -0000294436 00000 n -0000294595 00000 n -0000295208 00000 n -0000294289 00000 n -0000293265 00000 n -0000294755 00000 n -0000296185 00000 n -0000295953 00000 n -0000295319 00000 n -0000296072 00000 n -0000297612 00000 n -0000297762 00000 n -0000297911 00000 n -0000298061 00000 n -0000298211 00000 n -0000298361 00000 n -0000298511 00000 n -0000298661 00000 n -0000298811 00000 n -0000298960 00000 n -0000299110 00000 n -0000299260 00000 n -0000299410 00000 n -0000299560 00000 n -0000299710 00000 n -0000299859 00000 n -0000300009 00000 n -0000300159 00000 n -0000300309 00000 n -0000300459 00000 n -0000300609 00000 n -0000300759 00000 n -0000300908 00000 n -0000301058 00000 n -0000301208 00000 n -0000301358 00000 n -0000301508 00000 n -0000301658 00000 n -0000301808 00000 n -0000301958 00000 n -0000302108 00000 n -0000302258 00000 n -0000302408 00000 n -0000302558 00000 n -0000302708 00000 n -0000302858 00000 n -0000303007 00000 n -0000303157 00000 n -0000303307 00000 n -0000303457 00000 n -0000303606 00000 n -0000303756 00000 n -0000303906 00000 n -0000306107 00000 n -0000304112 00000 n -0000297137 00000 n -0000296283 00000 n -0000304056 00000 n -0000454644 00000 n -0000306257 00000 n -0000306407 00000 n -0000306557 00000 n -0000306706 00000 n -0000306855 00000 n -0000307005 00000 n -0000307155 00000 n -0000307305 00000 n -0000307455 00000 n -0000307605 00000 n -0000307755 00000 n -0000307905 00000 n -0000308055 00000 n -0000308205 00000 n -0000308355 00000 n -0000308505 00000 n -0000308655 00000 n -0000308804 00000 n -0000308954 00000 n -0000309103 00000 n -0000309253 00000 n -0000309402 00000 n -0000309551 00000 n -0000309701 00000 n -0000309851 00000 n -0000310001 00000 n -0000310150 00000 n -0000310300 00000 n -0000310449 00000 n -0000310599 00000 n -0000310748 00000 n -0000310898 00000 n -0000311047 00000 n -0000311197 00000 n -0000311347 00000 n -0000311497 00000 n -0000311646 00000 n -0000311796 00000 n -0000311946 00000 n -0000312096 00000 n -0000312244 00000 n -0000312394 00000 n -0000312544 00000 n -0000312693 00000 n -0000312843 00000 n -0000312992 00000 n -0000313142 00000 n -0000313292 00000 n -0000313441 00000 n -0000313591 00000 n -0000313741 00000 n -0000313891 00000 n -0000314041 00000 n -0000314191 00000 n -0000314340 00000 n -0000314490 00000 n -0000314640 00000 n -0000314790 00000 n -0000314940 00000 n -0000315090 00000 n -0000315239 00000 n -0000315389 00000 n -0000315539 00000 n -0000315689 00000 n -0000315839 00000 n -0000315989 00000 n -0000316139 00000 n -0000316287 00000 n -0000316437 00000 n -0000316587 00000 n -0000316737 00000 n -0000318729 00000 n -0000316943 00000 n -0000305400 00000 n -0000304197 00000 n -0000316887 00000 n -0000318879 00000 n -0000319029 00000 n -0000319179 00000 n -0000319329 00000 n -0000319479 00000 n -0000319629 00000 n -0000319778 00000 n -0000319928 00000 n -0000320078 00000 n -0000320228 00000 n -0000320376 00000 n -0000320526 00000 n -0000320675 00000 n -0000320825 00000 n -0000320973 00000 n -0000321123 00000 n -0000321271 00000 n -0000321419 00000 n -0000321568 00000 n -0000321718 00000 n -0000321868 00000 n -0000322017 00000 n -0000322167 00000 n -0000322317 00000 n -0000322467 00000 n -0000322614 00000 n -0000322764 00000 n -0000322914 00000 n -0000323063 00000 n -0000323213 00000 n -0000323363 00000 n -0000323513 00000 n -0000323663 00000 n -0000323813 00000 n -0000323964 00000 n -0000324114 00000 n -0000324265 00000 n -0000324416 00000 n -0000324566 00000 n -0000324717 00000 n -0000324868 00000 n -0000325019 00000 n -0000325169 00000 n -0000325319 00000 n -0000325469 00000 n -0000325620 00000 n -0000325771 00000 n -0000325921 00000 n -0000326072 00000 n -0000326223 00000 n -0000326374 00000 n -0000326524 00000 n -0000326675 00000 n -0000326826 00000 n -0000326976 00000 n -0000327127 00000 n -0000327278 00000 n -0000327428 00000 n -0000327579 00000 n -0000327730 00000 n -0000327881 00000 n -0000328032 00000 n -0000328181 00000 n -0000328332 00000 n -0000328483 00000 n -0000328633 00000 n -0000328784 00000 n -0000328935 00000 n -0000329085 00000 n -0000329236 00000 n -0000329387 00000 n -0000329538 00000 n -0000330340 00000 n -0000329746 00000 n -0000317971 00000 n -0000317028 00000 n -0000329688 00000 n -0000330491 00000 n -0000330642 00000 n -0000330792 00000 n -0000331001 00000 n -0000330170 00000 n -0000329832 00000 n -0000330943 00000 n -0000452004 00000 n -0000331087 00000 n +0000290841 00000 n +0000290727 00000 n +0000266318 00000 n +0000266513 00000 n +0000266708 00000 n +0000267097 00000 n +0000267292 00000 n +0000267487 00000 n +0000267682 00000 n +0000267877 00000 n +0000268070 00000 n +0000268264 00000 n +0000268458 00000 n +0000268653 00000 n +0000268848 00000 n +0000269043 00000 n +0000269432 00000 n +0000269627 00000 n +0000269822 00000 n +0000269982 00000 n +0000270175 00000 n +0000270370 00000 n +0000270529 00000 n +0000270724 00000 n +0000273158 00000 n +0000271261 00000 n +0000264982 00000 n +0000262906 00000 n +0000270918 00000 n +0000265929 00000 n +0000266903 00000 n +0000269238 00000 n +0000295864 00000 n +0000295978 00000 n +0000273352 00000 n +0000273547 00000 n +0000273740 00000 n +0000275487 00000 n +0000272987 00000 n +0000271372 00000 n +0000274129 00000 n +0000455810 00000 n +0000273935 00000 n +0000279717 00000 n +0000277685 00000 n +0000275611 00000 n +0000277804 00000 n +0000282310 00000 n +0000286721 00000 n +0000286915 00000 n +0000283676 00000 n +0000282163 00000 n +0000279815 00000 n +0000282765 00000 n +0000282537 00000 n +0000456936 00000 n +0000287109 00000 n +0000287337 00000 n +0000287793 00000 n +0000288676 00000 n +0000286534 00000 n +0000283787 00000 n +0000288248 00000 n +0000287565 00000 n +0000288020 00000 n +0000291125 00000 n +0000290309 00000 n +0000288774 00000 n +0000290428 00000 n +0000293701 00000 n +0000293241 00000 n +0000291236 00000 n +0000293360 00000 n +0000295490 00000 n +0000295649 00000 n +0000296262 00000 n +0000295343 00000 n +0000293812 00000 n +0000295808 00000 n +0000297532 00000 n +0000297186 00000 n +0000296373 00000 n +0000297305 00000 n +0000298972 00000 n +0000299122 00000 n +0000299271 00000 n +0000299421 00000 n +0000299571 00000 n +0000299721 00000 n +0000299871 00000 n +0000300021 00000 n +0000300171 00000 n +0000300320 00000 n +0000300470 00000 n +0000300620 00000 n +0000300770 00000 n +0000300920 00000 n +0000301070 00000 n +0000301219 00000 n +0000301369 00000 n +0000301519 00000 n +0000301669 00000 n +0000301819 00000 n +0000301969 00000 n +0000302119 00000 n +0000302268 00000 n +0000302418 00000 n +0000302568 00000 n +0000302718 00000 n +0000302868 00000 n +0000303018 00000 n +0000303168 00000 n +0000303318 00000 n +0000303468 00000 n +0000303618 00000 n +0000303768 00000 n +0000303918 00000 n +0000304068 00000 n +0000304218 00000 n +0000304367 00000 n +0000304517 00000 n +0000304667 00000 n +0000304817 00000 n +0000304966 00000 n +0000305116 00000 n +0000305266 00000 n +0000307484 00000 n +0000305472 00000 n +0000298497 00000 n +0000297630 00000 n +0000305416 00000 n +0000457054 00000 n +0000307634 00000 n +0000307784 00000 n +0000307934 00000 n +0000308083 00000 n +0000308232 00000 n +0000308382 00000 n +0000308532 00000 n +0000308682 00000 n +0000308832 00000 n +0000308982 00000 n +0000309132 00000 n +0000309282 00000 n +0000309432 00000 n +0000309582 00000 n +0000309732 00000 n +0000309882 00000 n +0000310032 00000 n +0000310182 00000 n +0000310332 00000 n +0000310482 00000 n +0000310632 00000 n +0000310782 00000 n +0000310932 00000 n +0000311082 00000 n +0000311232 00000 n +0000311380 00000 n +0000311530 00000 n +0000311679 00000 n +0000311829 00000 n +0000311977 00000 n +0000312127 00000 n +0000312277 00000 n +0000312427 00000 n +0000312576 00000 n +0000312726 00000 n +0000312876 00000 n +0000313026 00000 n +0000313176 00000 n +0000313326 00000 n +0000313475 00000 n +0000313625 00000 n +0000313774 00000 n +0000313923 00000 n +0000314073 00000 n +0000314223 00000 n +0000314372 00000 n +0000314522 00000 n +0000314671 00000 n +0000314820 00000 n +0000314970 00000 n +0000315120 00000 n +0000315269 00000 n +0000315419 00000 n +0000315569 00000 n +0000315719 00000 n +0000315869 00000 n +0000316019 00000 n +0000316168 00000 n +0000316318 00000 n +0000316467 00000 n +0000316617 00000 n +0000316766 00000 n +0000316916 00000 n +0000317066 00000 n +0000317216 00000 n +0000317366 00000 n +0000317515 00000 n +0000317664 00000 n +0000317814 00000 n +0000317964 00000 n +0000318114 00000 n +0000318264 00000 n +0000320293 00000 n +0000318469 00000 n +0000306769 00000 n +0000305557 00000 n +0000318413 00000 n +0000320443 00000 n +0000320591 00000 n +0000320741 00000 n +0000320890 00000 n +0000321039 00000 n +0000321188 00000 n +0000321338 00000 n +0000321488 00000 n +0000321638 00000 n +0000321788 00000 n +0000321938 00000 n +0000322088 00000 n +0000322238 00000 n +0000322388 00000 n +0000322538 00000 n +0000322688 00000 n +0000322838 00000 n +0000322987 00000 n +0000323137 00000 n +0000323286 00000 n +0000323436 00000 n +0000323584 00000 n +0000323733 00000 n +0000323883 00000 n +0000324033 00000 n +0000324182 00000 n +0000324333 00000 n +0000324484 00000 n +0000324635 00000 n +0000324785 00000 n +0000324934 00000 n +0000325085 00000 n +0000325236 00000 n +0000325387 00000 n +0000325537 00000 n +0000325687 00000 n +0000325837 00000 n +0000325988 00000 n +0000326138 00000 n +0000326289 00000 n +0000326440 00000 n +0000326591 00000 n +0000326742 00000 n +0000326892 00000 n +0000327042 00000 n +0000327193 00000 n +0000327344 00000 n +0000327495 00000 n +0000327645 00000 n +0000327795 00000 n +0000327946 00000 n +0000328097 00000 n +0000328247 00000 n +0000328398 00000 n +0000328549 00000 n +0000328699 00000 n +0000328850 00000 n +0000329000 00000 n +0000329151 00000 n +0000329301 00000 n +0000329452 00000 n +0000329603 00000 n +0000329754 00000 n +0000329905 00000 n +0000330056 00000 n +0000330207 00000 n +0000330358 00000 n +0000330509 00000 n +0000330660 00000 n +0000330811 00000 n +0000330962 00000 n +0000331113 00000 n +0000331264 00000 n +0000332145 00000 n +0000331473 00000 n +0000319519 00000 n +0000318554 00000 n +0000331415 00000 n +0000332296 00000 n +0000332447 00000 n +0000332598 00000 n +0000332749 00000 n +0000332900 00000 n +0000333051 00000 n +0000333202 00000 n +0000333411 00000 n +0000331939 00000 n 0000331559 00000 n -0000332035 00000 n -0000332636 00000 n -0000332720 00000 n -0000332918 00000 n -0000332944 00000 n -0000333324 00000 n -0000334203 00000 n -0000334681 00000 n -0000345366 00000 n -0000345631 00000 n -0000355014 00000 n -0000355284 00000 n -0000362478 00000 n -0000362717 00000 n -0000369746 00000 n -0000369978 00000 n -0000384546 00000 n -0000384975 00000 n -0000402330 00000 n -0000402807 00000 n -0000416889 00000 n -0000417265 00000 n -0000437244 00000 n -0000437842 00000 n -0000451612 00000 n -0000454748 00000 n -0000454868 00000 n -0000454947 00000 n -0000455020 00000 n -0000461673 00000 n -0000461859 00000 n -0000462022 00000 n -0000462280 00000 n -0000462611 00000 n -0000463142 00000 n -0000463673 00000 n -0000464468 00000 n -0000465263 00000 n -0000465860 00000 n -0000466490 00000 n -0000467285 00000 n -0000468080 00000 n -0000468875 00000 n -0000469670 00000 n -0000470465 00000 n -0000471260 00000 n -0000471672 00000 n -0000471851 00000 n -0000472022 00000 n -0000472192 00000 n -0000472363 00000 n -0000472533 00000 n -0000472702 00000 n -0000472881 00000 n -0000473076 00000 n -0000473273 00000 n -0000473600 00000 n -0000474123 00000 n -0000474646 00000 n -0000475169 00000 n -0000475477 00000 n -0000475729 00000 n -0000476020 00000 n -0000476309 00000 n -0000476593 00000 n -0000476876 00000 n -0000477159 00000 n -0000477444 00000 n -0000477695 00000 n -0000477858 00000 n -0000478130 00000 n -0000478323 00000 n -0000478442 00000 n -0000478605 00000 n -0000478779 00000 n -0000478896 00000 n -0000479028 00000 n -0000479127 00000 n -0000479223 00000 n -0000479263 00000 n -0000479444 00000 n +0000333353 00000 n +0000454414 00000 n +0000333497 00000 n +0000333969 00000 n +0000334445 00000 n +0000335046 00000 n +0000335130 00000 n +0000335328 00000 n +0000335354 00000 n +0000335734 00000 n +0000336613 00000 n +0000337091 00000 n +0000347776 00000 n +0000348041 00000 n +0000357424 00000 n +0000357694 00000 n +0000364888 00000 n +0000365127 00000 n +0000372156 00000 n +0000372388 00000 n +0000386956 00000 n +0000387385 00000 n +0000404740 00000 n +0000405217 00000 n +0000419299 00000 n +0000419675 00000 n +0000439654 00000 n +0000440252 00000 n +0000454022 00000 n +0000457158 00000 n +0000457278 00000 n +0000457357 00000 n +0000457430 00000 n +0000464083 00000 n +0000464269 00000 n +0000464432 00000 n +0000464690 00000 n +0000465021 00000 n +0000465552 00000 n +0000466083 00000 n +0000466878 00000 n +0000467673 00000 n +0000468369 00000 n +0000468900 00000 n +0000469629 00000 n +0000470424 00000 n +0000471219 00000 n +0000472014 00000 n +0000472809 00000 n +0000473604 00000 n +0000474249 00000 n +0000474429 00000 n +0000474606 00000 n +0000474777 00000 n +0000474947 00000 n +0000475118 00000 n +0000475289 00000 n +0000475452 00000 n +0000475647 00000 n +0000475843 00000 n +0000476041 00000 n +0000476496 00000 n +0000477019 00000 n +0000477542 00000 n +0000477958 00000 n +0000478198 00000 n +0000478469 00000 n +0000478760 00000 n +0000479045 00000 n +0000479328 00000 n +0000479611 00000 n +0000479897 00000 n +0000480180 00000 n +0000480335 00000 n +0000480498 00000 n +0000480770 00000 n +0000480966 00000 n +0000481083 00000 n +0000481246 00000 n +0000481420 00000 n +0000481546 00000 n +0000481678 00000 n +0000481777 00000 n +0000481873 00000 n +0000481913 00000 n +0000482094 00000 n trailer -<< /Size 1136 -/Root 1134 0 R -/Info 1135 0 R -/ID [<33DE22F3062993CAE4ECB2B2ECC0D2C2> <33DE22F3062993CAE4ECB2B2ECC0D2C2>] >> +<< /Size 1149 +/Root 1147 0 R +/Info 1148 0 R +/ID [ ] >> startxref -479771 +482421 %%EOF diff --git a/libAACdec/include/aacdecoder_lib.h b/libAACdec/include/aacdecoder_lib.h index 0253c5c..a281ab9 100644 --- a/libAACdec/include/aacdecoder_lib.h +++ b/libAACdec/include/aacdecoder_lib.h @@ -436,6 +436,16 @@ typedef enum 2: Create a dual mono output signal from channel 2. \n 3: Create a dual mono output signal by mixing both channels (L' = R' = 0.5*Ch1 + 0.5*Ch2). */ AAC_PCM_OUTPUT_CHANNEL_MAPPING = 0x0003, /*!< Output buffer channel ordering. 0: MPEG PCE style order, 1: WAV file channel order (default). */ + AAC_PCM_LIMITER_ENABLE = 0x0004, /*!< Enable signal level limiting. \n + -1: Auto-config. Enable limiter for all non-lowdelay configurations by default. \n + 0: Disable limiter in general. \n + 1: Enable limiter always. + It is recommended to call the decoder with a AACDEC_CLRHIST flag to reset all states when + the limiter switch is changed explicitly. */ + AAC_PCM_LIMITER_ATTACK_TIME = 0x0005, /*!< Signal level limiting attack time in ms. + Default confguration is 15 ms. Adjustable range from 1 ms to 15 ms. */ + AAC_PCM_LIMITER_RELEAS_TIME = 0x0006, /*!< Signal level limiting release time in ms. + Default configuration is 50 ms. Adjustable time must be larger than 0 ms. */ AAC_PCM_MIN_OUTPUT_CHANNELS = 0x0011, /*!< Minimum number of PCM output channels. If higher than the number of encoded audio channels, a simple channel extension is applied. \n -1, 0: Disable channel extenstion feature. The decoder output contains the same number of diff --git a/libAACdec/src/aacdec_drc.cpp b/libAACdec/src/aacdec_drc.cpp index bc74ddf..ba7419d 100644 --- a/libAACdec/src/aacdec_drc.cpp +++ b/libAACdec/src/aacdec_drc.cpp @@ -130,7 +130,6 @@ void aacDecoder_drcInit ( /* init control fields */ self->enable = 0; self->numThreads = 0; - self->digitalNorm = 0; /* init params */ pParams = &self->params; @@ -139,8 +138,9 @@ void aacDecoder_drcInit ( pParams->usrCut = FL2FXCONST_DBL(0.0f); pParams->boost = FL2FXCONST_DBL(0.0f); pParams->usrBoost = FL2FXCONST_DBL(0.0f); - pParams->targetRefLevel = AACDEC_DRC_DEFAULT_REF_LEVEL; + pParams->targetRefLevel = -1; pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES; + pParams->applyDigitalNorm = 0; pParams->applyHeavyCompression = 0; /* initial program ref level = target ref level */ @@ -222,11 +222,12 @@ AAC_DECODER_ERROR aacDecoder_drcSetParam ( return AAC_DEC_INVALID_HANDLE; } if (value < 0) { - self->digitalNorm = 0; + self->params.applyDigitalNorm = 0; + self->params.targetRefLevel = -1; } else { /* ref_level must be between 0 and MAX_REFERENCE_LEVEL, inclusive */ - self->digitalNorm = 1; + self->params.applyDigitalNorm = 1; if (self->params.targetRefLevel != (SCHAR)value) { self->params.targetRefLevel = (SCHAR)value; self->progRefLevel = (SCHAR)value; /* Always set the program reference level equal to the @@ -234,6 +235,16 @@ AAC_DECODER_ERROR aacDecoder_drcSetParam ( } } break; + case APPLY_NORMALIZATION: + if (value < 0 || value > 1) { + return AAC_DEC_SET_PARAM_FAIL; + } + if (self == NULL) { + return AAC_DEC_INVALID_HANDLE; + } + /* Store new parameter value */ + self->params.applyDigitalNorm = (UCHAR)value; + break; case APPLY_HEAVY_COMPRESSION: if (value < 0 || value > 1) { return AAC_DEC_SET_PARAM_FAIL; @@ -278,7 +289,7 @@ AAC_DECODER_ERROR aacDecoder_drcSetParam ( self->enable = ( (self->params.boost > (FIXP_DBL)0) || (self->params.cut > (FIXP_DBL)0) || (self->params.applyHeavyCompression != 0) - || (self->digitalNorm == 1) ); + || (self->params.targetRefLevel >= 0) ); return ErrorStatus; @@ -827,6 +838,7 @@ void aacDecoder_drcApply ( void *pSbrDec, CAacDecoderChannelInfo *pAacDecoderChannelInfo, CDrcChannelData *pDrcChData, + FIXP_DBL *extGain, int ch, /* needed only for SBR */ int aacFrameSize, int bSbrPresent ) @@ -838,8 +850,8 @@ void aacDecoder_drcApply ( FIXP_DBL max_mantissa; INT max_exponent; - FIXP_DBL norm_mantissa = FL2FXCONST_DBL(0.0f); - INT norm_exponent = 0; + FIXP_DBL norm_mantissa = FL2FXCONST_DBL(0.5f); + INT norm_exponent = 1; FIXP_DBL fact_mantissa[MAX_DRC_BANDS]; INT fact_exponent[MAX_DRC_BANDS]; @@ -861,6 +873,15 @@ void aacDecoder_drcApply ( if (!self->enable) { sbrDecoder_drcDisable( (HANDLE_SBRDECODER)pSbrDec, ch ); + if (extGain != NULL) { + INT gainScale = (INT)*extGain; + /* The gain scaling must be passed to the function in the buffer pointed on by extGain. */ + if (gainScale >= 0 && gainScale <= DFRACT_BITS) { + *extGain = scaleValue(norm_mantissa, norm_exponent-gainScale); + } else { + FDK_ASSERT(0); + } + } return; } @@ -876,7 +897,7 @@ void aacDecoder_drcApply ( reduced DAC SNR (if signal is attenuated) or clipping (if signal is boosted) */ - if (self->digitalNorm == 1) + if (pParams->targetRefLevel >= 0) { /* 0.5^((targetRefLevel - progRefLevel)/24) */ norm_mantissa = fLdPow( @@ -886,7 +907,18 @@ void aacDecoder_drcApply ( 3, &norm_exponent ); } - else { + /* Always export the normalization gain (if possible). */ + if (extGain != NULL) { + INT gainScale = (INT)*extGain; + /* The gain scaling must be passed to the function in the buffer pointed on by extGain. */ + if (gainScale >= 0 && gainScale <= DFRACT_BITS) { + *extGain = scaleValue(norm_mantissa, norm_exponent-gainScale); + } else { + FDK_ASSERT(0); + } + } + if (self->params.applyDigitalNorm == 0) { + /* Reset normalization gain since this module must not apply it */ norm_mantissa = FL2FXCONST_DBL(0.5f); norm_exponent = 1; } diff --git a/libAACdec/src/aacdec_drc.h b/libAACdec/src/aacdec_drc.h index 2ebae2c..41aac69 100644 --- a/libAACdec/src/aacdec_drc.h +++ b/libAACdec/src/aacdec_drc.h @@ -98,7 +98,6 @@ amm-info@iis.fraunhofer.de #include "channel.h" #include "FDK_bitstream.h" -#define AACDEC_DRC_DEFAULT_REF_LEVEL ( 108 ) /* -27 dB below full scale (typical for movies) */ #define AACDEC_DRC_DFLT_EXPIRY_FRAMES ( 50 ) /* Default DRC data expiry time in AAC frames */ /** @@ -111,6 +110,7 @@ typedef enum TARGET_REF_LEVEL, DRC_BS_DELAY, DRC_DATA_EXPIRY_FRAME, + APPLY_NORMALIZATION, APPLY_HEAVY_COMPRESSION } AACDEC_DRC_PARAM; @@ -149,6 +149,8 @@ int aacDecoder_drcProlog ( * \param pSbrDec pointer to SBR decoder instance * \param pAacDecoderChannelInfo AAC decoder channel instance to be processed * \param pDrcDat DRC channel data + * \param extGain Pointer to a FIXP_DBL where a externally applyable gain will be stored into (independently on whether it will be apply internally or not). + * At function call the buffer must hold the scale (0 >= scale < DFRACT_BITS) to be applied on the gain value. * \param ch channel index * \param aacFrameSize AAC frame size * \param bSbrPresent flag indicating that SBR is present, in which case DRC is handed over to the SBR instance pSbrDec @@ -158,6 +160,7 @@ void aacDecoder_drcApply ( void *pSbrDec, CAacDecoderChannelInfo *pAacDecoderChannelInfo, CDrcChannelData *pDrcDat, + FIXP_DBL *extGain, int ch, int aacFrameSize, int bSbrPresent ); diff --git a/libAACdec/src/aacdec_drc_types.h b/libAACdec/src/aacdec_drc_types.h index 1b5cd76..1f595b9 100644 --- a/libAACdec/src/aacdec_drc_types.h +++ b/libAACdec/src/aacdec_drc_types.h @@ -140,6 +140,7 @@ typedef struct UINT expiryFrame; SCHAR targetRefLevel; UCHAR bsDelayEnable; + UCHAR applyDigitalNorm; UCHAR applyHeavyCompression; } CDrcParams; diff --git a/libAACdec/src/aacdecoder.cpp b/libAACdec/src/aacdecoder.cpp index 7903f76..18c9afa 100644 --- a/libAACdec/src/aacdecoder.cpp +++ b/libAACdec/src/aacdecoder.cpp @@ -1653,6 +1653,8 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( { int stride, offset, c; + /* Turn on/off DRC modules level normalization in digital domain depending on the limiter status. */ + aacDecoder_drcSetParam( self->hDrcInfo, APPLY_NORMALIZATION, (self->limiterEnableCurr) ? 0 : 1 ); /* Extract DRC control data and map it to channels (without bitstream delay) */ aacDecoder_drcProlog ( self->hDrcInfo, @@ -1703,12 +1705,15 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( /* Reset DRC control data for this channel */ aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[c]->drcData ); } + /* The DRC module demands to be called with the gain field holding the gain scale. */ + self->extGain[0] = (FIXP_DBL)TDL_GAIN_SCALING; /* DRC processing */ aacDecoder_drcApply ( self->hDrcInfo, self->hSbrDecoder, pAacDecoderChannelInfo, &self->pAacDecoderStaticChannelInfo[c]->drcData, + self->extGain, c, self->streamInfo.aacSamplesPerFrame, self->sbrEnabled @@ -1726,6 +1731,7 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( (self->frameOK && !(flags&AACDEC_CONCEAL)), self->aacCommonData.workBufferCore1->mdctOutTemp ); + self->extGainDelay = self->streamInfo.aacSamplesPerFrame; break; case AACDEC_RENDER_ELDFB: CBlock_FrequencyToTimeLowDelay( @@ -1735,6 +1741,7 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( self->streamInfo.aacSamplesPerFrame, stride ); + self->extGainDelay = (self->streamInfo.aacSamplesPerFrame*2 - self->streamInfo.aacSamplesPerFrame/2 - 1)/2; break; default: ErrorStatus = AAC_DEC_UNKNOWN; diff --git a/libAACdec/src/aacdecoder.h b/libAACdec/src/aacdecoder.h index f581054..bcbc040 100644 --- a/libAACdec/src/aacdecoder.h +++ b/libAACdec/src/aacdecoder.h @@ -111,6 +111,7 @@ amm-info@iis.fraunhofer.de #include "aacdec_drc.h" #include "pcmutils_lib.h" + #include "limiter.h" /* Capabilities flags */ @@ -215,6 +216,12 @@ struct AAC_DECODER_INSTANCE { CAncData ancData; /*!< structure to handle ancillary data */ HANDLE_PCM_DOWNMIX hPcmUtils; /*!< privat data for the PCM utils. */ + TDLimiterPtr hLimiter; /*!< Handle of time domain limiter. */ + UCHAR limiterEnableUser; /*!< The limiter configuration requested by the library user */ + UCHAR limiterEnableCurr; /*!< The current limiter configuration. */ + + FIXP_DBL extGain[1]; /*!< Gain that must be applied to the output signal. */ + UINT extGainDelay; /*!< Delay that must be accounted for extGain. */ }; diff --git a/libAACdec/src/aacdecoder_lib.cpp b/libAACdec/src/aacdecoder_lib.cpp index d1b895d..98ef0de 100644 --- a/libAACdec/src/aacdecoder_lib.cpp +++ b/libAACdec/src/aacdecoder_lib.cpp @@ -110,7 +110,7 @@ amm-info@iis.fraunhofer.de /* Decoder library info */ #define AACDECODER_LIB_VL0 2 #define AACDECODER_LIB_VL1 5 -#define AACDECODER_LIB_VL2 6 +#define AACDECODER_LIB_VL2 7 #define AACDECODER_LIB_TITLE "AAC Decoder Lib" #define AACDECODER_LIB_BUILD_DATE __DATE__ #define AACDECODER_LIB_BUILD_TIME __TIME__ @@ -397,12 +397,14 @@ aacDecoder_SetParam ( const HANDLE_AACDECODER self, /*!< Handle of the decode CConcealParams *pConcealData = NULL; HANDLE_AAC_DRC hDrcInfo = NULL; HANDLE_PCM_DOWNMIX hPcmDmx = NULL; + TDLimiterPtr hPcmTdl = NULL; /* check decoder handle */ if (self != NULL) { pConcealData = &self->concealCommonData; hDrcInfo = self->hDrcInfo; hPcmDmx = self->hPcmUtils; + hPcmTdl = self->hLimiter; } else { errorStatus = AAC_DEC_INVALID_HANDLE; } @@ -486,6 +488,47 @@ aacDecoder_SetParam ( const HANDLE_AACDECODER self, /*!< Handle of the decode } break; + + case AAC_PCM_LIMITER_ENABLE: + if (value < -1 || value > 1) { + return AAC_DEC_SET_PARAM_FAIL; + } + if (self == NULL) { + return AAC_DEC_INVALID_HANDLE; + } + self->limiterEnableUser = value; + break; + + case AAC_PCM_LIMITER_ATTACK_TIME: + if (value <= 0) { /* module function converts value to unsigned */ + return AAC_DEC_SET_PARAM_FAIL; + } + switch (setLimiterAttack(hPcmTdl, value)) { + case TDLIMIT_OK: + break; + case TDLIMIT_INVALID_HANDLE: + return AAC_DEC_INVALID_HANDLE; + case TDLIMIT_INVALID_PARAMETER: + default: + return AAC_DEC_SET_PARAM_FAIL; + } + break; + + case AAC_PCM_LIMITER_RELEAS_TIME: + if (value <= 0) { /* module function converts value to unsigned */ + return AAC_DEC_SET_PARAM_FAIL; + } + switch (setLimiterRelease(hPcmTdl, value)) { + case TDLIMIT_OK: + break; + case TDLIMIT_INVALID_HANDLE: + return AAC_DEC_INVALID_HANDLE; + case TDLIMIT_INVALID_PARAMETER: + default: + return AAC_DEC_SET_PARAM_FAIL; + } + break; + case AAC_PCM_OUTPUT_CHANNEL_MAPPING: switch (value) { case 0: @@ -632,6 +675,14 @@ LINKSPEC_CPP HANDLE_AACDECODER aacDecoder_Open(TRANSPORT_TYPE transportFmt, UINT goto bail; } + aacDec->hLimiter = createLimiter(TDL_ATTACK_DEFAULT_MS, TDL_RELEASE_DEFAULT_MS, SAMPLE_MAX, (8), 96000); + if (NULL == aacDec->hLimiter) { + err = -1; + goto bail; + } + aacDec->limiterEnableUser = (UCHAR)-1; + aacDec->limiterEnableCurr = 0; + /* Assure that all modules have same delay */ @@ -807,6 +858,17 @@ LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_DecodeFrame( self->streamInfo.numTotalBytes = 0; } + if (self->limiterEnableUser==(UCHAR)-1) { + /* Enbale limiter for all non-lowdelay AOT's. */ + self->limiterEnableCurr = ( self->flags & (AC_LD|AC_ELD) ) ? 0 : 1; + } + else { + /* Use limiter configuration as requested. */ + self->limiterEnableCurr = self->limiterEnableUser; + } + /* reset limiter gain on a per frame basis */ + self->extGain[0] = FL2FXCONST_DBL(1.0f/(float)(1<channelType, self->channelIndices, self->channelOutputMapping, - NULL + (self->limiterEnableCurr) ? &pcmLimiterScale : NULL ); if (dmxErr == PCMDMX_INVALID_MODE) { /* Announce the framework that the current combination of channel configuration and downmix * settings are not know to produce a predictable behavior and thus maybe produce strange output. */ ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; } + + if ( flags & AACDEC_CLRHIST ) { + /* Delete the delayed signal. */ + resetLimiter(self->hLimiter); + } + if (self->limiterEnableCurr) + { + /* Set actual signal parameters */ + setLimiterNChannels(self->hLimiter, self->streamInfo.numChannels); + setLimiterSampleRate(self->hLimiter, self->streamInfo.sampleRate); + + applyLimiter( + self->hLimiter, + pTimeData, + self->extGain, + &pcmLimiterScale, + 1, + self->extGainDelay, + self->streamInfo.frameSize + ); + } } @@ -956,6 +1040,9 @@ LINKSPEC_CPP void aacDecoder_Close ( HANDLE_AACDECODER self ) return; + if (self->hLimiter != NULL) { + destroyLimiter(self->hLimiter); + } if (self->hPcmUtils != NULL) { pcmDmx_Close( &self->hPcmUtils ); diff --git a/libPCMutils/include/limiter.h b/libPCMutils/include/limiter.h new file mode 100644 index 0000000..0d3d701 --- /dev/null +++ b/libPCMutils/include/limiter.h @@ -0,0 +1,233 @@ + +/* ----------------------------------------------------------------------------------------------------------- +Software License for The Fraunhofer FDK AAC Codec Library for Android + +© Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. + All rights reserved. + + 1. INTRODUCTION +The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements +the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. +This FDK AAC Codec software is intended to be used on a wide variety of Android devices. + +AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual +audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by +independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part +of the MPEG specifications. + +Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) +may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners +individually for the purpose of encoding or decoding bit streams in products that are compliant with +the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license +these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec +software may already be covered under those patent licenses when it is used for those licensed purposes only. + +Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, +are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional +applications information and documentation. + +2. COPYRIGHT LICENSE + +Redistribution and use in source and binary forms, with or without modification, are permitted without +payment of copyright license fees provided that you satisfy the following conditions: + +You must retain the complete text of this software license in redistributions of the FDK AAC Codec or +your modifications thereto in source code form. + +You must retain the complete text of this software license in the documentation and/or other materials +provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. +You must make available free of charge copies of the complete source code of the FDK AAC Codec and your +modifications thereto to recipients of copies in binary form. + +The name of Fraunhofer may not be used to endorse or promote products derived from this library without +prior written permission. + +You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec +software or your modifications thereto. + +Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software +and the date of any change. For modified versions of the FDK AAC Codec, the term +"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term +"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." + +3. NO PATENT LICENSE + +NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, +ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with +respect to this software. + +You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized +by appropriate patent licenses. + +4. DISCLAIMER + +This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors +"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties +of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, +including but not limited to procurement of substitute goods or services; loss of use, data, or profits, +or business interruption, however caused and on any theory of liability, whether in contract, strict +liability, or tort (including negligence), arising in any way out of the use of this software, even if +advised of the possibility of such damage. + +5. CONTACT INFORMATION + +Fraunhofer Institute for Integrated Circuits IIS +Attention: Audio and Multimedia Departments - FDK AAC LL +Am Wolfsmantel 33 +91058 Erlangen, Germany + +www.iis.fraunhofer.de/amm +amm-info@iis.fraunhofer.de +----------------------------------------------------------------------------------------------------------- */ + +/************************ FDK PCM postprocessor module ********************* + + Author(s): Matthias Neusinger + Description: Hard limiter for clipping prevention + +*******************************************************************************/ + +#ifndef _LIMITER_H_ +#define _LIMITER_H_ + + +#include "common_fix.h" + +#define TDL_ATTACK_DEFAULT_MS (15) /* default attack time in ms */ +#define TDL_RELEASE_DEFAULT_MS (50) /* default release time in ms */ + +#define TDL_GAIN_SCALING (15) /* scaling of gain value. */ + + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef enum { + TDLIMIT_OK = 0, + + __error_codes_start = -100, + + TDLIMIT_INVALID_HANDLE, + TDLIMIT_INVALID_PARAMETER, + + __error_codes_end +} TDLIMITER_ERROR; + +struct TDLimiter; +typedef struct TDLimiter* TDLimiterPtr; + +/****************************************************************************** +* createLimiter * +* maxAttackMs: maximum and initial attack/lookahead time in milliseconds * +* releaseMs: release time in milliseconds (90% time constant) * +* threshold: limiting threshold * +* maxChannels: maximum and initial number of channels * +* maxSampleRate: maximum and initial sampling rate in Hz * +* returns: limiter handle * +******************************************************************************/ +TDLimiterPtr createLimiter(unsigned int maxAttackMs, + unsigned int releaseMs, + INT_PCM threshold, + unsigned int maxChannels, + unsigned int maxSampleRate); + + +/****************************************************************************** +* resetLimiter * +* limiter: limiter handle * +* returns: error code * +******************************************************************************/ +TDLIMITER_ERROR resetLimiter(TDLimiterPtr limiter); + + +/****************************************************************************** +* destroyLimiter * +* limiter: limiter handle * +* returns: error code * +******************************************************************************/ +TDLIMITER_ERROR destroyLimiter(TDLimiterPtr limiter); + +/****************************************************************************** +* applyLimiter * +* limiter: limiter handle * +* pGain : pointer to gains to be applied to the signal before limiting, * +* which are downscaled by TDL_GAIN_SCALING bit. * +* These gains are delayed by gain_delay, and smoothed. * +* Smoothing is done by a butterworth lowpass filter with a cutoff * +* frequency which is fixed with respect to the sampling rate. * +* It is a substitute for the smoothing due to windowing and * +* overlap/add, if a gain is applied in frequency domain. * +* gain_scale: pointer to scaling exponents to be applied to the signal before * +* limiting, without delay and without smoothing * +* gain_size: number of elements in pGain, currently restricted to 1 * +* gain_delay: delay [samples] with which the gains in pGain shall be applied * +* gain_delay <= nSamples * +* samples: input/output buffer containing interleaved samples * +* precision of output will be DFRACT_BITS-TDL_GAIN_SCALING bits * +* nSamples: number of samples per channel * +* returns: error code * +******************************************************************************/ +TDLIMITER_ERROR applyLimiter(TDLimiterPtr limiter, + INT_PCM* samples, + FIXP_DBL* pGain, + const INT* gain_scale, + const UINT gain_size, + const UINT gain_delay, + const UINT nSamples); + +/****************************************************************************** +* getLimiterDelay * +* limiter: limiter handle * +* returns: exact delay caused by the limiter in samples * +******************************************************************************/ +unsigned int getLimiterDelay(TDLimiterPtr limiter); + +/****************************************************************************** +* setLimiterNChannels * +* limiter: limiter handle * +* nChannels: number of channels ( <= maxChannels specified on create) * +* returns: error code * +******************************************************************************/ +TDLIMITER_ERROR setLimiterNChannels(TDLimiterPtr limiter, unsigned int nChannels); + +/****************************************************************************** +* setLimiterSampleRate * +* limiter: limiter handle * +* sampleRate: sampling rate in Hz ( <= maxSampleRate specified on create) * +* returns: error code * +******************************************************************************/ +TDLIMITER_ERROR setLimiterSampleRate(TDLimiterPtr limiter, unsigned int sampleRate); + +/****************************************************************************** +* setLimiterAttack * +* limiter: limiter handle * +* attackMs: attack time in ms ( <= maxAttackMs specified on create) * +* returns: error code * +******************************************************************************/ +TDLIMITER_ERROR setLimiterAttack(TDLimiterPtr limiter, unsigned int attackMs); + +/****************************************************************************** +* setLimiterRelease * +* limiter: limiter handle * +* releaseMs: release time in ms * +* returns: error code * +******************************************************************************/ +TDLIMITER_ERROR setLimiterRelease(TDLimiterPtr limiter, unsigned int releaseMs); + +/****************************************************************************** +* setLimiterThreshold * +* limiter: limiter handle * +* threshold: limiter threshold * +* returns: error code * +******************************************************************************/ +TDLIMITER_ERROR setLimiterThreshold(TDLimiterPtr limiter, INT_PCM threshold); + +#ifdef __cplusplus +} +#endif + + +#endif //#ifndef _LIMITER_H_ diff --git a/libPCMutils/src/limiter.cpp b/libPCMutils/src/limiter.cpp new file mode 100644 index 0000000..af724f0 --- /dev/null +++ b/libPCMutils/src/limiter.cpp @@ -0,0 +1,498 @@ + +/* ----------------------------------------------------------------------------------------------------------- +Software License for The Fraunhofer FDK AAC Codec Library for Android + +© Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. + All rights reserved. + + 1. INTRODUCTION +The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements +the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. +This FDK AAC Codec software is intended to be used on a wide variety of Android devices. + +AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual +audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by +independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part +of the MPEG specifications. + +Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) +may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners +individually for the purpose of encoding or decoding bit streams in products that are compliant with +the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license +these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec +software may already be covered under those patent licenses when it is used for those licensed purposes only. + +Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, +are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional +applications information and documentation. + +2. COPYRIGHT LICENSE + +Redistribution and use in source and binary forms, with or without modification, are permitted without +payment of copyright license fees provided that you satisfy the following conditions: + +You must retain the complete text of this software license in redistributions of the FDK AAC Codec or +your modifications thereto in source code form. + +You must retain the complete text of this software license in the documentation and/or other materials +provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. +You must make available free of charge copies of the complete source code of the FDK AAC Codec and your +modifications thereto to recipients of copies in binary form. + +The name of Fraunhofer may not be used to endorse or promote products derived from this library without +prior written permission. + +You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec +software or your modifications thereto. + +Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software +and the date of any change. For modified versions of the FDK AAC Codec, the term +"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term +"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." + +3. NO PATENT LICENSE + +NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, +ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with +respect to this software. + +You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized +by appropriate patent licenses. + +4. DISCLAIMER + +This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors +"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties +of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, +including but not limited to procurement of substitute goods or services; loss of use, data, or profits, +or business interruption, however caused and on any theory of liability, whether in contract, strict +liability, or tort (including negligence), arising in any way out of the use of this software, even if +advised of the possibility of such damage. + +5. CONTACT INFORMATION + +Fraunhofer Institute for Integrated Circuits IIS +Attention: Audio and Multimedia Departments - FDK AAC LL +Am Wolfsmantel 33 +91058 Erlangen, Germany + +www.iis.fraunhofer.de/amm +amm-info@iis.fraunhofer.de +----------------------------------------------------------------------------------------------------------- */ + +/************************ FDK PCM postprocessor module ********************* + + Author(s): Matthias Neusinger + Description: Hard limiter for clipping prevention + +*******************************************************************************/ + +#include "limiter.h" + + +struct TDLimiter { + unsigned int attack; + FIXP_DBL attackConst, releaseConst; + unsigned int attackMs, releaseMs, maxAttackMs; + FIXP_PCM threshold; + unsigned int channels, maxChannels; + unsigned int sampleRate, maxSampleRate; + FIXP_DBL cor, max; + FIXP_DBL* maxBuf; + FIXP_DBL* delayBuf; + unsigned int maxBufIdx, delayBufIdx; + FIXP_DBL smoothState0; + FIXP_DBL minGain; + + FIXP_DBL additionalGainPrev; + FIXP_DBL additionalGainFilterState; + FIXP_DBL additionalGainFilterState1; +}; + +/* create limiter */ +TDLimiterPtr createLimiter( + unsigned int maxAttackMs, + unsigned int releaseMs, + INT_PCM threshold, + unsigned int maxChannels, + unsigned int maxSampleRate + ) +{ + TDLimiterPtr limiter = NULL; + unsigned int attack, release; + FIXP_DBL attackConst, releaseConst, exponent; + INT e_ans; + + /* calc attack and release time in samples */ + attack = (unsigned int)(maxAttackMs * maxSampleRate / 1000); + release = (unsigned int)(releaseMs * maxSampleRate / 1000); + + /* alloc limiter struct */ + limiter = (TDLimiterPtr)FDKcalloc(1, sizeof(struct TDLimiter)); + if (!limiter) return NULL; + + /* alloc max and delay buffers */ + limiter->maxBuf = (FIXP_DBL*)FDKcalloc(attack + 1, sizeof(FIXP_DBL)); + limiter->delayBuf = (FIXP_DBL*)FDKcalloc(attack * maxChannels, sizeof(FIXP_DBL)); + + if (!limiter->maxBuf || !limiter->delayBuf) { + destroyLimiter(limiter); + return NULL; + } + + /* attackConst = pow(0.1, 1.0 / (attack + 1)) */ + exponent = invFixp(attack+1); + attackConst = fPow(FL2FXCONST_DBL(0.1f), 0, exponent, 0, &e_ans); + attackConst = scaleValue(attackConst, e_ans); + + /* releaseConst = (float)pow(0.1, 1.0 / (release + 1)) */ + exponent = invFixp(release + 1); + releaseConst = fPow(FL2FXCONST_DBL(0.1f), 0, exponent, 0, &e_ans); + releaseConst = scaleValue(releaseConst, e_ans); + + /* init parameters */ + limiter->attackMs = maxAttackMs; + limiter->maxAttackMs = maxAttackMs; + limiter->releaseMs = releaseMs; + limiter->attack = attack; + limiter->attackConst = attackConst; + limiter->releaseConst = releaseConst; + limiter->threshold = (FIXP_PCM)threshold; + limiter->channels = maxChannels; + limiter->maxChannels = maxChannels; + limiter->sampleRate = maxSampleRate; + limiter->maxSampleRate = maxSampleRate; + + resetLimiter(limiter); + + return limiter; +} + + +/* reset limiter */ +TDLIMITER_ERROR resetLimiter(TDLimiterPtr limiter) +{ + if (limiter != NULL) { + + limiter->maxBufIdx = 0; + limiter->delayBufIdx = 0; + limiter->max = (FIXP_DBL)0; + limiter->cor = FL2FXCONST_DBL(1.0f/(1<<1)); + limiter->smoothState0 = FL2FXCONST_DBL(1.0f/(1<<1)); + limiter->minGain = FL2FXCONST_DBL(1.0f/(1<<1)); + + limiter->additionalGainPrev = FL2FXCONST_DBL(1.0f/(1<additionalGainFilterState = FL2FXCONST_DBL(1.0f/(1<additionalGainFilterState1 = FL2FXCONST_DBL(1.0f/(1<maxBuf, 0, (limiter->attack + 1) * sizeof(FIXP_DBL) ); + FDKmemset(limiter->delayBuf, 0, limiter->attack * limiter->channels * sizeof(FIXP_DBL) ); + } + else { + return TDLIMIT_INVALID_HANDLE; + } + + return TDLIMIT_OK; +} + + +/* destroy limiter */ +TDLIMITER_ERROR destroyLimiter(TDLimiterPtr limiter) +{ + if (limiter != NULL) { + FDKfree(limiter->maxBuf); + FDKfree(limiter->delayBuf); + + FDKfree(limiter); + } + else { + return TDLIMIT_INVALID_HANDLE; + } + return TDLIMIT_OK; +} + +/* apply limiter */ +TDLIMITER_ERROR applyLimiter(TDLimiterPtr limiter, + INT_PCM* samples, + FIXP_DBL* pGain, + const INT* gain_scale, + const UINT gain_size, + const UINT gain_delay, + const UINT nSamples) +{ + unsigned int i, j; + FIXP_PCM tmp1, tmp2; + FIXP_DBL tmp, old, gain, additionalGain, additionalGainUnfiltered; + FIXP_DBL minGain = FL2FXCONST_DBL(1.0f/(1<<1)); + + FDK_ASSERT(gain_size == 1); + FDK_ASSERT(gain_delay <= nSamples); + + if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE; + + { + unsigned int channels = limiter->channels; + unsigned int attack = limiter->attack; + FIXP_DBL attackConst = limiter->attackConst; + FIXP_DBL releaseConst = limiter->releaseConst; + FIXP_DBL threshold = FX_PCM2FX_DBL(limiter->threshold)>>TDL_GAIN_SCALING; + + FIXP_DBL max = limiter->max; + FIXP_DBL* maxBuf = limiter->maxBuf; + unsigned int maxBufIdx = limiter->maxBufIdx; + FIXP_DBL cor = limiter->cor; + FIXP_DBL* delayBuf = limiter->delayBuf; + unsigned int delayBufIdx = limiter->delayBufIdx; + + FIXP_DBL smoothState0 = limiter->smoothState0; + FIXP_DBL additionalGainSmoothState = limiter->additionalGainFilterState; + FIXP_DBL additionalGainSmoothState1 = limiter->additionalGainFilterState1; + + for (i = 0; i < nSamples; i++) { + + if (i < gain_delay) { + additionalGainUnfiltered = limiter->additionalGainPrev; + } else { + additionalGainUnfiltered = pGain[0]; + } + + /* Smooth additionalGain */ + /* [b,a] = butter(1, 0.01) */ + static const FIXP_SGL b[] = { FL2FXCONST_SGL(0.015466*2.0), FL2FXCONST_SGL( 0.015466*2.0) }; + static const FIXP_SGL a[] = { FL2FXCONST_SGL(1.000000), FL2FXCONST_SGL(-0.96907) }; + /* [b,a] = butter(1, 0.001) */ + //static const FIXP_SGL b[] = { FL2FXCONST_SGL(0.0015683*2.0), FL2FXCONST_SGL( 0.0015683*2.0) }; + //static const FIXP_SGL a[] = { FL2FXCONST_SGL(1.0000000), FL2FXCONST_SGL(-0.99686) }; + additionalGain = - fMult(additionalGainSmoothState, a[1]) + fMultDiv2( additionalGainUnfiltered, b[0]) + fMultDiv2(additionalGainSmoothState1, b[1]); + additionalGainSmoothState1 = additionalGainUnfiltered; + additionalGainSmoothState = additionalGain; + + /* Apply the additional scaling that has no delay and no smoothing */ + if (gain_scale[0] > 0) { + additionalGain <<= gain_scale[0]; + } else { + additionalGain >>= gain_scale[0]; + } + + /* get maximum absolute sample value of all channels, including the additional gain. */ + tmp1 = (FIXP_PCM)0; + for (j = 0; j < channels; j++) { + tmp2 = (FIXP_PCM)samples[i * channels + j]; + if (tmp2 == (FIXP_PCM)SAMPLE_MIN) /* protect fAbs from -1.0 value */ + tmp2 = (FIXP_PCM)(SAMPLE_MIN+1); + tmp1 = fMax(tmp1, fAbs(tmp2)); + } + tmp = SATURATE_LEFT_SHIFT(fMultDiv2(tmp1, additionalGain), 1, DFRACT_BITS); + + /* set threshold as lower border to save calculations in running maximum algorithm */ + tmp = fMax(tmp, threshold); + + /* running maximum */ + old = maxBuf[maxBufIdx]; + maxBuf[maxBufIdx] = tmp; + + if (tmp >= max) { + /* new sample is greater than old maximum, so it is the new maximum */ + max = tmp; + } + else if (old < max) { + /* maximum does not change, as the sample, which has left the window was + not the maximum */ + } + else { + /* the old maximum has left the window, we have to search the complete + buffer for the new max */ + max = maxBuf[0]; + for (j = 1; j <= attack; j++) { + if (maxBuf[j] > max) max = maxBuf[j]; + } + } + maxBufIdx++; + if (maxBufIdx >= attack+1) maxBufIdx = 0; + + /* calc gain */ + /* gain is downscaled by one, so that gain = 1.0 can be represented */ + if (max > threshold) { + gain = fDivNorm(threshold, max)>>1; + } + else { + gain = FL2FXCONST_DBL(1.0f/(1<<1)); + } + + /* gain smoothing, method: TDL_EXPONENTIAL */ + /* first order IIR filter with attack correction to avoid overshoots */ + + /* correct the 'aiming' value of the exponential attack to avoid the remaining overshoot */ + if (gain < smoothState0) { + cor = fMin(cor, fMultDiv2((gain - fMultDiv2(FL2FXCONST_SGL(0.1f*(1<<1)),smoothState0)), FL2FXCONST_SGL(1.11111111f/(1<<1)))<<2); + } + else { + cor = gain; + } + + /* smoothing filter */ + if (cor < smoothState0) { + smoothState0 = fMult(attackConst,(smoothState0 - cor)) + cor; /* attack */ + smoothState0 = fMax(smoothState0, gain); /* avoid overshooting target */ + } + else { + /* sign inversion twice to round towards +infinity, + so that gain can converge to 1.0 again, + for bit-identical output when limiter is not active */ + smoothState0 = -fMult(releaseConst,-(smoothState0 - cor)) + cor; /* release */ + } + + gain = smoothState0; + + /* lookahead delay, apply gain */ + for (j = 0; j < channels; j++) { + + tmp = delayBuf[delayBufIdx * channels + j]; + delayBuf[delayBufIdx * channels + j] = fMult((FIXP_PCM)samples[i * channels + j], additionalGain); + + /* Apply gain to delayed signal */ + if (gain < FL2FXCONST_DBL(1.0f/(1<<1))) + tmp = fMult(tmp,gain<<1); + + samples[i * channels + j] = FX_DBL2FX_PCM((FIXP_DBL)SATURATE_LEFT_SHIFT(tmp,TDL_GAIN_SCALING,DFRACT_BITS)); + } + delayBufIdx++; + if (delayBufIdx >= attack) delayBufIdx = 0; + + /* save minimum gain factor */ + if (gain < minGain) minGain = gain; + } + + + limiter->max = max; + limiter->maxBufIdx = maxBufIdx; + limiter->cor = cor; + limiter->delayBufIdx = delayBufIdx; + + limiter->smoothState0 = smoothState0; + limiter->additionalGainFilterState = additionalGainSmoothState; + limiter->additionalGainFilterState1 = additionalGainSmoothState1; + + limiter->minGain = minGain; + + limiter->additionalGainPrev = pGain[0]; + + return TDLIMIT_OK; + } +} + +/* get delay in samples */ +unsigned int getLimiterDelay(TDLimiterPtr limiter) +{ + FDK_ASSERT(limiter != NULL); + return limiter->attack; +} + +/* set number of channels */ +TDLIMITER_ERROR setLimiterNChannels(TDLimiterPtr limiter, unsigned int nChannels) +{ + if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE; + + if (nChannels > limiter->maxChannels) return TDLIMIT_INVALID_PARAMETER; + + limiter->channels = nChannels; + //resetLimiter(limiter); + + return TDLIMIT_OK; +} + +/* set sampling rate */ +TDLIMITER_ERROR setLimiterSampleRate(TDLimiterPtr limiter, unsigned int sampleRate) +{ + unsigned int attack, release; + FIXP_DBL attackConst, releaseConst, exponent; + INT e_ans; + + if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE; + + if (sampleRate > limiter->maxSampleRate) return TDLIMIT_INVALID_PARAMETER; + + /* update attack and release time in samples */ + attack = (unsigned int)(limiter->attackMs * sampleRate / 1000); + release = (unsigned int)(limiter->releaseMs * sampleRate / 1000); + + /* attackConst = pow(0.1, 1.0 / (attack + 1)) */ + exponent = invFixp(attack+1); + attackConst = fPow(FL2FXCONST_DBL(0.1f), 0, exponent, 0, &e_ans); + attackConst = scaleValue(attackConst, e_ans); + + /* releaseConst = (float)pow(0.1, 1.0 / (release + 1)) */ + exponent = invFixp(release + 1); + releaseConst = fPow(FL2FXCONST_DBL(0.1f), 0, exponent, 0, &e_ans); + releaseConst = scaleValue(releaseConst, e_ans); + + limiter->attack = attack; + limiter->attackConst = attackConst; + limiter->releaseConst = releaseConst; + limiter->sampleRate = sampleRate; + + /* reset */ + //resetLimiter(limiter); + + return TDLIMIT_OK; +} + +/* set attack time */ +TDLIMITER_ERROR setLimiterAttack(TDLimiterPtr limiter, unsigned int attackMs) +{ + unsigned int attack; + FIXP_DBL attackConst, exponent; + INT e_ans; + + if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE; + + if (attackMs > limiter->maxAttackMs) return TDLIMIT_INVALID_PARAMETER; + + /* calculate attack time in samples */ + attack = (unsigned int)(attackMs * limiter->sampleRate / 1000); + + /* attackConst = pow(0.1, 1.0 / (attack + 1)) */ + exponent = invFixp(attack+1); + attackConst = fPow(FL2FXCONST_DBL(0.1f), 0, exponent, 0, &e_ans); + attackConst = scaleValue(attackConst, e_ans); + + limiter->attack = attack; + limiter->attackConst = attackConst; + limiter->attackMs = attackMs; + + return TDLIMIT_OK; +} + +/* set release time */ +TDLIMITER_ERROR setLimiterRelease(TDLimiterPtr limiter, unsigned int releaseMs) +{ + unsigned int release; + FIXP_DBL releaseConst, exponent; + INT e_ans; + + if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE; + + /* calculate release time in samples */ + release = (unsigned int)(releaseMs * limiter->sampleRate / 1000); + + /* releaseConst = (float)pow(0.1, 1.0 / (release + 1)) */ + exponent = invFixp(release + 1); + releaseConst = fPow(FL2FXCONST_DBL(0.1f), 0, exponent, 0, &e_ans); + releaseConst = scaleValue(releaseConst, e_ans); + + limiter->releaseConst = releaseConst; + limiter->releaseMs = releaseMs; + + return TDLIMIT_OK; +} + +/* set limiter threshold */ +TDLIMITER_ERROR setLimiterThreshold(TDLimiterPtr limiter, INT_PCM threshold) +{ + if ( limiter == NULL ) return TDLIMIT_INVALID_HANDLE; + + limiter->threshold = (FIXP_PCM)threshold; + + return TDLIMIT_OK; +} diff --git a/libPCMutils/src/pcmutils_lib.cpp b/libPCMutils/src/pcmutils_lib.cpp index bd291d7..32d8437 100644 --- a/libPCMutils/src/pcmutils_lib.cpp +++ b/libPCMutils/src/pcmutils_lib.cpp @@ -148,7 +148,7 @@ amm-info@iis.fraunhofer.de /* Decoder library info */ #define PCMDMX_LIB_VL0 2 #define PCMDMX_LIB_VL1 4 -#define PCMDMX_LIB_VL2 1 +#define PCMDMX_LIB_VL2 2 #define PCMDMX_LIB_TITLE "PCM Downmix Lib" #define PCMDMX_LIB_BUILD_DATE __DATE__ #define PCMDMX_LIB_BUILD_TIME __TIME__ -- cgit v1.2.3