shithub: aacdec

Download patch

ref: ac3398aa16ced0bc75de9640f93c1348f986d5dc
parent: eabc03b9c4ce3ed4039eb1c4e9637c896853accf
author: menno <menno>
date: Wed Dec 17 09:43:17 EST 2003

New code for DRM standard
Some SSE optimisations (someone please make this work for Linux)
Start work on Scalable profile
General fixes

--- a/README.linux
+++ b/README.linux
@@ -1,7 +1,7 @@
 To compile under Linux.
 ----------------------
 just run :
- - autoreconf -vsf
+ - autoreconf -vif
 then run configure with options you want.
 run ./configure --help for more informations.
 
--- a/frontend/main.c
+++ b/frontend/main.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: main.c,v 1.67 2003/12/11 18:32:58 menno Exp $
+** $Id: main.c,v 1.68 2003/12/17 14:43:15 menno Exp $
 **/
 
 #ifdef _WIN32
@@ -1194,8 +1194,8 @@
     {
 #ifdef _WIN32
         end = GetTickCount();
-        fprintf(stderr, "Decoding %s took: %d sec.\n", aacFileName,
-            (end-begin)/1000);
+        fprintf(stderr, "Decoding %s took: %5.2f sec.\n", aacFileName,
+            (float)(end-begin)/1000.0);
         SetConsoleTitle("FAAD");
 #else
         /* clock() grabs time since the start of the app but when we decode
--- a/libfaad/bits.c
+++ b/libfaad/bits.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: bits.c,v 1.28 2003/11/12 20:47:57 menno Exp $
+** $Id: bits.c,v 1.29 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -49,7 +49,7 @@
         return;
     }
 
-    ld->buffer = malloc((buffer_size+12)*sizeof(uint8_t));
+    ld->buffer = faad_malloc((buffer_size+12)*sizeof(uint8_t));
     memset(ld->buffer, 0, (buffer_size+12)*sizeof(uint8_t));
     memcpy(ld->buffer, _buffer, buffer_size*sizeof(uint8_t));
 
@@ -74,7 +74,7 @@
 void faad_endbits(bitfile *ld)
 {
     if (ld)
-        if (ld->buffer) free(ld->buffer);
+        if (ld->buffer) faad_free(ld->buffer);
 }
 
 uint32_t faad_get_processed_bits(bitfile *ld)
@@ -140,7 +140,7 @@
     uint16_t bytes = (uint16_t)bits / 8;
     uint8_t remainder = (uint8_t)bits % 8;
 
-    uint8_t *buffer = (uint8_t*)malloc((bytes+1)*sizeof(uint8_t));
+    uint8_t *buffer = (uint8_t*)faad_malloc((bytes+1)*sizeof(uint8_t));
 
     for (i = 0; i < bytes; i++)
     {
--- a/libfaad/cfft.c
+++ b/libfaad/cfft.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: cfft.c,v 1.20 2003/11/17 19:40:11 menno Exp $
+** $Id: cfft.c,v 1.21 2003/12/17 14:43:16 menno Exp $
 **/
 
 /*
@@ -724,7 +724,7 @@
     ifac[1] = nf;
 
 #ifndef FIXED_POINT
-    argh = (real_t)2.0*M_PI / (real_t)n;
+    argh = (real_t)2.0*(real_t)M_PI / (real_t)n;
     i = 0;
     l1 = 1;
 
@@ -767,13 +767,13 @@
 
 cfft_info *cffti(uint16_t n)
 {
-    cfft_info *cfft = (cfft_info*)malloc(sizeof(cfft_info));
+    cfft_info *cfft = (cfft_info*)faad_malloc(sizeof(cfft_info));
 
     cfft->n = n;
-    cfft->work = (complex_t*)malloc(n*sizeof(complex_t));
+    cfft->work = (complex_t*)faad_malloc(n*sizeof(complex_t));
 
 #ifndef FIXED_POINT
-    cfft->tab = (complex_t*)malloc(n*sizeof(complex_t));
+    cfft->tab = (complex_t*)faad_malloc(n*sizeof(complex_t));
 
     cffti1(n, cfft->tab, cfft->ifac);
 #else
@@ -802,11 +802,11 @@
 
 void cfftu(cfft_info *cfft)
 {
-    if (cfft->work) free(cfft->work);
+    if (cfft->work) faad_free(cfft->work);
 #ifndef FIXED_POINT
-    if (cfft->tab) free(cfft->tab);
+    if (cfft->tab) faad_free(cfft->tab);
 #endif
 
-    if (cfft) free(cfft);
+    if (cfft) faad_free(cfft);
 }
 
--- a/libfaad/cfft.h
+++ b/libfaad/cfft.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: cfft.h,v 1.13 2003/11/17 19:40:12 menno Exp $
+** $Id: cfft.h,v 1.14 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __CFFT_H__
--- a/libfaad/cfft_tab.h
+++ b/libfaad/cfft_tab.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: cfft_tab.h,v 1.10 2003/11/12 20:47:57 menno Exp $
+** $Id: cfft_tab.h,v 1.11 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __CFFT_TAB_H__
@@ -34,7 +34,7 @@
 
 #ifdef FIXED_POINT
 
-complex_t cfft_tab_512[] =
+ALIGN static const complex_t cfft_tab_512[] =
 {
     { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) },
     { FRAC_CONST(0.999924719333649), FRAC_CONST(0.012271538376808) },
@@ -551,7 +551,7 @@
 };
 
 #ifdef ALLOW_SMALL_FRAMELENGTH
-complex_t cfft_tab_480[] =
+ALIGN static const complex_t cfft_tab_480[] =
 {
     { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) },
     { FRAC_CONST(0.999914348125458), FRAC_CONST(0.013089596293867) },
@@ -1036,7 +1036,7 @@
 };
 #endif
 
-complex_t cfft_tab_64[] =
+ALIGN static const complex_t cfft_tab_64[] =
 {
     { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) },
     { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) },
@@ -1105,7 +1105,7 @@
 };
 
 #ifdef ALLOW_SMALL_FRAMELENGTH
-complex_t cfft_tab_60[] =
+ALIGN static const complex_t cfft_tab_60[] =
 {
     { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) },
     { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) },
@@ -1172,7 +1172,7 @@
 
 #ifdef LD_DEC
 
-complex_t cfft_tab_256[] =
+ALIGN static const complex_t cfft_tab_256[] =
 {
     { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) },
     { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) },
@@ -1433,7 +1433,7 @@
 };
 
 #ifdef ALLOW_SMALL_FRAMELENGTH
-complex_t cfft_tab_240[] =
+ALIGN static const complex_t cfft_tab_240[] =
 {
     { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) },
     { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) },
--- a/libfaad/common.c
+++ b/libfaad/common.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: common.c,v 1.12 2003/11/12 20:47:57 menno Exp $
+** $Id: common.c,v 1.13 2003/12/17 14:43:16 menno Exp $
 **/
 
 /* just some common functions that could be used anywhere */
@@ -30,10 +30,50 @@
 #include "common.h"
 #include "structs.h"
 
+#include <malloc.h>
+#include <stdlib.h>
 #include "syntax.h"
 
+#ifdef USE_SSE
+uint8_t cpu_has_sse()
+{
+    uint32_t feature;
+
+    __try
+    {
+        __asm
+        {
+            xor eax, eax
+            cpuid
+        }
+    }
+    __except (1)
+    {
+        return 0;
+    }
+
+    __asm
+    {
+        mov eax, 1
+        cpuid
+        mov feature, edx
+    }
+
+    /* check for SSE */
+    if (feature & 0x02000000)
+        return 1;
+
+    return 0;
+}
+#else
+uint8_t cpu_has_sse()
+{
+    return 0;
+}
+#endif
+
 /* Returns the sample rate index based on the samplerate */
-uint8_t get_sr_index(uint32_t samplerate)
+uint8_t get_sr_index(const uint32_t samplerate)
 {
     if (92017 <= samplerate) return 0;
     if (75132 <= samplerate) return 1;
@@ -52,7 +92,7 @@
 }
 
 /* Returns the sample rate based on the sample rate index */
-uint32_t get_sample_rate(uint8_t sr_index)
+uint32_t get_sample_rate(const uint8_t sr_index)
 {
     static const uint32_t sample_rates[] =
     {
@@ -66,7 +106,7 @@
     return 0;
 }
 
-uint8_t max_pred_sfb(uint8_t sr_index)
+uint8_t max_pred_sfb(const uint8_t sr_index)
 {
     static const uint8_t pred_sfb_max[] =
     {
@@ -80,7 +120,8 @@
     return 0;
 }
 
-uint8_t max_tns_sfb(uint8_t sr_index, uint8_t object_type, uint8_t is_short)
+uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type,
+                    const uint8_t is_short)
 {
     /* entry for each sampling rate	
      * 1    Main/LC long window
@@ -116,7 +157,7 @@
 }
 
 /* Returns 0 if an object type is decodable, otherwise returns -1 */
-int8_t can_decode_ot(uint8_t object_type)
+int8_t can_decode_ot(const uint8_t object_type)
 {
     switch (object_type)
     {
@@ -166,7 +207,26 @@
     return -1;
 }
 
+/* common malloc function */
+void *faad_malloc(int32_t size)
+{
+#ifdef _WIN32
+    return _aligned_malloc(size, 16);
+#else
+    return malloc(size);
+#endif
+}
 
+/* common free function */
+void faad_free(void *b)
+{
+#ifdef _WIN32
+    _aligned_free(b);
+#else
+    free(b);
+#endif
+}
+
 static const  uint8_t    Parity [256] = {  // parity
 	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
 	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
@@ -220,11 +280,3 @@
 
 	return (__r1 = (t3 >> 1) | t1 ) ^ (__r2 = (t4 + t4) | t2 );
 }
-
-#define LOG2 0.30102999566398
-
-int32_t int_log2(int32_t val)
-{
-    return (int32_t)ceil(log(val)/log(2));
-}
-
--- a/libfaad/common.h
+++ b/libfaad/common.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: common.h,v 1.38 2003/11/12 20:47:57 menno Exp $
+** $Id: common.h,v 1.39 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __COMMON_H__
@@ -33,6 +33,11 @@
 #endif
 
 #define INLINE __inline
+#ifdef _WIN32
+#define ALIGN __declspec(align(16))
+#else
+#define ALIGN
+#endif
 
 #ifndef max
 #define max(a, b) (((a) > (b)) ? (a) : (b))
@@ -64,6 +69,8 @@
 #define LTP_DEC
 /* Allow decoding of LD profile AAC */
 #define LD_DEC
+/* Allow decoding of scalable profiles */
+//#define SCALABLE_DEC
 /* Allow decoding of Digital Radio Mondiale (DRM) */
 //#define DRM
 
@@ -104,6 +111,13 @@
 # endif
 #endif // FIXED_POINT
 
+#if ((defined(_WIN32) && !defined(_WIN32_WCE)) || ((__GNUC__ >= 3) && defined(i386)))
+#ifndef FIXED_POINT
+/* includes <xmmintrin.h> to enable SSE intrinsics */
+#define USE_SSE
+#endif
+#endif
+
 #ifdef FIXED_POINT
 #define SBR_DIV(A, B) (((int64_t)A << REAL_BITS)/B)
 #else
@@ -123,11 +137,6 @@
 
 /* END COMPILE TIME DEFINITIONS */
 
-#ifndef FIXED_POINT
-#define POW_TABLE_SIZE 200
-#endif
-
-
 #if defined(_WIN32)
 
 
@@ -226,12 +235,6 @@
 
 #if defined(FIXED_POINT)
 
-  #ifdef HAS_MATHF_H
-    #include <mathf.h>
-  #else
-    #include <math.h>
-  #endif
-
   #include "fixed.h"
 
 #elif defined(USE_DOUBLE_PRECISION)
@@ -260,6 +263,10 @@
 
   typedef float real_t;
 
+#ifdef USE_SSE
+# include <xmmintrin.h>
+#endif
+
   #define MUL_R(A,B) ((A)*(B))
   #define MUL_C(A,B) ((A)*(B))
   #define MUL_F(A,B) ((A)*(B))
@@ -353,16 +360,31 @@
 
 
 /* common functions */
-int32_t int_log2(int32_t val);
+uint8_t cpu_has_sse();
 uint32_t random_int(void);
-uint8_t get_sr_index(uint32_t samplerate);
-uint8_t max_pred_sfb(uint8_t sr_index);
-uint8_t max_tns_sfb(uint8_t sr_index, uint8_t object_type, uint8_t is_short);
-uint32_t get_sample_rate(uint8_t sr_index);
-int8_t can_decode_ot(uint8_t object_type);
+uint8_t get_sr_index(const uint32_t samplerate);
+uint8_t max_pred_sfb(const uint8_t sr_index);
+uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type,
+                    const uint8_t is_short);
+uint32_t get_sample_rate(const uint8_t sr_index);
+int8_t can_decode_ot(const uint8_t object_type);
 
+void *faad_malloc(int32_t size);
+void faad_free(void *b);
+
+//#define PROFILE
+#ifdef PROFILE
+static int64_t faad_get_ts()
+{
+    __asm
+    {
+        rdtsc
+    }
+}
+#endif
+
 #ifndef M_PI
-#define M_PI 3.14159265358979323846f
+#define M_PI 3.14159265358979323846
 #endif
 #ifndef M_PI_2 /* PI/2 */
 #define M_PI_2 1.57079632679489661923
--- a/libfaad/decoder.c
+++ b/libfaad/decoder.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: decoder.c,v 1.82 2003/11/12 20:47:57 menno Exp $
+** $Id: decoder.c,v 1.83 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -85,7 +85,7 @@
     uint8_t i;
     faacDecHandle hDecoder = NULL;
 
-    if ((hDecoder = (faacDecHandle)malloc(sizeof(faacDecStruct))) == NULL)
+    if ((hDecoder = (faacDecHandle)faad_malloc(sizeof(faacDecStruct))) == NULL)
         return NULL;
 
     memset(hDecoder, 0, sizeof(faacDecStruct));
@@ -135,15 +135,13 @@
 
     hDecoder->drc = drc_init(REAL_CONST(1.0), REAL_CONST(1.0));
 
-#if POW_TABLE_SIZE
-    hDecoder->pow2_table = (real_t*)malloc(POW_TABLE_SIZE*sizeof(real_t));
-    if (!hDecoder->pow2_table)
+#ifdef USE_SSE
+    if (cpu_has_sse())
     {
-        free(hDecoder);
-        hDecoder = NULL;
-        return hDecoder;
+        hDecoder->apply_sf_func = apply_scalefactors_sse;
+    } else {
+        hDecoder->apply_sf_func = apply_scalefactors;
     }
-    build_tables(hDecoder->pow2_table);
 #endif
 
     return hDecoder;
@@ -407,7 +405,7 @@
     hDecoder->fb = filter_bank_init(hDecoder->frameLength);
 
     /* Take care of buffers */
-    if (hDecoder->sample_buffer) free(hDecoder->sample_buffer);
+    if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer);
     hDecoder->sample_buffer = NULL;
 
     for (i = 0; i < MAX_CHANNELS; i++)
@@ -414,25 +412,25 @@
     {
         hDecoder->window_shape_prev[i] = 0;
 
-        if (hDecoder->time_out[i]) free(hDecoder->time_out[i]);
+        if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]);
         hDecoder->time_out[i] = NULL;
 #ifdef SBR_DEC
-        if (hDecoder->time_out2[i]) free(hDecoder->time_out2[i]);
+        if (hDecoder->time_out2[i]) faad_free(hDecoder->time_out2[i]);
         hDecoder->time_out2[i] = NULL;
 #endif
 #ifdef SSR_DEC
-        if (hDecoder->ssr_overlap[i]) free(hDecoder->ssr_overlap[i]);
+        if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]);
         hDecoder->ssr_overlap[i] = NULL;
-        if (hDecoder->prev_fmd[i]) free(hDecoder->prev_fmd[i]);
+        if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]);
         hDecoder->prev_fmd[i] = NULL;
 #endif
 #ifdef MAIN_DEC
-        if (hDecoder->pred_stat[i]) free(hDecoder->pred_stat[i]);
+        if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]);
         hDecoder->pred_stat[i] = NULL;
 #endif
 #ifdef LTP_DEC
         hDecoder->ltp_lag[i] = 0;
-        if (hDecoder->lt_pred_stat[i]) free(hDecoder->lt_pred_stat[i]);
+        if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]);
         hDecoder->lt_pred_stat[i] = NULL;
 #endif
     }
@@ -448,21 +446,29 @@
     if (hDecoder == NULL)
         return;
 
+#ifdef PROFILE
+    printf("AAC decoder total:  %I64d cycles\n", hDecoder->cycles);
+    printf("requant:            %I64d cycles\n", hDecoder->requant_cycles);
+    printf("spectral_data:      %I64d cycles\n", hDecoder->spectral_cycles);
+    printf("scalefactors:       %I64d cycles\n", hDecoder->scalefac_cycles);
+    printf("output:             %I64d cycles\n", hDecoder->output_cycles);
+#endif
+
     for (i = 0; i < MAX_CHANNELS; i++)
     {
-        if (hDecoder->time_out[i]) free(hDecoder->time_out[i]);
+        if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]);
 #ifdef SBR_DEC
-        if (hDecoder->time_out2[i]) free(hDecoder->time_out2[i]);
+        if (hDecoder->time_out2[i]) faad_free(hDecoder->time_out2[i]);
 #endif
 #ifdef SSR_DEC
-        if (hDecoder->ssr_overlap[i]) free(hDecoder->ssr_overlap[i]);
-        if (hDecoder->prev_fmd[i]) free(hDecoder->prev_fmd[i]);
+        if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]);
+        if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]);
 #endif
 #ifdef MAIN_DEC
-        if (hDecoder->pred_stat[i]) free(hDecoder->pred_stat[i]);
+        if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]);
 #endif
 #ifdef LTP_DEC
-        if (hDecoder->lt_pred_stat[i]) free(hDecoder->lt_pred_stat[i]);
+        if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]);
 #endif
     }
 
@@ -475,14 +481,8 @@
 
     drc_end(hDecoder->drc);
 
-#ifndef FIXED_POINT
-#if POW_TABLE_SIZE
-    if (hDecoder->pow2_table) free(hDecoder->pow2_table);
-#endif
-#endif
+    if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer);
 
-    if (hDecoder->sample_buffer) free(hDecoder->sample_buffer);
-
 #ifdef SBR_DEC
     for (i = 0; i < 32; i++)
     {
@@ -491,7 +491,7 @@
     }
 #endif
 
-    if (hDecoder) free(hDecoder);
+    if (hDecoder) faad_free(hDecoder);
 }
 
 void FAADAPI faacDecPostSeekReset(faacDecHandle hDecoder, int32_t frame)
@@ -745,6 +745,10 @@
 
     void *sample_buffer;
 
+#ifdef PROFILE
+    int64_t count = faad_get_ts();
+#endif
+
     /* safety checks */
     if ((hDecoder == NULL) || (hInfo == NULL) || (buffer == NULL))
     {
@@ -782,6 +786,13 @@
 #ifdef DRM
     if (object_type == DRM_ER_LC)
     {
+        /* We do not support stereo right now */
+        if (hDecoder->channelConfiguration == 2)
+        {
+            hInfo->error = 8; // Throw CRC error
+            goto error;
+        }
+
         faad_getbits(&ld, 8
             DEBUGVAR(1,1,"faacDecDecode(): skip CRC"));
     }
@@ -804,7 +815,16 @@
 #endif
 
     /* decode the complete bitstream */
-    raw_data_block(hDecoder, hInfo, &ld, pce, drc);
+#ifdef SCALABLE_DEC
+    if ((hDecoder->object_type == 6) || (hDecoder->object_type == DRM_ER_LC))
+    {
+        aac_scalable_main_element(hDecoder, hInfo, &ld, pce, drc);
+    } else {
+#endif
+        raw_data_block(hDecoder, hInfo, &ld, pce, drc);
+#ifdef SCALABLE_DEC
+    }
+#endif
 
     ch_ele = hDecoder->fr_ch_ele;
     channels = hDecoder->fr_channels;
@@ -841,7 +861,7 @@
             hDecoder->sbr[0] = sbrDecodeInit(hDecoder->frameLength, 1);
 
         /* Reverse bit reading of SBR data in DRM audio frame */
-        revbuffer = (uint8_t*)malloc(buffer_size*sizeof(uint8_t));
+        revbuffer = (uint8_t*)faad_malloc(buffer_size*sizeof(uint8_t));
         prevbufstart = revbuffer;
         pbufend = &buffer[buffer_size - 1];
         for (i = 0; i < buffer_size; i++)
@@ -922,7 +942,7 @@
         if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
             stride = 2 * stride;
 #endif
-        hDecoder->sample_buffer = malloc(frame_len*channels*stride);
+        hDecoder->sample_buffer = faad_malloc(frame_len*channels*stride);
     }
 
     sample_buffer = hDecoder->sample_buffer;
@@ -949,7 +969,7 @@
             /* Allocate space for SBR output */
             if (hDecoder->time_out2[ch] == NULL)
             {
-                hDecoder->time_out2[ch] = (real_t*)malloc(hDecoder->frameLength*2*sizeof(real_t));
+                hDecoder->time_out2[ch] = (real_t*)faad_malloc(hDecoder->frameLength*2*sizeof(real_t));
                 memset(hDecoder->time_out2[ch], 0, hDecoder->frameLength*2*sizeof(real_t));
             }
 
@@ -958,7 +978,7 @@
                 /* space for 2 channels needed */
                 if (hDecoder->time_out2[ch+1] == NULL)
                 {
-                    hDecoder->time_out2[ch+1] = (real_t*)malloc(hDecoder->frameLength*2*sizeof(real_t));
+                    hDecoder->time_out2[ch+1] = (real_t*)faad_malloc(hDecoder->frameLength*2*sizeof(real_t));
                     memset(hDecoder->time_out2[ch+1], 0, hDecoder->frameLength*2*sizeof(real_t));
                 }
 
@@ -1021,6 +1041,11 @@
     /* cleanup */
 #ifdef ANALYSIS
     fflush(stdout);
+#endif
+
+#ifdef PROFILE
+    count = faad_get_ts() - count;
+    hDecoder->cycles += count;
 #endif
 
     return sample_buffer;
--- a/libfaad/drc.c
+++ b/libfaad/drc.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: drc.c,v 1.19 2003/11/12 20:47:57 menno Exp $
+** $Id: drc.c,v 1.20 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -35,7 +35,7 @@
 
 drc_info *drc_init(real_t cut, real_t boost)
 {
-    drc_info *drc = (drc_info*)malloc(sizeof(drc_info));
+    drc_info *drc = (drc_info*)faad_malloc(sizeof(drc_info));
     memset(drc, 0, sizeof(drc_info));
 
     drc->ctrl1 = cut;
@@ -51,7 +51,7 @@
 
 void drc_end(drc_info *drc)
 {
-    if (drc) free(drc);
+    if (drc) faad_free(drc);
 }
 
 #ifdef FIXED_POINT
--- a/libfaad/filtbank.c
+++ b/libfaad/filtbank.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: filtbank.c,v 1.32 2003/11/12 20:47:57 menno Exp $
+** $Id: filtbank.c,v 1.33 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -51,7 +51,7 @@
     uint16_t frame_len_ld = frame_len/2;
 #endif
 
-    fb_info *fb = (fb_info*)malloc(sizeof(fb_info));
+    fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info));
     memset(fb, 0, sizeof(fb_info));
 
     /* normal */
@@ -87,6 +87,15 @@
     }
 #endif
 
+#ifdef USE_SSE
+    if (cpu_has_sse())
+    {
+        fb->if_func = ifilter_bank_sse;
+    } else {
+        fb->if_func = ifilter_bank;
+    }
+#endif
+
     return fb;
 }
 
@@ -94,6 +103,10 @@
 {
     if (fb != NULL)
     {
+#ifdef PROFILE
+        printf("FB:                 %I64d cycles\n", fb->cycles);
+#endif
+
         faad_mdct_end(fb->mdct256);
         faad_mdct_end(fb->mdct2048);
 #ifdef LD_DEC
@@ -100,12 +113,13 @@
         faad_mdct_end(fb->mdct1024);
 #endif
 
-        free(fb);
+        faad_free(fb);
     }
 }
 
-static INLINE void imdct(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len)
+static INLINE void imdct_long(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len)
 {
+#ifdef LD_DEC
     mdct_info *mdct;
 
     switch (len)
@@ -114,20 +128,42 @@
     case 1920:
         mdct = fb->mdct2048;
         break;
-    case 256:
-    case 240:
-        mdct = fb->mdct256;
+    case 1024:
+    case 960:
+        mdct = fb->mdct1024;
         break;
+    }
+
+    faad_imdct(mdct, in_data, out_data);
+#else
+    faad_imdct(fb->mdct2048, in_data, out_data);
+#endif
+}
+
+#ifdef USE_SSE
+static INLINE void imdct_long_sse(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len)
+{
 #ifdef LD_DEC
+    mdct_info *mdct;
+
+    switch (len)
+    {
+    case 2048:
+    case 1920:
+        mdct = fb->mdct2048;
+        break;
     case 1024:
     case 960:
         mdct = fb->mdct1024;
         break;
-#endif
     }
 
-    faad_imdct(mdct, in_data, out_data);
+    faad_imdct_sse(mdct, in_data, out_data);
+#else
+    faad_imdct_sse(fb->mdct2048, in_data, out_data);
+#endif
 }
+#endif
 
 #ifdef LTP_DEC
 static INLINE void mdct(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len)
@@ -161,12 +197,12 @@
                   real_t *time_out, uint8_t object_type, uint16_t frame_len)
 {
     int16_t i;
-    real_t transf_buf[2*1024] = {0};
+    ALIGN real_t transf_buf[2*1024] = {0};
 
-    real_t *window_long;
-    real_t *window_long_prev;
-    real_t *window_short;
-    real_t *window_short_prev;
+    const real_t *window_long;
+    const real_t *window_long_prev;
+    const real_t *window_short;
+    const real_t *window_short_prev;
 
     uint16_t nlong = frame_len;
     uint16_t nshort = frame_len/8;
@@ -174,6 +210,10 @@
 
     uint16_t nflat_ls = (nlong-nshort)/2;
 
+#ifdef PROFILE
+    int64_t count = faad_get_ts();
+#endif
+
 #ifdef LD_DEC
     if (object_type == LD)
     {
@@ -192,7 +232,7 @@
     switch (window_sequence)
     {
     case ONLY_LONG_SEQUENCE:
-        imdct(fb, freq_in, transf_buf, 2*nlong);
+        imdct_long(fb, freq_in, transf_buf, 2*nlong);
         for (i = 0; i < nlong; i+=4)
         {
             time_out[i]   = time_out[nlong+i]   + MUL_F(transf_buf[i],window_long_prev[i]);
@@ -210,7 +250,7 @@
         break;
 
     case LONG_START_SEQUENCE:
-        imdct(fb, freq_in, transf_buf, 2*nlong);
+        imdct_long(fb, freq_in, transf_buf, 2*nlong);
         for (i = 0; i < nlong; i+=4)
         {
             time_out[i]   = time_out[nlong+i]   + MUL_F(transf_buf[i],window_long_prev[i]);
@@ -227,17 +267,17 @@
         break;
 
     case EIGHT_SHORT_SEQUENCE:
-        imdct(fb, freq_in+0*nshort, transf_buf+2*nshort*0, 2*nshort);
-        imdct(fb, freq_in+1*nshort, transf_buf+2*nshort*1, 2*nshort);
-        imdct(fb, freq_in+2*nshort, transf_buf+2*nshort*2, 2*nshort);
-        imdct(fb, freq_in+3*nshort, transf_buf+2*nshort*3, 2*nshort);
-        imdct(fb, freq_in+4*nshort, transf_buf+2*nshort*4, 2*nshort);
-        imdct(fb, freq_in+5*nshort, transf_buf+2*nshort*5, 2*nshort);
-        imdct(fb, freq_in+6*nshort, transf_buf+2*nshort*6, 2*nshort);
-        imdct(fb, freq_in+7*nshort, transf_buf+2*nshort*7, 2*nshort);
+        faad_imdct(fb->mdct256, freq_in+0*nshort, transf_buf+2*nshort*0);
+        faad_imdct(fb->mdct256, freq_in+1*nshort, transf_buf+2*nshort*1);
+        faad_imdct(fb->mdct256, freq_in+2*nshort, transf_buf+2*nshort*2);
+        faad_imdct(fb->mdct256, freq_in+3*nshort, transf_buf+2*nshort*3);
+        faad_imdct(fb->mdct256, freq_in+4*nshort, transf_buf+2*nshort*4);
+        faad_imdct(fb->mdct256, freq_in+5*nshort, transf_buf+2*nshort*5);
+        faad_imdct(fb->mdct256, freq_in+6*nshort, transf_buf+2*nshort*6);
+        faad_imdct(fb->mdct256, freq_in+7*nshort, transf_buf+2*nshort*7);
         for (i = 0; i < nflat_ls; i++)
             time_out[i] = time_out[nlong+i];
-        for(i = nshort-1; i >= 0; i--)
+        for(i = 0; i < nshort; i++)
         {
             time_out[nflat_ls+         i] = time_out[nlong+nflat_ls+         i] + MUL_F(transf_buf[nshort*0+i],window_short_prev[i]);
             time_out[nflat_ls+1*nshort+i] = time_out[nlong+nflat_ls+nshort*1+i] + MUL_F(transf_buf[nshort*1+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*2+i],window_short[i]);
@@ -257,7 +297,7 @@
         break;
 
     case LONG_STOP_SEQUENCE:
-        imdct(fb, freq_in, transf_buf, 2*nlong);
+        imdct_long(fb, freq_in, transf_buf, 2*nlong);
         for (i = 0; i < nflat_ls; i++)
             time_out[i] = time_out[nlong+i];
         for (i = 0; i < nshort; i++)
@@ -268,8 +308,346 @@
             time_out[nlong+i] = MUL_F(transf_buf[nlong+i],window_long[nlong-1-i]);
 		break;
     }
+
+#ifdef PROFILE
+    count = faad_get_ts() - count;
+    fb->cycles += count;
+#endif
 }
 
+#ifdef USE_SSE
+void ifilter_bank_sse(fb_info *fb, uint8_t window_sequence, uint8_t window_shape,
+                      uint8_t window_shape_prev, real_t *freq_in,
+                      real_t *time_out, uint8_t object_type, uint16_t frame_len)
+{
+    int16_t i;
+    ALIGN real_t transf_buf[2*1024] = {0};
+
+    const real_t *window_long;
+    const real_t *window_long_prev;
+    const real_t *window_short;
+    const real_t *window_short_prev;
+
+    uint16_t nlong = frame_len;
+    uint16_t nshort = frame_len/8;
+    uint16_t trans = nshort/2;
+
+    uint16_t nflat_ls = (nlong-nshort)/2;
+
+#ifdef PROFILE
+    int64_t count = faad_get_ts();
+#endif
+
+#ifdef LD_DEC
+    if (object_type == LD)
+    {
+        window_long       = fb->ld_window[window_shape];
+        window_long_prev  = fb->ld_window[window_shape_prev];
+    } else {
+#endif
+        window_long       = fb->long_window[window_shape];
+        window_long_prev  = fb->long_window[window_shape_prev];
+        window_short      = fb->short_window[window_shape];
+        window_short_prev = fb->short_window[window_shape_prev];
+#ifdef LD_DEC
+    }
+#endif
+
+    switch (window_sequence)
+    {
+    case ONLY_LONG_SEQUENCE:
+        imdct_long_sse(fb, freq_in, transf_buf, 2*nlong);
+        for (i = 0; i < nlong; i+=4)
+        {
+            __m128 m1 = _mm_load_ps(&transf_buf[i]);
+            __m128 m2 = _mm_load_ps(&window_long_prev[i]);
+            __m128 m3 = _mm_load_ps(&time_out[nlong+i]);
+
+            __m128 m4 = _mm_mul_ps(m1, m2);
+            m4 = _mm_add_ps(m4, m3);
+
+            _mm_store_ps(&time_out[i], m4);
+        }
+        for (i = 0; i < nlong; i+=4)
+        {
+            __m128 m1 = _mm_load_ps(&transf_buf[nlong+i]);
+            __m128 m2 = _mm_load_ps(&window_long[nlong-4-i]);
+            __m128 m3, m4;
+
+            m3 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m4 = _mm_mul_ps(m1, m3);
+
+            _mm_store_ps(&time_out[nlong+i], m4);
+        }
+        break;
+
+    case LONG_START_SEQUENCE:
+        imdct_long_sse(fb, freq_in, transf_buf, 2*nlong);
+        for (i = 0; i < nlong; i+=4)
+        {
+            __m128 m1 = _mm_load_ps(&transf_buf[i]);
+            __m128 m2 = _mm_load_ps(&window_long_prev[i]);
+            __m128 m3 = _mm_load_ps(&time_out[nlong+i]);
+
+            __m128 m4 = _mm_mul_ps(m1, m2);
+            m4 = _mm_add_ps(m4, m3);
+
+            _mm_store_ps(&time_out[i], m4);
+        }
+        for (i = 0; i < nflat_ls; i+=4)
+        {
+            __m128 m1 = _mm_load_ps(&transf_buf[nlong+i]);
+            _mm_store_ps(&time_out[nlong+i], m1);
+        }
+        for (i = 0; i < nshort; i+=4)
+        {
+            __m128 m1 = _mm_load_ps(&transf_buf[nlong+nflat_ls+i]);
+            __m128 m2 = _mm_load_ps(&window_short[nshort-4-i]);
+            __m128 m3, m4;
+
+            m3 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m4 = _mm_mul_ps(m1, m3);
+
+            _mm_store_ps(&time_out[nlong+nflat_ls+i], m4);
+        }
+        for (i = 0; i < nflat_ls; i+=4)
+        {
+            __m128 m1 = _mm_setzero_ps();
+            _mm_store_ps(&time_out[nlong+nflat_ls+nshort+i], m1);
+        }
+        break;
+
+    case EIGHT_SHORT_SEQUENCE:
+        faad_imdct_sse(fb->mdct256, freq_in+0*nshort, transf_buf+2*nshort*0);
+        faad_imdct_sse(fb->mdct256, freq_in+1*nshort, transf_buf+2*nshort*1);
+        faad_imdct_sse(fb->mdct256, freq_in+2*nshort, transf_buf+2*nshort*2);
+        faad_imdct_sse(fb->mdct256, freq_in+3*nshort, transf_buf+2*nshort*3);
+        faad_imdct_sse(fb->mdct256, freq_in+4*nshort, transf_buf+2*nshort*4);
+        faad_imdct_sse(fb->mdct256, freq_in+5*nshort, transf_buf+2*nshort*5);
+        faad_imdct_sse(fb->mdct256, freq_in+6*nshort, transf_buf+2*nshort*6);
+        faad_imdct_sse(fb->mdct256, freq_in+7*nshort, transf_buf+2*nshort*7);
+        for (i = 0; i < nflat_ls; i+=4)
+        {
+            __m128 m1 = _mm_load_ps(&time_out[nlong+i]);
+            _mm_store_ps(&time_out[i], m1);
+        }
+        for (i = 0; i < nshort; i+=4)
+        {
+            __m128 m1 = _mm_load_ps(&transf_buf[nshort*0+i]);
+            __m128 m2 = _mm_load_ps(&window_short_prev[i]);
+            __m128 m3 = _mm_load_ps(&time_out[nlong+nflat_ls+i]);
+
+            __m128 m4 = _mm_mul_ps(m1, m2);
+            m4 = _mm_add_ps(m4, m3);
+
+            _mm_store_ps(&time_out[nflat_ls+i], m4);
+        }
+        for (i = 0; i < nshort; i+=4)
+        {
+            __m128 m1, m2, m3, m4, m5, m6, m7, m8;
+            m1 = _mm_load_ps(&transf_buf[nshort*1+i]);
+            m2 = _mm_load_ps(&window_short[nshort-4-i]);
+            m3 = _mm_load_ps(&time_out[nlong+nflat_ls+nshort*1+i]);
+            m6 = _mm_load_ps(&transf_buf[nshort*2+i]);
+            m7 = _mm_load_ps(&window_short[i]);
+
+            m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m4 = _mm_mul_ps(m1, m5);
+            m8 = _mm_mul_ps(m6, m7);
+            m4 = _mm_add_ps(m4, m3);
+            m4 = _mm_add_ps(m4, m8);
+
+            _mm_store_ps(&time_out[nflat_ls+1*nshort+i], m4);
+        }
+        for (i = 0; i < nshort; i+=4)
+        {
+            __m128 m1, m2, m3, m4, m5, m6, m7, m8;
+            m1 = _mm_load_ps(&transf_buf[nshort*3+i]);
+            m2 = _mm_load_ps(&window_short[nshort-4-i]);
+            m3 = _mm_load_ps(&time_out[nlong+nflat_ls+nshort*2+i]);
+            m6 = _mm_load_ps(&transf_buf[nshort*4+i]);
+            m7 = _mm_load_ps(&window_short[i]);
+
+            m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m4 = _mm_mul_ps(m1, m5);
+            m8 = _mm_mul_ps(m6, m7);
+            m4 = _mm_add_ps(m4, m3);
+            m4 = _mm_add_ps(m4, m8);
+
+            _mm_store_ps(&time_out[nflat_ls+2*nshort+i], m4);
+        }
+        for (i = 0; i < nshort; i+=4)
+        {
+            __m128 m1, m2, m3, m4, m5, m6, m7, m8;
+            m1 = _mm_load_ps(&transf_buf[nshort*5+i]);
+            m2 = _mm_load_ps(&window_short[nshort-4-i]);
+            m3 = _mm_load_ps(&time_out[nlong+nflat_ls+nshort*3+i]);
+            m6 = _mm_load_ps(&transf_buf[nshort*6+i]);
+            m7 = _mm_load_ps(&window_short[i]);
+
+            m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m4 = _mm_mul_ps(m1, m5);
+            m8 = _mm_mul_ps(m6, m7);
+            m4 = _mm_add_ps(m4, m3);
+            m4 = _mm_add_ps(m4, m8);
+
+            _mm_store_ps(&time_out[nflat_ls+3*nshort+i], m4);
+        }
+        for(i = 0; i < trans; i+=4)
+        {
+            __m128 m1, m2, m3, m4, m5, m6, m7, m8;
+            m1 = _mm_load_ps(&transf_buf[nshort*7+i]);
+            m2 = _mm_load_ps(&window_short[nshort-4-i]);
+            m3 = _mm_load_ps(&time_out[nlong+nflat_ls+nshort*4+i]);
+            m6 = _mm_load_ps(&transf_buf[nshort*8+i]);
+            m7 = _mm_load_ps(&window_short[i]);
+
+            m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m4 = _mm_mul_ps(m1, m5);
+            m8 = _mm_mul_ps(m6, m7);
+            m4 = _mm_add_ps(m4, m3);
+            m4 = _mm_add_ps(m4, m8);
+
+            _mm_store_ps(&time_out[nflat_ls+4*nshort+i], m4);
+        }
+        for (i = trans; i < nshort; i+=4)
+        {
+            __m128 m1, m2, m3, m4, m5, m6, m7, m8;
+            m1 = _mm_load_ps(&transf_buf[nshort*7+i]);
+            m2 = _mm_load_ps(&window_short[nshort-4-i]);
+            m6 = _mm_load_ps(&transf_buf[nshort*8+i]);
+            m7 = _mm_load_ps(&window_short[i]);
+
+            m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m4 = _mm_mul_ps(m1, m5);
+            m8 = _mm_mul_ps(m6, m7);
+            m3 = _mm_add_ps(m4, m8);
+
+            _mm_store_ps(&time_out[nflat_ls+4*nshort+i], m3);
+        }
+        for (i = 0; i < nshort; i+=4)
+        {
+            __m128 m1, m2, m3, m4, m5, m6, m7, m8;
+            m1 = _mm_load_ps(&transf_buf[nshort*9+i]);
+            m2 = _mm_load_ps(&window_short[nshort-4-i]);
+            m6 = _mm_load_ps(&transf_buf[nshort*10+i]);
+            m7 = _mm_load_ps(&window_short[i]);
+
+            m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m4 = _mm_mul_ps(m1, m5);
+            m8 = _mm_mul_ps(m6, m7);
+            m3 = _mm_add_ps(m4, m8);
+
+            _mm_store_ps(&time_out[nflat_ls+5*nshort+i], m3);
+        }
+        for (i = 0; i < nshort; i+=4)
+        {
+            __m128 m1, m2, m3, m4, m5, m6, m7, m8;
+            m1 = _mm_load_ps(&transf_buf[nshort*11+i]);
+            m2 = _mm_load_ps(&window_short[nshort-4-i]);
+            m6 = _mm_load_ps(&transf_buf[nshort*12+i]);
+            m7 = _mm_load_ps(&window_short[i]);
+
+            m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m4 = _mm_mul_ps(m1, m5);
+            m8 = _mm_mul_ps(m6, m7);
+            m3 = _mm_add_ps(m4, m8);
+
+            _mm_store_ps(&time_out[nflat_ls+6*nshort+i], m3);
+        }
+        for (i = 0; i < nshort; i+=4)
+        {
+            __m128 m1, m2, m3, m4, m5, m6, m7, m8;
+            m1 = _mm_load_ps(&transf_buf[nshort*13+i]);
+            m2 = _mm_load_ps(&window_short[nshort-4-i]);
+            m6 = _mm_load_ps(&transf_buf[nshort*14+i]);
+            m7 = _mm_load_ps(&window_short[i]);
+
+            m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m4 = _mm_mul_ps(m1, m5);
+            m8 = _mm_mul_ps(m6, m7);
+            m3 = _mm_add_ps(m4, m8);
+
+            _mm_store_ps(&time_out[nflat_ls+7*nshort+i], m3);
+        }
+        for (i = 0; i < nshort; i+=4)
+        {
+            __m128 m1, m2, m3, m5;
+            m1 = _mm_load_ps(&transf_buf[nshort*15+i]);
+            m2 = _mm_load_ps(&window_short[nshort-4-i]);
+
+            m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m3 = _mm_mul_ps(m1, m5);
+
+            _mm_store_ps(&time_out[nflat_ls+8*nshort+i], m3);
+        }
+        for (i = 0; i < nflat_ls; i+=4)
+        {
+            __m128 m1 = _mm_setzero_ps();
+            _mm_store_ps(&time_out[nlong+nflat_ls+nshort+i], m1);
+        }
+        break;
+
+    case LONG_STOP_SEQUENCE:
+        imdct_long_sse(fb, freq_in, transf_buf, 2*nlong);
+        for (i = 0; i < nflat_ls; i+=4)
+        {
+            __m128 m1 = _mm_load_ps(&time_out[nlong+i]);
+            _mm_store_ps(&time_out[i], m1);
+        }
+        for (i = 0; i < nshort; i+=4)
+        {
+            __m128 m1 = _mm_load_ps(&transf_buf[nflat_ls+i]);
+            __m128 m2 = _mm_load_ps(&window_short_prev[i]);
+            __m128 m3 = _mm_load_ps(&time_out[nlong+nflat_ls+i]);
+
+            __m128 m4 = _mm_mul_ps(m1, m2);
+            m4 = _mm_add_ps(m4, m3);
+
+            _mm_store_ps(&time_out[nflat_ls+i], m4);
+        }
+        for (i = 0; i < nflat_ls; i+=4)
+        {
+            __m128 m1 = _mm_load_ps(&transf_buf[nflat_ls+nshort+i]);
+            __m128 m2 = _mm_load_ps(&time_out[nlong+nflat_ls+nshort+i]);
+
+            __m128 m3 = _mm_add_ps(m1, m2);
+
+            _mm_store_ps(&time_out[nflat_ls+nshort+i], m3);
+        }
+        for (i = 0; i < nlong; i+=4)
+        {
+            __m128 m1 = _mm_load_ps(&transf_buf[nlong+i]);
+            __m128 m2 = _mm_load_ps(&window_long[nlong-4-i]);
+            __m128 m3, m4;
+
+            m3 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3));
+
+            m4 = _mm_mul_ps(m1, m3);
+
+            _mm_store_ps(&time_out[nlong+i], m4);
+        }
+		break;
+    }
+
+#ifdef PROFILE
+    count = faad_get_ts() - count;
+    fb->cycles += count;
+#endif
+}
+#endif
+
 #ifdef LTP_DEC
 /* only works for LTP -> no overlapping, no short blocks */
 void filter_bank_ltp(fb_info *fb, uint8_t window_sequence, uint8_t window_shape,
@@ -277,12 +655,12 @@
                      uint8_t object_type, uint16_t frame_len)
 {
     int16_t i;
-    real_t windowed_buf[2*1024] = {0};
+    ALIGN real_t windowed_buf[2*1024] = {0};
 
-    real_t *window_long;
-    real_t *window_long_prev;
-    real_t *window_short;
-    real_t *window_short_prev;
+    const real_t *window_long;
+    const real_t *window_long_prev;
+    const real_t *window_short;
+    const real_t *window_short_prev;
 
     uint16_t nlong = frame_len;
     uint16_t nshort = frame_len/8;
--- a/libfaad/filtbank.h
+++ b/libfaad/filtbank.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: filtbank.h,v 1.17 2003/11/12 20:47:57 menno Exp $
+** $Id: filtbank.h,v 1.18 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __FILTBANK_H__
@@ -55,6 +55,11 @@
                   real_t *time_out,
                   uint8_t object_type,
                   uint16_t frame_len);
+#ifdef USE_SSE
+void ifilter_bank_sse(fb_info *fb, uint8_t window_sequence, uint8_t window_shape,
+                      uint8_t window_shape_prev, real_t *freq_in,
+                      real_t *time_out, uint8_t object_type, uint16_t frame_len);
+#endif
 
 #ifdef __cplusplus
 }
--- a/libfaad/fixed.h
+++ b/libfaad/fixed.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: fixed.h,v 1.15 2003/11/12 20:47:57 menno Exp $
+** $Id: fixed.h,v 1.16 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __FIXED_H__
@@ -32,6 +32,9 @@
 extern "C" {
 #endif
 
+#ifdef _WIN32_WCE
+#include <cmnintrin.h>
+#endif
 
 #define COEF_BITS 28
 #define COEF_PRECISION (1 << COEF_BITS)
@@ -169,7 +172,6 @@
   #define MUL_F(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (FRAC_BITS-1))) >> FRAC_BITS)
 #else
   /* eVC for PocketPC has an intrinsic function that returns only the high 32 bits of a 32x32 bit multiply */
-  #include <cmnintrin.h>
   static INLINE real_t MUL_F(real_t A, real_t B)
   {
       return _MulHigh(A,B) << (32-FRAC_BITS);
--- a/libfaad/ic_predict.c
+++ b/libfaad/ic_predict.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: ic_predict.c,v 1.18 2003/11/12 20:47:57 menno Exp $
+** $Id: ic_predict.c,v 1.19 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -79,7 +79,7 @@
 
 static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t pred)
 {
-    uint32_t tmp;
+    uint16_t tmp;
     int16_t i, j;
     real_t dr1, predictedvalue;
     real_t e0, e1;
--- a/libfaad/ic_predict.h
+++ b/libfaad/ic_predict.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: ic_predict.h,v 1.14 2003/11/12 20:47:57 menno Exp $
+** $Id: ic_predict.h,v 1.15 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifdef MAIN_DEC
@@ -43,7 +43,7 @@
 void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state,
                    uint16_t frame_len, uint8_t sf_index);
 
-static const real_t mnt_table[128] = {
+ALIGN static const real_t mnt_table[128] = {
     COEF_CONST(0.9531250000), COEF_CONST(0.9453125000),
     COEF_CONST(0.9375000000), COEF_CONST(0.9296875000),
     COEF_CONST(0.9257812500), COEF_CONST(0.9179687500),
@@ -110,7 +110,7 @@
     COEF_CONST(0.4804687500), COEF_CONST(0.4785156250)
 };
 
-static const real_t exp_table[128] = {
+ALIGN static const real_t exp_table[128] = {
     COEF_CONST(0.50000000000000000000000000000000000000000000000000),
     COEF_CONST(0.25000000000000000000000000000000000000000000000000),
     COEF_CONST(0.12500000000000000000000000000000000000000000000000),
@@ -237,7 +237,7 @@
     COEF_CONST(0.00000000000000000000000000000000000004701977403289),
     COEF_CONST(0.00000000000000000000000000000000000002350988701645),
     COEF_CONST(0.00000000000000000000000000000000000001175494350822),
-    COEF_CONST(0.00000000000000000000000000000000000000587747175411),
+    COEF_CONST(0.0 /* 0000000000000000000000000000000000000587747175411 "floating point underflow" */),
     COEF_CONST(0.0)
 };
 
--- a/libfaad/iq_table.h
+++ b/libfaad/iq_table.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: iq_table.h,v 1.10 2003/11/12 20:47:57 menno Exp $
+** $Id: iq_table.h,v 1.11 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef IQ_TABLE_H__
@@ -38,7 +38,7 @@
 
 #ifndef FIXED_POINT
 
-#define IQ_TABLE_SIZE 256
+#define IQ_TABLE_SIZE 8192
 
 #ifdef _MSC_VER
 #pragma warning(disable:4305)
@@ -45,10 +45,10 @@
 #pragma warning(disable:4244)
 #endif
 
-static real_t iq_table[IQ_TABLE_SIZE] =
+ALIGN static const real_t iq_table[IQ_TABLE_SIZE] =
 {
-    0.0,
-    1.0,
+    0,
+    1,
     2.5198420997897464,
     4.3267487109222245,
     6.3496042078727974,
@@ -302,7 +302,7943 @@
     1591.7226186094069,
     1600.1499964845941,
     1608.58848496618,
-    1617.0380548731737
+    1617.0380548731737,
+    1625.4986772154357,
+    1633.9703231916887,
+    1642.4529641875577,
+    1650.9465717736346,
+    1659.4511177035752,
+    1667.9665739122186,
+    1676.4929125137353,
+    1685.030105799801,
+    1693.5781262377957,
+    1702.136946469027,
+    1710.7065393069795,
+    1719.2868777355877,
+    1727.8779349075323,
+    1736.4796841425596,
+    1745.092098925825,
+    1753.7151529062583,
+    1762.3488198949503,
+    1770.9930738635628,
+    1779.6478889427597,
+    1788.3132394206564,
+    1796.9890997412947,
+    1805.6754445031333,
+    1814.3722484575621,
+    1823.0794865074322,
+    1831.7971337056094,
+    1840.5251652535437,
+    1849.2635564998579,
+    1858.0122829389563,
+    1866.7713202096493,
+    1875.5406440937966,
+    1884.3202305149687,
+    1893.110055537124,
+    1901.9100953633042,
+    1910.7203263343454,
+    1919.5407249276057,
+    1928.3712677557098,
+    1937.2119315653083,
+    1946.0626932358525,
+    1954.923529778386,
+    1963.79441833435,
+    1972.6753361744036,
+    1981.5662606972594,
+    1990.467169428533,
+    1999.3780400196069,
+    2008.2988502465078,
+    2017.2295780087982,
+    2026.1702013284819,
+    2035.1206983489212,
+    2044.0810473337688,
+    2053.0512266659125,
+    2062.0312148464309,
+    2071.0209904935646,
+    2080.0205323416958,
+    2089.0298192403443,
+    2098.0488301531714,
+    2107.0775441569995,
+    2116.115940440839,
+    2125.1639983049317,
+    2134.2216971597995,
+    2143.2890165253098,
+    2152.3659360297484,
+    2161.4524354089031,
+    2170.5484945051617,
+    2179.6540932666144,
+    2188.7692117461711,
+    2197.8938301006888,
+    2207.0279285901042,
+    2216.1714875765838,
+    2225.324487523676,
+    2234.4869089954782,
+    2243.6587326558101,
+    2252.8399392673982,
+    2262.0305096910702,
+    2271.2304248849537,
+    2280.4396659036897,
+    2289.6582138976523,
+    2298.8860501121762,
+    2308.1231558867926,
+    2317.3695126544767,
+    2326.6251019409005,
+    2335.8899053636933,
+    2345.1639046317132,
+    2354.4470815443233,
+    2363.7394179906792,
+    2373.0408959490205,
+    2382.3514974859731,
+    2391.6712047558558,
+    2400.9999999999991,
+    2410.3378655460651,
+    2419.6847838073813,
+    2429.0407372822747,
+    2438.4057085534191,
+    2447.7796802871858,
+    2457.1626352330004,
+    2466.5545562227112,
+    2475.9554261699564,
+    2485.3652280695474,
+    2494.7839449968492,
+    2504.2115601071737,
+    2513.6480566351788,
+    2523.0934178942675,
+    2532.5476272760025,
+    2542.0106682495189,
+    2551.482524360948,
+    2560.9631792328441,
+    2570.4526165636184,
+    2579.9508201269791,
+    2589.4577737713744,
+    2598.9734614194458,
+    2608.4978670674823,
+    2618.0309747848837,
+    2627.5727687136259,
+    2637.1232330677353,
+    2646.6823521327647,
+    2656.2501102652768,
+    2665.8264918923328,
+    2675.4114815109842,
+    2685.0050636877722,
+    2694.6072230582295,
+    2704.2179443263894,
+    2713.8372122642972,
+    2723.4650117115279,
+    2733.1013275747096,
+    2742.7461448270483,
+    2752.3994485078601,
+    2762.0612237221085,
+    2771.7314556399419,
+    2781.4101294962406,
+    2791.0972305901655,
+    2800.7927442847094,
+    2810.4966560062589,
+    2820.2089512441521,
+    2829.9296155502466,
+    2839.6586345384894,
+    2849.3959938844923,
+    2859.1416793251065,
+    2868.8956766580086,
+    2878.6579717412847,
+    2888.4285504930212,
+    2898.2073988908974,
+    2907.9945029717837,
+    2917.789848831344,
+    2927.5934226236377,
+    2937.4052105607311,
+    2947.2251989123079,
+    2957.0533740052865,
+    2966.8897222234368,
+    2976.734230007005,
+    2986.5868838523397,
+    2996.4476703115197,
+    3006.3165759919889,
+    3016.1935875561908,
+    3026.0786917212095,
+    3035.9718752584108,
+    3045.8731249930906,
+    3055.7824278041207,
+    3065.6997706236039,
+    3075.625140436528,
+    3085.5585242804245,
+    3095.4999092450298,
+    3105.4492824719491,
+    3115.4066311543256,
+    3125.3719425365089,
+    3135.3452039137287,
+    3145.3264026317715,
+    3155.3155260866592,
+    3165.3125617243295,
+    3175.3174970403229,
+    3185.3303195794679,
+    3195.35101693557,
+    3205.3795767511078,
+    3215.4159867169251,
+    3225.460234571929,
+    3235.5123081027928,
+    3245.5721951436558,
+    3255.63988357583,
+    3265.7153613275095,
+    3275.7986163734795,
+    3285.8896367348289,
+    3295.9884104786665,
+    3306.0949257178395,
+    3316.2091706106517,
+    3326.331133360588,
+    3336.4608022160378,
+    3346.5981654700231,
+    3356.7432114599264,
+    3366.8959285672249,
+    3377.0563052172211,
+    3387.2243298787821,
+    3397.3999910640764,
+    3407.5832773283128,
+    3417.7741772694862,
+    3427.9726795281199,
+    3438.1787727870123,
+    3448.3924457709873,
+    3458.6136872466445,
+    3468.8424860221107,
+    3479.0788309467976,
+    3489.3227109111554,
+    3499.5741148464344,
+    3509.8330317244445,
+    3520.0994505573185,
+    3530.3733603972751,
+    3540.6547503363886,
+    3550.9436095063534,
+    3561.239927078258,
+    3571.5436922623535,
+    3581.8548943078308,
+    3592.1735225025936,
+    3602.4995661730372,
+    3612.8330146838275,
+    3623.1738574376814,
+    3633.5220838751502,
+    3643.8776834744031,
+    3654.2406457510142,
+    3664.6109602577494,
+    3674.9886165843564,
+    3685.3736043573545,
+    3695.7659132398294,
+    3706.1655329312248,
+    3716.5724531671399,
+    3726.9866637191262,
+    3737.4081543944876,
+    3747.8369150360782,
+    3758.2729355221072,
+    3768.7162057659411,
+    3779.1667157159077,
+    3789.6244553551055,
+    3800.0894147012082,
+    3810.5615838062768,
+    3821.0409527565694,
+    3831.5275116723533,
+    3842.0212507077194,
+    3852.522160050396,
+    3863.0302299215673,
+    3873.5454505756893,
+    3884.0678123003108,
+    3894.5973054158922,
+    3905.1339202756285,
+    3915.6776472652732,
+    3926.2284768029604,
+    3936.7863993390338,
+    3947.3514053558706,
+    3957.9234853677135,
+    3968.5026299204969,
+    3979.0888295916798,
+    3989.6820749900776,
+    4000.2823567556948,
+    4010.8896655595613,
+    4021.5039921035655,
+    4032.1253271202945,
+    4042.7536613728694,
+    4053.3889856547858,
+    4064.0312907897551,
+    4074.6805676315448,
+    4085.3368070638221,
+    4095.9999999999982,
+    4106.6701373830711,
+    4117.347210185475,
+    4128.0312094089259,
+    4138.722126084268,
+    4149.4199512713267,
+    4160.1246760587583,
+    4170.8362915638982,
+    4181.5547889326181,
+    4192.2801593391769,
+    4203.0123939860741,
+    4213.7514841039101,
+    4224.4974209512384,
+    4235.2501958144258,
+    4246.0098000075095,
+    4256.7762248720574,
+    4267.549461777031,
+    4278.3295021186423,
+    4289.1163373202198,
+    4299.9099588320714,
+    4310.7103581313495,
+    4321.5175267219138,
+    4332.3314561342004,
+    4343.152137925088,
+    4353.9795636777671,
+    4364.8137250016052,
+    4375.6546135320223,
+    4386.5022209303588,
+    4397.3565388837469,
+    4408.2175591049827,
+    4419.0852733324018,
+    4429.9596733297531,
+    4440.8407508860728,
+    4451.7284978155603,
+    4462.6229059574571,
+    4473.5239671759227,
+    4484.4316733599126,
+    4495.3460164230582,
+    4506.2669883035496,
+    4517.1945809640119,
+    4528.1287863913894,
+    4539.069596596828,
+    4550.0170036155587,
+    4560.9709995067806,
+    4571.931576353546,
+    4582.898726262647,
+    4593.8724413645004,
+    4604.8527138130348,
+    4615.8395357855816,
+    4626.8328994827571,
+    4637.8327971283588,
+    4648.8392209692511,
+    4659.8521632752563,
+    4670.8716163390473,
+    4681.8975724760394,
+    4692.9300240242837,
+    4703.9689633443595,
+    4715.0143828192668,
+    4726.0662748543255,
+    4737.1246318770682,
+    4748.1894463371373,
+    4759.2607107061804,
+    4770.3384174777493,
+    4781.4225591671993,
+    4792.5131283115852,
+    4803.6101174695614,
+    4814.7135192212854,
+    4825.8233261683154,
+    4836.9395309335096,
+    4848.0621261609349,
+    4859.1911045157631,
+    4870.3264586841779,
+    4881.4681813732768,
+    4892.6162653109768,
+    4903.7707032459193,
+    4914.931487947375,
+    4926.0986122051509,
+    4937.2720688294967,
+    4948.4518506510112,
+    4959.637950520555,
+    4970.8303613091521,
+    4982.0290759079044,
+    4993.2340872278974,
+    5004.4453882001153,
+    5015.6629717753467,
+    5026.8868309241007,
+    5038.1169586365131,
+    5049.353347922266,
+    5060.5959918104927,
+    5071.8448833496996,
+    5083.1000156076734,
+    5094.3613816713996,
+    5105.6289746469747,
+    5116.9027876595246,
+    5128.18281385312,
+    5139.4690463906918,
+    5150.7614784539473,
+    5162.0601032432933,
+    5173.3649139777472,
+    5184.6759038948594,
+    5195.9930662506322,
+    5207.3163943194386,
+    5218.6458813939435,
+    5229.9815207850224,
+    5241.3233058216847,
+    5252.6712298509919,
+    5264.025286237983,
+    5275.3854683655954,
+    5286.7517696345885,
+    5298.1241834634639,
+    5309.5027032883945,
+    5320.887322563146,
+    5332.2780347589978,
+    5343.6748333646756,
+    5355.0777118862716,
+    5366.4866638471722,
+    5377.901682787985,
+    5389.3227622664635,
+    5400.749895857437,
+    5412.1830771527357,
+    5423.622299761123,
+    5435.067557308219,
+    5446.5188434364318,
+    5457.9761518048872,
+    5469.4394760893592,
+    5480.9088099821975,
+    5492.3841471922606,
+    5503.8654814448455,
+    5515.3528064816201,
+    5526.846116060552,
+    5538.3454039558474,
+    5549.8506639578736,
+    5561.3618898731029,
+    5572.8790755240361,
+    5584.4022147491451,
+    5595.9313014027975,
+    5607.4663293552012,
+    5619.0072924923297,
+    5630.5541847158656,
+    5642.1069999431284,
+    5653.665732107017,
+    5665.230375155943,
+    5676.8009230537655,
+    5688.3773697797333,
+    5699.9597093284156,
+    5711.5479357096474,
+    5723.1420429484588,
+    5734.7420250850209,
+    5746.347876174581,
+    5757.9595902874016,
+    5769.5771615087006,
+    5781.2005839385911,
+    5792.8298516920213,
+    5804.4649588987149,
+    5816.1058997031105,
+    5827.7526682643065,
+    5839.4052587559972,
+    5851.0636653664196,
+    5862.7278822982908,
+    5874.3979037687541,
+    5886.0737240093204,
+    5897.7553372658094,
+    5909.4427377982956,
+    5921.1359198810505,
+    5932.8348778024874,
+    5944.5396058651031,
+    5956.2500983854261,
+    5967.9663496939575,
+    5979.6883541351208,
+    5991.4161060672022,
+    6003.1495998623004,
+    6014.8888299062692,
+    6026.6337905986684,
+    6038.3844763527022,
+    6050.1408815951781,
+    6061.9030007664414,
+    6073.6708283203316,
+    6085.4443587241267,
+    6097.2235864584891,
+    6109.0085060174197,
+    6120.7991119081998,
+    6132.595398651345,
+    6144.3973607805519,
+    6156.2049928426459,
+    6168.0182893975361,
+    6179.8372450181578,
+    6191.6618542904307,
+    6203.4921118132024,
+    6215.3280121982016,
+    6227.1695500699925,
+    6239.0167200659189,
+    6250.8695168360628,
+    6262.7279350431891,
+    6274.5919693627056,
+    6286.4616144826068,
+    6298.3368651034316,
+    6310.2177159382172,
+    6322.1041617124456,
+    6333.9961971640032,
+    6345.8938170431311,
+    6357.7970161123785,
+    6369.7057891465583,
+    6381.6201309327007,
+    6393.5400362700075,
+    6405.4654999698032,
+    6417.3965168554978,
+    6429.3330817625329,
+    6441.2751895383453,
+    6453.2228350423138,
+    6465.176013145724,
+    6477.134718731716,
+    6489.0989466952469,
+    6501.0686919430445,
+    6513.0439493935628,
+    6525.0247139769417,
+    6537.010980634961,
+    6549.002744321001,
+    6560.9999999999973,
+    6573.0027426483985,
+    6585.0109672541284,
+    6597.0246688165371,
+    6609.0438423463656,
+    6621.0684828657004,
+    6633.0985854079354,
+    6645.134145017727,
+    6657.1751567509573,
+    6669.2216156746908,
+    6681.2735168671343,
+    6693.3308554176001,
+    6705.3936264264594,
+    6717.461825005108,
+    6729.535446275926,
+    6741.6144853722335,
+    6753.6989374382601,
+    6765.7887976290967,
+    6777.8840611106634,
+    6789.9847230596661,
+    6802.0907786635626,
+    6814.2022231205201,
+    6826.3190516393797,
+    6838.4412594396181,
+    6850.5688417513074,
+    6862.701793815083,
+    6874.840110882099,
+    6886.9837882139991,
+    6899.1328210828724,
+    6911.2872047712199,
+    6923.4469345719199,
+    6935.6120057881863,
+    6947.7824137335365,
+    6959.9581537317536,
+    6972.1392211168532,
+    6984.3256112330409,
+    6996.5173194346862,
+    7008.7143410862773,
+    7020.9166715623942,
+    7033.1243062476678,
+    7045.3372405367481,
+    7057.5554698342685,
+    7069.7789895548103,
+    7082.0077951228714,
+    7094.2418819728273,
+    7106.4812455489018,
+    7118.7258813051285,
+    7130.9757847053224,
+    7143.2309512230404,
+    7155.4913763415516,
+    7167.7570555538041,
+    7180.0279843623894,
+    7192.3041582795131,
+    7204.5855728269571,
+    7216.8722235360519,
+    7229.1641059476406,
+    7241.4612156120484,
+    7253.7635480890503,
+    7266.0710989478375,
+    7278.3838637669869,
+    7290.7018381344296,
+    7303.0250176474174,
+    7315.3533979124932,
+    7327.6869745454596,
+    7340.0257431713462,
+    7352.3696994243801,
+    7364.7188389479543,
+    7377.0731573945968,
+    7389.4326504259407,
+    7401.7973137126937,
+    7414.1671429346061,
+    7426.5421337804428,
+    7438.922281947951,
+    7451.3075831438346,
+    7463.6980330837177,
+    7476.0936274921214,
+    7488.4943621024304,
+    7500.9002326568652,
+    7513.3112349064522,
+    7525.7273646109943,
+    7538.1486175390446,
+    7550.5749894678729,
+    7563.0064761834419,
+    7575.4430734803736,
+    7587.8847771619248,
+    7600.3315830399597,
+    7612.7834869349153,
+    7625.24048467578,
+    7637.7025721000637,
+    7650.1697450537677,
+    7662.6419993913596,
+    7675.1193309757446,
+    7687.6017356782404,
+    7700.0892093785433,
+    7712.5817479647112,
+    7725.079347333125,
+    7737.5820033884729,
+    7750.0897120437139,
+    7762.6024692200581,
+    7775.1202708469355,
+    7787.6431128619733,
+    7800.1709912109645,
+    7812.7039018478481,
+    7825.2418407346768,
+    7837.7848038415968,
+    7850.3327871468155,
+    7862.8857866365806,
+    7875.4437983051539,
+    7888.006818154784,
+    7900.5748421956796,
+    7913.1478664459901,
+    7925.725886931772,
+    7938.3088996869719,
+    7950.8969007533951,
+    7963.4898861806851,
+    7976.0878520262959,
+    7988.6907943554688,
+    8001.2987092412086,
+    8013.911592764257,
+    8026.5294410130691,
+    8039.1522500837891,
+    8051.7800160802271,
+    8064.412735113835,
+    8077.0504033036796,
+    8089.6930167764222,
+    8102.3405716662946,
+    8114.9930641150731,
+    8127.6504902720571,
+    8140.3128462940449,
+    8152.9801283453098,
+    8165.6523325975786,
+    8178.3294552300049,
+    8191.0114924291529,
+    8203.6984403889655,
+    8216.3902953107463,
+    8229.0870534031419,
+    8241.7887108821069,
+    8254.4952639708936,
+    8267.2067089000211,
+    8279.9230419072574,
+    8292.6442592375952,
+    8305.3703571432306,
+    8318.101331883543,
+    8330.8371797250657,
+    8343.577896941475,
+    8356.3234798135582,
+    8369.0739246291978,
+    8381.8292276833508,
+    8394.5893852780209,
+    8407.3543937222421,
+    8420.1242493320569,
+    8432.8989484304948,
+    8445.6784873475499,
+    8458.4628624201578,
+    8471.2520699921806,
+    8484.0461064143838,
+    8496.8449680444082,
+    8509.6486512467636,
+    8522.4571523927953,
+    8535.270467860666,
+    8548.0885940353437,
+    8560.9115273085663,
+    8573.7392640788403,
+    8586.5718007514006,
+    8599.4091337382069,
+    8612.2512594579148,
+    8625.0981743358552,
+    8637.9498748040205,
+    8650.8063573010386,
+    8663.6676182721567,
+    8676.533654169225,
+    8689.4044614506638,
+    8702.2800365814601,
+    8715.1603760331418,
+    8728.0454762837508,
+    8740.9353338178389,
+    8753.8299451264356,
+    8766.7293067070332,
+    8779.6334150635721,
+    8792.5422667064158,
+    8805.4558581523324,
+    8818.3741859244819,
+    8831.2972465523908,
+    8844.2250365719356,
+    8857.1575525253265,
+    8870.0947909610859,
+    8883.0367484340295,
+    8895.9834215052524,
+    8908.934806742107,
+    8921.8909007181846,
+    8934.8517000132997,
+    8947.817201213471,
+    8960.7874009109,
+    8973.7622957039603,
+    8986.7418821971733,
+    8999.7261570011924,
+    9012.7151167327884,
+    9025.7087580148236,
+    9038.7070774762469,
+    9051.7100717520643,
+    9064.7177374833282,
+    9077.7300713171153,
+    9090.7470699065179,
+    9103.7687299106146,
+    9116.7950479944648,
+    9129.8260208290812,
+    9142.8616450914233,
+    9155.9019174643727,
+    9168.9468346367157,
+    9181.9963933031358,
+    9195.0505901641845,
+    9208.1094219262741,
+    9221.1728853016557,
+    9234.240977008405,
+    9247.3136937704076,
+    9260.3910323173386,
+    9273.472989384647,
+    9286.5595617135423,
+    9299.6507460509747,
+    9312.7465391496207,
+    9325.8469377678684,
+    9338.9519386698012,
+    9352.0615386251757,
+    9365.1757344094131,
+    9378.2945228035842,
+    9391.4179005943843,
+    9404.5458645741273,
+    9417.6784115407263,
+    9430.8155382976747,
+    9443.9572416540359,
+    9457.1035184244265,
+    9470.2543654290002,
+    9483.4097794934296,
+    9496.5697574488931,
+    9509.7342961320664,
+    9522.9033923850911,
+    9536.0770430555804,
+    9549.2552449965824,
+    9562.4379950665825,
+    9575.6252901294793,
+    9588.8171270545736,
+    9602.0135027165488,
+    9615.2144139954635,
+    9628.4198577767274,
+    9641.629830951093,
+    9654.844330414644,
+    9668.0633530687719,
+    9681.286895820167,
+    9694.5149555808002,
+    9707.7475292679192,
+    9720.9846138040157,
+    9734.2262061168276,
+    9747.4723031393187,
+    9760.7229018096641,
+    9773.9779990712323,
+    9787.2375918725811,
+    9800.5016771674327,
+    9813.7702519146696,
+    9827.0433130783094,
+    9840.3208576275028,
+    9853.602882536512,
+    9866.8893847846994,
+    9880.1803613565116,
+    9893.4758092414686,
+    9906.7757254341523,
+    9920.0801069341851,
+    9933.3889507462245,
+    9946.7022538799429,
+    9960.0200133500221,
+    9973.3422261761298,
+    9986.6688893829159,
+    9999.9999999999945,
+    10013.335555061929,
+    10026.675551608221,
+    10040.019986683301,
+    10053.368857336509,
+    10066.722160622081,
+    10080.079893599144,
+    10093.442053331697,
+    10106.808636888598,
+    10120.179641343551,
+    10133.555063775095,
+    10146.934901266595,
+    10160.31915090622,
+    10173.707809786936,
+    10187.100875006496,
+    10200.498343667417,
+    10213.900212876984,
+    10227.306479747222,
+    10240.717141394889,
+    10254.132194941467,
+    10267.551637513146,
+    10280.975466240814,
+    10294.40367826004,
+    10307.836270711066,
+    10321.273240738796,
+    10334.71458549278,
+    10348.160302127204,
+    10361.610387800878,
+    10375.064839677221,
+    10388.523654924258,
+    10401.986830714593,
+    10415.454364225412,
+    10428.926252638465,
+    10442.402493140049,
+    10455.883082921007,
+    10469.368019176709,
+    10482.85729910704,
+    10496.350919916393,
+    10509.848878813653,
+    10523.351173012188,
+    10536.857799729838,
+    10550.3687561889,
+    10563.884039616123,
+    10577.403647242685,
+    10590.927576304197,
+    10604.455824040679,
+    10617.988387696556,
+    10631.525264520642,
+    10645.066451766135,
+    10658.611946690598,
+    10672.161746555956,
+    10685.715848628475,
+    10699.274250178762,
+    10712.836948481747,
+    10726.403940816675,
+    10739.975224467091,
+    10753.550796720834,
+    10767.130654870027,
+    10780.714796211059,
+    10794.303218044579,
+    10807.895917675487,
+    10821.492892412922,
+    10835.094139570248,
+    10848.699656465047,
+    10862.309440419107,
+    10875.923488758415,
+    10889.541798813138,
+    10903.16436791762,
+    10916.791193410372,
+    10930.422272634056,
+    10944.05760293548,
+    10957.697181665582,
+    10971.341006179427,
+    10984.98907383619,
+    10998.641381999149,
+    11012.297928035676,
+    11025.958709317223,
+    11039.623723219316,
+    11053.292967121541,
+    11066.966438407539,
+    11080.64413446499,
+    11094.326052685608,
+    11108.012190465128,
+    11121.702545203296,
+    11135.397114303863,
+    11149.095895174571,
+    11162.798885227143,
+    11176.506081877278,
+    11190.217482544635,
+    11203.933084652828,
+    11217.652885629415,
+    11231.376882905886,
+    11245.105073917659,
+    11258.837456104062,
+    11272.574026908333,
+    11286.314783777601,
+    11300.059724162888,
+    11313.808845519083,
+    11327.562145304952,
+    11341.319620983111,
+    11355.081270020033,
+    11368.847089886023,
+    11382.617078055218,
+    11396.391232005579,
+    11410.169549218874,
+    11423.952027180676,
+    11437.738663380349,
+    11451.529455311042,
+    11465.324400469679,
+    11479.123496356951,
+    11492.926740477304,
+    11506.734130338931,
+    11520.545663453764,
+    11534.361337337466,
+    11548.181149509423,
+    11562.005097492724,
+    11575.83317881417,
+    11589.665391004253,
+    11603.501731597149,
+    11617.342198130715,
+    11631.186788146468,
+    11645.035499189589,
+    11658.888328808911,
+    11672.745274556904,
+    11686.606333989675,
+    11700.471504666955,
+    11714.340784152086,
+    11728.214170012021,
+    11742.091659817312,
+    11755.973251142101,
+    11769.858941564111,
+    11783.748728664636,
+    11797.642610028539,
+    11811.540583244237,
+    11825.442645903697,
+    11839.34879560242,
+    11853.259029939445,
+    11867.173346517333,
+    11881.091742942155,
+    11895.014216823492,
+    11908.940765774427,
+    11922.871387411526,
+    11936.806079354839,
+    11950.744839227897,
+    11964.687664657684,
+    11978.634553274653,
+    11992.585502712702,
+    12006.540510609168,
+    12020.499574604828,
+    12034.462692343877,
+    12048.429861473938,
+    12062.401079646032,
+    12076.376344514589,
+    12090.355653737433,
+    12104.339004975769,
+    12118.326395894188,
+    12132.317824160644,
+    12146.313287446457,
+    12160.312783426305,
+    12174.316309778205,
+    12188.323864183525,
+    12202.335444326955,
+    12216.351047896511,
+    12230.370672583531,
+    12244.394316082657,
+    12258.421976091831,
+    12272.453650312296,
+    12286.489336448574,
+    12300.529032208471,
+    12314.572735303058,
+    12328.620443446678,
+    12342.672154356922,
+    12356.727865754638,
+    12370.787575363909,
+    12384.851280912055,
+    12398.918980129623,
+    12412.990670750381,
+    12427.066350511306,
+    12441.146017152583,
+    12455.229668417589,
+    12469.317302052901,
+    12483.40891580827,
+    12497.50450743663,
+    12511.604074694078,
+    12525.707615339878,
+    12539.815127136444,
+    12553.926607849342,
+    12568.042055247275,
+    12582.161467102082,
+    12596.284841188726,
+    12610.41217528529,
+    12624.543467172971,
+    12638.678714636069,
+    12652.817915461985,
+    12666.961067441209,
+    12681.108168367316,
+    12695.259216036962,
+    12709.414208249869,
+    12723.573142808827,
+    12737.736017519681,
+    12751.902830191326,
+    12766.073578635704,
+    12780.248260667788,
+    12794.426874105588,
+    12808.609416770132,
+    12822.795886485468,
+    12836.986281078653,
+    12851.180598379744,
+    12865.378836221802,
+    12879.580992440871,
+    12893.787064875984,
+    12907.997051369144,
+    12922.210949765335,
+    12936.428757912496,
+    12950.650473661524,
+    12964.876094866273,
+    12979.105619383534,
+    12993.339045073039,
+    13007.576369797454,
+    13021.817591422368,
+    13036.062707816285,
+    13050.311716850629,
+    13064.564616399723,
+    13078.821404340792,
+    13093.082078553954,
+    13107.346636922217,
+    13121.615077331464,
+    13135.887397670458,
+    13150.163595830827,
+    13164.44366970706,
+    13178.727617196502,
+    13193.015436199352,
+    13207.307124618648,
+    13221.602680360265,
+    13235.902101332911,
+    13250.205385448118,
+    13264.512530620239,
+    13278.823534766434,
+    13293.138395806676,
+    13307.457111663734,
+    13321.779680263176,
+    13336.106099533356,
+    13350.436367405409,
+    13364.77048181325,
+    13379.108440693562,
+    13393.450241985796,
+    13407.795883632158,
+    13422.145363577607,
+    13436.498679769853,
+    13450.855830159346,
+    13465.216812699266,
+    13479.581625345529,
+    13493.950266056772,
+    13508.32273279435,
+    13522.699023522329,
+    13537.079136207483,
+    13551.463068819286,
+    13565.850819329906,
+    13580.2423857142,
+    13594.63776594971,
+    13609.036958016657,
+    13623.439959897927,
+    13637.846769579081,
+    13652.257385048335,
+    13666.67180429656,
+    13681.090025317284,
+    13695.512046106669,
+    13709.937864663521,
+    13724.367478989278,
+    13738.800887088004,
+    13753.238086966385,
+    13767.679076633727,
+    13782.123854101939,
+    13796.572417385545,
+    13811.024764501659,
+    13825.480893469998,
+    13839.94080231286,
+    13854.404489055134,
+    13868.871951724283,
+    13883.34318835034,
+    13897.818196965914,
+    13912.296975606168,
+    13926.779522308825,
+    13941.26583511416,
+    13955.755912064991,
+    13970.249751206682,
+    13984.747350587126,
+    13999.248708256751,
+    14013.753822268511,
+    14028.262690677873,
+    14042.775311542828,
+    14057.291682923867,
+    14071.811802883994,
+    14086.335669488704,
+    14100.863280805994,
+    14115.394634906341,
+    14129.92972986271,
+    14144.468563750548,
+    14159.01113464777,
+    14173.55744063476,
+    14188.107479794369,
+    14202.661250211901,
+    14217.218749975118,
+    14231.779977174227,
+    14246.344929901879,
+    14260.913606253163,
+    14275.486004325601,
+    14290.062122219146,
+    14304.641958036171,
+    14319.225509881464,
+    14333.812775862236,
+    14348.403754088098,
+    14362.998442671067,
+    14377.59683972556,
+    14392.198943368388,
+    14406.804751718748,
+    14421.414262898223,
+    14436.027475030774,
+    14450.64438624274,
+    14465.264994662828,
+    14479.889298422106,
+    14494.517295654005,
+    14509.148984494313,
+    14523.784363081166,
+    14538.423429555049,
+    14553.066182058781,
+    14567.712618737527,
+    14582.362737738777,
+    14597.016537212348,
+    14611.674015310382,
+    14626.33517018734,
+    14640.999999999993,
+    14655.668502907418,
+    14670.340677071003,
+    14685.016520654426,
+    14699.696031823671,
+    14714.379208746999,
+    14729.066049594967,
+    14743.756552540408,
+    14758.45071575843,
+    14773.148537426418,
+    14787.850015724018,
+    14802.555148833142,
+    14817.263934937961,
+    14831.976372224897,
+    14846.692458882624,
+    14861.41219310206,
+    14876.135573076363,
+    14890.862597000923,
+    14905.593263073371,
+    14920.327569493558,
+    14935.065514463557,
+    14949.807096187662,
+    14964.552312872382,
+    14979.301162726431,
+    14994.053643960735,
+    15008.809754788414,
+    15023.569493424788,
+    15038.332858087369,
+    15053.099846995858,
+    15067.870458372134,
+    15082.644690440264,
+    15097.422541426484,
+    15112.204009559202,
+    15126.989093068994,
+    15141.777790188597,
+    15156.570099152905,
+    15171.366018198967,
+    15186.165545565986,
+    15200.968679495301,
+    15215.775418230402,
+    15230.585760016909,
+    15245.399703102579,
+    15260.217245737298,
+    15275.038386173073,
+    15289.863122664035,
+    15304.691453466432,
+    15319.523376838621,
+    15334.358891041069,
+    15349.197994336346,
+    15364.040684989128,
+    15378.886961266177,
+    15393.736821436356,
+    15408.590263770609,
+    15423.447286541972,
+    15438.307888025554,
+    15453.172066498542,
+    15468.039820240196,
+    15482.91114753184,
+    15497.786046656869,
+    15512.664515900733,
+    15527.546553550939,
+    15542.432157897045,
+    15557.32132723066,
+    15572.214059845435,
+    15587.110354037064,
+    15602.010208103273,
+    15616.913620343823,
+    15631.820589060506,
+    15646.731112557136,
+    15661.645189139546,
+    15676.562817115593,
+    15691.483994795139,
+    15706.408720490062,
+    15721.336992514242,
+    15736.268809183561,
+    15751.204168815901,
+    15766.143069731135,
+    15781.085510251132,
+    15796.03148869974,
+    15810.981003402798,
+    15825.934052688119,
+    15840.890634885489,
+    15855.850748326673,
+    15870.814391345401,
+    15885.781562277361,
+    15900.752259460214,
+    15915.726481233565,
+    15930.704225938984,
+    15945.685491919978,
+    15960.670277522009,
+    15975.658581092481,
+    15990.65040098073,
+    16005.645735538035,
+    16020.644583117599,
+    16035.646942074556,
+    16050.652810765967,
+    16065.662187550806,
+    16080.675070789974,
+    16095.691458846273,
+    16110.711350084424,
+    16125.734742871053,
+    16140.761635574685,
+    16155.792026565747,
+    16170.825914216561,
+    16185.863296901338,
+    16200.904172996183,
+    16215.948540879079,
+    16230.996398929899,
+    16246.047745530386,
+    16261.102579064163,
+    16276.160897916721,
+    16291.22270047542,
+    16306.287985129484,
+    16321.356750269995,
+    16336.428994289896,
+    16351.504715583982,
+    16366.5839125489,
+    16381.666583583141,
+    16396.752727087041,
+    16411.842341462776,
+    16426.935425114363,
+    16442.031976447644,
+    16457.131993870298,
+    16472.235475791829,
+    16487.342420623561,
+    16502.452826778641,
+    16517.566692672033,
+    16532.684016720516,
+    16547.804797342676,
+    16562.929032958902,
+    16578.056721991394,
+    16593.18786286415,
+    16608.322454002962,
+    16623.460493835417,
+    16638.601980790896,
+    16653.746913300558,
+    16668.895289797354,
+    16684.047108716015,
+    16699.202368493046,
+    16714.361067566726,
+    16729.523204377107,
+    16744.688777366009,
+    16759.857784977012,
+    16775.030225655464,
+    16790.206097848466,
+    16805.385400004874,
+    16820.568130575302,
+    16835.754288012104,
+    16850.943870769381,
+    16866.136877302983,
+    16881.333306070494,
+    16896.53315553123,
+    16911.736424146249,
+    16926.943110378332,
+    16942.153212691992,
+    16957.366729553454,
+    16972.583659430682,
+    16987.804000793338,
+    17003.027752112816,
+    17018.254911862205,
+    17033.485478516312,
+    17048.719450551645,
+    17063.956826446421,
+    17079.197604680547,
+    17094.44178373563,
+    17109.689362094967,
+    17124.940338243552,
+    17140.194710668064,
+    17155.452477856852,
+    17170.713638299967,
+    17185.978190489128,
+    17201.246132917724,
+    17216.517464080825,
+    17231.792182475165,
+    17247.070286599141,
+    17262.351774952826,
+    17277.636646037936,
+    17292.924898357855,
+    17308.216530417623,
+    17323.511540723921,
+    17338.809927785089,
+    17354.111690111105,
+    17369.416826213594,
+    17384.725334605821,
+    17400.037213802683,
+    17415.352462320716,
+    17430.67107867809,
+    17445.993061394587,
+    17461.318408991636,
+    17476.647119992274,
+    17491.979192921168,
+    17507.314626304586,
+    17522.653418670423,
+    17537.995568548187,
+    17553.341074468986,
+    17568.689934965536,
+    17584.042148572156,
+    17599.397713824768,
+    17614.75662926089,
+    17630.118893419625,
+    17645.484504841683,
+    17660.853462069354,
+    17676.225763646511,
+    17691.601408118619,
+    17706.980394032718,
+    17722.362719937424,
+    17737.748384382936,
+    17753.137385921014,
+    17768.529723104999,
+    17783.92539448979,
+    17799.324398631856,
+    17814.726734089225,
+    17830.13239942148,
+    17845.541393189767,
+    17860.95371395678,
+    17876.369360286772,
+    17891.788330745527,
+    17907.210623900395,
+    17922.636238320254,
+    17938.065172575527,
+    17953.497425238176,
+    17968.932994881692,
+    17984.371880081104,
+    17999.814079412972,
+    18015.259591455371,
+    18030.708414787914,
+    18046.160547991731,
+    18061.615989649465,
+    18077.074738345284,
+    18092.536792664861,
+    18108.002151195393,
+    18123.470812525571,
+    18138.942775245599,
+    18154.418037947191,
+    18169.896599223546,
+    18185.37845766938,
+    18200.863611880886,
+    18216.352060455767,
+    18231.843801993204,
+    18247.338835093873,
+    18262.837158359936,
+    18278.338770395032,
+    18293.84366980429,
+    18309.351855194309,
+    18324.863325173166,
+    18340.378078350412,
+    18355.896113337069,
+    18371.417428745623,
+    18386.942023190033,
+    18402.469895285718,
+    18418.00104364955,
+    18433.53546689987,
+    18449.073163656474,
+    18464.614132540602,
+    18480.158372174956,
+    18495.705881183676,
+    18511.256658192357,
+    18526.810701828035,
+    18542.368010719183,
+    18557.928583495715,
+    18573.492418788985,
+    18589.059515231773,
+    18604.629871458303,
+    18620.203486104212,
+    18635.78035780658,
+    18651.360485203899,
+    18666.943866936086,
+    18682.53050164448,
+    18698.120387971841,
+    18713.713524562332,
+    18729.30991006154,
+    18744.909543116457,
+    18760.512422375479,
+    18776.118546488418,
+    18791.727914106479,
+    18807.340523882274,
+    18822.95637446981,
+    18838.575464524489,
+    18854.197792703111,
+    18869.823357663863,
+    18885.452158066328,
+    18901.08419257147,
+    18916.719459841639,
+    18932.357958540564,
+    18947.999687333362,
+    18963.644644886521,
+    18979.292829867907,
+    18994.944240946759,
+    19010.598876793687,
+    19026.256736080668,
+    19041.917817481048,
+    19057.582119669532,
+    19073.2496413222,
+    19088.920381116473,
+    19104.594337731145,
+    19120.271509846356,
+    19135.951896143604,
+    19151.635495305738,
+    19167.322306016948,
+    19183.012326962784,
+    19198.705556830122,
+    19214.401994307198,
+    19230.101638083579,
+    19245.804486850167,
+    19261.510539299208,
+    19277.219794124274,
+    19292.932250020265,
+    19308.647905683421,
+    19324.366759811302,
+    19340.088811102793,
+    19355.8140582581,
+    19371.542499978754,
+    19387.2741349676,
+    19403.008961928797,
+    19418.746979567823,
+    19434.488186591469,
+    19450.232581707827,
+    19465.980163626304,
+    19481.730931057613,
+    19497.484882713761,
+    19513.242017308068,
+    19529.002333555141,
+    19544.765830170898,
+    19560.532505872539,
+    19576.302359378566,
+    19592.075389408761,
+    19607.851594684209,
+    19623.630973927269,
+    19639.41352586159,
+    19655.199249212103,
+    19670.988142705017,
+    19686.780205067826,
+    19702.575435029288,
+    19718.373831319448,
+    19734.175392669615,
+    19749.980117812371,
+    19765.788005481569,
+    19781.599054412323,
+    19797.413263341008,
+    19813.230631005274,
+    19829.051156144014,
+    19844.874837497395,
+    19860.701673806827,
+    19876.531663814985,
+    19892.364806265789,
+    19908.201099904403,
+    19924.040543477258,
+    19939.883135732012,
+    19955.728875417579,
+    19971.577761284105,
+    19987.429792082985,
+    20003.284966566847,
+    20019.14328348956,
+    20035.004741606219,
+    20050.869339673161,
+    20066.737076447946,
+    20082.607950689362,
+    20098.481961157428,
+    20114.359106613385,
+    20130.239385819699,
+    20146.122797540058,
+    20162.009340539353,
+    20177.899013583716,
+    20193.791815440476,
+    20209.687744878182,
+    20225.586800666591,
+    20241.488981576669,
+    20257.394286380597,
+    20273.302713851754,
+    20289.214262764715,
+    20305.128931895277,
+    20321.046720020415,
+    20336.967625918318,
+    20352.891648368361,
+    20368.818786151114,
+    20384.749038048347,
+    20400.682402843009,
+    20416.618879319249,
+    20432.558466262391,
+    20448.501162458953,
+    20464.446966696629,
+    20480.395877764302,
+    20496.347894452025,
+    20512.303015551031,
+    20528.261239853735,
+    20544.22256615372,
+    20560.186993245738,
+    20576.15451992572,
+    20592.125144990758,
+    20608.098867239107,
+    20624.075685470198,
+    20640.055598484618,
+    20656.038605084115,
+    20672.024704071595,
+    20688.013894251126,
+    20704.006174427926,
+    20720.001543408373,
+    20735.999999999989,
+    20752.001543011454,
+    20768.006171252597,
+    20784.013883534382,
+    20800.024678668931,
+    20816.038555469506,
+    20832.055512750507,
+    20848.075549327474,
+    20864.098664017085,
+    20880.124855637161,
+    20896.154123006647,
+    20912.186464945626,
+    20928.221880275312,
+    20944.260367818049,
+    20960.301926397311,
+    20976.346554837684,
+    20992.394251964895,
+    21008.445016605787,
+    21024.498847588318,
+    21040.555743741574,
+    21056.615703895754,
+    21072.678726882168,
+    21088.744811533252,
+    21104.813956682538,
+    21120.886161164683,
+    21136.961423815443,
+    21153.039743471683,
+    21169.121118971379,
+    21185.205549153605,
+    21201.293032858535,
+    21217.383568927453,
+    21233.477156202731,
+    21249.573793527841,
+    21265.673479747358,
+    21281.776213706937,
+    21297.881994253334,
+    21313.990820234398,
+    21330.102690499054,
+    21346.21760389733,
+    21362.335559280327,
+    21378.456555500241,
+    21394.580591410333,
+    21410.707665864964,
+    21426.83777771956,
+    21442.970925830628,
+    21459.107109055756,
+    21475.246326253604,
+    21491.388576283895,
+    21507.533858007431,
+    21523.682170286087,
+    21539.833511982797,
+    21555.987881961566,
+    21572.145279087465,
+    21588.305702226615,
+    21604.469150246216,
+    21620.635622014521,
+    21636.805116400832,
+    21652.977632275521,
+    21669.153168510009,
+    21685.331723976764,
+    21701.513297549318,
+    21717.697888102244,
+    21733.885494511167,
+    21750.076115652759,
+    21766.269750404736,
+    21782.466397645861,
+    21798.666056255934,
+    21814.868725115801,
+    21831.074403107345,
+    21847.283089113484,
+    21863.494782018177,
+    21879.709480706417,
+    21895.927184064229,
+    21912.147890978667,
+    21928.371600337818,
+    21944.598311030797,
+    21960.828021947746,
+    21977.060731979829,
+    21993.296440019243,
+    22009.535144959198,
+    22025.77684569393,
+    22042.021541118691,
+    22058.269230129757,
+    22074.519911624411,
+    22090.773584500959,
+    22107.030247658717,
+    22123.289899998013,
+    22139.552540420187,
+    22155.818167827587,
+    22172.086781123569,
+    22188.358379212495,
+    22204.632960999726,
+    22220.910525391639,
+    22237.191071295601,
+    22253.474597619981,
+    22269.761103274148,
+    22286.050587168469,
+    22302.343048214312,
+    22318.638485324027,
+    22334.936897410968,
+    22351.23828338947,
+    22367.542642174871,
+    22383.849972683485,
+    22400.160273832618,
+    22416.473544540564,
+    22432.789783726603,
+    22449.108990310986,
+    22465.431163214958,
+    22481.75630136074,
+    22498.084403671528,
+    22514.415469071497,
+    22530.749496485802,
+    22547.086484840562,
+    22563.426433062879,
+    22579.769340080824,
+    22596.115204823436,
+    22612.464026220721,
+    22628.815803203655,
+    22645.170534704179,
+    22661.5282196552,
+    22677.888856990587,
+    22694.252445645168,
+    22710.618984554734,
+    22726.988472656034,
+    22743.360908886778,
+    22759.736292185622,
+    22776.114621492186,
+    22792.495895747044,
+    22808.880113891719,
+    22825.267274868678,
+    22841.657377621348,
+    22858.050421094096,
+    22874.446404232243,
+    22890.845325982053,
+    22907.247185290722,
+    22923.651981106406,
+    22940.059712378195,
+    22956.470378056114,
+    22972.883977091129,
+    22989.300508435153,
+    23005.719971041017,
+    23022.142363862498,
+    23038.567685854305,
+    23054.995935972078,
+    23071.427113172387,
+    23087.86121641273,
+    23104.298244651531,
+    23120.738196848146,
+    23137.181071962848,
+    23153.626868956846,
+    23170.075586792263,
+    23186.527224432142,
+    23202.981780840448,
+    23219.439254982066,
+    23235.899645822796,
+    23252.362952329357,
+    23268.829173469378,
+    23285.298308211408,
+    23301.770355524899,
+    23318.245314380223,
+    23334.723183748658,
+    23351.203962602387,
+    23367.687649914504,
+    23384.174244659007,
+    23400.663745810798,
+    23417.15615234568,
+    23433.651463240367,
+    23450.149677472462,
+    23466.650794020472,
+    23483.154811863806,
+    23499.661729982763,
+    23516.171547358543,
+    23532.684262973235,
+    23549.199875809823,
+    23565.718384852185,
+    23582.239789085092,
+    23598.764087494197,
+    23615.291279066041,
+    23631.821362788058,
+    23648.354337648565,
+    23664.890202636761,
+    23681.428956742733,
+    23697.970598957443,
+    23714.515128272738,
+    23731.062543681343,
+    23747.612844176863,
+    23764.166028753778,
+    23780.72209640744,
+    23797.281046134085,
+    23813.842876930816,
+    23830.407587795606,
+    23846.975177727301,
+    23863.545645725622,
+    23880.11899079115,
+    23896.695211925336,
+    23913.274308130498,
+    23929.856278409821,
+    23946.441121767348,
+    23963.028837207989,
+    23979.619423737513,
+    23996.212880362549,
+    24012.809206090584,
+    24029.408399929966,
+    24046.010460889898,
+    24062.615387980433,
+    24079.223180212492,
+    24095.833836597827,
+    24112.447356149063,
+    24129.063737879667,
+    24145.682980803951,
+    24162.305083937081,
+    24178.930046295067,
+    24195.557866894767,
+    24212.188544753884,
+    24228.822078890964,
+    24245.458468325389,
+    24262.097712077397,
+    24278.739809168052,
+    24295.384758619261,
+    24312.032559453768,
+    24328.683210695162,
+    24345.336711367858,
+    24361.993060497109,
+    24378.652257108995,
+    24395.314300230442,
+    24411.979188889192,
+    24428.646922113825,
+    24445.317498933746,
+    24461.990918379193,
+    24478.667179481225,
+    24495.346281271726,
+    24512.028222783407,
+    24528.713003049801,
+    24545.400621105266,
+    24562.091075984976,
+    24578.784366724925,
+    24595.480492361927,
+    24612.179451933614,
+    24628.881244478438,
+    24645.585869035654,
+    24662.293324645343,
+    24679.003610348394,
+    24695.716725186514,
+    24712.432668202211,
+    24729.151438438807,
+    24745.873034940436,
+    24762.597456752032,
+    24779.324702919344,
+    24796.054772488926,
+    24812.787664508123,
+    24829.5233780251,
+    24846.261912088819,
+    24863.003265749034,
+    24879.747438056307,
+    24896.494428062004,
+    24913.244234818278,
+    24929.996857378079,
+    24946.752294795166,
+    24963.510546124078,
+    24980.271610420157,
+    24997.035486739525,
+    25013.802174139113,
+    25030.571671676629,
+    25047.343978410572,
+    25064.119093400237,
+    25080.897015705697,
+    25097.677744387816,
+    25114.461278508239,
+    25131.2476171294,
+    25148.036759314517,
+    25164.828704127583,
+    25181.623450633375,
+    25198.42099789745,
+    25215.221344986145,
+    25232.024490966574,
+    25248.830434906627,
+    25265.639175874974,
+    25282.450712941049,
+    25299.265045175071,
+    25316.082171648024,
+    25332.902091431668,
+    25349.724803598532,
+    25366.550307221914,
+    25383.378601375884,
+    25400.209685135269,
+    25417.043557575678,
+    25433.880217773472,
+    25450.719664805783,
+    25467.561897750507,
+    25484.406915686297,
+    25501.254717692573,
+    25518.105302849512,
+    25534.958670238051,
+    25551.814818939893,
+    25568.67374803748,
+    25585.535456614027,
+    25602.399943753502,
+    25619.267208540619,
+    25636.137250060852,
+    25653.010067400432,
+    25669.885659646327,
+    25686.76402588627,
+    25703.645165208734,
+    25720.529076702944,
+    25737.415759458876,
+    25754.305212567244,
+    25771.197435119517,
+    25788.092426207899,
+    25804.990184925344,
+    25821.890710365547,
+    25838.794001622944,
+    25855.700057792714,
+    25872.608877970775,
+    25889.520461253778,
+    25906.434806739118,
+    25923.351913524923,
+    25940.271780710063,
+    25957.194407394138,
+    25974.11979267748,
+    25991.047935661154,
+    26007.978835446964,
+    26024.912491137442,
+    26041.848901835841,
+    26058.788066646157,
+    26075.729984673108,
+    26092.674655022136,
+    26109.622076799409,
+    26126.572249111829,
+    26143.525171067016,
+    26160.480841773315,
+    26177.43926033979,
+    26194.400425876229,
+    26211.364337493149,
+    26228.330994301767,
+    26245.30039541404,
+    26262.272539942627,
+    26279.247427000919,
+    26296.225055703002,
+    26313.205425163702,
+    26330.188534498539,
+    26347.174382823756,
+    26364.162969256304,
+    26381.154292913852,
+    26398.148352914774,
+    26415.145148378149,
+    26432.144678423778,
+    26449.146942172156,
+    26466.151938744493,
+    26483.159667262702,
+    26500.170126849403,
+    26517.183316627921,
+    26534.199235722277,
+    26551.217883257199,
+    26568.239258358124,
+    26585.263360151173,
+    26602.290187763181,
+    26619.319740321676,
+    26636.352016954883,
+    26653.387016791727,
+    26670.424738961825,
+    26687.465182595493,
+    26704.508346823739,
+    26721.554230778267,
+    26738.602833591467,
+    26755.65415439643,
+    26772.708192326929,
+    26789.764946517433,
+    26806.824416103096,
+    26823.886600219761,
+    26840.95149800396,
+    26858.019108592915,
+    26875.089431124517,
+    26892.162464737365,
+    26909.238208570721,
+    26926.316661764544,
+    26943.397823459472,
+    26960.481692796813,
+    26977.568268918571,
+    26994.657550967422,
+    27011.749538086722,
+    27028.844229420498,
+    27045.941624113464,
+    27063.041721311005,
+    27080.144520159181,
+    27097.250019804727,
+    27114.35821939505,
+    27131.469118078236,
+    27148.582715003027,
+    27165.699009318858,
+    27182.818000175819,
+    27199.939686724665,
+    27217.064068116837,
+    27234.191143504428,
+    27251.320912040203,
+    27268.453372877593,
+    27285.588525170693,
+    27302.726368074269,
+    27319.866900743735,
+    27337.010122335181,
+    27354.156032005358,
+    27371.304628911668,
+    27388.455912212183,
+    27405.609881065626,
+    27422.766534631384,
+    27439.925872069507,
+    27457.087892540683,
+    27474.252595206275,
+    27491.419979228293,
+    27508.5900437694,
+    27525.762787992917,
+    27542.93821106281,
+    27560.116312143706,
+    27577.297090400876,
+    27594.480545000242,
+    27611.666675108383,
+    27628.855479892518,
+    27646.046958520514,
+    27663.241110160889,
+    27680.437933982801,
+    27697.637429156068,
+    27714.839594851132,
+    27732.04443023909,
+    27749.251934491687,
+    27766.462106781299,
+    27783.674946280949,
+    27800.890452164302,
+    27818.108623605654,
+    27835.329459779954,
+    27852.55295986278,
+    27869.779123030345,
+    27887.007948459504,
+    27904.239435327745,
+    27921.473582813196,
+    27938.710390094613,
+    27955.949856351392,
+    27973.19198076355,
+    27990.436762511745,
+    28007.684200777272,
+    28024.934294742041,
+    28042.187043588601,
+    28059.442446500128,
+    28076.700502660427,
+    28093.961211253929,
+    28111.224571465693,
+    28128.490582481401,
+    28145.759243487362,
+    28163.030553670509,
+    28180.304512218394,
+    28197.581118319198,
+    28214.860371161725,
+    28232.14226993539,
+    28249.42681383024,
+    28266.71400203693,
+    28284.003833746745,
+    28301.296308151585,
+    28318.591424443959,
+    28335.889181817001,
+    28353.189579464462,
+    28370.492616580705,
+    28387.798292360701,
+    28405.106606000048,
+    28422.417556694945,
+    28439.731143642206,
+    28457.047366039264,
+    28474.366223084147,
+    28491.687713975512,
+    28509.011837912611,
+    28526.338594095305,
+    28543.667981724069,
+    28560.999999999982,
+    28578.334648124732,
+    28595.671925300605,
+    28613.011830730498,
+    28630.354363617909,
+    28647.699523166943,
+    28665.0473085823,
+    28682.397719069289,
+    28699.750753833818,
+    28717.10641208239,
+    28734.464693022121,
+    28751.825595860708,
+    28769.189119806462,
+    28786.55526406828,
+    28803.924027855664,
+    28821.295410378701,
+    28838.669410848088,
+    28856.046028475103,
+    28873.425262471628,
+    28890.80711205013,
+    28908.191576423673,
+    28925.578654805915,
+    28942.968346411097,
+    28960.360650454055,
+    28977.755566150216,
+    28995.153092715591,
+    29012.553229366786,
+    29029.955975320987,
+    29047.361329795975,
+    29064.769292010107,
+    29082.179861182336,
+    29099.593036532187,
+    29117.00881727978,
+    29134.427202645813,
+    29151.848191851568,
+    29169.271784118911,
+    29186.697978670283,
+    29204.126774728706,
+    29221.55817151779,
+    29238.992168261717,
+    29256.42876418525,
+    29273.867958513725,
+    29291.309750473058,
+    29308.754139289747,
+    29326.201124190855,
+    29343.65070440403,
+    29361.102879157483,
+    29378.557647680012,
+    29396.015009200975,
+    29413.474962950309,
+    29430.937508158524,
+    29448.402644056692,
+    29465.870369876469,
+    29483.340684850071,
+    29500.81358821028,
+    29518.289079190454,
+    29535.767157024511,
+    29553.247820946945,
+    29570.731070192807,
+    29588.216903997723,
+    29605.70532159787,
+    29623.19632223,
+    29640.689905131429,
+    29658.186069540028,
+    29675.684814694236,
+    29693.186139833047,
+    29710.690044196028,
+    29728.196527023298,
+    29745.705587555527,
+    29763.217225033964,
+    29780.731438700397,
+    29798.248227797183,
+    29815.76759156723,
+    29833.289529254005,
+    29850.81404010153,
+    29868.341123354381,
+    29885.870778257693,
+    29903.403004057145,
+    29920.937799998974,
+    29938.475165329975,
+    29956.015099297485,
+    29973.557601149394,
+    29991.102670134147,
+    30008.650305500738,
+    30026.200506498706,
+    30043.753272378144,
+    30061.308602389683,
+    30078.866495784507,
+    30096.426951814352,
+    30113.989969731494,
+    30131.55554878875,
+    30149.123688239491,
+    30166.694387337629,
+    30184.267645337608,
+    30201.843461494434,
+    30219.42183506364,
+    30237.002765301309,
+    30254.586251464058,
+    30272.172292809046,
+    30289.760888593977,
+    30307.35203807709,
+    30324.94574051716,
+    30342.541995173502,
+    30360.140801305966,
+    30377.742158174944,
+    30395.346065041358,
+    30412.952521166666,
+    30430.561525812864,
+    30448.173078242475,
+    30465.787177718561,
+    30483.403823504719,
+    30501.02301486507,
+    30518.644751064272,
+    30536.269031367516,
+    30553.895855040515,
+    30571.525221349519,
+    30589.157129561307,
+    30606.791578943175,
+    30624.428568762964,
+    30642.06809828903,
+    30659.710166790261,
+    30677.35477353607,
+    30695.001917796391,
+    30712.651598841687,
+    30730.303815942945,
+    30747.958568371676,
+    30765.615855399912,
+    30783.275676300211,
+    30800.938030345646,
+    30818.602916809814,
+    30836.270334966837,
+    30853.940284091354,
+    30871.612763458521,
+    30889.287772344011,
+    30906.965310024025,
+    30924.645375775272,
+    30942.327968874983,
+    30960.013088600903,
+    30977.700734231294,
+    30995.390905044929,
+    31013.083600321101,
+    31030.778819339619,
+    31048.476561380798,
+    31066.17682572547,
+    31083.879611654978,
+    31101.584918451179,
+    31119.29274539644,
+    31137.003091773637,
+    31154.715956866155,
+    31172.431339957893,
+    31190.14924033326,
+    31207.869657277162,
+    31225.592590075023,
+    31243.318038012771,
+    31261.046000376838,
+    31278.776476454172,
+    31296.50946553221,
+    31314.24496689891,
+    31331.98297984272,
+    31349.7235036526,
+    31367.466537618013,
+    31385.212081028923,
+    31402.960133175795,
+    31420.710693349596,
+    31438.463760841791,
+    31456.219334944351,
+    31473.977414949743,
+    31491.738000150934,
+    31509.501089841389,
+    31527.266683315069,
+    31545.034779866437,
+    31562.80537879045,
+    31580.578479382562,
+    31598.35408093872,
+    31616.132182755369,
+    31633.91278412945,
+    31651.695884358396,
+    31669.481482740131,
+    31687.269578573076,
+    31705.060171156143,
+    31722.853259788735,
+    31740.648843770748,
+    31758.446922402567,
+    31776.247494985066,
+    31794.050560819614,
+    31811.85611920806,
+    31829.664169452753,
+    31847.474710856521,
+    31865.287742722685,
+    31883.103264355046,
+    31900.921275057899,
+    31918.741774136019,
+    31936.564760894671,
+    31954.390234639599,
+    31972.21819467704,
+    31990.048640313704,
+    32007.881570856793,
+    32025.716985613984,
+    32043.554883893445,
+    32061.395265003815,
+    32079.238128254223,
+    32097.083472954269,
+    32114.931298414049,
+    32132.781603944117,
+    32150.634388855524,
+    32168.48965245979,
+    32186.347394068915,
+    32204.207612995371,
+    32222.07030855212,
+    32239.935480052583,
+    32257.803126810672,
+    32275.673248140767,
+    32293.545843357719,
+    32311.420911776862,
+    32329.298452713996,
+    32347.178465485395,
+    32365.060949407813,
+    32382.945903798463,
+    32400.83332797504,
+    32418.723221255706,
+    32436.615582959093,
+    32454.510412404306,
+    32472.407708910916,
+    32490.307471798966,
+    32508.209700388961,
+    32526.114394001877,
+    32544.021551959166,
+    32561.931173582732,
+    32579.843258194956,
+    32597.757805118679,
+    32615.674813677211,
+    32633.594283194328,
+    32651.516212994258,
+    32669.440602401712,
+    32687.367450741847,
+    32705.296757340297,
+    32723.228521523146,
+    32741.162742616943,
+    32759.099419948703,
+    32777.038552845901,
+    32794.980140636464,
+    32812.924182648792,
+    32830.87067821173,
+    32848.819626654593,
+    32866.77102730715,
+    32884.724879499619,
+    32902.681182562686,
+    32920.639935827494,
+    32938.601138625643,
+    32956.56479028918,
+    32974.530890150607,
+    32992.499437542894,
+    33010.470431799447,
+    33028.443872254145,
+    33046.419758241311,
+    33064.39808909571,
+    33082.378864152583,
+    33100.36208274759,
+    33118.347744216881,
+    33136.335847897026,
+    33154.326393125062,
+    33172.31937923847,
+    33190.314805575174,
+    33208.312671473555,
+    33226.312976272442,
+    33244.315719311111,
+    33262.320899929284,
+    33280.328517467125,
+    33298.33857126526,
+    33316.351060664747,
+    33334.365985007091,
+    33352.383343634239,
+    33370.403135888591,
+    33388.42536111299,
+    33406.450018650721,
+    33424.477107845501,
+    33442.506628041512,
+    33460.53857858335,
+    33478.572958816083,
+    33496.609768085189,
+    33514.649005736617,
+    33532.690671116739,
+    33550.734763572356,
+    33568.781282450735,
+    33586.830227099563,
+    33604.881596866973,
+    33622.935391101528,
+    33640.991609152239,
+    33659.050250368542,
+    33677.111314100322,
+    33695.174799697881,
+    33713.240706511984,
+    33731.309033893805,
+    33749.37978119497,
+    33767.452947767531,
+    33785.528532963974,
+    33803.606536137209,
+    33821.686956640602,
+    33839.769793827938,
+    33857.855047053425,
+    33875.942715671707,
+    33894.032799037872,
+    33912.125296507431,
+    33930.220207436316,
+    33948.317531180888,
+    33966.417267097961,
+    33984.519414544746,
+    34002.623972878901,
+    34020.730941458511,
+    34038.840319642077,
+    34056.952106788536,
+    34075.066302257255,
+    34093.182905408015,
+    34111.301915601027,
+    34129.42333219693,
+    34147.547154556785,
+    34165.673382042078,
+    34183.80201401472,
+    34201.933049837033,
+    34220.06648887178,
+    34238.202330482141,
+    34256.340574031703,
+    34274.481218884495,
+    34292.624264404949,
+    34310.769709957938,
+    34328.91755490873,
+    34347.067798623029,
+    34365.220440466954,
+    34383.375479807051,
+    34401.532916010263,
+    34419.692748443973,
+    34437.854976475966,
+    34456.01959947445,
+    34474.18661680806,
+    34492.356027845817,
+    34510.527831957188,
+    34528.702028512052,
+    34546.878616880676,
+    34565.05759643377,
+    34583.238966542449,
+    34601.422726578232,
+    34619.608875913065,
+    34637.797413919296,
+    34655.988339969692,
+    34674.181653437423,
+    34692.37735369608,
+    34710.575440119668,
+    34728.775912082579,
+    34746.978768959649,
+    34765.184010126082,
+    34783.391634957537,
+    34801.60164283005,
+    34819.814033120063,
+    34838.028805204456,
+    34856.24595846048,
+    34874.465492265823,
+    34892.687405998557,
+    34910.911699037177,
+    34929.138370760564,
+    34947.367420548027,
+    34965.598847779271,
+    34983.832651834389,
+    35002.068832093908,
+    35020.307387938738,
+    35038.548318750189,
+    35056.79162390998,
+    35075.03730280025,
+    35093.285354803513,
+    35111.535779302685,
+    35129.788575681116,
+    35148.043743322516,
+    35166.301281611013,
+    35184.561189931141,
+    35202.823467667826,
+    35221.088114206388,
+    35239.355128932555,
+    35257.624511232447,
+    35275.896260492584,
+    35294.170376099886,
+    35312.446857441668,
+    35330.725703905628,
+    35349.006914879887,
+    35367.290489752944,
+    35385.576427913686,
+    35403.864728751418,
+    35422.155391655811,
+    35440.448416016967,
+    35458.743801225341,
+    35477.041546671804,
+    35495.341651747622,
+    35513.644115844436,
+    35531.948938354304,
+    35550.256118669655,
+    35568.565656183309,
+    35586.877550288496,
+    35605.191800378816,
+    35623.508405848268,
+    35641.827366091238,
+    35660.148680502505,
+    35678.472348477233,
+    35696.798369410979,
+    35715.126742699678,
+    35733.457467739659,
+    35751.790543927644,
+    35770.125970660738,
+    35788.46374733642,
+    35806.803873352568,
+    35825.146348107453,
+    35843.49117099971,
+    35861.838341428367,
+    35880.187858792851,
+    35898.539722492955,
+    35916.893931928862,
+    35935.250486501129,
+    35953.609385610718,
+    35971.970628658957,
+    35990.334215047558,
+    36008.700144178612,
+    36027.068415454596,
+    36045.439028278372,
+    36063.811982053165,
+    36082.187276182609,
+    36100.564910070694,
+    36118.944883121789,
+    36137.327194740654,
+    36155.711844332429,
+    36174.098831302617,
+    36192.488155057115,
+    36210.87981500219,
+    36229.273810544473,
+    36247.670141091003,
+    36266.068806049167,
+    36284.469804826738,
+    36302.873136831862,
+    36321.278801473069,
+    36339.686798159251,
+    36358.097126299683,
+    36376.509785304013,
+    36394.924774582258,
+    36413.342093544816,
+    36431.761741602444,
+    36450.183718166292,
+    36468.608022647859,
+    36487.034654459028,
+    36505.463613012063,
+    36523.894897719583,
+    36542.328507994578,
+    36560.764443250409,
+    36579.202702900831,
+    36597.643286359926,
+    36616.086193042182,
+    36634.531422362437,
+    36652.978973735895,
+    36671.428846578143,
+    36689.881040305125,
+    36708.335554333149,
+    36726.792388078902,
+    36745.251540959427,
+    36763.713012392138,
+    36782.176801794812,
+    36800.642908585593,
+    36819.111332182983,
+    36837.582072005869,
+    36856.055127473483,
+    36874.530498005421,
+    36893.008183021651,
+    36911.488181942506,
+    36929.970494188674,
+    36948.455119181206,
+    36966.942056341519,
+    36985.431305091392,
+    37003.922864852961,
+    37022.416735048733,
+    37040.912915101559,
+    37059.411404434657,
+    37077.91220247162,
+    37096.415308636388,
+    37114.920722353243,
+    37133.428443046862,
+    37151.938470142253,
+    37170.450803064785,
+    37188.965441240209,
+    37207.482384094597,
+    37226.001631054402,
+    37244.523181546429,
+    37263.047034997842,
+    37281.573190836149,
+    37300.101648489224,
+    37318.632407385296,
+    37337.165466952945,
+    37355.700826621112,
+    37374.238485819085,
+    37392.778443976509,
+    37411.320700523385,
+    37429.865254890057,
+    37448.412106507232,
+    37466.961254805974,
+    37485.512699217681,
+    37504.066439174116,
+    37522.622474107404,
+    37541.180803449992,
+    37559.741426634704,
+    37578.304343094693,
+    37596.869552263488,
+    37615.43705357494,
+    37634.006846463279,
+    37652.578930363044,
+    37671.153304709165,
+    37689.729968936896,
+    37708.308922481847,
+    37726.890164779965,
+    37745.473695267559,
+    37764.059513381275,
+    37782.647618558112,
+    37801.238010235415,
+    37819.830687850859,
+    37838.425650842495,
+    37857.022898648691,
+    37875.622430708172,
+    37894.224246460013,
+    37912.828345343616,
+    37931.434726798747,
+    37950.043390265506,
+    37968.654335184328,
+    37987.267560995999,
+    38005.883067141665,
+    38024.500853062775,
+    38043.120918201159,
+    38061.743261998963,
+    38080.367883898682,
+    38098.994783343158,
+    38117.623959775563,
+    38136.255412639417,
+    38154.889141378575,
+    38173.525145437234,
+    38192.163424259939,
+    38210.803977291551,
+    38229.446803977284,
+    38248.091903762703,
+    38266.739276093685,
+    38285.388920416466,
+    38304.040836177606,
+    38322.695022824002,
+    38341.351479802899,
+    38360.010206561863,
+    38378.671202548816,
+    38397.334467211993,
+    38415.999999999978,
+    38434.667800361683,
+    38453.33786774637,
+    38472.010201603611,
+    38490.684801383337,
+    38509.361666535784,
+    38528.040796511552,
+    38546.722190761553,
+    38565.405848737035,
+    38584.091769889594,
+    38602.779953671132,
+    38621.470399533908,
+    38640.163106930493,
+    38658.858075313794,
+    38677.555304137059,
+    38696.254792853862,
+    38714.956540918094,
+    38733.660547783991,
+    38752.366812906112,
+    38771.075335739348,
+    38789.78611573892,
+    38808.499152360368,
+    38827.214445059573,
+    38845.931993292739,
+    38864.651796516388,
+    38883.373854187383,
+    38902.098165762916,
+    38920.824730700486,
+    38939.553548457938,
+    38958.284618493431,
+    38977.017940265461,
+    38995.753513232834,
+    39014.491336854699,
+    39033.231410590517,
+    39051.973733900079,
+    39070.718306243485,
+    39089.465127081188,
+    39108.214195873945,
+    39126.965512082832,
+    39145.719075169261,
+    39164.474884594965,
+    39183.232939821988,
+    39201.99324031271,
+    39220.755785529815,
+    39239.52057493633,
+    39258.287607995589,
+    39277.056884171245,
+    39295.828402927284,
+    39314.602163728006,
+    39333.378166038019,
+    39352.15640932227,
+    39370.936893046004,
+    39389.719616674811,
+    39408.504579674584,
+    39427.291781511522,
+    39446.081221652174,
+    39464.872899563372,
+    39483.666814712291,
+    39502.462966566411,
+    39521.261354593538,
+    39540.06197826178,
+    39558.864837039568,
+    39577.669930395656,
+    39596.47725779911,
+    39615.286818719302,
+    39634.098612625923,
+    39652.912638988993,
+    39671.728897278823,
+    39690.547386966064,
+    39709.368107521652,
+    39728.191058416858,
+    39747.016239123259,
+    39765.84364911275,
+    39784.673287857528,
+    39803.505154830105,
+    39822.339249503319,
+    39841.175571350293,
+    39860.014119844491,
+    39878.854894459677,
+    39897.697894669909,
+    39916.54311994958,
+    39935.390569773372,
+    39954.240243616303,
+    39973.092140953675,
+    39991.946261261117,
+    40010.802604014549,
+    40029.661168690225,
+    40048.521954764678,
+    40067.384961714779,
+    40086.250189017679,
+    40105.117636150855,
+    40123.98730259209,
+    40142.859187819471,
+    40161.733291311379,
+    40180.609612546526,
+    40199.488151003912,
+    40218.368906162854,
+    40237.25187750296,
+    40256.137064504153,
+    40275.024466646668,
+    40293.914083411029,
+    40312.805914278084,
+    40331.699958728961,
+    40350.596216245103,
+    40369.494686308273,
+    40388.39536840051,
+    40407.298262004173,
+    40426.20336660192,
+    40445.110681676706,
+    40464.020206711793,
+    40482.931941190756,
+    40501.845884597446,
+    40520.762036416032,
+    40539.680396130985,
+    40558.600963227072,
+    40577.523737189367,
+    40596.448717503234,
+    40615.375903654342,
+    40634.305295128659,
+    40653.236891412453,
+    40672.170691992294,
+    40691.106696355047,
+    40710.044903987873,
+    40728.985314378238,
+    40747.927927013901,
+    40766.872741382918,
+    40785.819756973651,
+    40804.768973274746,
+    40823.720389775161,
+    40842.674005964131,
+    40861.629821331211,
+    40880.587835366234,
+    40899.548047559321,
+    40918.510457400931,
+    40937.475064381761,
+    40956.441867992849,
+    40975.410867725499,
+    40994.382063071331,
+    41013.355453522236,
+    41032.331038570417,
+    41051.308817708363,
+    41070.288790428858,
+    41089.270956224987,
+    41108.255314590111,
+    41127.241865017888,
+    41146.23060700229,
+    41165.221540037543,
+    41184.214663618193,
+    41203.209977239079,
+    41222.207480395307,
+    41241.207172582297,
+    41260.209053295752,
+    41279.213122031659,
+    41298.219378286303,
+    41317.227821556255,
+    41336.23845133838,
+    41355.251267129832,
+    41374.266268428037,
+    41393.283454730743,
+    41412.302825535953,
+    41431.324380341983,
+    41450.348118647416,
+    41469.374039951144,
+    41488.402143752326,
+    41507.432429550427,
+    41526.464896845187,
+    41545.499545136627,
+    41564.536373925075,
+    41583.575382711126,
+    41602.616570995662,
+    41621.659938279874,
+    41640.705484065205,
+    41659.753207853406,
+    41678.803109146495,
+    41697.855187446803,
+    41716.909442256911,
+    41735.965873079709,
+    41755.02447941836,
+    41774.085260776315,
+    41793.148216657297,
+    41812.213346565331,
+    41831.280650004708,
+    41850.350126480014,
+    41869.421775496106,
+    41888.495596558132,
+    41907.571589171515,
+    41926.649752841957,
+    41945.730087075463,
+    41964.812591378286,
+    41983.897265256979,
+    42002.984108218378,
+    42022.073119769593,
+    42041.164299418015,
+    42060.257646671307,
+    42079.353161037419,
+    42098.450842024591,
+    42117.550689141324,
+    42136.652701896404,
+    42155.756879798893,
+    42174.863222358137,
+    42193.971729083758,
+    42213.082399485655,
+    42232.195233074002,
+    42251.310229359246,
+    42270.427387852127,
+    42289.546708063644,
+    42308.668189505079,
+    42327.791831687995,
+    42346.917634124227,
+    42366.045596325886,
+    42385.175717805352,
+    42404.307998075295,
+    42423.442436648642,
+    42442.579033038608,
+    42461.717786758672,
+    42480.858697322597,
+    42500.001764244422,
+    42519.146987038446,
+    42538.294365219248,
+    42557.443898301688,
+    42576.595585800882,
+    42595.749427232236,
+    42614.90542211142,
+    42634.063569954378,
+    42653.223870277317,
+    42672.386322596729,
+    42691.55092642938,
+    42710.717681292292,
+    42729.886586702756,
+    42749.057642178363,
+    42768.23084723694,
+    42787.406201396603,
+    42806.58370417574,
+    42825.76335509299,
+    42844.945153667286,
+    42864.129099417805,
+    42883.315191864014,
+    42902.503430525649,
+    42921.693814922692,
+    42940.88634457541,
+    42960.081019004348,
+    42979.277837730297,
+    42998.476800274322,
+    43017.677906157769,
+    43036.881154902228,
+    43056.086546029583,
+    43075.294079061961,
+    43094.503753521763,
+    43113.715568931671,
+    43132.929524814601,
+    43152.145620693766,
+    43171.363856092619,
+    43190.584230534907,
+    43209.806743544621,
+    43229.031394646016,
+    43248.258183363621,
+    43267.487109222224,
+    43286.718171746885,
+    43305.951370462906,
+    43325.186704895881,
+    43344.42417457165,
+    43363.663779016322,
+    43382.905517756262,
+    43402.149390318104,
+    43421.395396228749,
+    43440.643535015348,
+    43459.89380620532,
+    43479.146209326354,
+    43498.400743906379,
+    43517.657409473606,
+    43536.916205556496,
+    43556.177131683784,
+    43575.44018738444,
+    43594.705372187724,
+    43613.972685623135,
+    43633.242127220445,
+    43652.513696509668,
+    43671.787393021099,
+    43691.063216285271,
+    43710.341165833001,
+    43729.621241195346,
+    43748.903441903625,
+    43768.187767489413,
+    43787.474217484552,
+    43806.762791421126,
+    43826.053488831501,
+    43845.346309248278,
+    43864.641252204325,
+    43883.938317232765,
+    43903.237503866971,
+    43922.538811640596,
+    43941.842240087513,
+    43961.147788741881,
+    43980.455457138101,
+    43999.765244810835,
+    44019.077151295001,
+    44038.391176125755,
+    44057.70731883854,
+    44077.02557896902,
+    44096.345956053141,
+    44115.668449627083,
+    44134.993059227287,
+    44154.319784390456,
+    44173.648624653535,
+    44192.979579553728,
+    44212.312648628489,
+    44231.647831415532,
+    44250.985127452805,
+    44270.324536278538,
+    44289.666057431183,
+    44309.009690449464,
+    44328.355434872348,
+    44347.703290239064,
+    44367.053256089079,
+    44386.405331962109,
+    44405.759517398139,
+    44425.115811937387,
+    44444.474215120332,
+    44463.834726487694,
+    44483.197345580462,
+    44502.562071939843,
+    44521.928905107328,
+    44541.297844624634,
+    44560.668890033732,
+    44580.042040876848,
+    44599.417296696454,
+    44618.794657035272,
+    44638.174121436256,
+    44657.555689442641,
+    44676.939360597877,
+    44696.325134445673,
+    44715.713010530002,
+    44735.102988395054,
+    44754.495067585296,
+    44773.88924764542,
+    44793.285528120374,
+    44812.683908555344,
+    44832.084388495779,
+    44851.486967487363,
+    44870.891645076015,
+    44890.298420807922,
+    44909.707294229491,
+    44929.118264887409,
+    44948.531332328566,
+    44967.946496100136,
+    44987.363755749502,
+    45006.783110824319,
+    45026.204560872473,
+    45045.628105442098,
+    45065.053744081561,
+    45084.48147633949,
+    45103.911301764747,
+    45123.343219906426,
+    45142.777230313885,
+    45162.21333253671,
+    45181.651526124733,
+    45201.091810628037,
+    45220.534185596924,
+    45239.978650581965,
+    45259.425205133957,
+    45278.873848803938,
+    45298.324581143192,
+    45317.777401703235,
+    45337.232310035848,
+    45356.68930569302,
+    45376.148388226997,
+    45395.60955719027,
+    45415.072812135557,
+    45434.538152615823,
+    45454.005578184282,
+    45473.475088394356,
+    45492.946682799746,
+    45512.420360954362,
+    45531.896122412363,
+    45551.373966728155,
+    45570.853893456362,
+    45590.33590215187,
+    45609.819992369776,
+    45629.306163665438,
+    45648.794415594442,
+    45668.284747712612,
+    45687.777159576006,
+    45707.27165074092,
+    45726.768220763894,
+    45746.266869201696,
+    45765.767595611323,
+    45785.270399550034,
+    45804.775280575297,
+    45824.282238244828,
+    45843.79127211657,
+    45863.302381748719,
+    45882.815566699683,
+    45902.33082652813,
+    45921.848160792935,
+    45941.367569053225,
+    45960.889050868354,
+    45980.41260579793,
+    45999.938233401757,
+    46019.465933239902,
+    46038.995704872657,
+    46058.527547860547,
+    46078.06146176433,
+    46097.597446144995,
+    46117.135500563774,
+    46136.675624582109,
+    46156.217817761702,
+    46175.762079664462,
+    46195.308409852543,
+    46214.856807888333,
+    46234.407273334444,
+    46253.959805753715,
+    46273.51440470924,
+    46293.071069764315,
+    46312.629800482478,
+    46332.190596427499,
+    46351.753457163381,
+    46371.318382254351,
+    46390.885371264863,
+    46410.45442375962,
+    46430.025539303526,
+    46449.598717461733,
+    46469.17395779962,
+    46488.751259882782,
+    46508.33062327707,
+    46527.912047548532,
+    46547.495532263471,
+    46567.081076988397,
+    46586.668681290059,
+    46606.258344735434,
+    46625.850066891719,
+    46645.443847326351,
+    46665.039685606986,
+    46684.637581301497,
+    46704.237533978005,
+    46723.839543204842,
+    46743.443608550573,
+    46763.049729583989,
+    46782.657905874104,
+    46802.268136990162,
+    46821.880422501628,
+    46841.494761978196,
+    46861.111154989776,
+    46880.729601106526,
+    46900.350099898795,
+    46919.97265093719,
+    46939.597253792526,
+    46959.223908035841,
+    46978.852613238392,
+    46998.483368971691,
+    47018.11617480743,
+    47037.751030317551,
+    47057.387935074221,
+    47077.026888649809,
+    47096.66789061694,
+    47116.310940548428,
+    47135.956038017328,
+    47155.603182596918,
+    47175.252373860698,
+    47194.903611382375,
+    47214.556894735892,
+    47234.212223495422,
+    47253.869597235338,
+    47273.52901553025,
+    47293.19047795498,
+    47312.853984084577,
+    47332.519533494306,
+    47352.187125759658,
+    47371.856760456343,
+    47391.528437160297,
+    47411.202155447652,
+    47430.877914894787,
+    47450.555715078299,
+    47470.235555574982,
+    47489.917435961863,
+    47509.601355816201,
+    47529.287314715453,
+    47548.975312237308,
+    47568.665347959672,
+    47588.357421460656,
+    47608.051532318605,
+    47627.747680112072,
+    47647.445864419846,
+    47667.14608482091,
+    47686.848340894474,
+    47706.552632219973,
+    47726.258958377046,
+    47745.967318945557,
+    47765.677713505589,
+    47785.390141637428,
+    47805.104602921601,
+    47824.821096938824,
+    47844.539623270044,
+    47864.260181496429,
+    47883.982771199349,
+    47903.707391960394,
+    47923.434043361369,
+    47943.162724984308,
+    47962.893436411439,
+    47982.626177225218,
+    48002.36094700831,
+    48022.097745343599,
+    48041.836571814172,
+    48061.57742600335,
+    48081.32030749465,
+    48101.065215871815,
+    48120.81215071879,
+    48140.56111161974,
+    48160.312098159047,
+    48180.065109921306,
+    48199.820146491307,
+    48219.577207454073,
+    48239.336292394844,
+    48259.097400899045,
+    48278.860532552339,
+    48298.625686940592,
+    48318.392863649875,
+    48338.162062266485,
+    48357.933282376915,
+    48377.706523567889,
+    48397.481785426316,
+    48417.259067539344,
+    48437.038369494308,
+    48456.819690878765,
+    48476.603031280487,
+    48496.388390287451,
+    48516.175767487839,
+    48535.965162470042,
+    48555.756574822684,
+    48575.550004134566,
+    48595.345449994718,
+    48615.142911992378,
+    48634.942389716991,
+    48654.743882758201,
+    48674.547390705877,
+    48694.352913150084,
+    48714.160449681112,
+    48733.969999889443,
+    48753.781563365759,
+    48773.595139700978,
+    48793.410728486211,
+    48813.228329312769,
+    48833.047941772187,
+    48852.869565456189,
+    48872.693199956717,
+    48892.518844865925,
+    48912.346499776155,
+    48932.176164279976,
+    48952.007837970152,
+    48971.841520439666,
+    48991.677211281676,
+    49011.514910089587,
+    49031.354616456978,
+    49051.196329977654,
+    49071.04005024561,
+    49090.885776855059,
+    49110.733509400408,
+    49130.583247476279,
+    49150.434990677488,
+    49170.288738599062,
+    49190.144490836232,
+    49210.002246984441,
+    49229.86200663932,
+    49249.723769396718,
+    49269.587534852675,
+    49289.453302603448,
+    49309.32107224549,
+    49329.190843375451,
+    49349.062615590192,
+    49368.936388486785,
+    49388.812161662492,
+    49408.689934714785,
+    49428.569707241324,
+    49448.45147883999,
+    49468.335249108866,
+    49488.22101764621,
+    49508.108784050521,
+    49527.99854792047,
+    49547.890308854934,
+    49567.784066453009,
+    49587.679820313977,
+    49607.57757003732,
+    49627.477315222721,
+    49647.379055470075,
+    49667.28279037946,
+    49687.188519551179,
+    49707.096242585707,
+    49727.005959083741,
+    49746.917668646165,
+    49766.831370874068,
+    49786.747065368734,
+    49806.66475173166,
+    49826.584429564515,
+    49846.506098469203,
+    49866.429758047794,
+    49886.355407902578,
+    49906.283047636032,
+    49926.212676850846,
+    49946.144295149883,
+    49966.077902136225,
+    49986.013497413151,
+    50005.951080584135,
+    50025.890651252834,
+    50045.832209023123,
+    50065.775753499074,
+    50085.721284284933,
+    50105.668800985164,
+    50125.618303204428,
+    50145.569790547575,
+    50165.523262619652,
+    50185.478719025901,
+    50205.436159371769,
+    50225.395583262893,
+    50245.356990305103,
+    50265.320380104429,
+    50285.285752267104,
+    50305.253106399534,
+    50325.222442108337,
+    50345.193759000336,
+    50365.16705668252,
+    50385.142334762102,
+    50405.119592846473,
+    50425.098830543218,
+    50445.080047460127,
+    50465.063243205179,
+    50485.048417386541,
+    50505.035569612577,
+    50525.024699491856,
+    50545.015806633128,
+    50565.008890645338,
+    50585.003951137631,
+    50605.00098771933,
+    50624.999999999971,
+    50645.000987589265,
+    50665.003950097132,
+    50685.008887133677,
+    50705.015798309192,
+    50725.024683234165,
+    50745.035541519283,
+    50765.048372775411,
+    50785.063176613621,
+    50805.079952645159,
+    50825.098700481489,
+    50845.119419734241,
+    50865.142110015244,
+    50885.166770936521,
+    50905.193402110279,
+    50925.222003148934,
+    50945.252573665071,
+    50965.285113271471,
+    50985.319621581119,
+    51005.356098207172,
+    51025.394542762981,
+    51045.434954862096,
+    51065.477334118244,
+    51085.521680145357,
+    51105.567992557546,
+    51125.616270969113,
+    51145.66651499454,
+    51165.718724248516,
+    51185.772898345916,
+    51205.829036901778,
+    51225.887139531362,
+    51245.947205850105,
+    51266.009235473619,
+    51286.073228017718,
+    51306.139183098399,
+    51326.207100331856,
+    51346.276979334456,
+    51366.348819722756,
+    51386.42262111351,
+    51406.498383123653,
+    51426.57610537031,
+    51446.655787470787,
+    51466.737429042587,
+    51486.82102970338,
+    51506.906589071048,
+    51526.994106763632,
+    51547.083582399391,
+    51567.175015596738,
+    51587.268405974297,
+    51607.363753150858,
+    51627.461056745415,
+    51647.56031637713,
+    51667.661531665362,
+    51687.764702229651,
+    51707.869827689727,
+    51727.976907665499,
+    51748.085941777055,
+    51768.196929644677,
+    51788.309870888836,
+    51808.42476513017,
+    51828.541611989524,
+    51848.660411087905,
+    51868.781162046515,
+    51888.90386448674,
+    51909.028518030143,
+    51929.155122298485,
+    51949.283676913685,
+    51969.414181497872,
+    51989.546635673345,
+    52009.681039062583,
+    52029.817391288263,
+    52049.955691973213,
+    52070.095940740481,
+    52090.238137213273,
+    52110.382281014987,
+    52130.5283717692,
+    52150.676409099666,
+    52170.826392630333,
+    52190.97832198532,
+    52211.132196788931,
+    52231.288016665654,
+    52251.445781240145,
+    52271.60549013727,
+    52291.76714298204,
+    52311.930739399664,
+    52332.096279015546,
+    52352.263761455244,
+    52372.433186344519,
+    52392.604553309284,
+    52412.777861975665,
+    52432.953111969946,
+    52453.130302918595,
+    52473.309434448267,
+    52493.490506185793,
+    52513.67351775818,
+    52533.858468792605,
+    52554.045358916446,
+    52574.234187757254,
+    52594.42495494274,
+    52614.617660100812,
+    52634.812302859558,
+    52655.008882847229,
+    52675.20739969227,
+    52695.407853023295,
+    52715.610242469098,
+    52735.814567658657,
+    52756.02082822111,
+    52776.229023785803,
+    52796.439153982225,
+    52816.651218440056,
+    52836.865216789171,
+    52857.081148659599,
+    52877.29901368155,
+    52897.518811485425,
+    52917.740541701773,
+    52937.964203961354,
+    52958.18979789508,
+    52978.417323134046,
+    52998.646779309529,
+    53018.878166052978,
+    53039.111482996006,
+    53059.346729770419,
+    53079.583906008193,
+    53099.823011341483,
+    53120.0640454026,
+    53140.307007824063,
+    53160.551898238533,
+    53180.79871627887,
+    53201.047461578091,
+    53221.2981337694,
+    53241.550732486176,
+    53261.805257361964,
+    53282.061708030487,
+    53302.32008412564,
+    53322.580385281493,
+    53342.842611132299,
+    53363.106761312469,
+    53383.372835456597,
+    53403.640833199453,
+    53423.910754175973,
+    53444.18259802126,
+    53464.456364370613,
+    53484.732052859479,
+    53505.009663123499,
+    53525.289194798468,
+    53545.570647520362,
+    53565.854020925333,
+    53586.139314649699,
+    53606.426528329954,
+    53626.715661602764,
+    53647.006714104959,
+    53667.299685473547,
+    53687.59457534572,
+    53707.891383358816,
+    53728.190109150361,
+    53748.490752358055,
+    53768.793312619753,
+    53789.09778957349,
+    53809.404182857485,
+    53829.712492110106,
+    53850.022716969899,
+    53870.334857075584,
+    53890.648912066055,
+    53910.964881580367,
+    53931.28276525774,
+    53951.602562737586,
+    53971.924273659461,
+    53992.24789766311,
+    54012.57343438844,
+    54032.90088347553,
+    54053.23024456462,
+    54073.561517296133,
+    54093.894701310644,
+    54114.22979624891,
+    54134.566801751855,
+    54154.90571746057,
+    54175.246543016314,
+    54195.589278060506,
+    54215.933922234755,
+    54236.280475180814,
+    54256.628936540626,
+    54276.97930595628,
+    54297.331583070045,
+    54317.685767524359,
+    54338.041858961828,
+    54358.399857025215,
+    54378.759761357462,
+    54399.121571601667,
+    54419.485287401105,
+    54439.850908399218,
+    54460.218434239614,
+    54480.587864566056,
+    54500.95919902248,
+    54521.332437252997,
+    54541.707578901878,
+    54562.084623613555,
+    54582.46357103264,
+    54602.844420803893,
+    54623.227172572246,
+    54643.611825982807,
+    54663.998380680838,
+    54684.386836311773,
+    54704.777192521207,
+    54725.169448954897,
+    54745.563605258772,
+    54765.959661078923,
+    54786.357616061614,
+    54806.757469853255,
+    54827.159222100439,
+    54847.562872449904,
+    54867.968420548583,
+    54888.375866043534,
+    54908.785208582012,
+    54929.196447811417,
+    54949.609583379322,
+    54970.024614933463,
+    54990.441542121727,
+    55010.86036459219,
+    55031.28108199306,
+    55051.703693972733,
+    55072.128200179759,
+    55092.554600262847,
+    55112.982893870874,
+    55133.413080652877,
+    55153.845160258061,
+    55174.279132335789,
+    55194.714996535586,
+    55215.152752507143,
+    55235.592399900306,
+    55256.033938365079,
+    55276.477367551655,
+    55296.92268711036,
+    55317.369896691685,
+    55337.818995946305,
+    55358.269984525024,
+    55378.72286207883,
+    55399.177628258869,
+    55419.634282716441,
+    55440.092825103013,
+    55460.553255070205,
+    55481.015572269804,
+    55501.479776353764,
+    55521.945866974187,
+    55542.413843783339,
+    55562.883706433655,
+    55583.355454577715,
+    55603.82908786826,
+    55624.304605958219,
+    55644.782008500639,
+    55665.261295148754,
+    55685.742465555952,
+    55706.225519375774,
+    55726.710456261928,
+    55747.197275868275,
+    55767.685977848843,
+    55788.176561857814,
+    55808.669027549528,
+    55829.163374578478,
+    55849.659602599328,
+    55870.157711266889,
+    55890.657700236145,
+    55911.159569162221,
+    55931.663317700411,
+    55952.168945506164,
+    55972.676452235086,
+    55993.185837542944,
+    56013.697101085651,
+    56034.210242519301,
+    56054.72526150012,
+    56075.242157684508,
+    56095.760930729011,
+    56116.281580290342,
+    56136.804106025367,
+    56157.328507591104,
+    56177.85478464474,
+    56198.382936843598,
+    56218.912963845185,
+    56239.444865307138,
+    56259.978640887268,
+    56280.514290243525,
+    56301.051813034042,
+    56321.591208917082,
+    56342.13247755108,
+    56362.675618594607,
+    56383.220631706419,
+    56403.767516545398,
+    56424.316272770608,
+    56444.866900041241,
+    56465.419398016667,
+    56485.973766356394,
+    56506.530004720102,
+    56527.088112767611,
+    56547.648090158902,
+    56568.209936554107,
+    56588.773651613519,
+    56609.339234997584,
+    56629.9066863669,
+    56650.47600538221,
+    56671.04719170442,
+    56691.620244994599,
+    56712.195164913959,
+    56732.771951123868,
+    56753.350603285835,
+    56773.931121061541,
+    56794.513504112823,
+    56815.097752101647,
+    56835.683864690152,
+    56856.271841540627,
+    56876.86168231551,
+    56897.453386677393,
+    56918.046954289028,
+    56938.642384813298,
+    56959.239677913261,
+    56979.838833252121,
+    57000.439850493225,
+    57021.04272930009,
+    57041.647469336371,
+    57062.254070265873,
+    57082.862531752558,
+    57103.472853460553,
+    57124.085035054108,
+    57144.699076197649,
+    57165.314976555739,
+    57185.932735793103,
+    57206.552353574611,
+    57227.173829565276,
+    57247.797163430281,
+    57268.42235483494,
+    57289.049403444733,
+    57309.678308925286,
+    57330.30907094237,
+    57350.941689161911,
+    57371.576163249985,
+    57392.212492872815,
+    57412.850677696784,
+    57433.490717388406,
+    57454.132611614368,
+    57474.776360041491,
+    57495.421962336746,
+    57516.069418167266,
+    57536.718727200314,
+    57557.36988910332,
+    57578.022903543861,
+    57598.677770189643,
+    57619.334488708548,
+    57639.993058768589,
+    57660.653480037938,
+    57681.315752184906,
+    57701.979874877965,
+    57722.64584778573,
+    57743.31367057695,
+    57763.983342920546,
+    57784.654864485572,
+    57805.328234941233,
+    57826.003453956881,
+    57846.680521202026,
+    57867.359436346305,
+    57888.040199059527,
+    57908.722809011633,
+    57929.407265872709,
+    57950.093569313001,
+    57970.781719002895,
+    57991.471714612911,
+    58012.16355581375,
+    58032.857242276223,
+    58053.552773671312,
+    58074.25014967013,
+    58094.949369943948,
+    58115.650434164185,
+    58136.353342002389,
+    58157.058093130276,
+    58177.764687219693,
+    58198.47312394264,
+    58219.183402971255,
+    58239.895523977837,
+    58260.609486634821,
+    58281.325290614775,
+    58302.042935590434,
+    58322.762421234678,
+    58343.483747220511,
+    58364.206913221096,
+    58384.931918909751,
+    58405.658763959924,
+    58426.3874480452,
+    58447.117970839339,
+    58467.85033201622,
+    58488.584531249864,
+    58509.320568214462,
+    58530.058442584334,
+    58550.798154033931,
+    58571.539702237875,
+    58592.283086870906,
+    58613.028307607929,
+    58633.775364123983,
+    58654.52425609425,
+    58675.274983194053,
+    58696.027545098877,
+    58716.781941484325,
+    58737.538172026158,
+    58758.296236400274,
+    58779.056134282728,
+    58799.817865349694,
+    58820.581429277503,
+    58841.346825742643,
+    58862.114054421712,
+    58882.883114991484,
+    58903.654007128847,
+    58924.426730510851,
+    58945.201284814684,
+    58965.977669717664,
+    58986.755884897269,
+    59007.535930031117,
+    59028.317804796949,
+    59049.101508872664,
+    59069.887041936301,
+    59090.674403666046,
+    59111.463593740213,
+    59132.254611837263,
+    59153.047457635803,
+    59173.84213081457,
+    59194.638631052461,
+    59215.436958028506,
+    59236.237111421855,
+    59257.039090911829,
+    59277.842896177877,
+    59298.648526899589,
+    59319.455982756685,
+    59340.26526342905,
+    59361.076368596696,
+    59381.889297939757,
+    59402.704051138542,
+    59423.520627873484,
+    59444.339027825139,
+    59465.159250674224,
+    59485.9812961016,
+    59506.805163788253,
+    59527.630853415307,
+    59548.458364664046,
+    59569.287697215863,
+    59590.118850752311,
+    59610.951824955089,
+    59631.786619506012,
+    59652.623234087048,
+    59673.461668380311,
+    59694.301922068029,
+    59715.143994832593,
+    59735.987886356525,
+    59756.833596322482,
+    59777.681124413255,
+    59798.530470311794,
+    59819.381633701159,
+    59840.234614264569,
+    59861.089411685381,
+    59881.94602564707,
+    59902.804455833269,
+    59923.664701927737,
+    59944.526763614384,
+    59965.390640577243,
+    59986.256332500488,
+    60007.123839068438,
+    60027.993159965539,
+    60048.864294876381,
+    60069.737243485688,
+    60090.612005478324,
+    60111.488580539284,
+    60132.366968353708,
+    60153.247168606867,
+    60174.129180984164,
+    60195.013005171153,
+    60215.898640853513,
+    60236.786087717061,
+    60257.675345447751,
+    60278.566413731671,
+    60299.459292255044,
+    60320.353980704247,
+    60341.25047876576,
+    60362.148786126229,
+    60383.048902472423,
+    60403.950827491237,
+    60424.854560869717,
+    60445.76010229504,
+    60466.667451454516,
+    60487.57660803559,
+    60508.487571725847,
+    60529.400342212997,
+    60550.314919184893,
+    60571.231302329521,
+    60592.149491335003,
+    60613.069485889588,
+    60633.991285681674,
+    60654.914890399785,
+    60675.840299732568,
+    60696.767513368832,
+    60717.696530997484,
+    60738.627352307602,
+    60759.55997698837,
+    60780.494404729128,
+    60801.430635219323,
+    60822.368668148556,
+    60843.308503206565,
+    60864.250140083204,
+    60885.193578468468,
+    60906.138818052495,
+    60927.085858525541,
+    60948.034699578006,
+    60968.985340900421,
+    60989.937782183442,
+    61010.892023117864,
+    61031.848063394616,
+    61052.805902704764,
+    61073.765540739492,
+    61094.726977190134,
+    61115.690211748137,
+    61136.655244105103,
+    61157.622073952742,
+    61178.590700982917,
+    61199.561124887616,
+    61220.533345358948,
+    61241.507362089171,
+    61262.483174770663,
+    61283.460783095943,
+    61304.440186757645,
+    61325.421385448557,
+    61346.404378861582,
+    61367.389166689762,
+    61388.375748626262,
+    61409.364124364387,
+    61430.354293597571,
+    61451.346256019373,
+    61472.340011323497,
+    61493.335559203762,
+    61514.332899354122,
+    61535.332031468672,
+    61556.332955241618,
+    61577.335670367313,
+    61598.340176540238,
+    61619.346473454993,
+    61640.354560806329,
+    61661.3644382891,
+    61682.376105598312,
+    61703.389562429089,
+    61724.404808476691,
+    61745.42184343651,
+    61766.440667004063,
+    61787.461278874987,
+    61808.483678745069,
+    61829.507866310203,
+    61850.533841266435,
+    61871.561603309929,
+    61892.591152136971,
+    61913.622487443987,
+    61934.655608927525,
+    61955.690516284267,
+    61976.727209211022,
+    61997.765687404724,
+    62018.805950562448,
+    62039.847998381381,
+    62060.891830558845,
+    62081.93744679229,
+    62102.984846779298,
+    62124.034030217575,
+    62145.084996804966,
+    62166.137746239416,
+    62187.19227821903,
+    62208.248592442025,
+    62229.306688606739,
+    62250.366566411656,
+    62271.428225555377,
+    62292.491665736627,
+    62313.556886654267,
+    62334.623888007271,
+    62355.692669494762,
+    62376.763230815974,
+    62397.835571670272,
+    62418.909691757144,
+    62439.98559077621,
+    62461.063268427228,
+    62482.142724410049,
+    62503.223958424685,
+    62524.306970171267,
+    62545.39175935003,
+    62566.478325661366,
+    62587.566668805768,
+    62608.656788483881,
+    62629.748684396451,
+    62650.842356244357,
+    62671.937803728622,
+    62693.035026550366,
+    62714.134024410858,
+    62735.234797011479,
+    62756.337344053733,
+    62777.441665239276,
+    62798.547760269852,
+    62819.655628847358,
+    62840.765270673801,
+    62861.876685451323,
+    62882.989872882186,
+    62904.104832668774,
+    62925.221564513602,
+    62946.340068119309,
+    62967.460343188657,
+    62988.582389424526,
+    63009.70620652994,
+    63030.831794208025,
+    63051.959152162039,
+    63073.08828009537,
+    63094.219177711529,
+    63115.351844714154,
+    63136.486280806988,
+    63157.622485693922,
+    63178.760459078956,
+    63199.900200666219,
+    63221.041710159967,
+    63242.184987264569,
+    63263.330031684534,
+    63284.476843124474,
+    63305.625421289144,
+    63326.775765883409,
+    63347.927876612259,
+    63369.081753180813,
+    63390.237395294316,
+    63411.39480265812,
+    63432.553974977716,
+    63453.714911958712,
+    63474.877613306839,
+    63496.042078727944,
+    63517.208307927998,
+    63538.376300613119,
+    63559.546056489504,
+    63580.717575263516,
+    63601.890856641607,
+    63623.065900330374,
+    63644.242706036515,
+    63665.421273466869,
+    63686.601602328381,
+    63707.783692328136,
+    63728.967543173334,
+    63750.153154571279,
+    63771.340526229418,
+    63792.529657855317,
+    63813.720549156649,
+    63834.913199841227,
+    63856.107609616978,
+    63877.303778191941,
+    63898.501705274284,
+    63919.7013905723,
+    63940.902833794404,
+    63962.106034649114,
+    63983.310992845094,
+    64004.517708091109,
+    64025.726180096048,
+    64046.936408568938,
+    64068.1483932189,
+    64089.362133755196,
+    64110.577629887193,
+    64131.794881324393,
+    64153.013887776404,
+    64174.234648952966,
+    64195.457164563937,
+    64216.681434319289,
+    64237.907457929112,
+    64259.135235103626,
+    64280.36476555316,
+    64301.596048988169,
+    64322.829085119236,
+    64344.06387365704,
+    64365.300414312398,
+    64386.538706796251,
+    64407.778750819634,
+    64429.020546093721,
+    64450.26409232981,
+    64471.509389239291,
+    64492.756436533709,
+    64514.005233924705,
+    64535.255781124033,
+    64556.50807784358,
+    64577.762123795357,
+    64599.017918691468,
+    64620.275462244172,
+    64641.534754165805,
+    64662.795794168844,
+    64684.058581965895,
+    64705.323117269661,
+    64726.589399792974,
+    64747.857429248776,
+    64769.127205350138,
+    64790.398727810236,
+    64811.671996342375,
+    64832.947010659969,
+    64854.223770476558,
+    64875.502275505794,
+    64896.782525461451,
+    64918.064520057414,
+    64939.348259007682,
+    64960.633742026388,
+    64981.920968827762,
+    65003.209939126165,
+    65024.500652636067,
+    65045.793109072067,
+    65067.087308148861,
+    65088.383249581282,
+    65109.680933084259,
+    65130.980358372864,
+    65152.28152516226,
+    65173.584433167736,
+    65194.889082104703,
+    65216.195471688683,
+    65237.503601635319,
+    65258.813471660353,
+    65280.125081479666,
+    65301.438430809241,
+    65322.753519365178,
+    65344.070346863708,
+    65365.388913021146,
+    65386.709217553958,
+    65408.031260178701,
+    65429.355040612056,
+    65450.680558570821,
+    65472.00781377191,
+    65493.336805932355,
+    65514.66753476928,
+    65535.999999999956,
+    65557.334201341757,
+    65578.670138512171,
+    65600.007811228788,
+    65621.347219209332,
+    65642.688362171626,
+    65664.031239833639,
+    65685.375851913413,
+    65706.722198129137,
+    65728.070278199084,
+    65749.420091841661,
+    65770.771638775404,
+    65792.124918718939,
+    65813.479931391004,
+    65834.836676510458,
+    65856.195153796303,
+    65877.5553629676,
+    65898.917303743554,
+    65920.280975843489,
+    65941.646378986843,
+    65963.013512893158,
+    65984.382377282076,
+    66005.752971873386,
+    66027.125296386963,
+    66048.499350542799,
+    66069.875134061018,
+    66091.252646661844,
+    66112.631888065618,
+    66134.01285799277,
+    66155.395556163887,
+    66176.779982299631,
+    66198.166136120795,
+    66219.554017348273,
+    66240.943625703105,
+    66262.334960906388,
+    66283.728022679396,
+    66305.122810743444,
+    66326.519324820023,
+    66347.917564630698,
+    66369.317529897162,
+    66390.719220341227,
+    66412.122635684791,
+    66433.527775649884,
+    66454.934639958636,
+    66476.343228333324,
+    66497.753540496284,
+    66519.165576169995,
+    66540.57933507704,
+    66561.994816940118,
+    66583.412021482043,
+    66604.830948425733,
+    66626.251597494222,
+    66647.673968410629,
+    66669.098060898235,
+    66690.523874680381,
+    66711.951409480564,
+    66733.380665022371,
+    66754.811641029475,
+    66776.244337225711,
+    66797.678753334985,
+    66819.11488908132,
+    66840.552744188884,
+    66861.992318381905,
+    66883.433611384738,
+    66904.876622921889,
+    66926.321352717903,
+    66947.767800497502,
+    66969.215965985466,
+    66990.665848906734,
+    67012.117448986304,
+    67033.570765949335,
+    67055.025799521056,
+    67076.482549426815,
+    67097.941015392076,
+    67119.401197142433,
+    67140.863094403554,
+    67162.326706901222,
+    67183.792034361351,
+    67205.259076509959,
+    67226.72783307315,
+    67248.198303777172,
+    67269.670488348347,
+    67291.144386513144,
+    67312.619997998088,
+    67334.09732252988,
+    67355.576359835293,
+    67377.057109641188,
+    67398.53957167457,
+    67420.023745662547,
+    67441.50963133233,
+    67462.99722841123,
+    67484.486536626689,
+    67505.977555706224,
+    67527.470285377494,
+    67548.964725368263,
+    67570.460875406367,
+    67591.9587352198,
+    67613.458304536631,
+    67634.95958308503,
+    67656.462570593329,
+    67677.967266789899,
+    67699.473671403248,
+    67720.981784162024,
+    67742.491604794923,
+    67764.003133030797,
+    67785.516368598575,
+    67807.031311227314,
+    67828.547960646174,
+    67850.066316584402,
+    67871.58637877139,
+    67893.108146936589,
+    67914.63162080961,
+    67936.156800120138,
+    67957.683684597971,
+    67979.212273973011,
+    68000.742567975263,
+    68022.274566334876,
+    68043.808268782057,
+    68065.343675047145,
+    68086.880784860579,
+    68108.419597952918,
+    68129.960114054789,
+    68151.502332896969,
+    68173.04625421032,
+    68194.591877725834,
+    68216.139203174564,
+    68237.688230287706,
+    68259.238958796544,
+    68280.791388432481,
+    68302.345518927032,
+    68323.901350011787,
+    68345.458881418483,
+    68367.018112878912,
+    68388.579044125028,
+    68410.141674888844,
+    68431.706004902502,
+    68453.272033898262,
+    68474.839761608455,
+    68496.409187765545,
+    68517.980312102081,
+    68539.553134350732,
+    68561.127654244279,
+    68582.70387151558,
+    68604.281785897634,
+    68625.861397123503,
+    68647.44270492639,
+    68669.025709039604,
+    68690.610409196524,
+    68712.196805130661,
+    68733.784896575627,
+    68755.374683265123,
+    68776.966164932994,
+    68798.559341313128,
+    68820.154212139591,
+    68841.750777146473,
+    68863.349036068044,
+    68884.948988638629,
+    68906.550634592684,
+    68928.153973664739,
+    68949.75900558944,
+    68971.365730101577,
+    68992.974146935987,
+    69014.584255827634,
+    69036.196056511588,
+    69057.809548723017,
+    69079.424732197207,
+    69101.041606669532,
+    69122.660171875468,
+    69144.280427550606,
+    69165.902373430625,
+    69187.526009251334,
+    69209.151334748618,
+    69230.778349658474,
+    69252.40705371699,
+    69274.037446660412,
+    69295.669528225,
+    69317.303298147192,
+    69338.938756163494,
+    69360.575902010532,
+    69382.214735425005,
+    69403.855256143754,
+    69425.497463903681,
+    69447.141358441833,
+    69468.78693949533,
+    69490.434206801394,
+    69512.083160097391,
+    69533.733799120717,
+    69555.386123608929,
+    69577.04013329967,
+    69598.695827930685,
+    69620.353207239794,
+    69642.012270964973,
+    69663.67301884426,
+    69685.335450615792,
+    69706.999566017839,
+    69728.665364788743,
+    69750.332846666963,
+    69772.002011391058,
+    69793.672858699691,
+    69815.345388331611,
+    69837.019600025669,
+    69858.695493520849,
+    69880.373068556204,
+    69902.052324870907,
+    69923.733262204216,
+    69945.415880295492,
+    69967.100178884211,
+    69988.786157709939,
+    70010.473816512356,
+    70032.163155031216,
+    70053.854173006403,
+    70075.546870177874,
+    70097.241246285717,
+    70118.937301070109,
+    70140.635034271298,
+    70162.334445629691,
+    70184.035534885741,
+    70205.738301780017,
+    70227.442746053217,
+    70249.1488674461,
+    70270.856665699539,
+    70292.566140554511,
+    70314.277291752107,
+    70335.990119033493,
+    70357.704622139936,
+    70379.420800812819,
+    70401.138654793613,
+    70422.85818382389,
+    70444.579387645339,
+    70466.302265999722,
+    70488.026818628918,
+    70509.753045274876,
+    70531.480945679708,
+    70553.210519585555,
+    70574.941766734701,
+    70596.674686869505,
+    70618.409279732456,
+    70640.145545066101,
+    70661.883482613106,
+    70683.623092116264,
+    70705.364373318414,
+    70727.107325962526,
+    70748.851949791671,
+    70770.598244549008,
+    70792.346209977783,
+    70814.095845821372,
+    70835.847151823225,
+    70857.600127726895,
+    70879.354773276034,
+    70901.111088214413,
+    70922.869072285859,
+    70944.628725234332,
+    70966.390046803877,
+    70988.153036738629,
+    71009.917694782853,
+    71031.684020680885,
+    71053.45201417715,
+    71075.221675016204,
+    71096.993002942661,
+    71118.765997701266,
+    71140.540659036851,
+    71162.316986694335,
+    71184.09498041874,
+    71205.874639955218,
+    71227.655965048951,
+    71249.438955445294,
+    71271.223610889632,
+    71293.009931127483,
+    71314.797915904477,
+    71336.587564966307,
+    71358.378878058764,
+    71380.171854927772,
+    71401.966495319313,
+    71423.762798979486,
+    71445.560765654489,
+    71467.360395090596,
+    71489.161687034211,
+    71510.964641231811,
+    71532.769257429973,
+    71554.575535375348,
+    71576.383474814749,
+    71598.19307549503,
+    71620.004337163133,
+    71641.817259566145,
+    71663.631842451214,
+    71685.4480855656,
+    71707.26598865664,
+    71729.085551471784,
+    71750.906773758586,
+    71772.729655264673,
+    71794.554195737772,
+    71816.380394925713,
+    71838.208252576442,
+    71860.037768437964,
+    71881.868942258385,
+    71903.701773785942,
+    71925.536262768932,
+    71947.372408955751,
+    71969.210212094898,
+    71991.049671934976,
+    72012.890788224686,
+    72034.73356071279,
+    72056.577989148165,
+    72078.424073279821,
+    72100.271812856794,
+    72122.121207628254,
+    72143.97225734347,
+    72165.824961751801,
+    72187.679320602692,
+    72209.53533364569,
+    72231.393000630429,
+    72253.252321306645,
+    72275.113295424177,
+    72296.975922732949,
+    72318.840202982959,
+    72340.706135924338,
+    72362.573721307272,
+    72384.442958882093,
+    72406.313848399179,
+    72428.186389609036,
+    72450.060582262216,
+    72471.936426109431,
+    72493.813920901433,
+    72515.693066389096,
+    72537.573862323392,
+    72559.456308455352,
+    72581.340404536139,
+    72603.226150316987,
+    72625.113545549248,
+    72647.002589984331,
+    72668.893283373764,
+    72690.785625469172,
+    72712.679616022273,
+    72734.575254784853,
+    72756.472541508803,
+    72778.371475946144,
+    72800.272057848939,
+    72822.174286969355,
+    72844.07816305969,
+    72865.983685872285,
+    72887.890855159596,
+    72909.799670674183,
+    72931.710132168693,
+    72953.622239395845,
+    72975.535992108475,
+    72997.451390059519,
+    73019.368433001961,
+    73041.287120688925,
+    73063.207452873612,
+    73085.129429309294,
+    73107.053049749389,
+    73128.978313947344,
+    73150.905221656736,
+    73172.833772631217,
+    73194.763966624567,
+    73216.695803390612,
+    73238.62928268328,
+    73260.564404256627,
+    73282.501167864757,
+    73304.439573261901,
+    73326.379620202337,
+    73348.321308440485,
+    73370.264637730841,
+    73392.209607827957,
+    73414.156218486532,
+    73436.104469461323,
+    73458.054360507173,
+    73480.005891379056,
+    73501.959061831993,
+    73523.913871621116,
+    73545.870320501665,
+    73567.828408228932,
+    73589.78813455833,
+    73611.749499245358,
+    73633.712502045615,
+    73655.677142714747,
+    73677.643421008557,
+    73699.611336682879,
+    73721.580889493693,
+    73743.552079197019,
+    73765.524905548999,
+    73787.499368305856,
+    73809.475467223907,
+    73831.453202059551,
+    73853.432572569291,
+    73875.413578509717,
+    73897.396219637507,
+    73919.380495709411,
+    73941.36640648231,
+    73963.353951713143,
+    73985.343131158952,
+    74007.333944576865,
+    74029.326391724098,
+    74051.320472357969,
+    74073.316186235883,
+    74095.313533115303,
+    74117.312512753837,
+    74139.313124909138,
+    74161.315369338976,
+    74183.319245801191,
+    74205.324754053727,
+    74227.331893854629,
+    74249.340664961986,
+    74271.351067134034,
+    74293.363100129049,
+    74315.376763705441,
+    74337.392057621662,
+    74359.408981636298,
+    74381.427535508003,
+    74403.447718995507,
+    74425.469531857671,
+    74447.492973853383,
+    74469.518044741693,
+    74491.54474428168,
+    74513.573072232539,
+    74535.603028353551,
+    74557.634612404087,
+    74579.667824143602,
+    74601.702663331642,
+    74623.739129727837,
+    74645.777223091936,
+    74667.816943183716,
+    74689.858289763113,
+    74711.901262590094,
+    74733.945861424741,
+    74755.992086027225,
+    74778.039936157802,
+    74800.089411576817,
+    74822.140512044702,
+    74844.193237321961,
+    74866.24758716923,
+    74888.303561347187,
+    74910.36115961663,
+    74932.420381738411,
+    74954.481227473516,
+    74976.543696582972,
+    74998.607788827925,
+    75020.673503969607,
+    75042.740841769322,
+    75064.809801988464,
+    75086.88038438854,
+    75108.952588731103,
+    75131.026414777836,
+    75153.101862290467,
+    75175.178931030852,
+    75197.257620760924,
+    75219.33793124267,
+    75241.419862238225,
+    75263.503413509738,
+    75285.588584819503,
+    75307.675375929874,
+    75329.763786603318,
+    75351.853816602365,
+    75373.945465689612,
+    75396.038733627807,
+    75418.133620179724,
+    75440.230125108254,
+    75462.32824817636,
+    75484.427989147109,
+    75506.529347783653,
+    75528.63232384919,
+    75550.736917107075,
+    75572.843127320695,
+    75594.950954253538,
+    75617.060397669193,
+    75639.171457331307,
+    75661.284133003646,
+    75683.398424450032,
+    75705.514331434402,
+    75727.631853720741,
+    75749.750991073175,
+    75771.871743255862,
+    75793.994110033076,
+    75816.118091169177,
+    75838.243686428585,
+    75860.370895575848,
+    75882.499718375562,
+    75904.630154592422,
+    75926.762203991224,
+    75948.895866336825,
+    75971.031141394182,
+    75993.168028928325,
+    76015.306528704401,
+    76037.4466404876,
+    76059.588364043215,
+    76081.731699136653,
+    76103.876645533353,
+    76126.023202998884,
+    76148.171371298871,
+    76170.321150199044,
+    76192.472539465205,
+    76214.625538863256,
+    76236.780148159174,
+    76258.936367119008,
+    76281.094195508922,
+    76303.253633095141,
+    76325.414679643975,
+    76347.577334921851,
+    76369.741598695226,
+    76391.907470730686,
+    76414.074950794879,
+    76436.244038654564,
+    76458.414734076548,
+    76480.587036827754,
+    76502.760946675175,
+    76524.936463385893,
+    76547.11358672705,
+    76569.292316465915,
+    76591.472652369819,
+    76613.654594206164,
+    76635.838141742468,
+    76658.023294746308,
+    76680.210052985349,
+    76702.398416227341,
+    76724.588384240138,
+    76746.779956791637,
+    76768.973133649866,
+    76791.167914582897,
+    76813.364299358902,
+    76835.562287746157,
+    76857.761879512967,
+    76879.963074427797,
+    76902.165872259109,
+    76924.37027277553,
+    76946.576275745727,
+    76968.783880938441,
+    76990.993088122515,
+    77013.203897066895,
+    77035.416307540567,
+    77057.630319312622,
+    77079.845932152239,
+    77102.063145828695,
+    77124.281960111301,
+    77146.50237476948,
+    77168.724389572759,
+    77190.948004290723,
+    77213.173218693031,
+    77235.400032549442,
+    77257.628445629802,
+    77279.858457704031,
+    77302.090068542122,
+    77324.323277914169,
+    77346.558085590339,
+    77368.794491340886,
+    77391.032494936138,
+    77413.272096146524,
+    77435.51329474253,
+    77457.756090494731,
+    77480.000483173804,
+    77502.246472550498,
+    77524.494058395634,
+    77546.743240480107,
+    77568.994018574944,
+    77591.246392451198,
+    77613.500361880026,
+    77635.755926632657,
+    77658.013086480438,
+    77680.271841194757,
+    77702.532190547092,
+    77724.794134309021,
+    77747.057672252195,
+    77769.322804148323,
+    77791.589529769248,
+    77813.857848886837,
+    77836.127761273063,
+    77858.399266699998,
+    77880.67236493979,
+    77902.947055764627,
+    77925.223338946831,
+    77947.50121425878,
+    77969.780681472927,
+    77992.061740361838,
+    78014.344390698127,
+    78036.628632254491,
+    78058.914464803747,
+    78081.201888118725,
+    78103.490901972415,
+    78125.781506137821,
+    78148.073700388064,
+    78170.367484496339,
+    78192.662858235926,
+    78214.959821380166,
+    78237.258373702498,
+    78259.558514976452,
+    78281.860244975614,
+    78304.163563473659,
+    78326.468470244363,
+    78348.77496506153,
+    78371.083047699125,
+    78393.392717931114,
+    78415.703975531578,
+    78438.016820274701,
+    78460.331251934695,
+    78482.647270285903,
+    78504.964875102727,
+    78527.284066159627,
+    78549.604843231195,
+    78571.927206092048,
+    78594.251154516911,
+    78616.576688280606,
+    78638.903807157985,
+    78661.232510924034,
+    78683.562799353778,
+    78705.894672222363,
+    78728.228129304945,
+    78750.563170376859,
+    78772.899795213423,
+    78795.238003590101,
+    78817.577795282399,
+    78839.919170065928,
+    78862.262127716356,
+    78884.606668009452,
+    78906.952790721043,
+    78929.300495627045,
+    78951.64978250346,
+    78974.000651126378,
+    78996.353101271932,
+    79018.707132716358,
+    79041.062745235977,
+    79063.41993860717,
+    79085.778712606436,
+    79108.139067010285,
+    79130.501001595389,
+    79152.864516138419,
+    79175.22961041618,
+    79197.596284205531,
+    79219.96453728342,
+    79242.33436942687,
+    79264.705780412987,
+    79287.078770018954,
+    79309.453338022009,
+    79331.829484199508,
+    79354.207208328866,
+    79376.586510187582,
+    79398.967389553218,
+    79421.349846203433,
+    79443.733879915948,
+    79466.119490468584,
+    79488.50667763922,
+    79510.895441205823,
+    79533.285780946433,
+    79555.677696639163,
+    79578.071188062226,
+    79600.466254993895,
+    79622.862897212515,
+    79645.261114496549,
+    79667.660906624471,
+    79690.062273374875,
+    79712.465214526455,
+    79734.869729857935,
+    79757.275819148126,
+    79779.683482175955,
+    79802.092718720378,
+    79824.503528560454,
+    79846.915911475327,
+    79869.329867244203,
+    79891.745395646343,
+    79914.162496461155,
+    79936.581169468045,
+    79959.001414446553,
+    79981.423231176261,
+    80003.846619436852,
+    80026.271579008084,
+    80048.698109669771,
+    80071.12621120183,
+    80093.555883384237,
+    80115.987125997053,
+    80138.419938820414,
+    80160.854321634528,
+    80183.290274219689,
+    80205.727796356281,
+    80228.166887824715,
+    80250.607548405547,
+    80273.049777879336,
+    80295.493576026798,
+    80317.938942628651,
+    80340.385877465727,
+    80362.834380318949,
+    80385.28445096928,
+    80407.736089197788,
+    80430.189294785596,
+    80452.644067513917,
+    80475.100407164035,
+    80497.558313517322,
+    80520.017786355209,
+    80542.478825459213,
+    80564.941430610925,
+    80587.405601592007,
+    80609.871338184195,
+    80632.338640169342,
+    80654.8075073293,
+    80677.277939446067,
+    80699.749936301683,
+    80722.223497678278,
+    80744.698623358039,
+    80767.17531312324,
+    80789.653566756242,
+    80812.133384039465,
+    80834.614764755403,
+    80857.097708686648,
+    80879.582215615854,
+    80902.068285325731,
+    80924.555917599093,
+    80947.045112218824,
+    80969.535868967869,
+    80992.028187629272,
+    81014.522067986123,
+    81037.017509821613,
+    81059.514512919006,
+    81082.013077061609,
+    81104.513202032831,
+    81127.014887616184,
+    81149.518133595193,
+    81172.022939753486,
+    81194.529305874807,
+    81217.037231742899,
+    81239.546717141639,
+    81262.057761854958,
+    81284.570365666848,
+    81307.084528361403,
+    81329.600249722775,
+    81352.117529535186,
+    81374.636367582949,
+    81397.156763650448,
+    81419.678717522125,
+    81442.202228982511,
+    81464.727297816222,
+    81487.253923807933,
+    81509.782106742379,
+    81532.311846404409,
+    81554.843142578902,
+    81577.375995050839,
+    81599.910403605274,
+    81622.446368027333,
+    81644.983888102215,
+    81667.522963615178,
+    81690.063594351581,
+    81712.605780096841,
+    81735.149520636449,
+    81757.694815755967,
+    81780.241665241047,
+    81802.79006887741,
+    81825.340026450824,
+    81847.891537747171,
+    81870.444602552379,
+    81892.999220652477,
+    81915.555391833506,
+    81938.113115881672,
+    81960.672392583176,
+    81983.233221724338,
+    82005.795603091537,
+    82028.359536471224,
+    82050.925021649906,
+    82073.492058414209,
+    82096.060646550788,
+    82118.630785846399,
+    82141.202476087841,
+    82163.775717062032,
+    82186.35050855593,
+    82208.926850356569,
+    82231.504742251054,
+    82254.084184026578,
+    82276.665175470393,
+    82299.24771636985,
+    82321.831806512317,
+    82344.417445685307,
+    82367.004633676348,
+    82389.593370273054,
+    82412.183655263143,
+    82434.775488434374,
+    82457.368869574595,
+    82479.963798471697,
+    82502.560274913689,
+    82525.158298688606,
+    82547.757869584602,
+    82570.35898738986,
+    82592.961651892678,
+    82615.565862881398,
+    82638.171620144421,
+    82660.778923470265,
+    82683.387772647475,
+    82705.998167464713,
+    82728.610107710658,
+    82751.223593174116,
+    82773.83862364394,
+    82796.45519890904,
+    82819.073318758441,
+    82841.692982981185,
+    82864.314191366429,
+    82886.936943703375,
+    82909.561239781324,
+    82932.187079389638,
+    82954.814462317736,
+    82977.443388355125,
+    83000.073857291369,
+    83022.70586891612,
+    83045.339423019104,
+    83067.974519390089,
+    83090.611157818959,
+    83113.249338095629,
+    83135.8890600101,
+    83158.530323352461,
+    83181.173127912858,
+    83203.817473481497,
+    83226.463359848669,
+    83249.11078680474,
+    83271.759754140134,
+    83294.410261645375,
+    83317.062309111003,
+    83339.715896327703,
+    83362.371023086147,
+    83385.027689177165,
+    83407.685894391587,
+    83430.345638520361,
+    83453.006921354478,
+    83475.669742685001,
+    83498.334102303095,
+    83520.999999999942,
+    83543.667435566866,
+    83566.336408795192,
+    83589.006919476349,
+    83611.678967401851,
+    83634.352552363242,
+    83657.027674152167,
+    83679.704332560359,
+    83702.382527379552,
+    83725.062258401638,
+    83747.743525418511,
+    83770.42632822218,
+    83793.110666604684,
+    83815.796540358162,
+    83838.483949274829,
+    83861.172893146941,
+    83883.863371766842,
+    83906.555384926964,
+    83929.248932419752,
+    83951.944014037799,
+    83974.640629573696,
+    83997.338778820151,
+    84020.038461569929,
+    84042.739677615857,
+    84065.442426750829,
+    84088.146708767847,
+    84110.852523459922,
+    84133.559870620171,
+    84156.268750041796,
+    84178.979161518029,
+    84201.691104842204,
+    84224.404579807713,
+    84247.119586208006,
+    84269.83612383662,
+    84292.55419248715,
+    84315.273791953281,
+    84337.994922028738,
+    84360.717582507335,
+    84383.441773182945,
+    84406.167493849513,
+    84428.894744301069,
+    84451.623524331691,
+    84474.353833735542,
+    84497.085672306828,
+    84519.819039839858,
+    84542.553936128999,
+    84565.290360968676,
+    84588.028314153402,
+    84610.767795477717,
+    84633.508804736295,
+    84656.251341723822,
+    84678.995406235073,
+    84701.740998064924,
+    84724.488117008252,
+    84747.236762860062,
+    84769.986935415407,
+    84792.73863446941,
+    84815.491859817252,
+    84838.246611254188,
+    84861.002888575575,
+    84883.760691576768,
+    84906.520020053256,
+    84929.28087380057,
+    84952.043252614312,
+    84974.807156290146,
+    84997.572584623806,
+    85020.339537411113,
+    85043.108014447949,
+    85065.878015530237,
+    85088.649540453989,
+    85111.422589015303,
+    85134.197161010321,
+    85156.973256235244,
+    85179.750874486374,
+    85202.530015560071,
+    85225.310679252725,
+    85248.092865360857,
+    85270.876573681016,
+    85293.661804009811,
+    85316.448556143951,
+    85339.236829880188,
+    85362.026625015351,
+    85384.817941346351,
+    85407.610778670132,
+    85430.405136783724,
+    85453.201015484257,
+    85475.998414568865,
+    85498.797333834795,
+    85521.597773079353,
+    85544.399732099904,
+    85567.203210693886,
+    85590.008208658808,
+    85612.814725792239,
+    85635.62276189182,
+    85658.432316755265,
+    85681.243390180331,
+    85704.055981964877,
+    85726.870091906807,
+    85749.685719804082,
+    85772.502865454764,
+    85795.321528656961,
+    85818.141709208852,
+    85840.963406908675,
+    85863.78662155474,
+    85886.611352945445,
+    85909.437600879217,
+    85932.26536515457,
+    85955.094645570091,
+    85977.92544192441,
+    86000.757754016275,
+    86023.591581644432,
+    86046.426924607746,
+    86069.263782705122,
+    86092.102155735556,
+    86114.942043498071,
+    86137.783445791807,
+    86160.626362415918,
+    86183.470793169676,
+    86206.316737852379,
+    86229.164196263402,
+    86252.013168202204,
+    86274.863653468303,
+    86297.715651861261,
+    86320.569163180728,
+    86343.424187226425,
+    86366.280723798132,
+    86389.138772695675,
+    86411.998333718977,
+    86434.859406668009,
+    86457.721991342827,
+    86480.586087543532,
+    86503.451695070296,
+    86526.318813723352,
+    86549.187443303032,
+    86572.057583609683,
+    86594.929234443756,
+    86617.802395605773,
+    86640.677066896271,
+    86663.553248115903,
+    86686.43093906538,
+    86709.310139545443,
+    86732.190849356964,
+    86755.073068300815,
+    86777.956796177954,
+    86800.842032789442,
+    86823.728777936354,
+    86846.617031419853,
+    86869.506793041175,
+    86892.398062601613,
+    86915.290839902518,
+    86938.185124745316,
+    86961.080916931489,
+    86983.978216262592,
+    87006.87702254027,
+    87029.777335566177,
+    87052.67915514209,
+    87075.582481069796,
+    87098.487313151185,
+    87121.39365118822,
+    87144.301494982894,
+    87167.210844337285,
+    87190.121699053532,
+    87213.034058933845,
+    87235.947923780506,
+    87258.863293395829,
+    87281.780167582241,
+    87304.698546142172,
+    87327.618428878181,
+    87350.539815592856,
+    87373.462706088845,
+    87396.387100168897,
+    87419.312997635774,
+    87442.240398292357,
+    87465.16930194154,
+    87488.099708386319,
+    87511.031617429733,
+    87533.965028874911,
+    87556.899942525008,
+    87579.836358183282,
+    87602.774275653021,
+    87625.713694737613,
+    87648.654615240492,
+    87671.597036965148,
+    87694.540959715145,
+    87717.486383294105,
+    87740.433307505737,
+    87763.381732153779,
+    87786.331657042057,
+    87809.283081974456,
+    87832.236006754916,
+    87855.190431187453,
+    87878.146355076155,
+    87901.103778225151,
+    87924.062700438633,
+    87947.023121520891,
+    87969.985041276246,
+    87992.948459509105,
+    88015.913376023906,
+    88038.879790625171,
+    88061.847703117513,
+    88084.817113305573,
+    88107.788020994049,
+    88130.760425987726,
+    88153.734328091465,
+    88176.709727110137,
+    88199.686622848749,
+    88222.665015112303,
+    88245.644903705906,
+    88268.626288434709,
+    88291.609169103947,
+    88314.593545518903,
+    88337.579417484914,
+    88360.566784807408,
+    88383.555647291854,
+    88406.546004743795,
+    88429.537856968818,
+    88452.531203772611,
+    88475.52604496089,
+    88498.522380339447,
+    88521.52020971413,
+    88544.519532890874,
+    88567.520349675644,
+    88590.522659874507,
+    88613.526463293543,
+    88636.531759738922,
+    88659.538549016899,
+    88682.546830933745,
+    88705.556605295846,
+    88728.567871909589,
+    88751.580630581491,
+    88774.594881118086,
+    88797.610623325963,
+    88820.62785701183,
+    88843.646581982393,
+    88866.666798044462,
+    88889.688505004888,
+    88912.711702670611,
+    88935.7363908486,
+    88958.762569345898,
+    88981.790237969632,
+    89004.81939652696,
+    89027.850044825114,
+    89050.882182671412,
+    89073.9158098732,
+    89096.950926237885,
+    89119.987531572973,
+    89143.025625686001,
+    89166.065208384563,
+    89189.106279476357,
+    89212.148838769106,
+    89235.192886070581,
+    89258.238421188667,
+    89281.285443931265,
+    89304.333954106376,
+    89327.383951522017,
+    89350.435435986306,
+    89373.488407307406,
+    89396.542865293537,
+    89419.598809753006,
+    89442.656240494165,
+    89465.715157325409,
+    89488.775560055219,
+    89511.837448492137,
+    89534.900822444746,
+    89557.965681721733,
+    89581.032026131812,
+    89604.099855483742,
+    89627.169169586399,
+    89650.239968248672,
+    89673.312251279538,
+    89696.386018488018,
+    89719.461269683205,
+    89742.53800467425,
+    89765.616223270365,
+    89788.69592528083,
+    89811.777110514988,
+    89834.859778782207,
+    89857.943929891975,
+    89881.029563653807,
+    89904.116679877261,
+    89927.205278372014,
+    89950.29535894774,
+    89973.386921414218,
+    89996.479965581268,
+    90019.574491258769,
+    90042.670498256688,
+    90065.767986385021,
+    90088.866955453836,
+    90111.967405273259,
+    90135.069335653476,
+    90158.172746404758,
+    90181.277637337407,
+    90204.384008261797,
+    90227.49185898836,
+    90250.601189327586,
+    90273.711999090039,
+    90296.824288086325,
+    90319.938056127125,
+    90343.053303023189,
+    90366.170028585286,
+    90389.288232624298,
+    90412.407914951138,
+    90435.529075376777,
+    90458.651713712257,
+    90481.775829768681,
+    90504.901423357209,
+    90528.028494289058,
+    90551.157042375504,
+    90574.287067427911,
+    90597.418569257643,
+    90620.551547676194,
+    90643.686002495073,
+    90666.821933525847,
+    90689.959340580186,
+    90713.098223469773,
+    90736.238582006365,
+    90759.380416001804,
+    90782.523725267951,
+    90805.668509616764,
+    90828.814768860233,
+    90851.962502810435,
+    90875.11171127946,
+    90898.262394079517,
+    90921.414551022855,
+    90944.568181921743,
+    90967.72328658856,
+    90990.879864835719,
+    91014.037916475718,
+    91037.19744132107,
+    91060.358439184391,
+    91083.520909878338,
+    91106.684853215629,
+    91129.850269009039,
+    91153.017157071401,
+    91176.185517215621,
+    91199.355349254649,
+    91222.526653001492,
+    91245.699428269247,
+    91268.873674871036,
+    91292.049392620058,
+    91315.226581329553,
+    91338.405240812834,
+    91361.585370883287,
+    91384.766971354344,
+    91407.950042039476,
+    91431.134582752245,
+    91454.320593306256,
+    91477.508073515171,
+    91500.697023192712,
+    91523.887442152685,
+    91547.07933020893,
+    91570.272687175326,
+    91593.467512865856,
+    91616.663807094534,
+    91639.861569675442,
+    91663.060800422725,
+    91686.261499150554,
+    91709.463665673218,
+    91732.66729980502,
+    91755.872401360321,
+    91779.078970153569,
+    91802.287005999257,
+    91825.49650871192,
+    91848.707478106167,
+    91871.91991399668,
+    91895.133816198169,
+    91918.349184525418,
+    91941.566018793281,
+    91964.784318816659,
+    91988.004084410495,
+    92011.22531538982,
+    92034.448011569708,
+    92057.672172765277,
+    92080.897798791746,
+    92104.124889464365,
+    92127.353444598411,
+    92150.58346400928,
+    92173.814947512379,
+    92197.04789492322,
+    92220.282306057314,
+    92243.518180730272,
+    92266.755518757753,
+    92289.994319955469,
+    92313.234584139194,
+    92336.476311124774,
+    92359.719500728082,
+    92382.964152765067,
+    92406.210267051734,
+    92429.457843404161,
+    92452.706881638471,
+    92475.957381570814,
+    92499.209343017443,
+    92522.462765794655,
+    92545.717649718805,
+    92568.973994606305,
+    92592.231800273614,
+    92615.491066537259,
+    92638.751793213814,
+    92662.01398011994,
+    92685.277627072326,
+    92708.54273388772,
+    92731.809300382942,
+    92755.077326374871,
+    92778.346811680414,
+    92801.617756116568,
+    92824.890159500384,
+    92848.164021648947,
+    92871.439342379424,
+    92894.716121509016,
+    92917.994358855023,
+    92941.274054234746,
+    92964.555207465572,
+    92987.837818364962,
+    93011.121886750407,
+    93034.407412439468,
+    93057.694395249753,
+    93080.982834998955,
+    93104.272731504767,
+    93127.564084584999,
+    93150.856894057491,
+    93174.15115974014,
+    93197.446881450916,
+    93220.744059007804,
+    93244.04269222889,
+    93267.342780932304,
+    93290.644324936235,
+    93313.947324058914,
+    93337.251778118633,
+    93360.557686933767,
+    93383.865050322696,
+    93407.173868103928,
+    93430.484140095941,
+    93453.795866117362,
+    93477.109045986799,
+    93500.423679522952,
+    93523.739766544561,
+    93547.057306870454,
+    93570.376300319491,
+    93593.696746710571,
+    93617.018645862699,
+    93640.341997594893,
+    93663.666801726242,
+    93686.993058075881,
+    93710.320766463032,
+    93733.64992670693,
+    93756.980538626914,
+    93780.312602042337,
+    93803.646116772637,
+    93826.981082637285,
+    93850.317499455836,
+    93873.655367047861,
+    93896.994685233032,
+    93920.335453831038,
+    93943.677672661666,
+    93967.021341544707,
+    93990.366460300051,
+    94013.713028747632,
+    94037.061046707429,
+    94060.410513999494,
+    94083.761430443905,
+    94107.113795860845,
+    94130.467610070496,
+    94153.822872893157,
+    94177.179584149111,
+    94200.537743658759,
+    94223.897351242529,
+    94247.25840672091,
+    94270.620909914433,
+    94293.98486064373,
+    94317.350258729421,
+    94340.71710399224,
+    94364.085396252936,
+    94387.455135332348,
+    94410.82632105134,
+    94434.198953230851,
+    94457.573031691878,
+    94480.948556255447,
+    94504.325526742658,
+    94527.70394297468,
+    94551.083804772716,
+    94574.465111958023,
+    94597.847864351934,
+    94621.232061775823,
+    94644.617704051096,
+    94668.004790999272,
+    94691.393322441872,
+    94714.783298200506,
+    94738.174718096794,
+    94761.567581952477,
+    94784.961889589307,
+    94808.357640829097,
+    94831.754835493703,
+    94855.153473405066,
+    94878.553554385173,
+    94901.955078256055,
+    94925.358044839784,
+    94948.762453958523,
+    94972.168305434476,
+    94995.575599089891,
+    95018.984334747074,
+    95042.394512228391,
+    95065.806131356265,
+    95089.219191953176,
+    95112.633693841635,
+    95136.04963684424,
+    95159.467020783617,
+    95182.885845482466,
+    95206.306110763529,
+    95229.727816449609,
+    95253.150962363579,
+    95276.575548328314,
+    95300.001574166803,
+    95323.429039702052,
+    95346.857944757154,
+    95370.288289155214,
+    95393.720072719429,
+    95417.153295273019,
+    95440.587956639298,
+    95464.024056641589,
+    95487.461595103305,
+    95510.900571847902,
+    95534.340986698866,
+    95557.782839479783,
+    95581.226130014256,
+    95604.670858125959,
+    95628.117023638595,
+    95651.564626375985,
+    95675.013666161918,
+    95698.464142820303,
+    95721.916056175076,
+    95745.369406050231,
+    95768.824192269807,
+    95792.280414657915,
+    95815.738073038709,
+    95839.197167236387,
+    95862.657697075221,
+    95886.11966237954,
+    95909.583062973688,
+    95933.047898682111,
+    95956.514169329268,
+    95979.981874739708,
+    96003.451014738006,
+    96026.921589148798,
+    96050.393597796792,
+    96073.867040506724,
+    96097.341917103375,
+    96120.818227411626,
+    96144.295971256375,
+    96167.775148462577,
+    96191.255758855244,
+    96214.737802259449,
+    96238.221278500292,
+    96261.70618740299,
+    96285.192528792715,
+    96308.680302494788,
+    96332.169508334526,
+    96355.660146137321,
+    96379.152215728609,
+    96402.645716933868,
+    96426.14064957868,
+    96449.637013488609,
+    96473.134808489311,
+    96496.63403440651,
+    96520.134691065963,
+    96543.636778293469,
+    96567.140295914898,
+    96590.645243756153,
+    96614.151621643221,
+    96637.659429402134,
+    96661.168666858954,
+    96684.679333839798,
+    96708.191430170875,
+    96731.70495567839,
+    96755.219910188665,
+    96778.736293528011,
+    96802.254105522836,
+    96825.77334599958,
+    96849.29401478474,
+    96872.816111704873,
+    96896.339636586577,
+    96919.864589256511,
+    96943.390969541389,
+    96966.918777267958,
+    96990.448012263048,
+    97013.978674353522,
+    97037.510763366285,
+    97061.044279128328,
+    97084.579221466673,
+    97108.115590208385,
+    97131.653385180587,
+    97155.19260621049,
+    97178.733253125291,
+    97202.2753257523,
+    97225.81882391886,
+    97249.363747452342,
+    97272.910096180189,
+    97296.457869929916,
+    97320.007068529041,
+    97343.557691805196,
+    97367.109739586012,
+    97390.663211699197,
+    97414.218107972498,
+    97437.774428233737,
+    97461.332172310766,
+    97484.891340031507,
+    97508.451931223899,
+    97532.013945715982,
+    97555.577383335811,
+    97579.142243911512,
+    97602.708527271257,
+    97626.276233243261,
+    97649.845361655811,
+    97673.415912337223,
+    97696.987885115886,
+    97720.561279820206,
+    97744.1360962787,
+    97767.712334319876,
+    97791.289993772341,
+    97814.869074464703,
+    97838.449576225685,
+    97862.031498883996,
+    97885.614842268449,
+    97909.199606207883,
+    97932.785790531183,
+    97956.37339506732,
+    97979.962419645264,
+    98003.552864094076,
+    98027.144728242856,
+    98050.738011920766,
+    98074.332714956996,
+    98097.928837180807,
+    98121.526378421506,
+    98145.125338508456,
+    98168.725717271067,
+    98192.327514538789,
+    98215.930730141132,
+    98239.535363907664,
+    98263.141415668011,
+    98286.748885251814,
+    98310.357772488816,
+    98333.968077208759,
+    98357.579799241488,
+    98381.192938416847,
+    98404.807494564782,
+    98428.42346751524,
+    98452.040857098269,
+    98475.659663143917,
+    98499.27988548232,
+    98522.901523943656,
+    98546.524578358163,
+    98570.149048556093,
+    98593.774934367786,
+    98617.402235623624,
+    98641.030952154048,
+    98664.661083789513,
+    98688.292630360564,
+    98711.925591697771,
+    98735.559967631794,
+    98759.195757993293,
+    98782.832962613014,
+    98806.471581321734,
+    98830.111613950285,
+    98853.753060329575,
+    98877.39592029051,
+    98901.040193664099,
+    98924.68588028138,
+    98948.33297997342,
+    98971.981492571387,
+    98995.63141790645,
+    99019.282755809851,
+    99042.935506112874,
+    99066.589668646877,
+    99090.245243243233,
+    99113.902229733401,
+    99137.560627948857,
+    99161.220437721131,
+    99184.881658881859,
+    99208.544291262631,
+    99232.208334695169,
+    99255.87378901121,
+    99279.540654042547,
+    99303.208929621018,
+    99326.878615578535,
+    99350.549711746993,
+    99374.222217958435,
+    99397.896134044888,
+    99421.571459838422,
+    99445.248195171211,
+    99468.926339875441,
+    99492.605893783344,
+    99516.286856727209,
+    99539.969228539398,
+    99563.653009052287,
+    99587.338198098325,
+    99611.024795510006,
+    99634.712801119866,
+    99658.402214760499,
+    99682.093036264545,
+    99705.785265464699,
+    99729.478902193689,
+    99753.173946284325,
+    99776.870397569437,
+    99800.56825588191,
+    99824.267521054688,
+    99847.968192920773,
+    99871.670271313182,
+    99895.373756065004,
+    99919.078647009388,
+    99942.78494397951,
+    99966.492646808634,
+    99990.20175533001,
+    100013.91226937699,
+    100037.62418878295,
+    100061.33751338134,
+    100085.05224300563,
+    100108.76837748935,
+    100132.4859166661,
+    100156.2048603695,
+    100179.92520843323,
+    100203.64696069101,
+    100227.37011697664,
+    100251.09467712394,
+    100274.82064096678,
+    100298.54800833909,
+    100322.27677907483,
+    100346.00695300807,
+    100369.73852997283,
+    100393.47150980328,
+    100417.20589233354,
+    100440.94167739789,
+    100464.67886483055,
+    100488.41745446586,
+    100512.1574461382,
+    100535.89883968196,
+    100559.64163493161,
+    100583.38583172169,
+    100607.13142988674,
+    100630.87842926137,
+    100654.62682968024,
+    100678.37663097809,
+    100702.12783298964,
+    100725.88043554971,
+    100749.63443849317,
+    100773.38984165489,
+    100797.14664486986,
+    100820.90484797307,
+    100844.66445079957,
+    100868.42545318443,
+    100892.18785496285,
+    100915.95165596998,
+    100939.71685604109,
+    100963.48345501146,
+    100987.25145271645,
+    101011.02084899142,
+    101034.79164367182,
+    101058.56383659317,
+    101082.33742759094,
+    101106.11241650078,
+    101129.88880315828,
+    101153.66658739912,
+    101177.44576905905,
+    101201.22634797383,
+    101225.00832397929,
+    101248.7916969113,
+    101272.57646660579,
+    101296.36263289873,
+    101320.15019562612,
+    101343.93915462404,
+    101367.7295097286,
+    101391.52126077596,
+    101415.31440760233,
+    101439.10895004397,
+    101462.9048879372,
+    101486.70222111834,
+    101510.50094942382,
+    101534.30107269008,
+    101558.10259075361,
+    101581.90550345098,
+    101605.70981061876,
+    101629.5155120936,
+    101653.32260771218,
+    101677.13109731126,
+    101700.9409807276,
+    101724.75225779804,
+    101748.56492835947,
+    101772.37899224881,
+    101796.19444930303,
+    101820.01129935916,
+    101843.82954225427,
+    101867.64917782549,
+    101891.47020590997,
+    101915.29262634492,
+    101939.11643896763,
+    101962.94164361537,
+    101986.76824012553,
+    102010.59622833549,
+    102034.42560808272,
+    102058.25637920471,
+    102082.08854153901,
+    102105.9220949232,
+    102129.75703919494,
+    102153.59337419191,
+    102177.43109975185,
+    102201.27021571253,
+    102225.1107219118,
+    102248.95261818753,
+    102272.79590437764,
+    102296.64058032009,
+    102320.48664585294,
+    102344.33410081422,
+    102368.18294504205,
+    102392.03317837461,
+    102415.88480065008,
+    102439.73781170673,
+    102463.59221138287,
+    102487.44799951684,
+    102511.30517594704,
+    102535.1637405119,
+    102559.02369304992,
+    102582.88503339965,
+    102606.74776139967,
+    102630.61187688859,
+    102654.4773797051,
+    102678.34426968795,
+    102702.21254667587,
+    102726.08221050771,
+    102749.95326102231,
+    102773.8256980586,
+    102797.69952145554,
+    102821.57473105213,
+    102845.45132668741,
+    102869.32930820051,
+    102893.20867543056,
+    102917.08942821674,
+    102940.97156639832,
+    102964.85508981455,
+    102988.73999830478,
+    103012.6262917084,
+    103036.51396986481,
+    103060.40303261351,
+    103084.293479794,
+    103108.18531124585,
+    103132.07852680866,
+    103155.97312632212,
+    103179.8691096259,
+    103203.76647655977,
+    103227.66522696352,
+    103251.56536067701,
+    103275.46687754011,
+    103299.36977739276,
+    103323.27406007495,
+    103347.1797254267,
+    103371.0867732881,
+    103394.99520349925,
+    103418.90501590034,
+    103442.81621033157,
+    103466.72878663319,
+    103490.64274464553,
+    103514.55808420894,
+    103538.4748051638,
+    103562.39290735057,
+    103586.31239060973,
+    103610.23325478184,
+    103634.15549970744,
+    103658.07912522719,
+    103682.00413118176,
+    103705.93051741188,
+    103729.85828375829,
+    103753.78743006183,
+    103777.71795616332,
+    103801.64986190372,
+    103825.58314712394,
+    103849.51781166498,
+    103873.4538553679,
+    103897.39127807376,
+    103921.33007962372,
+    103945.27025985894,
+    103969.21181862066,
+    103993.15475575015,
+    104017.0990710887,
+    104041.0447644777,
+    104064.99183575854,
+    104088.94028477269,
+    104112.89011136163,
+    104136.84131536692,
+    104160.79389663014,
+    104184.74785499295,
+    104208.70319029699,
+    104232.65990238401,
+    104256.61799109577,
+    104280.57745627411,
+    104304.53829776087,
+    104328.50051539797,
+    104352.46410902737,
+    104376.42907849104,
+    104400.39542363105,
+    104424.36314428948,
+    104448.33224030846,
+    104472.3027115302,
+    104496.27455779689,
+    104520.24777895081,
+    104544.22237483428,
+    104568.19834528965,
+    104592.17569015936,
+    104616.15440928582,
+    104640.13450251156,
+    104664.1159696791,
+    104688.09881063103,
+    104712.08302520998,
+    104736.06861325864,
+    104760.05557461972,
+    104784.043909136,
+    104808.03361665027,
+    104832.0246970054,
+    104856.01715004431,
+    104880.01097560991,
+    104904.00617354522,
+    104928.00274369326,
+    104952.00068589712,
+    104975.99999999993,
+    105000.00068584486,
+    105024.00274327511,
+    105048.00617213396,
+    105072.0109722647,
+    105096.0171435107,
+    105120.02468571534,
+    105144.03359872208,
+    105168.04388237436,
+    105192.05553651576,
+    105216.06856098982,
+    105240.08295564017,
+    105264.09872031047,
+    105288.11585484444,
+    105312.13435908582,
+    105336.1542328784,
+    105360.17547606604,
+    105384.19808849262,
+    105408.22207000206,
+    105432.24742043833,
+    105456.27413964548,
+    105480.30222746753,
+    105504.33168374863,
+    105528.36250833291,
+    105552.39470106458,
+    105576.42826178786,
+    105600.46319034706,
+    105624.49948658649,
+    105648.53715035053,
+    105672.5761814836,
+    105696.61657983017,
+    105720.65834523473,
+    105744.70147754184,
+    105768.7459765961,
+    105792.79184224214,
+    105816.83907432464,
+    105840.88767268835,
+    105864.93763717801,
+    105888.98896763846,
+    105913.04166391456,
+    105937.09572585119,
+    105961.15115329332,
+    105985.20794608595,
+    106009.26610407409,
+    106033.32562710284,
+    106057.38651501729,
+    106081.44876766266,
+    106105.51238488412,
+    106129.57736652695,
+    106153.64371243643,
+    106177.71142245791,
+    106201.78049643678,
+    106225.85093421848,
+    106249.92273564848,
+    106273.99590057228,
+    106298.07042883546,
+    106322.14632028362,
+    106346.22357476239,
+    106370.30219211751,
+    106394.38217219469,
+    106418.46351483969,
+    106442.54621989837,
+    106466.63028721658,
+    106490.71571664025,
+    106514.80250801529,
+    106538.89066118775,
+    106562.98017600364,
+    106587.07105230905,
+    106611.16328995011,
+    106635.25688877302,
+    106659.35184862395,
+    106683.44816934918,
+    106707.54585079502,
+    106731.64489280782,
+    106755.74529523395,
+    106779.84705791986,
+    106803.95018071201,
+    106828.05466345693,
+    106852.16050600118,
+    106876.26770819137,
+    106900.37626987413,
+    106924.48619089619,
+    106948.59747110425,
+    106972.71011034511,
+    106996.82410846559,
+    107020.93946531253,
+    107045.05618073288,
+    107069.17425457356,
+    107093.29368668159,
+    107117.41447690397,
+    107141.53662508781,
+    107165.66013108024,
+    107189.7849947284,
+    107213.91121587952,
+    107238.03879438085,
+    107262.16773007967,
+    107286.29802282334,
+    107310.42967245923,
+    107334.56267883476,
+    107358.69704179741,
+    107382.83276119467,
+    107406.96983687414,
+    107431.10826868335,
+    107455.24805646999,
+    107479.38920008171,
+    107503.53169936626,
+    107527.67555417139,
+    107551.82076434491,
+    107575.96732973469,
+    107600.11525018861,
+    107624.26452555459,
+    107648.41515568066,
+    107672.56714041479,
+    107696.72047960508,
+    107720.87517309963,
+    107745.03122074658,
+    107769.18862239413,
+    107793.34737789053,
+    107817.50748708403,
+    107841.66894982298,
+    107865.83176595572,
+    107889.99593533068,
+    107914.16145779629,
+    107938.32833320105,
+    107962.49656139348,
+    107986.66614222217,
+    108010.83707553572,
+    108035.00936118282,
+    108059.18299901215,
+    108083.35798887245,
+    108107.53433061253,
+    108131.71202408121,
+    108155.89106912735,
+    108180.07146559987,
+    108204.25321334775,
+    108228.43631221994,
+    108252.62076206553,
+    108276.80656273357,
+    108300.99371407321,
+    108325.18221593359,
+    108349.37206816394,
+    108373.56327061349,
+    108397.75582313156,
+    108421.94972556747,
+    108446.1449777706,
+    108470.34157959036,
+    108494.53953087622,
+    108518.73883147769,
+    108542.93948124432,
+    108567.14148002568,
+    108591.34482767139,
+    108615.54952403114,
+    108639.75556895464,
+    108663.96296229165,
+    108688.17170389196,
+    108712.38179360541,
+    108736.59323128188,
+    108760.80601677128,
+    108785.02014992358,
+    108809.23563058881,
+    108833.45245861699,
+    108857.67063385822,
+    108881.89015616261,
+    108906.11102538036,
+    108930.33324136167,
+    108954.55680395682,
+    108978.78171301607,
+    109003.00796838976,
+    109027.23556992831,
+    109051.46451748211,
+    109075.69481090162,
+    109099.92645003737,
+    109124.15943473989,
+    109148.39376485976,
+    109172.62944024763,
+    109196.86646075416,
+    109221.10482623006,
+    109245.34453652608,
+    109269.58559149304,
+    109293.82799098175,
+    109318.07173484311,
+    109342.31682292801,
+    109366.56325508743,
+    109390.81103117237,
+    109415.06015103387,
+    109439.31061452301,
+    109463.56242149093,
+    109487.8155717888,
+    109512.07006526781,
+    109536.3259017792,
+    109560.58308117429,
+    109584.8416033044,
+    109609.1014680209,
+    109633.36267517522,
+    109657.62522461878,
+    109681.88911620311,
+    109706.15434977971,
+    109730.4209252002,
+    109754.68884231619,
+    109778.95810097932,
+    109803.22870104131,
+    109827.50064235389,
+    109851.77392476884,
+    109876.04854813802,
+    109900.32451231324,
+    109924.60181714644,
+    109948.88046248957,
+    109973.1604481946,
+    109997.44177411357,
+    110021.72444009855,
+    110046.00844600165,
+    110070.29379167501,
+    110094.58047697082,
+    110118.86850174134,
+    110143.15786583882,
+    110167.44856911557,
+    110191.74061142397,
+    110216.03399261639,
+    110240.32871254528,
+    110264.62477106311,
+    110288.9221680224,
+    110313.22090327571,
+    110337.52097667565,
+    110361.82238807483,
+    110386.12513732594,
+    110410.42922428172,
+    110434.73464879491,
+    110459.04141071832,
+    110483.34950990479,
+    110507.6589462072,
+    110531.96971947847,
+    110556.28182957157,
+    110580.5952763395,
+    110604.91005963532,
+    110629.22617931209,
+    110653.54363522294,
+    110677.86242722106,
+    110702.18255515963,
+    110726.50401889188,
+    110750.82681827113,
+    110775.1509531507,
+    110799.47642338395,
+    110823.80322882428,
+    110848.13136932514,
+    110872.46084474004,
+    110896.79165492248,
+    110921.12379972603,
+    110945.4572790043,
+    110969.79209261097,
+    110994.12824039967,
+    111018.46572222417,
+    111042.80453793822,
+    111067.14468739564,
+    111091.48617045028,
+    111115.82898695602,
+    111140.1731367668,
+    111164.51861973655,
+    111188.86543571933,
+    111213.21358456917,
+    111237.56306614014,
+    111261.91388028639,
+    111286.26602686207,
+    111310.61950572141,
+    111334.97431671864,
+    111359.33045970804,
+    111383.68793454397,
+    111408.04674108078,
+    111432.40687917286,
+    111456.76834867468,
+    111481.13114944073,
+    111505.49528132551,
+    111529.86074418361,
+    111554.22753786964,
+    111578.59566223821,
+    111602.96511714405,
+    111627.33590244185,
+    111651.7080179864,
+    111676.08146363248,
+    111700.45623923496,
+    111724.8323446487,
+    111749.20977972864,
+    111773.58854432974,
+    111797.96863830699,
+    111822.35006151545,
+    111846.73281381019,
+    111871.11689504632,
+    111895.50230507903,
+    111919.8890437635,
+    111944.27711095495,
+    111968.6665065087,
+    111993.05723028004,
+    112017.44928212435,
+    112041.842661897,
+    112066.23736945343,
+    112090.63340464912,
+    112115.03076733962,
+    112139.42945738042,
+    112163.82947462716,
+    112188.23081893545,
+    112212.63349016097,
+    112237.03748815943,
+    112261.44281278658,
+    112285.84946389822,
+    112310.25744135017,
+    112334.66674499828,
+    112359.07737469849,
+    112383.48933030672,
+    112407.90261167898,
+    112432.31721867126,
+    112456.73315113965,
+    112481.15040894024,
+    112505.56899192919,
+    112529.98889996267,
+    112554.41013289688,
+    112578.8326905881,
+    112603.25657289263,
+    112627.68177966679,
+    112652.10831076698,
+    112676.53616604958,
+    112700.96534537108,
+    112725.39584858794,
+    112749.82767555672,
+    112774.26082613398,
+    112798.6953001763,
+    112823.13109754038,
+    112847.56821808286,
+    112872.00666166049,
+    112896.44642813003,
+    112920.88751734827,
+    112945.32992917208,
+    112969.77366345831,
+    112994.21872006389,
+    113018.66509884578,
+    113043.11279966099,
+    113067.56182236652,
+    113092.01216681948,
+    113116.46383287695,
+    113140.9168203961,
+    113165.37112923413,
+    113189.82675924824,
+    113214.28371029573,
+    113238.74198223387,
+    113263.20157492002,
+    113287.66248821157,
+    113312.12472196593,
+    113336.58827604055,
+    113361.05315029295,
+    113385.51934458067,
+    113409.98685876124,
+    113434.45569269233,
+    113458.92584623155,
+    113483.39731923661,
+    113507.87011156522,
+    113532.34422307517,
+    113556.81965362425,
+    113581.2964030703,
+    113605.77447127122,
+    113630.25385808491,
+    113654.73456336933,
+    113679.2165869825,
+    113703.69992878241,
+    113728.18458862718,
+    113752.67056637487,
+    113777.15786188368,
+    113801.64647501177,
+    113826.13640561736,
+    113850.62765355874,
+    113875.12021869418,
+    113899.61410088204,
+    113924.1092999807,
+    113948.60581584855,
+    113973.10364834407,
+    113997.60279732574,
+    114022.1032626521,
+    114046.60504418171,
+    114071.10814177318,
+    114095.61255528514,
+    114120.11828457628,
+    114144.62532950533,
+    114169.13368993104,
+    114193.6433657122,
+    114218.15435670764,
+    114242.66666277625,
+    114267.18028377694,
+    114291.69521956862,
+    114316.21147001031,
+    114340.72903496103,
+    114365.24791427983,
+    114389.7681078258,
+    114414.2896154581,
+    114438.81243703589,
+    114463.33657241837,
+    114487.8620214648,
+    114512.38878403447,
+    114536.91685998671,
+    114561.44624918087,
+    114585.97695147636,
+    114610.5089667326,
+    114635.04229480909,
+    114659.57693556532,
+    114684.11288886084,
+    114708.65015455526,
+    114733.18873250818,
+    114757.72862257928,
+    114782.26982462825,
+    114806.81233851484,
+    114831.35616409882,
+    114855.90130123998,
+    114880.44774979822,
+    114904.99550963337,
+    114929.5445806054,
+    114954.09496257425,
+    114978.64665539992,
+    115003.19965894247,
+    115027.75397306195,
+    115052.30959761847,
+    115076.86653247218,
+    115101.42477748329,
+    115125.984332512,
+    115150.54519741859,
+    115175.10737206334,
+    115199.67085630659,
+    115224.23565000873,
+    115248.80175303014,
+    115273.3691652313,
+    115297.93788647266,
+    115322.50791661476,
+    115347.07925551817,
+    115371.65190304347,
+    115396.22585905129,
+    115420.80112340231,
+    115445.37769595724,
+    115469.95557657682,
+    115494.53476512182,
+    115519.11526145306,
+    115543.69706543141,
+    115568.28017691776,
+    115592.86459577303,
+    115617.4503218582,
+    115642.03735503425,
+    115666.62569516223,
+    115691.21534210323,
+    115715.80629571836,
+    115740.39855586876,
+    115764.99212241563,
+    115789.58699522018,
+    115814.18317414368,
+    115838.78065904744,
+    115863.37944979276,
+    115887.97954624105,
+    115912.5809482537,
+    115937.18365569216,
+    115961.78766841792,
+    115986.39298629249,
+    116010.99960917742,
+    116035.60753693432,
+    116060.21676942479,
+    116084.82730651053,
+    116109.43914805322,
+    116134.0522939146,
+    116158.66674395646,
+    116183.2824980406,
+    116207.89955602887,
+    116232.51791778316,
+    116257.13758316539,
+    116281.75855203751,
+    116306.38082426153,
+    116331.00439969949,
+    116355.62927821343,
+    116380.25545966547,
+    116404.88294391775,
+    116429.51173083246,
+    116454.14182027178,
+    116478.77321209799,
+    116503.40590617337,
+    116528.03990236025,
+    116552.67520052097,
+    116577.31180051794,
+    116601.94970221359,
+    116626.5889054704,
+    116651.22941015086,
+    116675.87121611751,
+    116700.51432323294,
+    116725.15873135976,
+    116749.8044403606,
+    116774.45145009817,
+    116799.0997604352,
+    116823.74937123443,
+    116848.40028235866,
+    116873.05249367072,
+    116897.70600503348,
+    116922.36081630984,
+    116947.01692736275,
+    116971.67433805518,
+    116996.33304825013,
+    117020.99305781067,
+    117045.65436659988,
+    117070.31697448085,
+    117094.98088131678,
+    117119.64608697082,
+    117144.31259130624,
+    117168.98039418629,
+    117193.64949547425,
+    117218.31989503348,
+    117242.99159272734,
+    117267.66458841923,
+    117292.33888197262,
+    117317.01447325097,
+    117341.6913621178,
+    117366.36954843666,
+    117391.04903207115,
+    117415.72981288488,
+    117440.41189074152,
+    117465.09526550474,
+    117489.77993703831,
+    117514.46590520597,
+    117539.15316987153,
+    117563.84173089883,
+    117588.53158815173,
+    117613.22274149416,
+    117637.91519079007,
+    117662.60893590341,
+    117687.30397669821,
+    117712.00031303853,
+    117736.69794478847,
+    117761.39687181212,
+    117786.09709397367,
+    117810.7986111373,
+    117835.50142316725,
+    117860.20552992777,
+    117884.91093128319,
+    117909.6176270978,
+    117934.32561723603,
+    117959.03490156225,
+    117983.74547994092,
+    118008.45735223651,
+    118033.17051831353,
+    118057.88497803656,
+    118082.60073127014,
+    118107.31777787894,
+    118132.03611772758,
+    118156.75575068076,
+    118181.47667660323,
+    118206.19889535972,
+    118230.92240681504,
+    118255.64721083404,
+    118280.37330728157,
+    118305.10069602253,
+    118329.82937692189,
+    118354.55934984458,
+    118379.29061465565,
+    118404.02317122012,
+    118428.75701940308,
+    118453.49215906965,
+    118478.22859008498,
+    118502.96631231424,
+    118527.70532562268,
+    118552.44562987552,
+    118577.18722493808,
+    118601.93011067568,
+    118626.67428695368,
+    118651.41975363747,
+    118676.16651059251,
+    118700.91455768423,
+    118725.66389477813,
+    118750.41452173979,
+    118775.16643843475,
+    118799.91964472862,
+    118824.67414048707,
+    118849.42992557574,
+    118874.18699986035,
+    118898.94536320666,
+    118923.70501548045,
+    118948.46595654752,
+    118973.22818627374,
+    118997.99170452499,
+    119022.7565111672,
+    119047.52260606633,
+    119072.28998908834,
+    119097.0586600993,
+    119121.82861896523,
+    119146.59986555226,
+    119171.3723997265,
+    119196.14622135412,
+    119220.92133030134,
+    119245.69772643436,
+    119270.47540961947,
+    119295.25437972297,
+    119320.03463661121,
+    119344.81618015055,
+    119369.5990102074,
+    119394.38312664822,
+    119419.16852933947,
+    119443.95521814766,
+    119468.74319293935,
+    119493.53245358112,
+    119518.32299993958,
+    119543.11483188139,
+    119567.90794927324,
+    119592.70235198183,
+    119617.49803987393,
+    119642.29501281632,
+    119667.09327067583,
+    119691.89281331931,
+    119716.69364061367,
+    119741.49575242582,
+    119766.29914862274,
+    119791.10382907141,
+    119815.90979363887,
+    119840.71704219218,
+    119865.52557459843,
+    119890.33539072477,
+    119915.14649043836,
+    119939.95887360642,
+    119964.77254009615,
+    119989.58748977486,
+    120014.40372250983,
+    120039.22123816841,
+    120064.04003661797,
+    120088.86011772591,
+    120113.6814813597,
+    120138.5041273868,
+    120163.3280556747,
+    120188.15326609099,
+    120212.97975850321,
+    120237.807532779,
+    120262.63658878599,
+    120287.46692639188,
+    120312.29854546436,
+    120337.13144587121,
+    120361.9656274802,
+    120386.80109015915,
+    120411.63783377589,
+    120436.47585819835,
+    120461.31516329442,
+    120486.15574893207,
+    120510.99761497928,
+    120535.84076130406,
+    120560.68518777451,
+    120585.53089425867,
+    120610.3778806247,
+    120635.22614674074,
+    120660.07569247499,
+    120684.92651769568,
+    120709.77862227106,
+    120734.63200606944,
+    120759.48666895913,
+    120784.3426108085,
+    120809.19983148595,
+    120834.05833085992,
+    120858.91810879884,
+    120883.77916517125,
+    120908.64149984565,
+    120933.5051126906,
+    120958.37000357473,
+    120983.23617236665,
+    121008.10361893504,
+    121032.97234314861,
+    121057.84234487606,
+    121082.71362398617,
+    121107.58618034775,
+    121132.46001382964,
+    121157.33512430069,
+    121182.21151162982,
+    121207.08917568595,
+    121231.96811633807,
+    121256.84833345517,
+    121281.72982690629,
+    121306.61259656049,
+    121331.49664228689,
+    121356.38196395461,
+    121381.26856143285,
+    121406.15643459078,
+    121431.04558329767,
+    121455.93600742276,
+    121480.82770683538,
+    121505.72068140487,
+    121530.61493100057,
+    121555.51045549192,
+    121580.40725474835,
+    121605.30532863933,
+    121630.20467703436,
+    121655.10529980299,
+    121680.00719681478,
+    121704.91036793934,
+    121729.81481304632,
+    121754.72053200539,
+    121779.62752468624,
+    121804.53579095862,
+    121829.44533069231,
+    121854.3561437571,
+    121879.26823002285,
+    121904.1815893594,
+    121929.09622163669,
+    121954.01212672464,
+    121978.92930449323,
+    122003.84775481246,
+    122028.76747755238,
+    122053.68847258303,
+    122078.61073977455,
+    122103.53427899707,
+    122128.45909012076,
+    122153.38517301581,
+    122178.31252755247,
+    122203.24115360099,
+    122228.17105103172,
+    122253.10221971494,
+    122278.03465952107,
+    122302.96837032049,
+    122327.90335198362,
+    122352.83960438096,
+    122377.777127383,
+    122402.71592086025,
+    122427.65598468333,
+    122452.59731872278,
+    122477.53992284928,
+    122502.48379693348,
+    122527.42894084606,
+    122552.37535445779,
+    122577.32303763942,
+    122602.27199026172,
+    122627.22221219557,
+    122652.17370331181,
+    122677.12646348133,
+    122702.08049257506,
+    122727.03579046397,
+    122751.99235701906,
+    122776.95019211136,
+    122801.9092956119,
+    122826.8696673918,
+    122851.83130732219,
+    122876.79421527422,
+    122901.75839111909,
+    122926.72383472799,
+    122951.69054597223,
+    122976.65852472307,
+    123001.62777085182,
+    123026.59828422987,
+    123051.57006472857,
+    123076.54311221937,
+    123101.5174265737,
+    123126.49300766307,
+    123151.46985535898,
+    123176.44796953299,
+    123201.42735005668,
+    123226.40799680166,
+    123251.38990963959,
+    123276.37308844214,
+    123301.35753308103,
+    123326.343243428,
+    123351.33021935483,
+    123376.31846073334,
+    123401.30796743535,
+    123426.29873933276,
+    123451.29077629748,
+    123476.28407820144,
+    123501.2786449166,
+    123526.27447631498,
+    123551.27157226863,
+    123576.26993264959,
+    123601.26955732999,
+    123626.27044618195,
+    123651.27259907764,
+    123676.27601588926,
+    123701.28069648903,
+    123726.28664074924,
+    123751.29384854218,
+    123776.30231974016,
+    123801.31205421555,
+    123826.32305184075,
+    123851.33531248817,
+    123876.34883603029,
+    123901.36362233957,
+    123926.37967128855,
+    123951.39698274979,
+    123976.41555659588,
+    124001.43539269941,
+    124026.45649093305,
+    124051.47885116948,
+    124076.50247328142,
+    124101.5273571416,
+    124126.55350262282,
+    124151.58090959788,
+    124176.60957793961,
+    124201.63950752091,
+    124226.67069821467,
+    124251.70314989384,
+    124276.73686243138,
+    124301.7718357003,
+    124326.80806957364,
+    124351.84556392446,
+    124376.88431862585,
+    124401.92433355095,
+    124426.96560857294,
+    124452.00814356498,
+    124477.05193840031,
+    124502.0969929522,
+    124527.14330709392,
+    124552.19088069882,
+    124577.23971364023,
+    124602.28980579154,
+    124627.34115702618,
+    124652.3937672176,
+    124677.44763623926,
+    124702.50276396469,
+    124727.55915026742,
+    124752.61679502104,
+    124777.67569809916,
+    124802.73585937542,
+    124827.79727872348,
+    124852.85995601704,
+    124877.92389112986,
+    124902.98908393568,
+    124928.05553430831,
+    124953.1232421216,
+    124978.19220724938,
+    125003.26242956554,
+    125028.33390894404,
+    125053.40664525882,
+    125078.48063838384,
+    125103.55588819318,
+    125128.63239456083,
+    125153.71015736091,
+    125178.78917646752,
+    125203.86945175481,
+    125228.95098309696,
+    125254.03377036817,
+    125279.1178134427,
+    125304.20311219479,
+    125329.28966649878,
+    125354.37747622898,
+    125379.46654125977,
+    125404.55686146552,
+    125429.6484367207,
+    125454.74126689974,
+    125479.83535187715,
+    125504.93069152744,
+    125530.02728572517,
+    125555.12513434493,
+    125580.22423726133,
+    125605.32459434902,
+    125630.4262054827,
+    125655.52907053704,
+    125680.63318938682,
+    125705.73856190679,
+    125730.84518797178,
+    125755.9530674566,
+    125781.06220023613,
+    125806.17258618528,
+    125831.28422517896,
+    125856.39711709213,
+    125881.51126179981,
+    125906.62665917698,
+    125931.74330909875,
+    125956.86121144016,
+    125981.98036607634,
+    126007.10077288245,
+    126032.22243173365,
+    126057.34534250517,
+    126082.46950507225,
+    126107.59491931014,
+    126132.72158509417,
+    126157.84950229966,
+    126182.97867080198,
+    126208.10909047653,
+    126233.24076119871,
+    126258.37368284403,
+    126283.50785528794,
+    126308.64327840599,
+    126333.77995207369,
+    126358.91787616667,
+    126384.0570505605,
+    126409.19747513086,
+    126434.3391497534,
+    126459.48207430386,
+    126484.62624865794,
+    126509.77167269142,
+    126534.9183462801,
+    126560.06626929982,
+    126585.21544162642,
+    126610.36586313581,
+    126635.51753370393,
+    126660.67045320668,
+    126685.82462152008,
+    126710.98003852014,
+    126736.13670408291,
+    126761.29461808444,
+    126786.45378040087,
+    126811.61419090834,
+    126836.77584948298,
+    126861.93875600102,
+    126887.10291033868,
+    126912.26831237224,
+    126937.43496197795,
+    126962.60285903217,
+    126987.77200341123,
+    127012.94239499152,
+    127038.11403364947,
+    127063.2869192615,
+    127088.46105170409,
+    127113.63643085376,
+    127138.81305658702,
+    127163.99092878048,
+    127189.17004731069,
+    127214.35041205429,
+    127239.53202288797,
+    127264.71487968838,
+    127289.89898233226,
+    127315.08433069635,
+    127340.27092465744,
+    127365.45876409234,
+    127390.64784887788,
+    127415.83817889093,
+    127441.02975400841,
+    127466.22257410725,
+    127491.41663906439,
+    127516.61194875685,
+    127541.80850306165,
+    127567.00630185583,
+    127592.20534501647,
+    127617.4056324207,
+    127642.60716394568,
+    127667.80993946856,
+    127693.01395886653,
+    127718.21922201688,
+    127743.42572879682,
+    127768.63347908368,
+    127793.84247275478,
+    127819.05270968749,
+    127844.26418975917,
+    127869.47691284724,
+    127894.69087882918,
+    127919.90608758242,
+    127945.12253898452,
+    127970.34023291297,
+    127995.55916924537,
+    128020.77934785932,
+    128046.00076863244,
+    128071.22343144237,
+    128096.44733616684,
+    128121.67248268353,
+    128146.89887087021,
+    128172.12650060465,
+    128197.35537176467,
+    128222.5854842281,
+    128247.81683787282,
+    128273.04943257671,
+    128298.28326821771,
+    128323.51834467379,
+    128348.75466182294,
+    128373.99221954317,
+    128399.23101771252,
+    128424.47105620909,
+    128449.71233491098,
+    128474.95485369631,
+    128500.19861244329,
+    128525.44361103009,
+    128550.68984933494,
+    128575.93732723613,
+    128601.18604461191,
+    128626.43600134061,
+    128651.68719730059,
+    128676.93963237021,
+    128702.1933064279,
+    128727.44821935208,
+    128752.70437102125,
+    128777.96176131385,
+    128803.22039010846,
+    128828.48025728362,
+    128853.74136271792,
+    128879.00370628996,
+    128904.26728787841,
+    128929.53210736193,
+    128954.79816461923,
+    128980.06545952905,
+    129005.33399197015,
+    129030.60376182134,
+    129055.87476896142,
+    129081.14701326926,
+    129106.42049462376,
+    129131.6952129038,
+    129156.97116798835,
+    129182.24835975636,
+    129207.52678808685,
+    129232.80645285884,
+    129258.08735395141,
+    129283.36949124365,
+    129308.65286461466,
+    129333.9374739436,
+    129359.22331910966,
+    129384.51039999202,
+    129409.79871646997,
+    129435.08826842274,
+    129460.37905572963,
+    129485.67107826998,
+    129510.96433592314,
+    129536.25882856851,
+    129561.55455608548,
+    129586.85151835352,
+    129612.14971525209,
+    129637.4491466607,
+    129662.74981245887,
+    129688.0517125262,
+    129713.35484674224,
+    129738.65921498663,
+    129763.96481713903,
+    129789.27165307909,
+    129814.57972268655,
+    129839.88902584116,
+    129865.19956242264,
+    129890.51133231082,
+    129915.82433538554,
+    129941.13857152662,
+    129966.45404061397,
+    129991.7707425275,
+    130017.08867714716,
+    130042.4078443529,
+    130067.72824402474,
+    130093.04987604271,
+    130118.37274028687,
+    130143.69683663732,
+    130169.02216497416,
+    130194.34872517755,
+    130219.67651712766,
+    130245.0055407047,
+    130270.33579578891,
+    130295.66728226055,
+    130320.99999999991,
+    130346.33394888733,
+    130371.66912880314,
+    130397.00553962773,
+    130422.34318124152,
+    130447.68205352494,
+    130473.02215635845,
+    130498.36348962256,
+    130523.70605319779,
+    130549.0498469647,
+    130574.39487080388,
+    130599.74112459592,
+    130625.08860822149,
+    130650.43732156123,
+    130675.78726449587,
+    130701.13843690613,
+    130726.49083867275,
+    130751.84446967654,
+    130777.19932979831,
+    130802.5554189189,
+    130827.91273691918,
+    130853.27128368006,
+    130878.63105908247,
+    130903.99206300738,
+    130929.35429533575,
+    130954.71775594862,
+    130980.08244472703,
+    131005.44836155206,
+    131030.81550630482,
+    131056.18387886642,
+    131081.55347911804,
+    131106.92430694087,
+    131132.29636221612,
+    131157.66964482504,
+    131183.0441546489,
+    131208.41989156904,
+    131233.79685546676,
+    131259.17504622342,
+    131284.55446372041,
+    131309.93510783918,
+    131335.31697846117,
+    131360.70007546784,
+    131386.0843987407,
+    131411.46994816128,
+    131436.85672361116,
+    131462.24472497194,
+    131487.63395212521,
+    131513.02440495262,
+    131538.41608333588,
+    131563.80898715663,
+    131589.2031162967,
+    131614.59847063778,
+    131639.9950500617,
+    131665.39285445024,
+    131690.79188368531,
+    131716.19213764873,
+    131741.59361622241,
+    131766.99631928833,
+    131792.40024672839,
+    131817.80539842462,
+    131843.21177425905,
+    131868.61937411371,
+    131894.02819787065,
+    131919.43824541202,
+    131944.84951661993,
+    131970.26201137656,
+    131995.67572956407,
+    132021.09067106468,
+    132046.50683576067,
+    132071.9242235343,
+    132097.34283426782,
+    132122.76266784366,
+    132148.1837241441,
+    132173.60600305157,
+    132199.02950444847,
+    132224.45422821722,
+    132249.88017424036,
+    132275.30734240031,
+    132300.73573257966,
+    132326.16534466096,
+    132351.59617852676,
+    132377.02823405969,
+    132402.46151114244,
+    132427.89600965759,
+    132453.33172948789,
+    132478.76867051609,
+    132504.20683262491,
+    132529.64621569714,
+    132555.08681961559,
+    132580.5286442631,
+    132605.97168952253,
+    132631.41595527678,
+    132656.86144140881,
+    132682.30814780149,
+    132707.75607433787,
+    132733.20522090094,
+    132758.65558737374,
+    132784.10717363929,
+    132809.55997958075,
+    132835.01400508118,
+    132860.46925002377,
+    132885.92571429166,
+    132911.38339776811,
+    132936.84230033628,
+    132962.30242187946,
+    132987.76376228096,
+    133013.22632142407,
+    133038.69009919214,
+    133064.15509546854,
+    133089.62131013666,
+    133115.08874307995,
+    133140.55739418184,
+    133166.02726332581,
+    133191.49835039541,
+    133216.97065527414,
+    133242.44417784561,
+    133267.91891799335,
+    133293.39487560102,
+    133318.87205055228,
+    133344.35044273079,
+    133369.83005202023,
+    133395.31087830439,
+    133420.79292146701,
+    133446.27618139185,
+    133471.76065796276,
+    133497.24635106357,
+    133522.73326057816,
+    133548.22138639039,
+    133573.71072838426,
+    133599.20128644365,
+    133624.69306045261,
+    133650.1860502951,
+    133675.68025585517,
+    133701.1756770169,
+    133726.67231366437,
+    133752.17016568172,
+    133777.66923295305,
+    133803.16951536259,
+    133828.67101279454,
+    133854.17372513309,
+    133879.67765226253,
+    133905.18279406714,
+    133930.68915043125,
+    133956.19672123916,
+    133981.70550637526,
+    134007.21550572399,
+    134032.7267191697,
+    134058.23914659687,
+    134083.75278789,
+    134109.26764293358,
+    134134.78371161217,
+    134160.30099381026,
+    134185.8194894125,
+    134211.33919830353,
+    134236.8601203679,
+    134262.38225549037,
+    134287.90560355558,
+    134313.43016444831,
+    134338.95593805326,
+    134364.48292425525,
+    134390.01112293909,
+    134415.54053398955,
+    134441.07115729159,
+    134466.60299273001,
+    134492.1360401898,
+    134517.67029955584,
+    134543.20577071316,
+    134568.74245354676,
+    134594.28034794159,
+    134619.81945378278,
+    134645.35977095537,
+    134670.90129934452,
+    134696.4440388353,
+    134721.98798931291,
+    134747.53315066252,
+    134773.07952276937,
+    134798.62710551871,
+    134824.17589879577,
+    134849.72590248589,
+    134875.27711647438,
+    134900.82954064661,
+    134926.38317488792,
+    134951.93801908373,
+    134977.49407311951,
+    135003.05133688069,
+    135028.60981025276,
+    135054.16949312127,
+    135079.73038537172,
+    135105.29248688967,
+    135130.85579756077,
+    135156.42031727062,
+    135181.98604590484,
+    135207.55298334916,
+    135233.12112948924,
+    135258.69048421088,
+    135284.26104739975,
+    135309.83281894168,
+    135335.4057987225,
+    135360.97998662802,
+    135386.55538254412,
+    135412.13198635669,
+    135437.70979795168,
+    135463.28881721498,
+    135488.86904403262,
+    135514.45047829056,
+    135540.03311987486,
+    135565.61696867159,
+    135591.20202456677,
+    135616.78828744654,
+    135642.37575719706,
+    135667.96443370447,
+    135693.55431685498,
+    135719.14540653475,
+    135744.73770263011,
+    135770.33120502727,
+    135795.92591361253,
+    135821.52182827223,
+    135847.11894889272,
+    135872.7172753604,
+    135898.31680756161,
+    135923.91754538284,
+    135949.51948871053,
+    135975.12263743114,
+    136000.72699143123,
+    136026.33255059729,
+    136051.93931481591,
+    136077.54728397369,
+    136103.15645795723,
+    136128.76683665317,
+    136154.37841994822,
+    136179.99120772901,
+    136205.60519988232,
+    136231.2203962949,
+    136256.83679685349,
+    136282.45440144493,
+    136308.07320995603,
+    136333.69322227367,
+    136359.31443828469,
+    136384.93685787608,
+    136410.56048093468,
+    136436.18530734754,
+    136461.81133700156,
+    136487.43856978384,
+    136513.06700558143,
+    136538.6966442813,
+    136564.32748577066,
+    136589.95952993655,
+    136615.59277666616,
+    136641.22722584667,
+    136666.86287736523,
+    136692.49973110916,
+    136718.13778696564,
+    136743.77704482197,
+    136769.41750456547,
+    136795.05916608346,
+    136820.70202926331,
+    136846.34609399244,
+    136871.99136015819,
+    136897.63782764805,
+    136923.28549634948,
+    136948.93436614997,
+    136974.58443693706,
+    137000.23570859825,
+    137025.88818102115,
+    137051.54185409332,
+    137077.19672770242,
+    137102.85280173609,
+    137128.51007608202,
+    137154.16855062786,
+    137179.82822526142,
+    137205.48909987041,
+    137231.15117434258,
+    137256.8144485658,
+    137282.47892242789,
+    137308.14459581667,
+    137333.81146862009,
+    137359.47954072602,
+    137385.14881202241,
+    137410.81928239719,
+    137436.49095173844,
+    137462.16381993407,
+    137487.83788687221,
+    137513.51315244089,
+    137539.18961652822,
+    137564.86727902229,
+    137590.54613981131,
+    137616.22619878338,
+    137641.90745582676,
+    137667.58991082967,
+    137693.27356368033,
+    137718.95841426702,
+    137744.64446247809,
+    137770.33170820182,
+    137796.02015132661,
+    137821.70979174081,
+    137847.40062933284,
+    137873.09266399115,
+    137898.78589560417,
+    137924.48032406042,
+    137950.17594924837,
+    137975.8727710566,
+    138001.57078937365,
+    138027.27000408815,
+    138052.97041508864,
+    138078.67202226384,
+    138104.3748255024,
+    138130.07882469296,
+    138155.78401972432,
+    138181.49041048516,
+    138207.1979968643,
+    138232.9067787505,
+    138258.61675603263,
+    138284.32792859949,
+    138310.04029633995,
+    138335.75385914298,
+    138361.46861689744,
+    138387.18456949232,
+    138412.90171681659,
+    138438.62005875923,
+    138464.33959520931,
+    138490.06032605586,
+    138515.78225118798,
+    138541.50537049473,
+    138567.2296838653,
+    138592.95519118884,
+    138618.68189235451,
+    138644.40978725153,
+    138670.13887576913,
+    138695.86915779658,
+    138721.60063322316,
+    138747.33330193823,
+    138773.06716383106,
+    138798.80221879104,
+    138824.53846670757,
+    138850.27590747006,
+    138876.01454096794,
+    138901.7543670907,
+    138927.49538572782,
+    138953.2375967688,
+    138978.9810001032,
+    139004.72559562061,
+    139030.47138321059,
+    139056.2183627628,
+    139081.96653416683,
+    139107.71589731239,
+    139133.46645208917,
+    139159.21819838689,
+    139184.97113609532,
+    139210.72526510421,
+    139236.48058530336,
+    139262.23709658257,
+    139287.99479883176,
+    139313.75369194071,
+    139339.51377579942,
+    139365.27505029776,
+    139391.03751532568,
+    139416.80117077316,
+    139442.56601653024,
+    139468.33205248689,
+    139494.09927853322,
+    139519.86769455927,
+    139545.63730045516,
+    139571.408096111,
+    139597.18008141697,
+    139622.95325626322,
+    139648.72762054001,
+    139674.5031741375,
+    139700.27991694602,
+    139726.05784885579,
+    139751.83696975713,
+    139777.61727954043,
+    139803.39877809596,
+    139829.18146531415,
+    139854.96534108539,
+    139880.75040530015,
+    139906.53665784886,
+    139932.32409862199,
+    139958.11272751007,
+    139983.90254440365,
+    140009.69354919327,
+    140035.48574176949,
+    140061.27912202294,
+    140087.07368984428,
+    140112.86944512415,
+    140138.66638775321,
+    140164.4645176222,
+    140190.26383462184,
+    140216.06433864293,
+    140241.86602957622,
+    140267.66890731253,
+    140293.47297174268,
+    140319.27822275754,
+    140345.08466024802,
+    140370.89228410498,
+    140396.70109421943,
+    140422.51109048226,
+    140448.32227278448,
+    140474.13464101712,
+    140499.94819507122,
+    140525.76293483781,
+    140551.57886020801,
+    140577.3959710729,
+    140603.21426732364,
+    140629.03374885136,
+    140654.85441554731,
+    140680.67626730262,
+    140706.49930400858,
+    140732.32352555645,
+    140758.1489318375,
+    140783.97552274304,
+    140809.80329816442,
+    140835.63225799298,
+    140861.46240212015,
+    140887.29373043729,
+    140913.12624283586,
+    140938.95993920733,
+    140964.79481944317,
+    140990.63088343487,
+    141016.46813107401,
+    141042.30656225214,
+    141068.14617686081,
+    141093.98697479168,
+    141119.82895593636,
+    141145.6721201865,
+    141171.51646743377,
+    141197.36199756994,
+    141223.20871048668,
+    141249.05660607578,
+    141274.90568422904,
+    141300.75594483822,
+    141326.6073877952,
+    141352.4600129918,
+    141378.31382031992,
+    141404.16880967148,
+    141430.02498093838,
+    141455.8823340126,
+    141481.74086878612,
+    141507.60058515094,
+    141533.46148299909,
+    141559.32356222265,
+    141585.18682271364,
+    141611.05126436421,
+    141636.9168870665,
+    141662.78369071262,
+    141688.65167519479,
+    141714.5208404052,
+    141740.39118623605,
+    141766.26271257963,
+    141792.1354193282,
+    141818.00930637406,
+    141843.88437360956,
+    141869.760620927,
+    141895.6380482188,
+    141921.51665537735,
+    141947.39644229505,
+    141973.27740886438,
+    141999.15955497778,
+    142025.04288052776,
+    142050.92738540689,
+    142076.81306950765,
+    142102.69993272264,
+    142128.58797494444,
+    142154.47719606571,
+    142180.36759597904,
+    142206.25917457714,
+    142232.15193175265,
+    142258.04586739838,
+    142283.94098140698,
+    142309.83727367126,
+    142335.73474408401,
+    142361.63339253806,
+    142387.5332189262,
+    142413.43422314132,
+    142439.33640507635,
+    142465.23976462413,
+    142491.14430167765,
+    142517.05001612983,
+    142542.95690787368,
+    142568.86497680223,
+    142594.77422280848,
+    142620.68464578551,
+    142646.5962456264,
+    142672.50902222423,
+    142698.42297547215,
+    142724.33810526333,
+    142750.25441149093,
+    142776.17189404817,
+    142802.09055282827,
+    142828.01038772447,
+    142853.93139863008,
+    142879.85358543837,
+    142905.77694804268,
+    142931.70148633636,
+    142957.62720021277,
+    142983.55408956532,
+    143009.48215428743,
+    143035.41139427255,
+    143061.34180941415,
+    143087.27339960571,
+    143113.20616474075,
+    143139.14010471283,
+    143165.07521941551,
+    143191.01150874238,
+    143216.94897258704,
+    143242.88761084314,
+    143268.82742340435,
+    143294.76841016437,
+    143320.71057101688,
+    143346.65390585564,
+    143372.59841457437,
+    143398.54409706692,
+    143424.49095322701,
+    143450.43898294857,
+    143476.38818612538,
+    143502.33856265133,
+    143528.29011242036,
+    143554.24283532638,
+    143580.19673126334,
+    143606.1518001252,
+    143632.10804180597,
+    143658.06545619969,
+    143684.02404320039,
+    143709.98380270213,
+    143735.944734599,
+    143761.90683878519,
+    143787.87011515474,
+    143813.83456360188,
+    143839.8001840208,
+    143865.76697630569,
+    143891.73494035081,
+    143917.7040760504,
+    143943.67438329876,
+    143969.6458619902,
+    143995.61851201905,
+    144021.59233327967,
+    144047.56732566646,
+    144073.54348907378,
+    144099.52082339607,
+    144125.49932852783,
+    144151.4790043635,
+    144177.45985079758,
+    144203.44186772458,
+    144229.42505503909,
+    144255.40941263564,
+    144281.39494040885,
+    144307.38163825331,
+    144333.36950606373,
+    144359.35854373468,
+    144385.34875116093,
+    144411.34012823718,
+    144437.33267485813,
+    144463.32639091855,
+    144489.32127631325,
+    144515.31733093705,
+    144541.31455468474,
+    144567.3129474512,
+    144593.3125091313,
+    144619.31323961995,
+    144645.31513881206,
+    144671.31820660262,
+    144697.32244288657,
+    144723.32784755889,
+    144749.33442051467,
+    144775.34216164888,
+    144801.35107085665,
+    144827.36114803303,
+    144853.37239307314,
+    144879.38480587213,
+    144905.39838632516,
+    144931.41313432742,
+    144957.4290497741,
+    144983.44613256046,
+    145009.46438258173,
+    145035.48379973322,
+    145061.50438391021,
+    145087.52613500805,
+    145113.54905292206,
+    145139.57313754765,
+    145165.59838878017,
+    145191.62480651509,
+    145217.65239064783,
+    145243.68114107384,
+    145269.71105768863,
+    145295.74214038774,
+    145321.77438906668,
+    145347.80780362099,
+    145373.84238394629,
+    145399.87812993818,
+    145425.91504149229,
+    145451.95311850426,
+    145477.9923608698,
+    145504.03276848458,
+    145530.07434124436,
+    145556.11707904484,
+    145582.16098178181,
+    145608.20604935108,
+    145634.25228164849,
+    145660.29967856981,
+    145686.34824001096,
+    145712.39796586783,
+    145738.4488560363,
+    145764.50091041232,
+    145790.55412889185,
+    145816.60851137087,
+    145842.66405774537,
+    145868.72076791141,
+    145894.77864176501,
+    145920.83767920226,
+    145946.89788011924,
+    145972.95924441208,
+    145999.02177197693,
+    146025.08546270995,
+    146051.15031650732,
+    146077.21633326527,
+    146103.28351288004,
+    146129.35185524789,
+    146155.42136026506,
+    146181.49202782792,
+    146207.56385783272,
+    146233.63685017588,
+    146259.71100475377,
+    146285.78632146274,
+    146311.86280019928,
+    146337.94044085976,
+    146364.01924334071,
+    146390.09920753856,
+    146416.18033334985,
+    146442.26262067116,
+    146468.34606939898,
+    146494.43067942993,
+    146520.51645066062,
+    146546.60338298764,
+    146572.69147630769,
+    146598.78073051744,
+    146624.87114551352,
+    146650.96272119274,
+    146677.05545745179,
+    146703.14935418745,
+    146729.2444112965,
+    146755.34062867577,
+    146781.43800622207,
+    146807.53654383228,
+    146833.63624140329,
+    146859.73709883197,
+    146885.83911601527,
+    146911.94229285014,
+    146938.04662923355,
+    146964.15212506248,
+    146990.25878023397,
+    147016.36659464505,
+    147042.47556819281,
+    147068.58570077427,
+    147094.6969922866,
+    147120.80944262692,
+    147146.92305169237,
+    147173.03781938017,
+    147199.15374558745,
+    147225.27083021149,
+    147251.38907314953,
+    147277.50847429881,
+    147303.62903355664,
+    147329.75075082036,
+    147355.87362598727,
+    147381.99765895473,
+    147408.12284962015,
+    147434.24919788091,
+    147460.37670363448,
+    147486.50536677826,
+    147512.63518720976,
+    147538.76616482646,
+    147564.89829952587,
+    147591.03159120557,
+    147617.16603976308,
+    147643.30164509601,
+    147669.43840710199,
+    147695.57632567859,
+    147721.71540072354,
+    147747.85563213445,
+    147773.99701980909,
+    147800.13956364512,
+    147826.28326354033,
+    147852.42811939248,
+    147878.57413109933,
+    147904.72129855872,
+    147930.86962166851,
+    147957.01910032652,
+    147983.16973443062,
+    148009.32152387875,
+    148035.47446856883,
+    148061.62856839882,
+    148087.78382326665,
+    148113.94023307035,
+    148140.09779770792,
+    148166.25651707739,
+    148192.41639107687,
+    148218.57741960438,
+    148244.73960255808,
+    148270.90293983606,
+    148297.0674313365,
+    148323.23307695755,
+    148349.39987659742,
+    148375.56783015432,
+    148401.73693752653,
+    148427.90719861226,
+    148454.07861330983,
+    148480.25118151752,
+    148506.42490313368,
+    148532.59977805667,
+    148558.77580618486,
+    148584.95298741665,
+    148611.13132165043,
+    148637.31080878471,
+    148663.49144871789,
+    148689.6732413485,
+    148715.85618657502,
+    148742.040284296,
+    148768.22553440998,
+    148794.41193681557,
+    148820.59949141133,
+    148846.78819809589,
+    148872.97805676793,
+    148899.16906732606,
+    148925.36122966901,
+    148951.55454369547,
+    148977.74900930419,
+    149003.9446263939,
+    149030.1413948634,
+    149056.33931461151,
+    149082.53838553699,
+    149108.73860753875,
+    149134.9399805156,
+    149161.14250436646,
+    149187.34617899026,
+    149213.5510042859,
+    149239.75698015234,
+    149265.96410648854,
+    149292.17238319354,
+    149318.38181016635,
+    149344.59238730598,
+    149370.80411451156,
+    149397.01699168212,
+    149423.23101871679,
+    149449.44619551473,
+    149475.66252197503,
+    149501.87999799693,
+    149528.0986234796,
+    149554.31839832227,
+    149580.53932242419,
+    149606.76139568459,
+    149632.98461800278,
+    149659.20898927809,
+    149685.43450940982,
+    149711.66117829733,
+    149737.88899584001,
+    149764.11796193724,
+    149790.34807648844,
+    149816.57933939309,
+    149842.81175055061,
+    149869.04530986046,
+    149895.28001722222,
+    149921.51587253538,
+    149947.75287569952,
+    149973.99102661415,
+    150000.23032517891,
+    150026.47077129342,
+    150052.71236485732,
+    150078.95510577026,
+    150105.1989939319,
+    150131.444029242,
+    150157.69021160025,
+    150183.93754090639,
+    150210.18601706024,
+    150236.43563996154,
+    150262.68640951012,
+    150288.93832560582,
+    150315.19138814852,
+    150341.44559703805,
+    150367.70095217437,
+    150393.95745345735,
+    150420.21510078697,
+    150446.47389406321,
+    150472.73383318601,
+    150498.99491805542,
+    150525.25714857146,
+    150551.52052463419,
+    150577.78504614369,
+    150604.05071300003,
+    150630.31752510337,
+    150656.58548235384,
+    150682.85458465159,
+    150709.1248318968,
+    150735.39622398972,
+    150761.66876083051,
+    150787.9424423195,
+    150814.21726835691,
+    150840.49323884305,
+    150866.77035367821,
+    150893.04861276277,
+    150919.32801599705,
+    150945.60856328148,
+    150971.89025451642,
+    150998.17308960229,
+    151024.45706843957,
+    151050.74219092872,
+    151077.02845697021,
+    151103.31586646455,
+    151129.60441931229,
+    151155.894115414,
+    151182.1849546702,
+    151208.47693698155,
+    151234.77006224863,
+    151261.06433037209,
+    151287.35974125259,
+    151313.65629479082,
+    151339.95399088747,
+    151366.25282944329,
+    151392.55281035902,
+    151418.85393353543,
+    151445.1561988733,
+    151471.45960627345,
+    151497.76415563675,
+    151524.06984686397,
+    151550.37667985607,
+    151576.68465451393,
+    151602.99377073845,
+    151629.30402843058,
+    151655.61542749128,
+    151681.92796782157,
+    151708.24164932242,
+    151734.55647189484,
+    151760.87243543993,
+    151787.18953985872,
+    151813.50778505235,
+    151839.82717092187,
+    151866.14769736846,
+    151892.46936429327,
+    151918.79217159748,
+    151945.11611918229,
+    151971.44120694889,
+    151997.76743479856,
+    152024.09480263255,
+    152050.42331035214,
+    152076.75295785864,
+    152103.08374505339,
+    152129.41567183775,
+    152155.74873811303,
+    152182.08294378067,
+    152208.41828874208,
+    152234.75477289871,
+    152261.09239615197,
+    152287.43115840337,
+    152313.77105955439,
+    152340.11209950657,
+    152366.45427816146,
+    152392.79759542056,
+    152419.14205118554,
+    152445.48764535793,
+    152471.8343778394,
+    152498.18224853161,
+    152524.53125733617,
+    152550.88140415482,
+    152577.23268888926,
+    152603.58511144121,
+    152629.93867171241,
+    152656.29336960468,
+    152682.64920501978,
+    152709.00617785956,
+    152735.36428802583,
+    152761.72353542043,
+    152788.08391994529,
+    152814.44544150229,
+    152840.80809999333,
+    152867.17189532038,
+    152893.53682738543,
+    152919.90289609041,
+    152946.27010133737,
+    152972.63844302832,
+    152999.00792106529,
+    153025.37853535041,
+    153051.7502857857,
+    153078.12317227334,
+    153104.4971947154,
+    153130.8723530141,
+    153157.24864707157,
+    153183.62607679001,
+    153210.00464207167,
+    153236.38434281875,
+    153262.76517893354,
+    153289.14715031831,
+    153315.53025687535,
+    153341.91449850702,
+    153368.2998751156,
+    153394.68638660354,
+    153421.07403287315,
+    153447.46281382689,
+    153473.85272936718,
+    153500.24377939643,
+    153526.63596381716,
+    153553.02928253182,
+    153579.42373544298,
+    153605.81932245308,
+    153632.21604346478,
+    153658.61389838057,
+    153685.0128871031,
+    153711.41300953497,
+    153737.81426557881,
+    153764.21665513728,
+    153790.62017811305,
+    153817.02483440886,
+    153843.43062392739,
+    153869.83754657139,
+    153896.24560224367,
+    153922.65479084692,
+    153949.06511228404,
+    153975.4765664578,
+    154001.88915327107,
+    154028.30287262669,
+    154054.71772442761,
+    154081.13370857667,
+    154107.55082497682,
+    154133.96907353101,
+    154160.38845414223,
+    154186.80896671346,
+    154213.23061114774,
+    154239.65338734805,
+    154266.07729521746,
+    154292.50233465908,
+    154318.92850557598,
+    154345.35580787127,
+    154371.7842414481,
+    154398.21380620965,
+    154424.64450205903,
+    154451.07632889951,
+    154477.50928663427,
+    154503.94337516659,
+    154530.37859439969,
+    154556.81494423689,
+    154583.25242458144,
+    154609.69103533673,
+    154636.13077640603,
+    154662.57164769279,
+    154689.01364910032,
+    154715.45678053208,
+    154741.90104189145,
+    154768.34643308193,
+    154794.79295400696,
+    154821.24060457002,
+    154847.68938467462,
+    154874.13929422433,
+    154900.59033312264,
+    154927.04250127316,
+    154953.49579857948,
+    154979.95022494521,
+    155006.40578027396,
+    155032.86246446942,
+    155059.32027743524,
+    155085.77921907514,
+    155112.2392892928,
+    155138.70048799197,
+    155165.16281507642,
+    155191.62627044989,
+    155218.09085401625,
+    155244.55656567923,
+    155271.02340534274,
+    155297.49137291059,
+    155323.96046828668,
+    155350.4306913749,
+    155376.90204207919,
+    155403.37452030348,
+    155429.84812595171,
+    155456.32285892789,
+    155482.79871913602,
+    155509.27570648011,
+    155535.75382086422,
+    155562.23306219239,
+    155588.71343036872,
+    155615.19492529731,
+    155641.67754688227,
+    155668.16129502779,
+    155694.64616963797,
+    155721.13217061706,
+    155747.61929786921,
+    155774.10755129869,
+    155800.59693080973,
+    155827.08743630661,
+    155853.57906769359,
+    155880.07182487496,
+    155906.56570775513,
+    155933.06071623837,
+    155959.55685022907,
+    155986.05410963166,
+    156012.5524943505,
+    156039.05200429002,
+    156065.55263935472,
+    156092.054399449,
+    156118.5572844774,
+    156145.06129434443,
+    156171.5664289546,
+    156198.07268821247,
+    156224.5800720226,
+    156251.08858028959,
+    156277.59821291809,
+    156304.10896981266,
+    156330.62085087801,
+    156357.1338560188,
+    156383.64798513969,
+    156410.16323814544,
+    156436.67961494075,
+    156463.1971154304,
+    156489.71573951913,
+    156516.23548711176,
+    156542.75635811311,
+    156569.27835242799,
+    156595.80146996127,
+    156622.32571061782,
+    156648.85107430254,
+    156675.37756092031,
+    156701.90517037612,
+    156728.43390257491,
+    156754.96375742162,
+    156781.49473482129,
+    156808.02683467892,
+    156834.5600568995,
+    156861.09440138817,
+    156887.62986804993,
+    156914.16645678994,
+    156940.70416751326,
+    156967.24300012505,
+    156993.78295453047,
+    157020.32403063469,
+    157046.8662283429,
+    157073.40954756032,
+    157099.9539881922,
+    157126.49955014378,
+    157153.04623332032,
+    157179.59403762716,
+    157206.14296296958,
+    157232.69300925292,
+    157259.24417638258,
+    157285.79646426387,
+    157312.34987280221,
+    157338.90440190304,
+    157365.46005147175,
+    157392.01682141385,
+    157418.57471163478,
+    157445.13372204005,
+    157471.69385253513,
+    157498.25510302564,
+    157524.81747341706,
+    157551.38096361503,
+    157577.9455735251,
+    157604.51130305286,
+    157631.07815210402,
+    157657.64612058419,
+    157684.21520839902,
+    157710.78541545427,
+    157737.35674165559,
+    157763.92918690876,
+    157790.50275111952,
+    157817.07743419363,
+    157843.65323603692,
+    157870.23015655516,
+    157896.80819565422,
+    157923.3873532399,
+    157949.96762921812,
+    157976.54902349479,
+    158003.13153597576,
+    158029.71516656701,
+    158056.29991517449,
+    158082.88578170416,
+    158109.47276606198,
+    158136.06086815402,
+    158162.65008788629,
+    158189.24042516484,
+    158215.83187989573,
+    158242.42445198505,
+    158269.01814133892,
+    158295.61294786347,
+    158322.20887146486,
+    158348.80591204923,
+    158375.4040695228,
+    158402.00334379176,
+    158428.60373476235,
+    158455.2052423408,
+    158481.80786643337,
+    158508.41160694641,
+    158535.01646378616,
+    158561.62243685898,
+    158588.2295260712,
+    158614.8377313292,
+    158641.44705253936,
+    158668.05748960807,
+    158694.66904244179,
+    158721.28171094693,
+    158747.89549502998,
+    158774.5103945974,
+    158801.12640955573,
+    158827.74353981143,
+    158854.36178527112,
+    158880.9811458413,
+    158907.60162142856,
+    158934.22321193956,
+    158960.84591728085,
+    158987.46973735912,
+    159014.09467208097,
+    159040.72072135314,
+    159067.3478850823,
+    159093.97616317519,
+    159120.60555553852,
+    159147.23606207906,
+    159173.8676827036,
+    159200.50041731889,
+    159227.13426583182,
+    159253.76922814918,
+    159280.40530417781,
+    159307.04249382461,
+    159333.68079699649,
+    159360.32021360032,
+    159386.96074354305,
+    159413.60238673165,
+    159440.24514307309,
+    159466.88901247433,
+    159493.53399484244,
+    159520.18009008438,
+    159546.82729810724,
+    159573.47561881805,
+    159600.12505212394,
+    159626.77559793202,
+    159653.42725614941,
+    159680.08002668325,
+    159706.73390944069,
+    159733.38890432892,
+    159760.04501125516,
+    159786.70223012666,
+    159813.36056085059,
+    159840.02000333427,
+    159866.68055748497,
+    159893.34222320997,
+    159920.00500041663,
+    159946.66888901225,
+    159973.33388890422,
+    159999.99999999988,
+    160026.66722220668,
+    160053.33555543202,
+    160080.0049995833,
+    160106.67555456801,
+    160133.3472202936,
+    160160.0199966676,
+    160186.6938835975,
+    160213.36888099083,
+    160240.04498875517,
+    160266.72220679806,
+    160293.40053502709,
+    160320.07997334987,
+    160346.76052167406,
+    160373.44217990729,
+    160400.1249479572,
+    160426.80882573154,
+    160453.49381313793,
+    160480.17991008417,
+    160506.86711647795,
+    160533.55543222709,
+    160560.24485723933,
+    160586.93539142248,
+    160613.62703468435,
+    160640.31978693281,
+    160667.01364807569,
+    160693.70861802087,
+    160720.40469667627,
+    160747.1018839498,
+    160773.80017974938,
+    160800.49958398298,
+    160827.20009655855,
+    160853.90171738411,
+    160880.60444636765,
+    160907.30828341722,
+    160934.01322844089,
+    160960.71928134665,
+    160987.42644204266,
+    161014.13471043704,
+    161040.84408643784,
+    161067.55456995327,
+    161094.26616089148,
+    161120.97885916062,
+    161147.69266466892,
+    161174.40757732463,
+    161201.12359703594,
+    161227.84072371112,
+    161254.55895725847,
+    161281.27829758628,
+    161307.99874460287,
+    161334.72029821656,
+    161361.44295833571,
+    161388.1667248687,
+    161414.89159772391,
+    161441.61757680977,
+    161468.34466203468,
+    161495.07285330712,
+    161521.80215053557,
+    161548.53255362847,
+    161575.26406249436,
+    161601.99667704175,
+    161628.7303971792,
+    161655.46522281526,
+    161682.20115385848,
+    161708.93819021754,
+    161735.67633180099,
+    161762.41557851751,
+    161789.15593027571,
+    161815.89738698432,
+    161842.63994855201,
+    161869.38361488748,
+    161896.1283858995,
+    161922.87426149679,
+    161949.62124158812,
+    161976.36932608229,
+    162003.1185148881,
+    162029.8688079144,
+    162056.62020507001,
+    162083.37270626382,
+    162110.12631140469,
+    162136.88102040152,
+    162163.63683316324,
+    162190.39374959879,
+    162217.15176961714,
+    162243.91089312723,
+    162270.67112003808,
+    162297.43245025873,
+    162324.19488369819,
+    162350.9584202655,
+    162377.72305986975,
+    162404.48880242003,
+    162431.25564782543,
+    162458.02359599507,
+    162484.79264683815,
+    162511.56280026378,
+    162538.33405618116,
+    162565.10641449949,
+    162591.87987512801,
+    162618.65443797593,
+    162645.43010295252,
+    162672.20686996708,
+    162698.98473892888,
+    162725.76370974723,
+    162752.54378233149,
+    162779.32495659095,
+    162806.10723243505,
+    162832.89060977317,
+    162859.67508851466,
+    162886.46066856899,
+    162913.24734984562,
+    162940.03513225398,
+    162966.82401570358,
+    162993.6140001039,
+    163020.40508536444,
+    163047.19727139481,
+    163073.99055810447,
+    163100.78494540305,
+    163127.58043320014,
+    163154.37702140535,
+    163181.17470992831,
+    163207.97349867865,
+    163234.77338756606,
+    163261.57437650024,
+    163288.37646539087,
+    163315.17965414765,
+    163341.98394268038,
+    163368.78933089875,
+    163395.59581871261,
+    163422.40340603172,
+    163449.2120927659,
+    163476.02187882498,
+    163502.83276411882,
+    163529.6447485573,
+    163556.45783205028,
+    163583.2720145077,
+    163610.08729583945,
+    163636.90367595552,
+    163663.72115476584,
+    163690.53973218042,
+    163717.35940810922,
+    163744.18018246227,
+    163771.00205514964,
+    163797.82502608138,
+    163824.64909516752,
+    163851.4742623182,
+    163878.3005274435,
+    163905.12789045356,
+    163931.95635125853,
+    163958.78590976857,
+    163985.61656589387,
+    164012.44831954464,
+    164039.28117063109,
+    164066.11511906344,
+    164092.95016475199,
+    164119.78630760699,
+    164146.62354753874,
+    164173.46188445756,
+    164200.30131827376,
+    164227.14184889771,
+    164253.98347623978,
+    164280.82620021031,
+    164307.67002071979,
+    164334.51493767856,
+    164361.3609509971,
+    164388.20806058586,
+    164415.05626635533,
+    164441.905568216,
+    164468.75596607837,
+    164495.607459853,
+    164522.4600494504,
+    164549.31373478117,
+    164576.16851575591,
+    164603.02439228518,
+    164629.88136427966,
+    164656.73943164994,
+    164683.59859430668,
+    164710.45885216061,
+    164737.32020512238,
+    164764.1826531027,
+    164791.04619601235,
+    164817.91083376206,
+    164844.77656626256,
+    164871.64339342469,
+    164898.51131515924,
+    164925.38033137703,
+    164952.25044198887,
+    164979.1216469057,
+    165005.9939460383,
+    165032.86733929763,
+    165059.7418265946,
+    165086.61740784015,
+    165113.4940829452
 };
 
 #else
@@ -309,7 +8245,7 @@
 
 #define IQ_TABLE_SIZE  1026
 
-static real_t iq_table[IQ_TABLE_SIZE] =
+ALIGN static const real_t iq_table[IQ_TABLE_SIZE] =
 {
     REAL_CONST(0.0),
     REAL_CONST(1.0/8.0),
--- a/libfaad/is.c
+++ b/libfaad/is.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: is.c,v 1.17 2003/11/12 20:47:58 menno Exp $
+** $Id: is.c,v 1.18 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -76,8 +76,8 @@
 #ifndef FIXED_POINT
                     scale = (real_t)pow(0.5, (0.25*icsr->scale_factors[g][sfb]));
 #else
-                    exp = icsr->scale_factors[g][sfb] / 4;
-                    frac = icsr->scale_factors[g][sfb] % 4;
+                    exp = icsr->scale_factors[g][sfb] >> 2;
+                    frac = icsr->scale_factors[g][sfb] & 3;
 #endif
 
                     /* Scale from left to right channel,
--- a/libfaad/kbd_win.h
+++ b/libfaad/kbd_win.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: kbd_win.h,v 1.11 2003/11/12 20:47:58 menno Exp $
+** $Id: kbd_win.h,v 1.12 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __KBD_WIN_H__
@@ -37,7 +37,7 @@
 #pragma warning(disable:4244)
 #endif
 
-real_t kbd_long_1024[] =
+ALIGN static const real_t kbd_long_1024[] =
 {
     FRAC_CONST(0.00029256153896361),
     FRAC_CONST(0.00042998567353047),
@@ -1066,7 +1066,7 @@
 };
 
 #ifdef ALLOW_SMALL_FRAMELENGTH
-real_t kbd_long_960[] = {
+ALIGN static const real_t kbd_long_960[] = {
     FRAC_CONST(0.0003021562530949),
     FRAC_CONST(0.0004452267024786),
     FRAC_CONST(0.0005674947527496),
@@ -2030,7 +2030,7 @@
 };
 #endif
 
-real_t kbd_short_128[] =
+ALIGN static const real_t kbd_short_128[] =
 {
     FRAC_CONST(4.3795702929468881e-005),
     FRAC_CONST(0.00011867384265436617),
@@ -2163,7 +2163,7 @@
 };
 
 #ifdef ALLOW_SMALL_FRAMELENGTH
-real_t kbd_short_120[] =
+ALIGN static const real_t kbd_short_120[] =
 {
     FRAC_CONST(0.0000452320086910),
     FRAC_CONST(0.0001274564692111),
--- a/libfaad/lt_predict.c
+++ b/libfaad/lt_predict.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: lt_predict.c,v 1.18 2003/11/12 20:47:58 menno Exp $
+** $Id: lt_predict.c,v 1.19 2003/12/17 14:43:16 menno Exp $
 **/
 
 
@@ -48,6 +48,9 @@
 #ifdef LD_DEC
         || (object_type == LD)
 #endif
+#ifdef SCALABLE_DEC
+        || (object_type == 6) /* TODO */
+#endif
         )
     {
         return 1;
@@ -57,7 +60,7 @@
     return 0;
 }
 
-static real_t codebook[8] =
+ALIGN static const real_t codebook[8] =
 {
     REAL_CONST(0.570829),
     REAL_CONST(0.696616),
@@ -76,8 +79,8 @@
 {
     uint8_t sfb;
     uint16_t bin, i, num_samples;
-    real_t x_est[2048];
-    real_t X_est[2048];
+    ALIGN real_t x_est[2048];
+    ALIGN real_t X_est[2048];
 
     if (ics->window_sequence != EIGHT_SHORT_SEQUENCE)
     {
@@ -130,12 +133,12 @@
     if (sig_in >= 0)
     {
         sig_in += (1 << (REAL_BITS-1));
-        if (sig_in > REAL_CONST(32767))
-            sig_in = 32767.0f;
+        if (sig_in >= REAL_CONST(32768))
+            return 32767;
     } else {
         sig_in += -(1 << (REAL_BITS-1));
-        if (sig_in < REAL_CONST(-32768))
-            sig_in = -32768.0f;
+        if (sig_in <= REAL_CONST(-32768))
+            return -32768;
     }
 
     return (sig_in >> REAL_BITS);
@@ -148,14 +151,14 @@
 #ifndef HAS_LRINTF
         sig_in += 0.5f;
 #endif
-        if (sig_in > REAL_CONST(32767))
-            sig_in = 32767.0f;
+        if (sig_in >= 32768.0f)
+            return 32767;
     } else {
 #ifndef HAS_LRINTF
-        sig_in -= 0.5f;
+        sig_in += -0.5f;
 #endif
-        if (sig_in < REAL_CONST(-32768))
-            sig_in = -32768.0f;
+        if (sig_in <= -32768.0f)
+            return -32768;
     }
 
     return lrintf(sig_in);
--- a/libfaad/mdct.c
+++ b/libfaad/mdct.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: mdct.c,v 1.34 2003/11/12 20:47:58 menno Exp $
+** $Id: mdct.c,v 1.35 2003/12/17 14:43:16 menno Exp $
 **/
 
 /*
@@ -149,12 +149,12 @@
 #endif
 	real_t scale;
 
-    mdct_info *mdct = (mdct_info*)malloc(sizeof(mdct_info));
+    mdct_info *mdct = (mdct_info*)faad_malloc(sizeof(mdct_info));
 
     assert(N % 8 == 0);
 
     mdct->N = N;
-    mdct->sincos = (complex_t*)malloc(N/4*sizeof(complex_t));
+    mdct->sincos = (complex_t*)faad_malloc(N/4*sizeof(complex_t));
 
 #ifdef FIXED_POINT
     N_idx = map_N_to_idx(N);
@@ -190,6 +190,10 @@
     /* initialise fft */
     mdct->cfft = cffti(N/4);
 
+#ifdef PROFILE
+    mdct->cycles = 0;
+#endif
+
     return mdct;
 }
 
@@ -197,11 +201,15 @@
 {
     if (mdct != NULL)
     {
+#ifdef PROFILE
+        printf("MDCT[%.4d]:         %I64d cycles\n", mdct->N, mdct->cycles);
+#endif
+
         cfftu(mdct->cfft);
 
-        if (mdct->sincos) free(mdct->sincos);
+        if (mdct->sincos) faad_free(mdct->sincos);
 
-        free(mdct);
+        faad_free(mdct);
     }
 }
 
@@ -210,7 +218,7 @@
     uint16_t k;
 
     complex_t x;
-    complex_t Z1[512];
+    ALIGN complex_t Z1[512];
     complex_t *sincos = mdct->sincos;
 
     uint16_t N  = mdct->N;
@@ -218,6 +226,10 @@
     uint16_t N4 = N >> 2;
     uint16_t N8 = N >> 3;
 
+#ifdef PROFILE
+    int64_t count1, count2 = faad_get_ts();
+#endif
+
     /* pre-IFFT complex multiplication */
     for (k = 0; k < N4; k++)
     {
@@ -225,9 +237,17 @@
             X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k]));
     }
 
+#ifdef PROFILE
+    count1 = faad_get_ts();
+#endif
+
     /* complex IFFT, any non-scaling FFT can be used here */
     cfftb(mdct->cfft, Z1);
 
+#ifdef PROFILE
+    count1 = faad_get_ts() - count1;
+#endif
+
     /* post-IFFT complex multiplication */
     for (k = 0; k < N4; k++)
     {
@@ -235,41 +255,201 @@
         IM(x) = IM(Z1[k]);
         ComplexMult(&IM(Z1[k]), &RE(Z1[k]),
             IM(x), RE(x), RE(sincos[k]), IM(sincos[k]));
-
-#ifdef FIXED_POINT
-#if (REAL_BITS == 16)
-        if (abs(RE(Z1[k])) > REAL_CONST(16383.5))
-        {
-            if (RE(Z1[k]) > 0) RE(Z1[k]) = REAL_CONST(32767.0);
-            else RE(Z1[k]) = REAL_CONST(-32767.0);
-        } else {
-            RE(Z1[k]) *= 2;
-        }
-        if (abs(IM(Z1[k])) > REAL_CONST(16383.5))
-        {
-            if (IM(Z1[k]) > 0) IM(Z1[k]) = REAL_CONST(32767.0);
-            else IM(Z1[k]) = REAL_CONST(-32767.0);
-        } else {
-            IM(Z1[k]) *= 2;
-        }
-#endif
-#endif
     }
 
     /* reordering */
-    for (k = 0; k < N8; k++)
+    for (k = 0; k < N8; k+=2)
     {
         X_out[              2*k] =  IM(Z1[N8 +     k]);
+        X_out[          2 + 2*k] =  IM(Z1[N8 + 1 + k]);
+
         X_out[          1 + 2*k] = -RE(Z1[N8 - 1 - k]);
+        X_out[          3 + 2*k] = -RE(Z1[N8 - 2 - k]);
+
         X_out[N4 +          2*k] =  RE(Z1[         k]);
+        X_out[N4 +    + 2 + 2*k] =  RE(Z1[     1 + k]);
+
         X_out[N4 +      1 + 2*k] = -IM(Z1[N4 - 1 - k]);
+        X_out[N4 +      3 + 2*k] = -IM(Z1[N4 - 2 - k]);
+
         X_out[N2 +          2*k] =  RE(Z1[N8 +     k]);
+        X_out[N2 +    + 2 + 2*k] =  RE(Z1[N8 + 1 + k]);
+
         X_out[N2 +      1 + 2*k] = -IM(Z1[N8 - 1 - k]);
+        X_out[N2 +      3 + 2*k] = -IM(Z1[N8 - 2 - k]);
+
         X_out[N2 + N4 +     2*k] = -IM(Z1[         k]);
+        X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[     1 + k]);
+
         X_out[N2 + N4 + 1 + 2*k] =  RE(Z1[N4 - 1 - k]);
+        X_out[N2 + N4 + 3 + 2*k] =  RE(Z1[N4 - 2 - k]);
     }
+
+#ifdef PROFILE
+    count2 = faad_get_ts() - count2;
+    mdct->cycles += (count2 - count1);
+#endif
 }
 
+#ifdef USE_SSE
+void faad_imdct_sse(mdct_info *mdct, real_t *X_in, real_t *X_out)
+{
+    uint16_t k;
+
+    ALIGN complex_t Z1[512];
+    complex_t *sincos = mdct->sincos;
+
+    uint16_t N  = mdct->N;
+    uint16_t N2 = N >> 1;
+    uint16_t N4 = N >> 2;
+    uint16_t N8 = N >> 3;
+
+#ifdef PROFILE
+    int64_t count1, count2 = faad_get_ts();
+#endif
+
+    /* pre-IFFT complex multiplication */
+    for (k = 0; k < N4; k+=4)
+    {
+        __m128 m12, m13, m14, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11;
+        __m128 n12, n13, n14, n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11;
+        n12 = _mm_load_ps(&X_in[N2 - 2*k - 8]);
+        m12 = _mm_load_ps(&X_in[N2 - 2*k - 4]);
+        m13 = _mm_load_ps(&X_in[2*k]);
+        n13 = _mm_load_ps(&X_in[2*k + 4]);
+        m1 = _mm_load_ps(&RE(sincos[k]));
+        n1 = _mm_load_ps(&RE(sincos[k+2]));
+
+        m0 = _mm_shuffle_ps(m12, m13, _MM_SHUFFLE(2,0,1,3));
+        m2 = _mm_shuffle_ps(m1, m1, _MM_SHUFFLE(2,3,0,1));
+        m14 = _mm_shuffle_ps(m0, m0, _MM_SHUFFLE(3,1,2,0));
+        n0 = _mm_shuffle_ps(n12, n13, _MM_SHUFFLE(2,0,1,3));
+        n2 = _mm_shuffle_ps(n1, n1, _MM_SHUFFLE(2,3,0,1));
+        n14 = _mm_shuffle_ps(n0, n0, _MM_SHUFFLE(3,1,2,0));
+
+        m3 = _mm_mul_ps(m14, m1);
+        n3 = _mm_mul_ps(n14, n1);
+        m4 = _mm_mul_ps(m14, m2);
+        n4 = _mm_mul_ps(n14, n2);
+
+        m5 = _mm_shuffle_ps(m3, m4, _MM_SHUFFLE(2,0,2,0));
+        n5 = _mm_shuffle_ps(n3, n4, _MM_SHUFFLE(2,0,2,0));
+        m6 = _mm_shuffle_ps(m3, m4, _MM_SHUFFLE(3,1,3,1));
+        n6 = _mm_shuffle_ps(n3, n4, _MM_SHUFFLE(3,1,3,1));
+
+        m7 = _mm_add_ps(m5, m6);
+        n7 = _mm_add_ps(n5, n6);
+        m8 = _mm_sub_ps(m5, m6);
+        n8 = _mm_sub_ps(n5, n6);
+
+        m9 = _mm_shuffle_ps(m7, m7, _MM_SHUFFLE(3,2,3,2));
+        n9 = _mm_shuffle_ps(n7, n7, _MM_SHUFFLE(3,2,3,2));
+        m10 = _mm_shuffle_ps(m8, m8, _MM_SHUFFLE(1,0,1,0));
+        n10 = _mm_shuffle_ps(n8, n8, _MM_SHUFFLE(1,0,1,0));
+
+        m11 = _mm_unpacklo_ps(m10, m9);
+        n11 = _mm_unpacklo_ps(n10, n9);
+
+        _mm_store_ps(&RE(Z1[k]), m11);
+        _mm_store_ps(&RE(Z1[k+2]), n11);
+    }
+
+#ifdef PROFILE
+    count1 = faad_get_ts();
+#endif
+
+    /* complex IFFT, any non-scaling FFT can be used here */
+    cfftb(mdct->cfft, Z1);
+
+#ifdef PROFILE
+    count1 = faad_get_ts() - count1;
+#endif
+
+    /* post-IFFT complex multiplication */
+    for (k = 0; k < N4; k+=4)
+    {
+        __m128 m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11;
+        __m128 n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11;
+        m0 = _mm_load_ps(&RE(Z1[k]));
+        n0 = _mm_load_ps(&RE(Z1[k+2]));
+        m1 = _mm_load_ps(&RE(sincos[k]));
+        n1 = _mm_load_ps(&RE(sincos[k+2]));
+
+        m2 = _mm_shuffle_ps(m1, m1, _MM_SHUFFLE(2,3,0,1));
+        n2 = _mm_shuffle_ps(n1, n1, _MM_SHUFFLE(2,3,0,1));
+
+        m3 = _mm_mul_ps(m0, m1);
+        n3 = _mm_mul_ps(n0, n1);
+        m4 = _mm_mul_ps(m0, m2);
+        n4 = _mm_mul_ps(n0, n2);
+
+        m5 = _mm_shuffle_ps(m3, m4, _MM_SHUFFLE(2,0,2,0));
+        n5 = _mm_shuffle_ps(n3, n4, _MM_SHUFFLE(2,0,2,0));
+        m6 = _mm_shuffle_ps(m3, m4, _MM_SHUFFLE(3,1,3,1));
+        n6 = _mm_shuffle_ps(n3, n4, _MM_SHUFFLE(3,1,3,1));
+
+        m7 = _mm_add_ps(m5, m6);
+        n7 = _mm_add_ps(n5, n6);
+        m8 = _mm_sub_ps(m5, m6);
+        n8 = _mm_sub_ps(n5, n6);
+
+        m9 = _mm_shuffle_ps(m7, m7, _MM_SHUFFLE(3,2,3,2));
+        n9 = _mm_shuffle_ps(n7, n7, _MM_SHUFFLE(3,2,3,2));
+        m10 = _mm_shuffle_ps(m8, m8, _MM_SHUFFLE(1,0,1,0));
+        n10 = _mm_shuffle_ps(n8, n8, _MM_SHUFFLE(1,0,1,0));
+
+        m11 = _mm_unpacklo_ps(m10, m9);
+        n11 = _mm_unpacklo_ps(n10, n9);
+
+        _mm_store_ps(&RE(Z1[k]), m11);
+        _mm_store_ps(&RE(Z1[k+2]), n11);
+    }
+
+    /* reordering */
+    for (k = 0; k < N8; k+=2)
+    {
+        __m128 m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m13;
+        __m128 n4, n5, n6, n7, n8, n9;
+        __m128 neg1 = _mm_set_ps(-1.0,  1.0, -1.0,  1.0);
+        __m128 neg2 = _mm_set_ps(-1.0, -1.0, -1.0, -1.0);
+
+        m0 = _mm_load_ps(&RE(Z1[k]));
+        m1 = _mm_load_ps(&RE(Z1[N8 - 2 - k]));
+        m2 = _mm_load_ps(&RE(Z1[N8 + k]));
+        m3 = _mm_load_ps(&RE(Z1[N4 - 2 - k]));
+
+        m10 = _mm_mul_ps(m0, neg1);
+        m11 = _mm_mul_ps(m1, neg2);
+        m13 = _mm_mul_ps(m3, neg1);
+
+        m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(3,1,2,0));
+        n4 = _mm_shuffle_ps(m10, m10, _MM_SHUFFLE(3,1,2,0));
+        m4 = _mm_shuffle_ps(m11, m11, _MM_SHUFFLE(3,1,2,0));
+        n5 = _mm_shuffle_ps(m13, m13, _MM_SHUFFLE(3,1,2,0));
+
+        m6 = _mm_shuffle_ps(m4, m5, _MM_SHUFFLE(3,2,1,0));
+        n6 = _mm_shuffle_ps(n4, n5, _MM_SHUFFLE(3,2,1,0));
+        m7 = _mm_shuffle_ps(m5, m4, _MM_SHUFFLE(3,2,1,0));
+        n7 = _mm_shuffle_ps(n5, n4, _MM_SHUFFLE(3,2,1,0));
+
+        m8 = _mm_shuffle_ps(m6, m6, _MM_SHUFFLE(0,3,1,2));
+        n8 = _mm_shuffle_ps(n6, n6, _MM_SHUFFLE(2,1,3,0));
+        m9 = _mm_shuffle_ps(m7, m7, _MM_SHUFFLE(2,1,3,0));
+        n9 = _mm_shuffle_ps(n7, n7, _MM_SHUFFLE(0,3,1,2));
+
+        _mm_store_ps(&X_out[2*k], m8);
+        _mm_store_ps(&X_out[N4 + 2*k], n8);
+        _mm_store_ps(&X_out[N2 + 2*k], m9);
+        _mm_store_ps(&X_out[N2 + N4 + 2*k], n9);
+    }
+
+#ifdef PROFILE
+    count2 = faad_get_ts() - count2;
+    mdct->cycles += (count2 - count1);
+#endif
+}
+#endif
+
 #ifdef LTP_DEC
 void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out)
 {
@@ -276,7 +456,7 @@
     uint16_t k;
 
     complex_t x;
-    complex_t Z1[512];
+    ALIGN complex_t Z1[512];
     complex_t *sincos = mdct->sincos;
 
     uint16_t N  = mdct->N;
--- a/libfaad/mdct.h
+++ b/libfaad/mdct.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: mdct.h,v 1.20 2003/11/12 20:47:58 menno Exp $
+** $Id: mdct.h,v 1.21 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __MDCT_H__
@@ -36,6 +36,9 @@
 mdct_info *faad_mdct_init(uint16_t N);
 void faad_mdct_end(mdct_info *mdct);
 void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out);
+#ifdef USE_SSE
+void faad_imdct_sse(mdct_info *mdct, real_t *X_in, real_t *X_out);
+#endif
 void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out);
 
 
--- a/libfaad/mp4.c
+++ b/libfaad/mp4.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: mp4.c,v 1.24 2003/11/12 20:47:58 menno Exp $
+** $Id: mp4.c,v 1.25 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -58,7 +58,11 @@
 #else
     0, /*  5 SBR */
 #endif
+#ifdef SCALABLE_DEC
+    1, /*  6 AAC Scalable */
+#else
     0, /*  6 AAC Scalable */
+#endif
     0, /*  7 TwinVQ */
     0, /*  8 CELP */
     0, /*  9 HVXC */
@@ -79,7 +83,11 @@
 #else
     0, /* 19 ER AAC LTP */
 #endif
+#ifdef SCALABLE_DEC
+    1, /* 20 ER AAC scalable */
+#else
     0, /* 20 ER AAC scalable */
+#endif
     0, /* 21 ER TwinVQ */
     0, /* 22 ER BSAC */
 #ifdef LD_DEC
--- a/libfaad/output.c
+++ b/libfaad/output.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: output.c,v 1.31 2003/12/17 10:50:21 menno Exp $
+** $Id: output.c,v 1.32 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
--- a/libfaad/rvlc.c
+++ b/libfaad/rvlc.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: rvlc.c,v 1.11 2003/11/12 20:47:58 menno Exp $
+** $Id: rvlc.c,v 1.12 2003/12/17 14:43:16 menno Exp $
 **/
 
 /* RVLC scalefactor decoding
@@ -58,7 +58,7 @@
 
     ics->sf_concealment = faad_get1bit(ld
         DEBUGVAR(1,149,"rvlc_scale_factor_data(): sf_concealment"));
-    ics->rev_global_gain = faad_getbits(ld, 8
+    ics->rev_global_gain = (uint8_t)faad_getbits(ld, 8
         DEBUGVAR(1,150,"rvlc_scale_factor_data(): rev_global_gain"));
 
     if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
@@ -65,12 +65,12 @@
         bits = 11;
 
     /* the number of bits used for the huffman codewords */
-    ics->length_of_rvlc_sf = faad_getbits(ld, bits
+    ics->length_of_rvlc_sf = (uint16_t)faad_getbits(ld, bits
         DEBUGVAR(1,151,"rvlc_scale_factor_data(): length_of_rvlc_sf"));
 
     if (ics->noise_used)
     {
-        ics->dpcm_noise_nrg = faad_getbits(ld, 9
+        ics->dpcm_noise_nrg = (uint16_t)faad_getbits(ld, 9
             DEBUGVAR(1,152,"rvlc_scale_factor_data(): dpcm_noise_nrg"));
 
         ics->length_of_rvlc_sf -= 9;
@@ -81,13 +81,13 @@
 
     if (ics->sf_escapes_present)
     {
-        ics->length_of_rvlc_escapes = faad_getbits(ld, 8
+        ics->length_of_rvlc_escapes = (uint8_t)faad_getbits(ld, 8
             DEBUGVAR(1,154,"rvlc_scale_factor_data(): length_of_rvlc_escapes"));
     }
 
     if (ics->noise_used)
     {
-        ics->dpcm_noise_last_position = faad_getbits(ld, 9
+        ics->dpcm_noise_last_position = (uint16_t)faad_getbits(ld, 9
             DEBUGVAR(1,155,"rvlc_scale_factor_data(): dpcm_noise_last_position"));
     }
 
@@ -136,8 +136,8 @@
 //        &ld_rvlc_esc_rev, intensity_used);
 
 
-    if (rvlc_esc_buffer) free(rvlc_esc_buffer);
-    if (rvlc_sf_buffer) free(rvlc_sf_buffer);
+    if (rvlc_esc_buffer) faad_free(rvlc_esc_buffer);
+    if (rvlc_sf_buffer) faad_free(rvlc_sf_buffer);
 
     if (ics->length_of_rvlc_sf > 0)
         faad_endbits(&ld_rvlc_sf);
--- a/libfaad/sbr_dct.c
+++ b/libfaad/sbr_dct.c
@@ -1,19 +1,19 @@
 /*
 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
 ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com
-**  
+**
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 ** the Free Software Foundation; either version 2 of the License, or
 ** (at your option) any later version.
-** 
+**
 ** This program is distributed in the hope that it will be useful,
 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ** GNU General Public License for more details.
-** 
+**
 ** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software 
+** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
 ** Any non-GPL usage of this software or parts of this software is strictly
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_dct.c,v 1.8 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_dct.c,v 1.9 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -387,27 +387,27 @@
     real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50;
     real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60;
     real_t f61, f62, f65, f66, f67, f68, f71, f72, f73, f74;
-    real_t f75, f76, f77, f78, f79, f80, f81, f82, f85, f86;
+    real_t f75, f76, f77, f78, f79, f80, f81, f82, f83, f85;
     real_t f87, f88, f91, f92, f93, f94, f95, f96, f97, f98;
     real_t f99, f100, f101, f102, f103, f104, f105, f106, f107, f108;
     real_t f109, f110, f111, f112, f113, f114, f115, f116, f117, f118;
-    real_t f119, f120, f121, f122, f123, f124, f125, f126, f127, f128;
-    real_t f129, f130, f133, f134, f135, f136, f139, f140, f141, f142;
-    real_t f145, f146, f147, f148, f151, f152, f153, f154, f155, f156;
+    real_t f119, f120, f121, f122, f123, f124, f125, f126, f129, f130;
+    real_t f131, f132, f135, f136, f137, f138, f141, f142, f143, f144;
+    real_t f147, f148, f149, f150, f151, f152, f153, f154, f155, f156;
     real_t f157, f158, f159, f160, f161, f162, f163, f164, f165, f166;
     real_t f167, f168, f169, f170, f171, f172, f173, f174, f175, f176;
     real_t f177, f178, f179, f180, f181, f182, f183, f184, f185, f186;
     real_t f187, f188, f189, f190, f191, f192, f193, f194, f195, f196;
     real_t f197, f198, f199, f200, f201, f202, f203, f204, f205, f206;
-    real_t f207, f208, f209, f210, f211, f213, f214, f215, f216, f217;
-    real_t f218, f219, f220, f221, f222, f223, f224, f225, f226, f227;
-    real_t f228, f229, f230, f231, f232, f233, f234, f235, f236, f237;
-    real_t f238, f239, f240, f241, f242, f243, f244, f245, f246, f247;
-    real_t f248, f249, f250, f251, f252, f253, f254, f255, f256, f257;
-    real_t f258, f259, f260, f261, f262, f263, f264, f265, f266, f267;
-    real_t f268, f269, f270, f271, f272, f273, f274, f275, f276, f277;
-    real_t f279, f280, f295, f296, f297, f298, f299, f300, f301, f302;
-    real_t f303, f304, f305, f306, f307, f308, f309, f310, f311, f312;
+    real_t f207, f208, f209, f210, f211, f212, f213, f214, f215, f216;
+    real_t f217, f218, f219, f220, f221, f222, f223, f224, f225, f226;
+    real_t f227, f228, f229, f230, f231, f232, f233, f234, f235, f236;
+    real_t f237, f238, f239, f240, f241, f242, f243, f244, f245, f246;
+    real_t f247, f248, f249, f250, f251, f252, f253, f254, f255, f256;
+    real_t f257, f258, f259, f260, f261, f262, f265, f266, f267, f268;
+    real_t f271, f272, f273, f274, f277, f278, f279, f280, f283, f284;
+    real_t f285, f286, f289, f290, f291, f292, f295, f296, f297, f298;
+    real_t f301, f302, f303, f304, f307, f308, f309, f310, f311, f312;
     real_t f313, f314, f315, f316, f317, f318, f319, f320, f321, f322;
     real_t f323, f324, f325, f326, f327, f328, f329, f330, f331, f332;
     real_t f333, f334, f335, f336, f337, f338, f339, f340, f341, f342;
@@ -419,27 +419,28 @@
     real_t f393, f394, f395, f396, f397, f398, f399, f400, f401, f402;
     real_t f403, f404, f405, f406, f407, f408, f409, f410, f411, f412;
     real_t f413, f414, f415, f416, f417, f418, f419, f420, f421, f422;
-    real_t f423, f424, f425, f426, f427, f428, f429, f430, f431, f432;
-    real_t f433, f434, f435, f436, f437, f438, f439, f440, f441, f442;
-    real_t f443, f444, f445, f446, f447, f448, f449, f450, f451, f452;
-    real_t f453, f454, f455, f456, f457, f458, f459, f460, f461, f462;
-    real_t f463, f464, f465, f466, f467, f468, f469, f470, f471, f472;
-    real_t f473, f474, f475, f476, f477, f478, f479, f480, f481, f482;
-    real_t f483, f484, f485, f486, f487, f488, f489, f490, f491, f492;
-    real_t f493, f494, f495, f496, f497, f498, f499, f500, f501, f502;
-    real_t f503, f504, f505, f506, f507, f508, f509, f510, f511, f512;
-    real_t f513, f514, f515, f516, f517, f518, f519, f520, f521, f522;
-    real_t f523, f524, f525, f526, f527, f528, f529, f530, f531, f532;
-    real_t f533, f534, f535, f536, f537, f538, f539, f540, f541, f542;
-    real_t f543, f544, f545, f546, f547, f548, f549, f550, f551, f552;
-    real_t f553, f554, f557, f558, f559, f560, f563, f564, f565, f566;
-    real_t f569, f570, f571, f572, f575, f576, f577, f578, f581, f582;
-    real_t f583, f584, f587, f588, f589, f590, f593, f594, f595, f596;
-    real_t f599, f600, f601, f602, f605, f606, f607, f608, f611, f612;
-    real_t f613, f614, f617, f618, f619, f620, f623, f624, f625, f626;
-    real_t f629, f630, f631, f632, f635, f636, f637, f638, f641, f642;
-    real_t f643, f644;
-    static real_t t2[64];
+    real_t f423, f424, f425, f426, f427, f428, f429, f430, f431, f433;
+    real_t f434, f435, f436, f437, f438, f439, f440, f441, f442, f443;
+    real_t f444, f445, f446, f447, f448, f449, f450, f451, f452, f453;
+    real_t f454, f455, f456, f457, f458, f459, f460, f461, f462, f463;
+    real_t f464, f465, f466, f467, f468, f469, f470, f471, f472, f473;
+    real_t f474, f475, f476, f477, f478, f479, f480, f481, f482, f483;
+    real_t f484, f485, f486, f487, f488, f489, f490, f491, f492, f493;
+    real_t f494, f495, f496, f497, f498, f499, f500, f501, f502, f503;
+    real_t f504, f505, f506, f507, f508, f509, f510, f511, f512, f513;
+    real_t f514, f515, f516, f517, f518, f519, f520, f521, f522, f523;
+    real_t f524, f525, f526, f527, f528, f529, f530, f531, f532, f533;
+    real_t f534, f535, f536, f537, f538, f539, f540, f541, f542, f543;
+    real_t f544, f546, f547, f548, f549, f550, f551, f552, f553, f554;
+    real_t f555, f556, f557, f558, f559, f560, f561, f562, f563, f564;
+    real_t f565, f566, f567, f568, f569, f570, f571, f572, f573, f574;
+    real_t f575, f576, f577, f578, f579, f580, f581, f582, f583, f584;
+    real_t f585, f586, f587, f588, f589, f590, f591, f592, f593, f594;
+    real_t f595, f596, f597, f598, f599, f600, f601, f602, f603, f604;
+    real_t f605, f606, f607, f608, f609, f610, f611, f612, f613, f614;
+    real_t f615, f616, f617, f618, f619, f620, f621, f622, f623, f624;
+    real_t f625, f626, f627, f628;
+    ALIGN static real_t t2[64];
 
     for (i0=0; i0<32; i0++)
     {
@@ -515,582 +516,1362 @@
     f68 = MUL_C(COEF_CONST((-0.5411961001461967)), f60);
     y[48] = f66 + f67;
     y[16] = f68 - f67;
-    f71 = f52 - f54;
-    f72 = f52 + f54;
-    f73 = MUL_C(COEF_CONST(0.7071067811865476), f72);
-    f74 = MUL_C(COEF_CONST(0.7071067811865476), f71);
-    f75 = f50 - f73;
-    f76 = f50 + f73;
-    f77 = f56 - f74;
-    f78 = f56 + f74;
-    f79 = f78 + f76;
-    f80 = MUL_C(COEF_CONST((-0.7856949583871021)), f78);
-    f81 = MUL_C(COEF_CONST(0.9807852804032304), f79);
-    f82 = MUL_C(COEF_CONST(1.1758756024193588), f76);
-    y[8] = f80 + f81;
-    y[56] = f82 - f81;
-    f85 = f77 + f75;
-    f86 = MUL_C(COEF_CONST(0.2758993792829431), f77);
-    f87 = MUL_C(COEF_CONST(0.5555702330196022), f85);
-    f88 = MUL_C(COEF_CONST(1.3870398453221475), f75);
-    y[40] = f86 + f87;
-    y[24] = f88 - f87;
-    f91 = f40 - f42;
-    f92 = f40 + f42;
-    f93 = MUL_C(COEF_CONST(0.7071067811865476), f92);
-    f94 = MUL_C(COEF_CONST(0.7071067811865476), f91);
-    f95 = f38 - f44;
-    f96 = f38 + f44;
-    f97 = MUL_C(COEF_CONST(0.7071067811865476), f96);
-    f98 = MUL_C(COEF_CONST(0.7071067811865476), f95);
-    f99 = f34 - f93;
-    f100 = f34 + f93;
-    f101 = f48 - f94;
-    f102 = f48 + f94;
-    f103 = f36 - f97;
-    f104 = f36 + f97;
-    f105 = f46 - f98;
-    f106 = f46 + f98;
-    f107 = f106 + f104;
-    f108 = MUL_C(COEF_CONST((-0.5411961001461969)), f106);
-    f109 = MUL_C(COEF_CONST(0.9238795325112867), f107);
-    f110 = MUL_C(COEF_CONST(1.3065629648763766), f104);
-    f111 = f108 + f109;
-    f112 = f110 - f109;
-    f113 = f105 + f103;
-    f114 = MUL_C(COEF_CONST(1.3065629648763770), f105);
-    f115 = MUL_C(COEF_CONST((-0.3826834323650904)), f113);
-    f116 = MUL_C(COEF_CONST(0.5411961001461961), f103);
-    f117 = f114 + f115;
-    f118 = f116 - f115;
-    f119 = f100 - f111;
-    f120 = f100 + f111;
-    f121 = f102 - f112;
-    f122 = f102 + f112;
-    f123 = f99 - f117;
-    f124 = f99 + f117;
-    f125 = f101 - f118;
-    f126 = f101 + f118;
-    f127 = f122 + f120;
-    f128 = MUL_C(COEF_CONST((-0.8971675863426361)), f122);
-    f129 = MUL_C(COEF_CONST(0.9951847266721968), f127);
-    f130 = MUL_C(COEF_CONST(1.0932018670017576), f120);
-    y[4] = f128 + f129;
-    y[60] = f130 - f129;
-    f133 = f126 + f124;
-    f134 = MUL_C(COEF_CONST((-0.4105245275223571)), f126);
-    f135 = MUL_C(COEF_CONST(0.8819212643483549), f133);
-    f136 = MUL_C(COEF_CONST(1.3533180011743529), f124);
-    y[20] = f134 + f135;
-    y[44] = f136 - f135;
-    f139 = f121 + f119;
-    f140 = MUL_C(COEF_CONST(0.1386171691990915), f121);
-    f141 = MUL_C(COEF_CONST(0.6343932841636455), f139);
-    f142 = MUL_C(COEF_CONST(1.4074037375263826), f119);
-    y[36] = f140 + f141;
-    y[28] = f142 - f141;
-    f145 = f125 + f123;
-    f146 = MUL_C(COEF_CONST(0.6666556584777466), f125);
-    f147 = MUL_C(COEF_CONST(0.2902846772544623), f145);
-    f148 = MUL_C(COEF_CONST(1.2472250129866711), f123);
-    y[52] = f146 + f147;
-    y[12] = f148 - f147;
-    f151 = f2 + f32;
-    f152 = MUL_C(COEF_CONST(1.0478631305325901), f2);
-    f153 = MUL_C(COEF_CONST((-0.9987954562051724)), f151);
-    f154 = MUL_C(COEF_CONST((-0.9497277818777548)), f32);
-    f155 = f152 + f153;
-    f156 = f154 - f153;
-    f157 = f4 + f30;
-    f158 = MUL_C(COEF_CONST(1.1359069844201428), f4);
-    f159 = MUL_C(COEF_CONST((-0.9891765099647809)), f157);
-    f160 = MUL_C(COEF_CONST((-0.8424460355094190)), f30);
-    f161 = f158 + f159;
-    f162 = f160 - f159;
-    f163 = f6 + f28;
-    f164 = MUL_C(COEF_CONST(1.2130114330978077), f6);
-    f165 = MUL_C(COEF_CONST((-0.9700312531945440)), f163);
-    f166 = MUL_C(COEF_CONST((-0.7270510732912803)), f28);
-    f167 = f164 + f165;
-    f168 = f166 - f165;
-    f169 = f8 + f26;
-    f170 = MUL_C(COEF_CONST(1.2784339185752405), f8);
-    f171 = MUL_C(COEF_CONST((-0.9415440651830209)), f169);
-    f172 = MUL_C(COEF_CONST((-0.6046542117908014)), f26);
-    f173 = f170 + f171;
-    f174 = f172 - f171;
-    f175 = f10 + f24;
-    f176 = MUL_C(COEF_CONST(1.3315443865537255), f10);
-    f177 = MUL_C(COEF_CONST((-0.9039892931234433)), f175);
-    f178 = MUL_C(COEF_CONST((-0.4764341996931612)), f24);
-    f179 = f176 + f177;
-    f180 = f178 - f177;
-    f181 = f12 + f22;
-    f182 = MUL_C(COEF_CONST(1.3718313541934939), f12);
-    f183 = MUL_C(COEF_CONST((-0.8577286100002722)), f181);
-    f184 = MUL_C(COEF_CONST((-0.3436258658070507)), f22);
-    f185 = f182 + f183;
-    f186 = f184 - f183;
-    f187 = f14 + f20;
-    f188 = MUL_C(COEF_CONST(1.3989068359730781), f14);
-    f189 = MUL_C(COEF_CONST((-0.8032075314806453)), f187);
-    f190 = MUL_C(COEF_CONST((-0.2075082269882124)), f20);
-    f191 = f188 + f189;
-    f192 = f190 - f189;
-    f193 = f16 + f18;
-    f194 = MUL_C(COEF_CONST(1.4125100802019774), f16);
-    f195 = MUL_C(COEF_CONST((-0.7409511253549591)), f193);
-    f196 = MUL_C(COEF_CONST((-0.0693921705079408)), f18);
-    f197 = f194 + f195;
-    f198 = f196 - f195;
-    f199 = f156 - f198;
-    f200 = f156 + f198;
-    f201 = f162 - f192;
-    f202 = f162 + f192;
-    f203 = f168 - f186;
-    f204 = f168 + f186;
-    f205 = f174 - f180;
-    f206 = f174 + f180;
-    f207 = f200 - f206;
-    f208 = f200 + f206;
-    f209 = f202 - f204;
-    f210 = f202 + f204;
-    f211 = f208 - f210;
-    y[2] = f208 + f210;
-    f213 = MUL_C(COEF_CONST(0.7071067811865476), f211);
-    f214 = f207 + f209;
-    f215 = MUL_C(COEF_CONST(1.3065629648763766), f207);
-    f216 = MUL_C(COEF_CONST((-0.9238795325112866)), f214);
-    f217 = MUL_C(COEF_CONST((-0.5411961001461967)), f209);
-    f218 = f215 + f216;
-    f219 = f217 - f216;
-    f220 = f201 - f203;
-    f221 = f201 + f203;
-    f222 = MUL_C(COEF_CONST(0.7071067811865476), f221);
-    f223 = MUL_C(COEF_CONST(0.7071067811865476), f220);
-    f224 = f199 - f222;
-    f225 = f199 + f222;
-    f226 = f205 - f223;
-    f227 = f205 + f223;
-    f228 = f227 + f225;
-    f229 = MUL_C(COEF_CONST((-0.7856949583871021)), f227);
-    f230 = MUL_C(COEF_CONST(0.9807852804032304), f228);
-    f231 = MUL_C(COEF_CONST(1.1758756024193588), f225);
-    f232 = f229 + f230;
-    f233 = f231 - f230;
-    f234 = f226 + f224;
-    f235 = MUL_C(COEF_CONST(0.2758993792829431), f226);
-    f236 = MUL_C(COEF_CONST(0.5555702330196022), f234);
-    f237 = MUL_C(COEF_CONST(1.3870398453221475), f224);
-    f238 = f235 + f236;
-    f239 = f237 - f236;
-    f240 = f155 - f197;
-    f241 = f155 + f197;
-    f242 = f161 - f191;
-    f243 = f161 + f191;
-    f244 = f167 - f185;
-    f245 = f167 + f185;
-    f246 = f173 - f179;
-    f247 = f173 + f179;
-    f248 = f245 - f243;
-    f249 = f245 + f243;
-    f250 = MUL_C(COEF_CONST(0.7071067811865476), f249);
-    f251 = f247 - f250;
-    f252 = f247 + f250;
-    f253 = MUL_C(COEF_CONST(0.7071067811865476), f248);
-    f254 = f253 - f241;
-    f255 = f253 + f241;
-    f256 = f255 + f252;
-    f257 = MUL_C(COEF_CONST((-0.7856949583871021)), f255);
-    f258 = MUL_C(COEF_CONST(0.9807852804032304), f256);
-    f259 = MUL_C(COEF_CONST(1.1758756024193588), f252);
-    f260 = f257 + f258;
-    f261 = f259 - f258;
-    f262 = f254 + f251;
-    f263 = MUL_C(COEF_CONST((-0.2758993792829430)), f254);
-    f264 = MUL_C(COEF_CONST(0.8314696123025452), f262);
-    f265 = MUL_C(COEF_CONST(1.3870398453221475), f251);
-    f266 = f263 + f264;
-    f267 = f265 - f264;
-    f268 = f240 - f246;
-    f269 = f240 + f246;
-    f270 = f242 - f244;
-    f271 = f242 + f244;
-    f272 = f269 + f271;
-    f273 = MUL_C(COEF_CONST(1.3065629648763770), f269);
-    f274 = MUL_C(COEF_CONST((-0.3826834323650904)), f272);
-    f275 = MUL_C(COEF_CONST(0.5411961001461961), f271);
-    f276 = f273 + f274;
-    f277 = f275 - f274;
-    y[62] = f268 - f270;
-    f279 = f268 + f270;
-    f280 = MUL_C(COEF_CONST(0.7071067811865476), f279);
-    y[10] = f232 - f260;
-    y[6] = f232 + f260;
-    y[18] = f219 - f277;
-    y[14] = f219 + f277;
-    y[26] = f239 + f266;
-    y[22] = f239 - f266;
-    y[34] = f213 - f280;
-    y[30] = f213 + f280;
-    y[42] = f238 - f267;
-    y[38] = f238 + f267;
-    y[50] = f218 - f276;
-    y[46] = f218 + f276;
-    y[58] = f233 + f261;
-    y[54] = f233 - f261;
-    f295 = t2[3] - t2[5];
-    f296 = t2[3] + t2[5];
-    f297 = t2[7] - t2[9];
-    f298 = t2[7] + t2[9];
-    f299 = t2[11] - t2[13];
-    f300 = t2[11] + t2[13];
-    f301 = t2[15] - t2[17];
-    f302 = t2[15] + t2[17];
-    f303 = t2[19] - t2[21];
-    f304 = t2[19] + t2[21];
-    f305 = t2[23] - t2[25];
-    f306 = t2[23] + t2[25];
-    f307 = t2[27] - t2[29];
-    f308 = t2[27] + t2[29];
-    f309 = t2[31] - t2[33];
-    f310 = t2[31] + t2[33];
-    f311 = t2[35] - t2[37];
-    f312 = t2[35] + t2[37];
-    f313 = t2[39] - t2[41];
-    f314 = t2[39] + t2[41];
-    f315 = t2[43] - t2[45];
-    f316 = t2[43] + t2[45];
-    f317 = t2[47] - t2[49];
-    f318 = t2[47] + t2[49];
-    f319 = t2[51] - t2[53];
-    f320 = t2[51] + t2[53];
-    f321 = t2[55] - t2[57];
-    f322 = t2[55] + t2[57];
-    f323 = t2[59] - t2[61];
-    f324 = t2[59] + t2[61];
-    f325 = MUL_C(COEF_CONST(0.7071067811865476), f310);
-    f326 = t2[1] - f325;
-    f327 = t2[1] + f325;
-    f328 = f302 + f318;
-    f329 = MUL_C(COEF_CONST(1.3065629648763766), f302);
-    f330 = MUL_C(COEF_CONST((-0.9238795325112866)), f328);
-    f331 = MUL_C(COEF_CONST((-0.5411961001461967)), f318);
-    f332 = f329 + f330;
-    f333 = f331 - f330;
-    f334 = f327 - f333;
-    f335 = f327 + f333;
-    f336 = f326 - f332;
-    f337 = f326 + f332;
-    f338 = f306 - f314;
-    f339 = f306 + f314;
-    f340 = MUL_C(COEF_CONST(0.7071067811865476), f339);
-    f341 = f298 - f340;
-    f342 = f298 + f340;
-    f343 = MUL_C(COEF_CONST(0.7071067811865476), f338);
-    f344 = f343 - f322;
-    f345 = f343 + f322;
-    f346 = f345 + f342;
-    f347 = MUL_C(COEF_CONST((-0.7856949583871021)), f345);
-    f348 = MUL_C(COEF_CONST(0.9807852804032304), f346);
-    f349 = MUL_C(COEF_CONST(1.1758756024193588), f342);
-    f350 = f347 + f348;
-    f351 = f349 - f348;
-    f352 = f344 + f341;
-    f353 = MUL_C(COEF_CONST((-0.2758993792829430)), f344);
-    f354 = MUL_C(COEF_CONST(0.8314696123025452), f352);
-    f355 = MUL_C(COEF_CONST(1.3870398453221475), f341);
-    f356 = f353 + f354;
-    f357 = f355 - f354;
-    f358 = f335 - f350;
-    f359 = f335 + f350;
-    f360 = f337 - f356;
-    f361 = f337 + f356;
-    f362 = f336 - f357;
-    f363 = f336 + f357;
-    f364 = f334 - f351;
-    f365 = f334 + f351;
-    f366 = MUL_C(COEF_CONST(5.1011486186891641), f296);
-    f367 = MUL_C(COEF_CONST(1.7224470982383342), f300);
-    f368 = MUL_C(COEF_CONST(1.0606776859903475), f304);
-    f369 = MUL_C(COEF_CONST(0.7881546234512502), f308);
-    f370 = MUL_C(COEF_CONST(0.5024192861881557), f324);
-    f371 = MUL_C(COEF_CONST(0.5224986149396889), f320);
-    f372 = MUL_C(COEF_CONST(0.5669440348163577), f316);
-    f373 = MUL_C(COEF_CONST(0.6468217833599901), f312);
-    f374 = f366 - f370;
-    f375 = f366 + f370;
-    f376 = f367 - f371;
-    f377 = f367 + f371;
-    f378 = f368 - f372;
-    f379 = f368 + f372;
-    f380 = f369 - f373;
-    f381 = f369 + f373;
-    f382 = MUL_C(COEF_CONST(0.5097955791041592), f375);
-    f383 = MUL_C(COEF_CONST(0.6013448869350453), f377);
-    f384 = MUL_C(COEF_CONST(0.8999762231364156), f379);
-    f385 = MUL_C(COEF_CONST(2.5629154477415055), f381);
-    f386 = f382 + f385;
-    f387 = f382 - f385;
-    f388 = f383 + f384;
-    f389 = f384 - f383;
-    f390 = f387 - f389;
-    f391 = f387 + f389;
-    f392 = MUL_C(COEF_CONST(0.7071067811865476), f390);
-    f393 = f386 - f388;
-    f394 = MUL_C(COEF_CONST(1.3065629648763766), f386);
-    f395 = MUL_C(COEF_CONST((-0.9238795325112866)), f393);
-    f396 = MUL_C(COEF_CONST((-0.5411961001461967)), f388);
-    f397 = f394 + f395;
-    f398 = f395 + f396;
-    f399 = f391 - f398;
-    f400 = f392 - f398;
-    f401 = f392 + f397;
-    f402 = f380 - f374;
-    f403 = f374 + f380;
-    f404 = f378 - f376;
-    f405 = f376 + f378;
-    f406 = f403 + f405;
-    f407 = MUL_C(COEF_CONST(1.3065629648763770), f403);
-    f408 = MUL_C(COEF_CONST((-0.3826834323650904)), f406);
-    f409 = MUL_C(COEF_CONST(0.5411961001461961), f405);
-    f410 = f407 + f408;
-    f411 = f408 - f409;
-    f412 = f402 - f404;
-    f413 = f402 + f404;
-    f414 = MUL_C(COEF_CONST(0.7071067811865476), f413);
-    f415 = f411 + f397;
-    f416 = f401 + f411;
-    f417 = f414 + f401;
-    f418 = f400 + f414;
-    f419 = f400 - f410;
-    f420 = f399 - f410;
-    f421 = f412 + f399;
-    f422 = f359 - f397;
-    f423 = f359 + f397;
-    f424 = f361 + f415;
-    f425 = f361 - f415;
-    f426 = f363 - f416;
-    f427 = f363 + f416;
-    f428 = f365 + f417;
-    f429 = f365 - f417;
-    f430 = f364 - f418;
-    f431 = f364 + f418;
-    f432 = f362 + f419;
-    f433 = f362 - f419;
-    f434 = f360 - f420;
-    f435 = f360 + f420;
-    f436 = f358 + f421;
-    f437 = f358 - f421;
-    f438 = MUL_C(COEF_CONST(5.1011486186891641), f295);
-    f439 = MUL_C(COEF_CONST(1.7224470982383342), f299);
-    f440 = MUL_C(COEF_CONST(1.0606776859903475), f303);
-    f441 = MUL_C(COEF_CONST(0.7881546234512502), f307);
-    f442 = MUL_C(COEF_CONST(0.5024192861881557), f323);
-    f443 = MUL_C(COEF_CONST(0.5224986149396889), f319);
-    f444 = MUL_C(COEF_CONST(0.5669440348163577), f315);
-    f445 = MUL_C(COEF_CONST(0.6468217833599901), f311);
-    f446 = f438 + f442;
-    f447 = f438 - f442;
-    f448 = f439 + f443;
-    f449 = f443 - f439;
-    f450 = f440 + f444;
-    f451 = f440 - f444;
-    f452 = f441 + f445;
-    f453 = f445 - f441;
-    f454 = MUL_C(COEF_CONST(0.5097955791041592), f447);
-    f455 = MUL_C(COEF_CONST(0.6013448869350453), f449);
-    f456 = MUL_C(COEF_CONST(0.8999762231364156), f451);
-    f457 = MUL_C(COEF_CONST(2.5629154477415055), f453);
-    f458 = f454 + f457;
-    f459 = f454 - f457;
-    f460 = f455 + f456;
-    f461 = f456 - f455;
-    f462 = f459 - f461;
-    f463 = f459 + f461;
-    f464 = MUL_C(COEF_CONST(0.7071067811865476), f462);
-    f465 = f458 - f460;
-    f466 = MUL_C(COEF_CONST(1.3065629648763766), f458);
-    f467 = MUL_C(COEF_CONST((-0.9238795325112866)), f465);
-    f468 = MUL_C(COEF_CONST((-0.5411961001461967)), f460);
-    f469 = f466 + f467;
-    f470 = f467 + f468;
-    f471 = f463 - f470;
-    f472 = f464 - f470;
-    f473 = f464 + f469;
-    f474 = f446 + f452;
-    f475 = f452 - f446;
-    f476 = f448 + f450;
-    f477 = f448 - f450;
-    f478 = f475 + f477;
-    f479 = MUL_C(COEF_CONST(1.3065629648763770), f475);
-    f480 = MUL_C(COEF_CONST((-0.3826834323650904)), f478);
-    f481 = MUL_C(COEF_CONST(0.5411961001461961), f477);
-    f482 = f479 + f480;
-    f483 = f481 - f480;
-    f484 = f474 + f476;
-    f485 = f476 - f474;
-    f486 = MUL_C(COEF_CONST(0.7071067811865476), f485);
-    f487 = f483 + f469;
-    f488 = f473 + f483;
-    f489 = f486 + f473;
-    f490 = f472 + f486;
-    f491 = f482 + f472;
-    f492 = f471 + f482;
-    f493 = f471 - f484;
-    f494 = MUL_C(COEF_CONST(0.7071067811865476), f309);
-    f495 = t2[63] - f494;
-    f496 = t2[63] + f494;
-    f497 = f317 + f301;
-    f498 = MUL_C(COEF_CONST(1.3065629648763766), f317);
-    f499 = MUL_C(COEF_CONST((-0.9238795325112866)), f497);
-    f500 = MUL_C(COEF_CONST((-0.5411961001461967)), f301);
-    f501 = f498 + f499;
-    f502 = f500 - f499;
-    f503 = f496 - f502;
-    f504 = f496 + f502;
-    f505 = f495 - f501;
-    f506 = f495 + f501;
-    f507 = MUL_C(COEF_CONST(0.5097955791041592), f321);
-    f508 = MUL_C(COEF_CONST(0.6013448869350453), f313);
-    f509 = MUL_C(COEF_CONST(0.8999762231364156), f305);
-    f510 = MUL_C(COEF_CONST(2.5629154477415055), f297);
-    f511 = f507 - f510;
-    f512 = f507 + f510;
-    f513 = f508 - f509;
-    f514 = f508 + f509;
-    f515 = f512 - f514;
-    f516 = f512 + f514;
-    f517 = MUL_C(COEF_CONST(0.7071067811865476), f515);
-    f518 = f511 + f513;
-    f519 = MUL_C(COEF_CONST(1.3065629648763766), f511);
-    f520 = MUL_C(COEF_CONST((-0.9238795325112866)), f518);
-    f521 = MUL_C(COEF_CONST((-0.5411961001461967)), f513);
-    f522 = f519 + f520;
-    f523 = f521 - f520;
-    f524 = f516 + f523;
-    f525 = f523 + f517;
-    f526 = f517 + f522;
-    f527 = f504 - f524;
-    f528 = f504 + f524;
-    f529 = f506 - f525;
-    f530 = f506 + f525;
-    f531 = f505 - f526;
-    f532 = f505 + f526;
-    f533 = f503 - f522;
-    f534 = f503 + f522;
-    f535 = f493 + f528;
-    f536 = f528 - f493;
-    f537 = f492 + f530;
-    f538 = f492 - f530;
-    f539 = f491 + f532;
-    f540 = f532 - f491;
-    f541 = f490 + f534;
-    f542 = f490 - f534;
-    f543 = f489 + f533;
-    f544 = f533 - f489;
-    f545 = f488 + f531;
-    f546 = f488 - f531;
-    f547 = f487 + f529;
-    f548 = f529 - f487;
-    f549 = f469 + f527;
-    f550 = f469 - f527;
-    f551 = f536 + f423;
-    f552 = MUL_C(COEF_CONST((-0.9751575901732920)), f536);
-    f553 = MUL_C(COEF_CONST(0.9996988186962043), f551);
-    f554 = MUL_C(COEF_CONST(1.0242400472191164), f423);
-    y[1] = f552 + f553;
-    y[63] = f554 - f553;
-    f557 = f538 + f425;
-    f558 = MUL_C(COEF_CONST((-0.9237258930790228)), f538);
-    f559 = MUL_C(COEF_CONST(0.9972904566786902), f557);
-    f560 = MUL_C(COEF_CONST(1.0708550202783576), f425);
-    y[3] = f558 + f559;
-    y[61] = f560 - f559;
-    f563 = f540 + f427;
-    f564 = MUL_C(COEF_CONST((-0.8700688593994936)), f540);
-    f565 = MUL_C(COEF_CONST(0.9924795345987100), f563);
-    f566 = MUL_C(COEF_CONST(1.1148902097979263), f427);
-    y[5] = f564 + f565;
-    y[59] = f566 - f565;
-    f569 = f542 + f429;
-    f570 = MUL_C(COEF_CONST((-0.8143157536286398)), f542);
-    f571 = MUL_C(COEF_CONST(0.9852776423889412), f569);
-    f572 = MUL_C(COEF_CONST(1.1562395311492426), f429);
-    y[7] = f570 + f571;
-    y[57] = f572 - f571;
-    f575 = f544 + f431;
-    f576 = MUL_C(COEF_CONST((-0.7566008898816587)), f544);
-    f577 = MUL_C(COEF_CONST(0.9757021300385286), f575);
-    f578 = MUL_C(COEF_CONST(1.1948033701953984), f431);
-    y[9] = f576 + f577;
-    y[55] = f578 - f577;
-    f581 = f546 + f433;
-    f582 = MUL_C(COEF_CONST((-0.6970633083205414)), f546);
-    f583 = MUL_C(COEF_CONST(0.9637760657954398), f581);
-    f584 = MUL_C(COEF_CONST(1.2304888232703384), f433);
-    y[11] = f582 + f583;
-    y[53] = f584 - f583;
-    f587 = f548 + f435;
-    f588 = MUL_C(COEF_CONST((-0.6358464401941451)), f548);
-    f589 = MUL_C(COEF_CONST(0.9495281805930367), f587);
-    f590 = MUL_C(COEF_CONST(1.2632099209919283), f435);
-    y[13] = f588 + f589;
-    y[51] = f590 - f589;
-    f593 = f550 + f437;
-    f594 = MUL_C(COEF_CONST((-0.5730977622997506)), f550);
-    f595 = MUL_C(COEF_CONST(0.9329927988347389), f593);
-    f596 = MUL_C(COEF_CONST(1.2928878353697271), f437);
-    y[15] = f594 + f595;
-    y[49] = f596 - f595;
-    f599 = f549 + f436;
-    f600 = MUL_C(COEF_CONST((-0.5089684416985408)), f549);
-    f601 = MUL_C(COEF_CONST(0.9142097557035307), f599);
-    f602 = MUL_C(COEF_CONST(1.3194510697085207), f436);
-    y[17] = f600 + f601;
-    y[47] = f602 - f601;
-    f605 = f434 - f547;
-    f606 = MUL_C(COEF_CONST((-0.4436129715409087)), f547);
-    f607 = MUL_C(COEF_CONST(0.8932243011955153), f605);
-    f608 = MUL_C(COEF_CONST(1.3428356308501219), f434);
-    y[19] = f607 - f606;
-    y[45] = f608 - f607;
-    f611 = f545 + f432;
-    f612 = MUL_C(COEF_CONST((-0.3771887988789273)), f545);
-    f613 = MUL_C(COEF_CONST(0.8700869911087114), f611);
-    f614 = MUL_C(COEF_CONST(1.3629851833384954), f432);
-    y[21] = f612 + f613;
-    y[43] = f614 - f613;
-    f617 = f430 - f543;
-    f618 = MUL_C(COEF_CONST((-0.3098559453626097)), f543);
-    f619 = MUL_C(COEF_CONST(0.8448535652497070), f617);
-    f620 = MUL_C(COEF_CONST(1.3798511851368043), f430);
-    y[23] = f619 - f618;
-    y[41] = f620 - f619;
-    f623 = f541 + f428;
-    f624 = MUL_C(COEF_CONST((-0.2417766217337384)), f541);
-    f625 = MUL_C(COEF_CONST(0.8175848131515837), f623);
-    f626 = MUL_C(COEF_CONST(1.3933930045694289), f428);
-    y[25] = f624 + f625;
-    y[39] = f626 - f625;
-    f629 = f426 - f539;
-    f630 = MUL_C(COEF_CONST((-0.1731148370459794)), f539);
-    f631 = MUL_C(COEF_CONST(0.7883464276266062), f629);
-    f632 = MUL_C(COEF_CONST(1.4035780182072330), f426);
-    y[27] = f631 - f630;
-    y[37] = f632 - f631;
-    f635 = f537 + f424;
-    f636 = MUL_C(COEF_CONST((-0.1040360035527077)), f537);
-    f637 = MUL_C(COEF_CONST(0.7572088465064845), f635);
-    f638 = MUL_C(COEF_CONST(1.4103816894602612), f424);
-    y[29] = f636 + f637;
-    y[35] = f638 - f637;
-    f641 = f422 - f535;
-    f642 = MUL_C(COEF_CONST((-0.0347065382144000)), f535);
-    f643 = MUL_C(COEF_CONST(0.7242470829514669), f641);
-    f644 = MUL_C(COEF_CONST(1.4137876276885337), f422);
-    y[31] = f643 - f642;
-    y[33] = f644 - f643;
+    f71 = f50 + f56;
+    f72 = MUL_C(COEF_CONST(1.1758756024193588), f50);
+    f73 = MUL_C(COEF_CONST((-0.9807852804032304)), f71);
+    f74 = MUL_C(COEF_CONST((-0.7856949583871021)), f56);
+    f75 = f72 + f73;
+    f76 = f74 - f73;
+    f77 = f52 + f54;
+    f78 = MUL_C(COEF_CONST(1.3870398453221473), f52);
+    f79 = MUL_C(COEF_CONST((-0.8314696123025455)), f77);
+    f80 = MUL_C(COEF_CONST((-0.2758993792829436)), f54);
+    f81 = f78 + f79;
+    f82 = f80 - f79;
+    f83 = f76 - f82;
+    y[8] = f76 + f82;
+    f85 = MUL_C(COEF_CONST(0.7071067811865476), f83);
+    y[56] = f75 - f81;
+    f87 = f75 + f81;
+    f88 = MUL_C(COEF_CONST(0.7071067811865476), f87);
+    y[40] = f85 - f88;
+    y[24] = f85 + f88;
+    f91 = f36 - f38;
+    f92 = f36 + f38;
+    f93 = f40 - f42;
+    f94 = f40 + f42;
+    f95 = f44 - f46;
+    f96 = f44 + f46;
+    f97 = MUL_C(COEF_CONST(0.7071067811865476), f94);
+    f98 = f34 - f97;
+    f99 = f34 + f97;
+    f100 = f92 + f96;
+    f101 = MUL_C(COEF_CONST(1.3065629648763766), f92);
+    f102 = MUL_C(COEF_CONST((-0.9238795325112866)), f100);
+    f103 = MUL_C(COEF_CONST((-0.5411961001461967)), f96);
+    f104 = f101 + f102;
+    f105 = f103 - f102;
+    f106 = f99 - f105;
+    f107 = f99 + f105;
+    f108 = f98 - f104;
+    f109 = f98 + f104;
+    f110 = f91 + f95;
+    f111 = MUL_C(COEF_CONST(1.3065629648763770), f91);
+    f112 = MUL_C(COEF_CONST((-0.3826834323650904)), f110);
+    f113 = MUL_C(COEF_CONST(0.5411961001461961), f95);
+    f114 = f111 + f112;
+    f115 = f113 - f112;
+    f116 = MUL_C(COEF_CONST(0.7071067811865476), f93);
+    f117 = f116 - f48;
+    f118 = f116 + f48;
+    f119 = f115 - f118;
+    f120 = f115 + f118;
+    f121 = f114 - f117;
+    f122 = f114 + f117;
+    f123 = f120 + f107;
+    f124 = MUL_C(COEF_CONST((-0.8971675863426361)), f120);
+    f125 = MUL_C(COEF_CONST(0.9951847266721968), f123);
+    f126 = MUL_C(COEF_CONST(1.0932018670017576), f107);
+    y[4] = f124 + f125;
+    y[60] = f126 - f125;
+    f129 = f122 + f109;
+    f130 = MUL_C(COEF_CONST((-0.6666556584777466)), f122);
+    f131 = MUL_C(COEF_CONST(0.9569403357322089), f129);
+    f132 = MUL_C(COEF_CONST(1.2472250129866713), f109);
+    y[12] = f130 + f131;
+    y[52] = f132 - f131;
+    f135 = f121 + f108;
+    f136 = MUL_C(COEF_CONST((-0.4105245275223571)), f121);
+    f137 = MUL_C(COEF_CONST(0.8819212643483549), f135);
+    f138 = MUL_C(COEF_CONST(1.3533180011743529), f108);
+    y[20] = f136 + f137;
+    y[44] = f138 - f137;
+    f141 = f119 + f106;
+    f142 = MUL_C(COEF_CONST((-0.1386171691990915)), f119);
+    f143 = MUL_C(COEF_CONST(0.7730104533627370), f141);
+    f144 = MUL_C(COEF_CONST(1.4074037375263826), f106);
+    y[28] = f142 + f143;
+    y[36] = f144 - f143;
+    f147 = f16 - f18;
+    f148 = f16 + f18;
+    f149 = MUL_C(COEF_CONST(0.7071067811865476), f148);
+    f150 = MUL_C(COEF_CONST(0.7071067811865476), f147);
+    f151 = f10 - f24;
+    f152 = f10 + f24;
+    f153 = MUL_C(COEF_CONST(0.7071067811865476), f152);
+    f154 = MUL_C(COEF_CONST(0.7071067811865476), f151);
+    f155 = f14 - f20;
+    f156 = f14 + f20;
+    f157 = MUL_C(COEF_CONST(0.7071067811865476), f156);
+    f158 = MUL_C(COEF_CONST(0.7071067811865476), f155);
+    f159 = f12 - f22;
+    f160 = f12 + f22;
+    f161 = MUL_C(COEF_CONST(0.7071067811865476), f160);
+    f162 = MUL_C(COEF_CONST(0.7071067811865476), f159);
+    f163 = f2 - f149;
+    f164 = f2 + f149;
+    f165 = f32 - f150;
+    f166 = f32 + f150;
+    f167 = f8 - f153;
+    f168 = f8 + f153;
+    f169 = f26 - f154;
+    f170 = f26 + f154;
+    f171 = f4 - f157;
+    f172 = f4 + f157;
+    f173 = f30 - f158;
+    f174 = f30 + f158;
+    f175 = f6 - f161;
+    f176 = f6 + f161;
+    f177 = f28 - f162;
+    f178 = f28 + f162;
+    f179 = f170 + f168;
+    f180 = MUL_C(COEF_CONST((-0.5411961001461969)), f170);
+    f181 = MUL_C(COEF_CONST(0.9238795325112867), f179);
+    f182 = MUL_C(COEF_CONST(1.3065629648763766), f168);
+    f183 = f180 + f181;
+    f184 = f182 - f181;
+    f185 = f169 + f167;
+    f186 = MUL_C(COEF_CONST(1.3065629648763770), f169);
+    f187 = MUL_C(COEF_CONST((-0.3826834323650904)), f185);
+    f188 = MUL_C(COEF_CONST(0.5411961001461961), f167);
+    f189 = f186 + f187;
+    f190 = f188 - f187;
+    f191 = f178 + f176;
+    f192 = MUL_C(COEF_CONST((-0.5411961001461969)), f178);
+    f193 = MUL_C(COEF_CONST(0.9238795325112867), f191);
+    f194 = MUL_C(COEF_CONST(1.3065629648763766), f176);
+    f195 = f192 + f193;
+    f196 = f194 - f193;
+    f197 = f177 + f175;
+    f198 = MUL_C(COEF_CONST(1.3065629648763770), f177);
+    f199 = MUL_C(COEF_CONST((-0.3826834323650904)), f197);
+    f200 = MUL_C(COEF_CONST(0.5411961001461961), f175);
+    f201 = f198 + f199;
+    f202 = f200 - f199;
+    f203 = f164 - f183;
+    f204 = f164 + f183;
+    f205 = f166 - f184;
+    f206 = f166 + f184;
+    f207 = f163 - f189;
+    f208 = f163 + f189;
+    f209 = f165 - f190;
+    f210 = f165 + f190;
+    f211 = f172 - f195;
+    f212 = f172 + f195;
+    f213 = f174 - f196;
+    f214 = f174 + f196;
+    f215 = f171 - f201;
+    f216 = f171 + f201;
+    f217 = f173 - f202;
+    f218 = f173 + f202;
+    f219 = f214 + f212;
+    f220 = MUL_C(COEF_CONST((-0.7856949583871021)), f214);
+    f221 = MUL_C(COEF_CONST(0.9807852804032304), f219);
+    f222 = MUL_C(COEF_CONST(1.1758756024193588), f212);
+    f223 = f220 + f221;
+    f224 = f222 - f221;
+    f225 = f218 + f216;
+    f226 = MUL_C(COEF_CONST(0.2758993792829431), f218);
+    f227 = MUL_C(COEF_CONST(0.5555702330196022), f225);
+    f228 = MUL_C(COEF_CONST(1.3870398453221475), f216);
+    f229 = f226 + f227;
+    f230 = f228 - f227;
+    f231 = f213 + f211;
+    f232 = MUL_C(COEF_CONST(1.1758756024193591), f213);
+    f233 = MUL_C(COEF_CONST((-0.1950903220161287)), f231);
+    f234 = MUL_C(COEF_CONST(0.7856949583871016), f211);
+    f235 = f232 + f233;
+    f236 = f234 - f233;
+    f237 = f217 + f215;
+    f238 = MUL_C(COEF_CONST(1.3870398453221473), f217);
+    f239 = MUL_C(COEF_CONST((-0.8314696123025455)), f237);
+    f240 = MUL_C(COEF_CONST((-0.2758993792829436)), f215);
+    f241 = f238 + f239;
+    f242 = f240 - f239;
+    f243 = f204 - f223;
+    f244 = f204 + f223;
+    f245 = f206 - f224;
+    f246 = f206 + f224;
+    f247 = f208 - f229;
+    f248 = f208 + f229;
+    f249 = f210 - f230;
+    f250 = f210 + f230;
+    f251 = f203 - f235;
+    f252 = f203 + f235;
+    f253 = f205 - f236;
+    f254 = f205 + f236;
+    f255 = f207 - f241;
+    f256 = f207 + f241;
+    f257 = f209 - f242;
+    f258 = f209 + f242;
+    f259 = f246 + f244;
+    f260 = MUL_C(COEF_CONST((-0.9497277818777543)), f246);
+    f261 = MUL_C(COEF_CONST(0.9987954562051724), f259);
+    f262 = MUL_C(COEF_CONST(1.0478631305325905), f244);
+    y[2] = f260 + f261;
+    y[62] = f262 - f261;
+    f265 = f250 + f248;
+    f266 = MUL_C(COEF_CONST((-0.7270510732912801)), f250);
+    f267 = MUL_C(COEF_CONST(0.9700312531945440), f265);
+    f268 = MUL_C(COEF_CONST(1.2130114330978079), f248);
+    y[10] = f266 + f267;
+    y[54] = f268 - f267;
+    f271 = f254 + f252;
+    f272 = MUL_C(COEF_CONST((-0.4764341996931611)), f254);
+    f273 = MUL_C(COEF_CONST(0.9039892931234433), f271);
+    f274 = MUL_C(COEF_CONST(1.3315443865537255), f252);
+    y[18] = f272 + f273;
+    y[46] = f274 - f273;
+    f277 = f258 + f256;
+    f278 = MUL_C(COEF_CONST((-0.2075082269882114)), f258);
+    f279 = MUL_C(COEF_CONST(0.8032075314806448), f277);
+    f280 = MUL_C(COEF_CONST(1.3989068359730783), f256);
+    y[26] = f278 + f279;
+    y[38] = f280 - f279;
+    f283 = f245 + f243;
+    f284 = MUL_C(COEF_CONST(0.0693921705079408), f245);
+    f285 = MUL_C(COEF_CONST(0.6715589548470183), f283);
+    f286 = MUL_C(COEF_CONST(1.4125100802019774), f243);
+    y[34] = f284 + f285;
+    y[30] = f286 - f285;
+    f289 = f249 + f247;
+    f290 = MUL_C(COEF_CONST(0.3436258658070505), f249);
+    f291 = MUL_C(COEF_CONST(0.5141027441932217), f289);
+    f292 = MUL_C(COEF_CONST(1.3718313541934939), f247);
+    y[42] = f290 + f291;
+    y[22] = f292 - f291;
+    f295 = f253 + f251;
+    f296 = MUL_C(COEF_CONST(0.6046542117908007), f253);
+    f297 = MUL_C(COEF_CONST(0.3368898533922201), f295);
+    f298 = MUL_C(COEF_CONST(1.2784339185752409), f251);
+    y[50] = f296 + f297;
+    y[14] = f298 - f297;
+    f301 = f257 + f255;
+    f302 = MUL_C(COEF_CONST(0.8424460355094192), f257);
+    f303 = MUL_C(COEF_CONST(0.1467304744553618), f301);
+    f304 = MUL_C(COEF_CONST(1.1359069844201428), f255);
+    y[58] = f302 + f303;
+    y[6] = f304 - f303;
+    f307 = t2[1] + t2[63];
+    f308 = MUL_C(COEF_CONST(1.0242400472191162), t2[1]);
+    f309 = MUL_C(COEF_CONST((-0.9996988186962043)), f307);
+    f310 = MUL_C(COEF_CONST((-0.9751575901732922)), t2[63]);
+    f311 = f308 + f309;
+    f312 = f310 - f309;
+    f313 = t2[3] + t2[61];
+    f314 = MUL_C(COEF_CONST(1.0708550202783571),t2[3]);
+    f315 = MUL_C(COEF_CONST((-0.9972904566786902)), f313);
+    f316 = MUL_C(COEF_CONST((-0.9237258930790232)), t2[61]);
+    f317 = f314 + f315;
+    f318 = f316 - f315;
+    f319 = t2[5] + t2[59];
+    f320 = MUL_C(COEF_CONST(1.1148902097979256), t2[5]);
+    f321 = MUL_C(COEF_CONST((-0.9924795345987101)), f319);
+    f322 = MUL_C(COEF_CONST((-0.8700688593994945)), t2[59]);
+    f323 = f320 + f321;
+    f324 = f322 - f321;
+    f325 = t2[7] + t2[57];
+    f326 = MUL_C(COEF_CONST(1.1562395311492426), t2[7]);
+    f327 = MUL_C(COEF_CONST((-0.9852776423889412)), f325);
+    f328 = MUL_C(COEF_CONST((-0.8143157536286398)), t2[57]);
+    f329 = f326 + f327;
+    f330 = f328 - f327;
+    f331 = t2[9] + t2[55];
+    f332 = MUL_C(COEF_CONST(1.1948033701953984), t2[9]);
+    f333 = MUL_C(COEF_CONST((-0.9757021300385286)), f331);
+    f334 = MUL_C(COEF_CONST((-0.7566008898816589)), t2[55]);
+    f335 = f332 + f333;
+    f336 = f334 - f333;
+    f337 = t2[11] + t2[53];
+    f338 = MUL_C(COEF_CONST(1.2304888232703382), t2[11]);
+    f339 = MUL_C(COEF_CONST((-0.9637760657954400)), f337);
+    f340 = MUL_C(COEF_CONST((-0.6970633083205418)), t2[53]);
+    f341 = f338 + f339;
+    f342 = f340 - f339;
+    f343 = t2[13] + t2[51];
+    f344 = MUL_C(COEF_CONST(1.2632099209919279), t2[13]);
+    f345 = MUL_C(COEF_CONST((-0.9495281805930368)), f343);
+    f346 = MUL_C(COEF_CONST((-0.6358464401941457)), t2[51]);
+    f347 = f344 + f345;
+    f348 = f346 - f345;
+    f349 = t2[15] + t2[49];
+    f350 = MUL_C(COEF_CONST(1.2928878353697266), t2[15]);
+    f351 = MUL_C(COEF_CONST((-0.9329927988347391)), f349);
+    f352 = MUL_C(COEF_CONST((-0.5730977622997515)), t2[49]);
+    f353 = f350 + f351;
+    f354 = f352 - f351;
+    f355 = t2[17] + t2[47];
+    f356 = MUL_C(COEF_CONST(1.3194510697085207), t2[17]);
+    f357 = MUL_C(COEF_CONST((-0.9142097557035306)), f355);
+    f358 = MUL_C(COEF_CONST((-0.5089684416985405)), t2[47]);
+    f359 = f356 + f357;
+    f360 = f358 - f357;
+    f361 = t2[19] + t2[45];
+    f362 = MUL_C(COEF_CONST(1.3428356308501219), t2[19]);
+    f363 = MUL_C(COEF_CONST((-0.8932243011955153)), f361);
+    f364 = MUL_C(COEF_CONST((-0.4436129715409087)), t2[45]);
+    f365 = f362 + f363;
+    f366 = f364 - f363;
+    f367 = t2[21] + t2[43];
+    f368 = MUL_C(COEF_CONST(1.3629851833384954), t2[21]);
+    f369 = MUL_C(COEF_CONST((-0.8700869911087115)), f367);
+    f370 = MUL_C(COEF_CONST((-0.3771887988789276)), t2[43]);
+    f371 = f368 + f369;
+    f372 = f370 - f369;
+    f373 = t2[23] + t2[41];
+    f374 = MUL_C(COEF_CONST(1.3798511851368040), t2[23]);
+    f375 = MUL_C(COEF_CONST((-0.8448535652497072)), f373);
+    f376 = MUL_C(COEF_CONST((-0.3098559453626103)), t2[41]);
+    f377 = f374 + f375;
+    f378 = f376 - f375;
+    f379 = t2[25] + t2[39];
+    f380 = MUL_C(COEF_CONST(1.3933930045694289), t2[25]);
+    f381 = MUL_C(COEF_CONST((-0.8175848131515840)), f379);
+    f382 = MUL_C(COEF_CONST((-0.2417766217337392)), t2[39]);
+    f383 = f380 + f381;
+    f384 = f382 - f381;
+    f385 = t2[27] + t2[37];
+    f386 = MUL_C(COEF_CONST(1.4035780182072330), t2[27]);
+    f387 = MUL_C(COEF_CONST((-0.7883464276266061)), f385);
+    f388 = MUL_C(COEF_CONST((-0.1731148370459791)), t2[37]);
+    f389 = f386 + f387;
+    f390 = f388 - f387;
+    f391 = t2[29] + t2[35];
+    f392 = MUL_C(COEF_CONST(1.4103816894602614), t2[29]);
+    f393 = MUL_C(COEF_CONST((-0.7572088465064846)), f391);
+    f394 = MUL_C(COEF_CONST((-0.1040360035527078)), t2[35]);
+    f395 = f392 + f393;
+    f396 = f394 - f393;
+    f397 = t2[31] + t2[33];
+    f398 = MUL_C(COEF_CONST(1.4137876276885337), t2[31]);
+    f399 = MUL_C(COEF_CONST((-0.7242470829514670)), f397);
+    f400 = MUL_C(COEF_CONST((-0.0347065382144002)), t2[33]);
+    f401 = f398 + f399;
+    f402 = f400 - f399;
+    f403 = f312 - f402;
+    f404 = f312 + f402;
+    f405 = f318 - f396;
+    f406 = f318 + f396;
+    f407 = f324 - f390;
+    f408 = f324 + f390;
+    f409 = f330 - f384;
+    f410 = f330 + f384;
+    f411 = f336 - f378;
+    f412 = f336 + f378;
+    f413 = f342 - f372;
+    f414 = f342 + f372;
+    f415 = f348 - f366;
+    f416 = f348 + f366;
+    f417 = f354 - f360;
+    f418 = f354 + f360;
+    f419 = f404 - f418;
+    f420 = f404 + f418;
+    f421 = f406 - f416;
+    f422 = f406 + f416;
+    f423 = f408 - f414;
+    f424 = f408 + f414;
+    f425 = f410 - f412;
+    f426 = f410 + f412;
+    f427 = f420 - f426;
+    f428 = f420 + f426;
+    f429 = f422 - f424;
+    f430 = f422 + f424;
+    f431 = f428 - f430;
+    y[1] = f428 + f430;
+    f433 = MUL_C(COEF_CONST(0.7071067811865476), f431);
+    f434 = f427 + f429;
+    f435 = MUL_C(COEF_CONST(1.3065629648763766), f427);
+    f436 = MUL_C(COEF_CONST((-0.9238795325112866)), f434);
+    f437 = MUL_C(COEF_CONST((-0.5411961001461967)), f429);
+    f438 = f435 + f436;
+    f439 = f437 - f436;
+    f440 = f419 + f425;
+    f441 = MUL_C(COEF_CONST(1.1758756024193588), f419);
+    f442 = MUL_C(COEF_CONST((-0.9807852804032304)), f440);
+    f443 = MUL_C(COEF_CONST((-0.7856949583871021)), f425);
+    f444 = f441 + f442;
+    f445 = f443 - f442;
+    f446 = f421 + f423;
+    f447 = MUL_C(COEF_CONST(1.3870398453221473), f421);
+    f448 = MUL_C(COEF_CONST((-0.8314696123025455)), f446);
+    f449 = MUL_C(COEF_CONST((-0.2758993792829436)), f423);
+    f450 = f447 + f448;
+    f451 = f449 - f448;
+    f452 = f445 - f451;
+    f453 = f445 + f451;
+    f454 = MUL_C(COEF_CONST(0.7071067811865476), f452);
+    f455 = f444 - f450;
+    f456 = f444 + f450;
+    f457 = MUL_C(COEF_CONST(0.7071067811865476), f456);
+    f458 = f454 - f457;
+    f459 = f454 + f457;
+    f460 = f405 - f407;
+    f461 = f405 + f407;
+    f462 = f409 - f411;
+    f463 = f409 + f411;
+    f464 = f413 - f415;
+    f465 = f413 + f415;
+    f466 = MUL_C(COEF_CONST(0.7071067811865476), f463);
+    f467 = f403 - f466;
+    f468 = f403 + f466;
+    f469 = f461 + f465;
+    f470 = MUL_C(COEF_CONST(1.3065629648763766), f461);
+    f471 = MUL_C(COEF_CONST((-0.9238795325112866)), f469);
+    f472 = MUL_C(COEF_CONST((-0.5411961001461967)), f465);
+    f473 = f470 + f471;
+    f474 = f472 - f471;
+    f475 = f468 - f474;
+    f476 = f468 + f474;
+    f477 = f467 - f473;
+    f478 = f467 + f473;
+    f479 = f460 + f464;
+    f480 = MUL_C(COEF_CONST(1.3065629648763770), f460);
+    f481 = MUL_C(COEF_CONST((-0.3826834323650904)), f479);
+    f482 = MUL_C(COEF_CONST(0.5411961001461961), f464);
+    f483 = f480 + f481;
+    f484 = f482 - f481;
+    f485 = MUL_C(COEF_CONST(0.7071067811865476), f462);
+    f486 = f485 - f417;
+    f487 = f485 + f417;
+    f488 = f484 - f487;
+    f489 = f484 + f487;
+    f490 = f483 - f486;
+    f491 = f483 + f486;
+    f492 = f489 + f476;
+    f493 = MUL_C(COEF_CONST((-0.8971675863426361)), f489);
+    f494 = MUL_C(COEF_CONST(0.9951847266721968), f492);
+    f495 = MUL_C(COEF_CONST(1.0932018670017576), f476);
+    f496 = f493 + f494;
+    f497 = f495 - f494;
+    f498 = f491 + f478;
+    f499 = MUL_C(COEF_CONST((-0.6666556584777466)), f491);
+    f500 = MUL_C(COEF_CONST(0.9569403357322089), f498);
+    f501 = MUL_C(COEF_CONST(1.2472250129866713), f478);
+    f502 = f499 + f500;
+    f503 = f501 - f500;
+    f504 = f490 + f477;
+    f505 = MUL_C(COEF_CONST((-0.4105245275223571)), f490);
+    f506 = MUL_C(COEF_CONST(0.8819212643483549), f504);
+    f507 = MUL_C(COEF_CONST(1.3533180011743529), f477);
+    f508 = f505 + f506;
+    f509 = f507 - f506;
+    f510 = f488 + f475;
+    f511 = MUL_C(COEF_CONST((-0.1386171691990915)), f488);
+    f512 = MUL_C(COEF_CONST(0.7730104533627370), f510);
+    f513 = MUL_C(COEF_CONST(1.4074037375263826), f475);
+    f514 = f511 + f512;
+    f515 = f513 - f512;
+    f516 = f311 + f401;
+    f517 = f311 - f401;
+    f518 = f317 + f395;
+    f519 = f395 - f317;
+    f520 = f323 + f389;
+    f521 = f323 - f389;
+    f522 = f329 + f383;
+    f523 = f383 - f329;
+    f524 = f335 + f377;
+    f525 = f335 - f377;
+    f526 = f341 + f371;
+    f527 = f371 - f341;
+    f528 = f347 + f365;
+    f529 = f347 - f365;
+    f530 = f353 + f359;
+    f531 = f359 - f353;
+    f532 = f517 - f531;
+    f533 = f517 + f531;
+    f534 = f519 - f529;
+    f535 = f519 + f529;
+    f536 = f521 - f527;
+    f537 = f521 + f527;
+    f538 = f523 - f525;
+    f539 = f523 + f525;
+    f540 = f533 - f539;
+    f541 = f533 + f539;
+    f542 = f535 - f537;
+    f543 = f535 + f537;
+    f544 = f541 - f543;
+    y[63] = f541 + f543;
+    f546 = MUL_C(COEF_CONST(0.7071067811865476), f544);
+    f547 = f540 + f542;
+    f548 = MUL_C(COEF_CONST(1.3065629648763766), f540);
+    f549 = MUL_C(COEF_CONST((-0.9238795325112866)), f547);
+    f550 = MUL_C(COEF_CONST((-0.5411961001461967)), f542);
+    f551 = f548 + f549;
+    f552 = f550 - f549;
+    f553 = f532 + f538;
+    f554 = MUL_C(COEF_CONST(1.1758756024193588), f532);
+    f555 = MUL_C(COEF_CONST((-0.9807852804032304)), f553);
+    f556 = MUL_C(COEF_CONST((-0.7856949583871021)), f538);
+    f557 = f554 + f555;
+    f558 = f556 - f555;
+    f559 = f534 + f536;
+    f560 = MUL_C(COEF_CONST(1.3870398453221473), f534);
+    f561 = MUL_C(COEF_CONST((-0.8314696123025455)), f559);
+    f562 = MUL_C(COEF_CONST((-0.2758993792829436)), f536);
+    f563 = f560 + f561;
+    f564 = f562 - f561;
+    f565 = f558 - f564;
+    f566 = f558 + f564;
+    f567 = MUL_C(COEF_CONST(0.7071067811865476), f565);
+    f568 = f557 - f563;
+    f569 = f557 + f563;
+    f570 = MUL_C(COEF_CONST(0.7071067811865476), f569);
+    f571 = f567 - f570;
+    f572 = f567 + f570;
+    f573 = MUL_C(COEF_CONST(0.5024192861881557), f516);
+    f574 = MUL_C(COEF_CONST(0.5224986149396889), f518);
+    f575 = MUL_C(COEF_CONST(0.5669440348163577), f520);
+    f576 = MUL_C(COEF_CONST(0.6468217833599901), f522);
+    f577 = MUL_C(COEF_CONST(0.7881546234512502), f524);
+    f578 = MUL_C(COEF_CONST(1.0606776859903471), f526);
+    f579 = MUL_C(COEF_CONST(1.7224470982383342), f528);
+    f580 = MUL_C(COEF_CONST(5.1011486186891553), f530);
+    f581 = f573 + f580;
+    f582 = f573 - f580;
+    f583 = f574 + f579;
+    f584 = f579 - f574;
+    f585 = f575 + f578;
+    f586 = f575 - f578;
+    f587 = f576 + f577;
+    f588 = f577 - f576;
+    f589 = f582 - f588;
+    f590 = f582 + f588;
+    f591 = f584 - f586;
+    f592 = f584 + f586;
+    f593 = f590 - f592;
+    f594 = f590 + f592;
+    f595 = MUL_C(COEF_CONST(0.7071067811865476), f593);
+    f596 = f589 + f591;
+    f597 = MUL_C(COEF_CONST(1.3065629648763766), f589);
+    f598 = MUL_C(COEF_CONST((-0.9238795325112866)), f596);
+    f599 = MUL_C(COEF_CONST((-0.5411961001461967)), f591);
+    f600 = f597 + f598;
+    f601 = f599 - f598;
+    f602 = f583 + f585;
+    f603 = f585 - f583;
+    f604 = MUL_C(COEF_CONST(0.7071067811865476), f603);
+    f605 = MUL_C(COEF_CONST(0.7071067811865476), f602);
+    f606 = f581 - f604;
+    f607 = f581 + f604;
+    f608 = f605 - f587;
+    f609 = f587 + f605;
+    f610 = f607 - f609;
+    f611 = MUL_C(COEF_CONST((-0.7856949583871021)), f609);
+    f612 = MUL_C(COEF_CONST(0.9807852804032304), f610);
+    f613 = MUL_C(COEF_CONST(1.1758756024193588), f607);
+    f614 = f612 - f611;
+    f615 = f613 - f612;
+    f616 = f608 + f606;
+    f617 = MUL_C(COEF_CONST(0.2758993792829431), f608);
+    f618 = MUL_C(COEF_CONST(0.5555702330196022), f616);
+    f619 = MUL_C(COEF_CONST(1.3870398453221475), f606);
+    f620 = f617 + f618;
+    f621 = f619 - f618;
+    f622 = f594 + f614;
+    f623 = f614 + f601;
+    f624 = f601 + f621;
+    f625 = f621 + f595;
+    f626 = f595 + f620;
+    f627 = f620 + f600;
+    f628 = f600 + f615;
+    y[5] = f496 - f615;
+    y[3] = f496 + f615;
+    y[9] = f453 - f568;
+    y[7] = f453 + f568;
+    y[13] = f502 - f628;
+    y[11] = f502 + f628;
+    y[17] = f439 - f551;
+    y[15] = f439 + f551;
+    y[21] = f508 - f627;
+    y[19] = f508 + f627;
+    y[25] = f459 - f571;
+    y[23] = f459 + f571;
+    y[29] = f514 - f626;
+    y[27] = f514 + f626;
+    y[33] = f433 - f546;
+    y[31] = f433 + f546;
+    y[37] = f515 - f625;
+    y[35] = f515 + f625;
+    y[41] = f458 - f572;
+    y[39] = f458 + f572;
+    y[45] = f509 - f624;
+    y[43] = f509 + f624;
+    y[49] = f438 - f552;
+    y[47] = f438 + f552;
+    y[53] = f503 - f623;
+    y[51] = f503 + f623;
+    y[57] = f455 - f566;
+    y[55] = f455 + f566;
+    y[61] = f497 - f622;
+    y[59] = f497 + f622;
+}
+
+void DST2_64_unscaled(real_t *y, real_t *x)
+{
+    int16_t i0;
+    real_t f2, f3, f4, f5, f6, f7;
+    real_t f8, f9, f10, f11, f12, f13;
+    real_t f14, f15, f16, f17, f18, f19;
+    real_t f20, f21, f22, f23, f24, f25;
+    real_t f26, f27, f28, f29, f30, f31;
+    real_t f32, f33, f34, f35, f36, f37;
+    real_t f38, f39, f40, f41, f42, f43;
+    real_t f44, f45, f46, f47, f48, f49;
+    real_t f50, f51, f52, f53, f54, f55;
+    real_t f56, f57, f58, f59, f60, f61;
+    real_t f62, f63, f64, f65, f66, f67;
+    real_t f68, f69, f70, f71, f72, f73;
+    real_t f74, f75, f76, f77, f78, f79;
+    real_t f80, f81, f82, f83, f84, f85;
+    real_t f86, f87, f88, f89, f90, f91;
+    real_t f92, f93, f94, f95, f96, f97;
+    real_t f98, f99, f100, f101, f102, f103;
+    real_t f104, f105, f106, f107, f108, f109;
+    real_t f110, f111, f112, f113, f114, f115;
+    real_t f116, f117, f118, f119, f120, f121;
+    real_t f122, f123, f124, f125, f126, f127;
+    real_t f128, f129, f130, f131, f132, f133;
+    real_t f134, f135, f136, f137, f138, f139;
+    real_t f140, f141, f142, f143, f144, f145;
+    real_t f146, f147, f148, f149, f150, f151;
+    real_t f152, f153, f154, f155, f156, f157;
+    real_t f158, f159, f160, f161, f162, f163;
+    real_t f164, f165, f166, f167, f168, f169;
+    real_t f170, f171, f172, f173, f174, f175;
+    real_t f176, f177, f178, f179, f180, f181;
+    real_t f182, f183, f184, f185, f186, f187;
+    real_t f188, f189, f190, f191, f192, f193;
+    real_t f194, f195, f196, f197, f198, f199;
+    real_t f200, f201, f202, f203, f204, f205;
+    real_t f206, f207, f208, f209, f210, f211;
+    real_t f212, f213, f214, f215, f216, f217;
+    real_t f218, f219, f220, f221, f222, f223;
+    real_t f224, f225, f226, f227, f228, f229;
+    real_t f230, f231, f232, f233, f234, f235;
+    real_t f236, f237, f238, f239, f240, f241;
+    real_t f242, f243, f244, f245, f246, f247;
+    real_t f248, f249, f250, f251, f252, f253;
+    real_t f254, f255, f256, f257, f258, f259;
+    real_t f260, f261, f264, f265, f266, f267;
+    real_t f270, f271, f272, f273, f276, f277;
+    real_t f278, f279, f282, f283, f284, f285;
+    real_t f288, f289, f290, f291, f294, f295;
+    real_t f296, f297, f300, f301, f302, f303;
+    real_t f306, f307, f308, f309, f312, f313;
+    real_t f314, f315, f318, f319, f320, f321;
+    real_t f324, f325, f326, f327, f330, f331;
+    real_t f332, f333, f336, f337, f338, f339;
+    real_t f342, f343, f344, f345, f348, f349;
+    real_t f350, f351, f354, f355, f356, f357;
+    real_t f358, f359, f360, f361, f362, f363;
+    real_t f364, f365, f366, f367, f368, f369;
+    real_t f370, f371, f372, f373, f374, f375;
+    real_t f376, f377, f378, f379, f380, f381;
+    real_t f382, f383, f384, f385, f386, f387;
+    real_t f388, f389, f390, f391, f392, f393;
+    real_t f394, f395, f396, f397, f398, f399;
+    real_t f400, f401, f402, f403, f404, f405;
+    real_t f406, f407, f408, f409, f410, f411;
+    real_t f412, f413, f414, f415, f416, f417;
+    real_t f418, f419, f420, f421, f422, f423;
+    real_t f424, f425, f426, f427, f428, f429;
+    real_t f430, f431, f432, f433, f434, f435;
+    real_t f436, f437, f438, f439, f440, f441;
+    real_t f442, f443, f444, f445, f446, f447;
+    real_t f448, f449, f450, f451, f452, f453;
+    real_t f454, f455, f456, f457, f458, f459;
+    real_t f460, f461, f462, f463, f464, f465;
+    real_t f466, f467, f468, f469, f470, f471;
+    real_t f472, f473, f474, f475, f476, f477;
+    real_t f478, f479, f480, f481, f482, f483;
+    real_t f484, f485, f486, f487, f488, f489;
+    real_t f490, f491, f492, f493, f494, f495;
+    real_t f496, f497, f498, f499, f500, f501;
+    real_t f504, f505, f506, f507, f510, f511;
+    real_t f512, f513, f516, f517, f518, f519;
+    real_t f522, f523, f524, f525, f528, f529;
+    real_t f530, f531, f534, f535, f536, f537;
+    real_t f540, f541, f542, f543, f546, f547;
+    real_t f548, f549, f550, f551, f552, f553;
+    real_t f554, f555, f556, f557, f558, f559;
+    real_t f560, f561, f562, f563, f564, f565;
+    real_t f566, f567, f568, f569, f570, f571;
+    real_t f572, f573, f574, f577, f578, f579;
+    real_t f580, f583, f584, f585, f586, f587;
+    real_t f588, f589, f590, f591, f592, f593;
+    real_t f594, f595, f596, f597, f598, f603;
+    real_t f604, f605, f606, f607, f608, f609;
+    real_t f610, f611, f612, f613, f614, f615;
+    real_t f616, f617, f618, f619, f620, f621;
+    real_t f622, f623, f624, f625, f626, f627;
+    real_t f628, f629, f630, f631, f632, f633;
+    real_t f634, f635, f636, f637, f638, f639;
+    real_t f640, f641, f642, f643, f644, f645;
+    real_t f646, f647, f648, f649, f650;
+    ALIGN static real_t t2[64];
+
+    for (i0=0; i0<32; i0++)
+    {
+        t2[2*i0+1] = x[i0] - x[-i0+63];
+        t2[2*i0] = x[i0] + x[-i0+63];
+    }
+    f2 = t2[2] + t2[4];
+    f3 = t2[4] - t2[2];
+    f4 = t2[6] + t2[8];
+    f5 = t2[8] - t2[6];
+    f6 = t2[10] + t2[12];
+    f7 = t2[12] - t2[10];
+    f8 = t2[14] + t2[16];
+    f9 = t2[16] - t2[14];
+    f10 = t2[18] + t2[20];
+    f11 = t2[20] - t2[18];
+    f12 = t2[22] + t2[24];
+    f13 = t2[24] - t2[22];
+    f14 = t2[26] + t2[28];
+    f15 = t2[28] - t2[26];
+    f16 = t2[30] + t2[32];
+    f17 = t2[32] - t2[30];
+    f18 = t2[34] + t2[36];
+    f19 = t2[36] - t2[34];
+    f20 = t2[38] + t2[40];
+    f21 = t2[40] - t2[38];
+    f22 = t2[42] + t2[44];
+    f23 = t2[44] - t2[42];
+    f24 = t2[46] + t2[48];
+    f25 = t2[48] - t2[46];
+    f26 = t2[50] + t2[52];
+    f27 = t2[52] - t2[50];
+    f28 = t2[54] + t2[56];
+    f29 = t2[56] - t2[54];
+    f30 = t2[58] + t2[60];
+    f31 = t2[60] - t2[58];
+    f32 = MUL_C(COEF_CONST(0.7071067811865476), f17);
+    f33 = t2[0] - f32;
+    f34 = t2[0] + f32;
+    f35 = f9 + f25;
+    f36 = MUL_C(COEF_CONST(1.3065629648763766), f9);
+    f37 = MUL_C(COEF_CONST((-0.9238795325112866)), f35);
+    f38 = MUL_C(COEF_CONST((-0.5411961001461967)), f25);
+    f39 = f36 + f37;
+    f40 = f38 - f37;
+    f41 = f34 - f40;
+    f42 = f34 + f40;
+    f43 = f33 - f39;
+    f44 = f33 + f39;
+    f45 = MUL_C(COEF_CONST(2.5629154477415064), f5);
+    f46 = MUL_C(COEF_CONST(0.8999762231364158), f13);
+    f47 = MUL_C(COEF_CONST(0.5097955791041592), f29);
+    f48 = MUL_C(COEF_CONST(0.6013448869350453), f21);
+    f49 = f45 - f47;
+    f50 = f45 + f47;
+    f51 = f46 - f48;
+    f52 = f46 + f48;
+    f53 = f50 + f52;
+    f54 = MUL_C(COEF_CONST(1.3065629648763770), f50);
+    f55 = MUL_C(COEF_CONST((-0.3826834323650904)), f53);
+    f56 = MUL_C(COEF_CONST(0.5411961001461961), f52);
+    f57 = f54 + f55;
+    f58 = f56 - f55;
+    f59 = f51 - f49;
+    f60 = f49 + f51;
+    f61 = MUL_C(COEF_CONST(0.7071067811865476), f60);
+    f62 = f58 - f61;
+    f63 = f57 - f61;
+    f64 = f59 + f57;
+    f65 = f42 - f58;
+    f66 = f42 + f58;
+    f67 = f44 + f62;
+    f68 = f44 - f62;
+    f69 = f43 - f63;
+    f70 = f43 + f63;
+    f71 = f41 + f64;
+    f72 = f41 - f64;
+    f73 = f7 - f11;
+    f74 = f7 + f11;
+    f75 = f15 - f19;
+    f76 = f15 + f19;
+    f77 = f23 - f27;
+    f78 = f23 + f27;
+    f79 = MUL_C(COEF_CONST(0.7071067811865476), f76);
+    f80 = f3 - f79;
+    f81 = f3 + f79;
+    f82 = f74 + f78;
+    f83 = MUL_C(COEF_CONST(1.3065629648763766), f74);
+    f84 = MUL_C(COEF_CONST((-0.9238795325112866)), f82);
+    f85 = MUL_C(COEF_CONST((-0.5411961001461967)), f78);
+    f86 = f83 + f84;
+    f87 = f85 - f84;
+    f88 = f81 - f87;
+    f89 = f81 + f87;
+    f90 = f80 - f86;
+    f91 = f80 + f86;
+    f92 = MUL_C(COEF_CONST(0.7071067811865476), f75);
+    f93 = f31 - f92;
+    f94 = f31 + f92;
+    f95 = f77 + f73;
+    f96 = MUL_C(COEF_CONST(1.3065629648763766), f77);
+    f97 = MUL_C(COEF_CONST((-0.9238795325112866)), f95);
+    f98 = MUL_C(COEF_CONST((-0.5411961001461967)), f73);
+    f99 = f96 + f97;
+    f100 = f98 - f97;
+    f101 = f94 - f100;
+    f102 = f94 + f100;
+    f103 = f93 - f99;
+    f104 = f93 + f99;
+    f105 = f102 + f89;
+    f106 = MUL_C(COEF_CONST((-0.8971675863426361)), f102);
+    f107 = MUL_C(COEF_CONST(0.9951847266721968), f105);
+    f108 = MUL_C(COEF_CONST(1.0932018670017576), f89);
+    f109 = f106 + f107;
+    f110 = f108 - f107;
+    f111 = f91 - f104;
+    f112 = MUL_C(COEF_CONST((-0.6666556584777466)), f104);
+    f113 = MUL_C(COEF_CONST(0.9569403357322089), f111);
+    f114 = MUL_C(COEF_CONST(1.2472250129866713), f91);
+    f115 = f113 - f112;
+    f116 = f114 - f113;
+    f117 = f103 + f90;
+    f118 = MUL_C(COEF_CONST((-0.4105245275223571)), f103);
+    f119 = MUL_C(COEF_CONST(0.8819212643483549), f117);
+    f120 = MUL_C(COEF_CONST(1.3533180011743529), f90);
+    f121 = f118 + f119;
+    f122 = f120 - f119;
+    f123 = f88 - f101;
+    f124 = MUL_C(COEF_CONST((-0.1386171691990915)), f101);
+    f125 = MUL_C(COEF_CONST(0.7730104533627370), f123);
+    f126 = MUL_C(COEF_CONST(1.4074037375263826), f88);
+    f127 = f125 - f124;
+    f128 = f126 - f125;
+    f129 = f66 - f109;
+    f130 = f66 + f109;
+    f131 = f68 - f115;
+    f132 = f68 + f115;
+    f133 = f70 - f121;
+    f134 = f70 + f121;
+    f135 = f72 - f127;
+    f136 = f72 + f127;
+    f137 = f71 - f128;
+    f138 = f71 + f128;
+    f139 = f69 - f122;
+    f140 = f69 + f122;
+    f141 = f67 - f116;
+    f142 = f67 + f116;
+    f143 = f65 - f110;
+    f144 = f65 + f110;
+    f145 = f26 + f30;
+    f146 = f22 + f26;
+    f147 = f18 + f22;
+    f148 = f14 + f18;
+    f149 = f10 + f14;
+    f150 = f6 + f10;
+    f151 = f2 + f6;
+    f152 = MUL_C(COEF_CONST(0.7071067811865476), f148);
+    f153 = f152 - f30;
+    f154 = f30 + f152;
+    f155 = f146 + f150;
+    f156 = MUL_C(COEF_CONST(1.3065629648763766), f146);
+    f157 = MUL_C(COEF_CONST((-0.9238795325112866)), f155);
+    f158 = MUL_C(COEF_CONST((-0.5411961001461967)), f150);
+    f159 = f156 + f157;
+    f160 = f157 - f158;
+    f161 = f154 + f160;
+    f162 = f160 - f154;
+    f163 = f153 + f159;
+    f164 = f153 - f159;
+    f165 = f147 + f145;
+    f166 = f149 + f147;
+    f167 = f151 + f149;
+    f168 = MUL_C(COEF_CONST(0.7071067811865476), f166);
+    f169 = f168 - f145;
+    f170 = f145 + f168;
+    f171 = f165 + f167;
+    f172 = MUL_C(COEF_CONST(1.3065629648763766), f165);
+    f173 = MUL_C(COEF_CONST((-0.9238795325112866)), f171);
+    f174 = MUL_C(COEF_CONST((-0.5411961001461967)), f167);
+    f175 = f172 + f173;
+    f176 = f173 - f174;
+    f177 = f170 + f176;
+    f178 = f176 - f170;
+    f179 = f169 + f175;
+    f180 = f169 - f175;
+    f181 = MUL_C(COEF_CONST(0.5097955791041592), f178);
+    f182 = MUL_C(COEF_CONST(0.6013448869350453), f180);
+    f183 = MUL_C(COEF_CONST(0.8999762231364156), f179);
+    f184 = MUL_C(COEF_CONST(2.5629154477415055), f177);
+    f185 = f162 - f181;
+    f186 = f162 + f181;
+    f187 = f164 - f182;
+    f188 = f164 + f182;
+    f189 = f163 - f183;
+    f190 = f163 + f183;
+    f191 = f184 - f161;
+    f192 = f161 + f184;
+    f193 = MUL_C(COEF_CONST(0.5024192861881557), f186);
+    f194 = MUL_C(COEF_CONST(0.5224986149396889), f188);
+    f195 = MUL_C(COEF_CONST(0.5669440348163577), f190);
+    f196 = MUL_C(COEF_CONST(0.6468217833599901), f192);
+    f197 = MUL_C(COEF_CONST(0.7881546234512502), f191);
+    f198 = MUL_C(COEF_CONST(1.0606776859903471), f189);
+    f199 = MUL_C(COEF_CONST(1.7224470982383342), f187);
+    f200 = MUL_C(COEF_CONST(5.1011486186891553), f185);
+    f201 = MUL_C(COEF_CONST(0.7071067811865476), f16);
+    f202 = f201 - t2[62];
+    f203 = t2[62] + f201;
+    f204 = f24 + f8;
+    f205 = MUL_C(COEF_CONST(1.3065629648763766), f24);
+    f206 = MUL_C(COEF_CONST((-0.9238795325112866)), f204);
+    f207 = MUL_C(COEF_CONST((-0.5411961001461967)), f8);
+    f208 = f205 + f206;
+    f209 = f206 - f207;
+    f210 = f203 + f209;
+    f211 = f209 - f203;
+    f212 = f202 + f208;
+    f213 = f202 - f208;
+    f214 = f20 + f28;
+    f215 = f12 + f20;
+    f216 = f4 + f12;
+    f217 = MUL_C(COEF_CONST(0.7071067811865476), f215);
+    f218 = f217 - f28;
+    f219 = f28 + f217;
+    f220 = f214 + f216;
+    f221 = MUL_C(COEF_CONST(1.3065629648763766), f214);
+    f222 = MUL_C(COEF_CONST((-0.9238795325112866)), f220);
+    f223 = MUL_C(COEF_CONST((-0.5411961001461967)), f216);
+    f224 = f221 + f222;
+    f225 = f222 - f223;
+    f226 = f219 + f225;
+    f227 = f225 - f219;
+    f228 = f218 + f224;
+    f229 = f218 - f224;
+    f230 = MUL_C(COEF_CONST(0.5097955791041592), f227);
+    f231 = MUL_C(COEF_CONST(0.6013448869350453), f229);
+    f232 = MUL_C(COEF_CONST(0.8999762231364156), f228);
+    f233 = MUL_C(COEF_CONST(2.5629154477415055), f226);
+    f234 = f211 - f230;
+    f235 = f211 + f230;
+    f236 = f213 - f231;
+    f237 = f213 + f231;
+    f238 = f212 - f232;
+    f239 = f212 + f232;
+    f240 = f233 - f210;
+    f241 = f210 + f233;
+    f242 = f193 - f235;
+    f243 = f193 + f235;
+    f244 = f237 - f194;
+    f245 = f194 + f237;
+    f246 = f195 - f239;
+    f247 = f195 + f239;
+    f248 = f196 - f241;
+    f249 = f196 + f241;
+    f250 = f197 - f240;
+    f251 = f197 + f240;
+    f252 = f238 - f198;
+    f253 = f198 + f238;
+    f254 = f199 - f236;
+    f255 = f199 + f236;
+    f256 = f234 - f200;
+    f257 = f200 + f234;
+    f258 = f243 + f130;
+    f259 = MUL_C(COEF_CONST((-0.9751575901732920)), f243);
+    f260 = MUL_C(COEF_CONST(0.9996988186962043), f258);
+    f261 = MUL_C(COEF_CONST(1.0242400472191164), f130);
+    y[62] = f259 + f260;
+    y[0] = f261 - f260;
+    f264 = f132 - f245;
+    f265 = MUL_C(COEF_CONST((-0.9237258930790228)), f245);
+    f266 = MUL_C(COEF_CONST(0.9972904566786902), f264);
+    f267 = MUL_C(COEF_CONST(1.0708550202783576), f132);
+    y[60] = f266 - f265;
+    y[2] = f267 - f266;
+    f270 = f247 + f134;
+    f271 = MUL_C(COEF_CONST((-0.8700688593994936)), f247);
+    f272 = MUL_C(COEF_CONST(0.9924795345987100), f270);
+    f273 = MUL_C(COEF_CONST(1.1148902097979263), f134);
+    y[58] = f271 + f272;
+    y[4] = f273 - f272;
+    f276 = f249 + f136;
+    f277 = MUL_C(COEF_CONST((-0.8143157536286398)), f249);
+    f278 = MUL_C(COEF_CONST(0.9852776423889412), f276);
+    f279 = MUL_C(COEF_CONST(1.1562395311492426), f136);
+    y[56] = f277 + f278;
+    y[6] = f279 - f278;
+    f282 = f251 + f138;
+    f283 = MUL_C(COEF_CONST((-0.7566008898816587)), f251);
+    f284 = MUL_C(COEF_CONST(0.9757021300385286), f282);
+    f285 = MUL_C(COEF_CONST(1.1948033701953984), f138);
+    y[54] = f283 + f284;
+    y[8] = f285 - f284;
+    f288 = f140 - f253;
+    f289 = MUL_C(COEF_CONST((-0.6970633083205414)), f253);
+    f290 = MUL_C(COEF_CONST(0.9637760657954398), f288);
+    f291 = MUL_C(COEF_CONST(1.2304888232703384), f140);
+    y[52] = f290 - f289;
+    y[10] = f291 - f290;
+    f294 = f255 + f142;
+    f295 = MUL_C(COEF_CONST((-0.6358464401941451)), f255);
+    f296 = MUL_C(COEF_CONST(0.9495281805930367), f294);
+    f297 = MUL_C(COEF_CONST(1.2632099209919283), f142);
+    y[50] = f295 + f296;
+    y[12] = f297 - f296;
+    f300 = f144 - f257;
+    f301 = MUL_C(COEF_CONST((-0.5730977622997506)), f257);
+    f302 = MUL_C(COEF_CONST(0.9329927988347389), f300);
+    f303 = MUL_C(COEF_CONST(1.2928878353697271), f144);
+    y[48] = f302 - f301;
+    y[14] = f303 - f302;
+    f306 = f256 + f143;
+    f307 = MUL_C(COEF_CONST((-0.5089684416985408)), f256);
+    f308 = MUL_C(COEF_CONST(0.9142097557035307), f306);
+    f309 = MUL_C(COEF_CONST(1.3194510697085207), f143);
+    y[46] = f307 + f308;
+    y[16] = f309 - f308;
+    f312 = f254 + f141;
+    f313 = MUL_C(COEF_CONST((-0.4436129715409087)), f254);
+    f314 = MUL_C(COEF_CONST(0.8932243011955153), f312);
+    f315 = MUL_C(COEF_CONST(1.3428356308501219), f141);
+    y[44] = f313 + f314;
+    y[18] = f315 - f314;
+    f318 = f252 + f139;
+    f319 = MUL_C(COEF_CONST((-0.3771887988789273)), f252);
+    f320 = MUL_C(COEF_CONST(0.8700869911087114), f318);
+    f321 = MUL_C(COEF_CONST(1.3629851833384954), f139);
+    y[42] = f319 + f320;
+    y[20] = f321 - f320;
+    f324 = f250 + f137;
+    f325 = MUL_C(COEF_CONST((-0.3098559453626097)), f250);
+    f326 = MUL_C(COEF_CONST(0.8448535652497070), f324);
+    f327 = MUL_C(COEF_CONST(1.3798511851368043), f137);
+    y[40] = f325 + f326;
+    y[22] = f327 - f326;
+    f330 = f248 + f135;
+    f331 = MUL_C(COEF_CONST((-0.2417766217337384)), f248);
+    f332 = MUL_C(COEF_CONST(0.8175848131515837), f330);
+    f333 = MUL_C(COEF_CONST(1.3933930045694289), f135);
+    y[38] = f331 + f332;
+    y[24] = f333 - f332;
+    f336 = f246 + f133;
+    f337 = MUL_C(COEF_CONST((-0.1731148370459794)), f246);
+    f338 = MUL_C(COEF_CONST(0.7883464276266062), f336);
+    f339 = MUL_C(COEF_CONST(1.4035780182072330), f133);
+    y[36] = f337 + f338;
+    y[26] = f339 - f338;
+    f342 = f244 + f131;
+    f343 = MUL_C(COEF_CONST((-0.1040360035527077)), f244);
+    f344 = MUL_C(COEF_CONST(0.7572088465064845), f342);
+    f345 = MUL_C(COEF_CONST(1.4103816894602612), f131);
+    y[34] = f343 + f344;
+    y[28] = f345 - f344;
+    f348 = f242 + f129;
+    f349 = MUL_C(COEF_CONST((-0.0347065382144000)), f242);
+    f350 = MUL_C(COEF_CONST(0.7242470829514669), f348);
+    f351 = MUL_C(COEF_CONST(1.4137876276885337), f129);
+    y[32] = f349 + f350;
+    y[30] = f351 - f350;
+    f354 = t2[1] - t2[63];
+    f355 = t2[1] + t2[63];
+    f356 = t2[3] - t2[61];
+    f357 = t2[3] + t2[61];
+    f358 = t2[5] - t2[59];
+    f359 = t2[5] + t2[59];
+    f360 = t2[7] - t2[57];
+    f361 = t2[7] + t2[57];
+    f362 = t2[9] - t2[55];
+    f363 = t2[9] + t2[55];
+    f364 = t2[11] - t2[53];
+    f365 = t2[11] + t2[53];
+    f366 = t2[13] - t2[51];
+    f367 = t2[13] + t2[51];
+    f368 = t2[15] - t2[49];
+    f369 = t2[15] + t2[49];
+    f370 = t2[17] - t2[47];
+    f371 = t2[17] + t2[47];
+    f372 = t2[19] - t2[45];
+    f373 = t2[19] + t2[45];
+    f374 = t2[21] - t2[43];
+    f375 = t2[21] + t2[43];
+    f376 = t2[23] - t2[41];
+    f377 = t2[23] + t2[41];
+    f378 = t2[25] - t2[39];
+    f379 = t2[25] + t2[39];
+    f380 = t2[27] - t2[37];
+    f381 = t2[27] + t2[37];
+    f382 = t2[29] - t2[35];
+    f383 = t2[29] + t2[35];
+    f384 = t2[31] - t2[33];
+    f385 = t2[31] + t2[33];
+    f386 = f369 + f371;
+    f387 = f371 - f369;
+    f388 = MUL_C(COEF_CONST(0.7071067811865476), f387);
+    f389 = MUL_C(COEF_CONST(0.7071067811865476), f386);
+    f390 = f363 + f377;
+    f391 = f363 - f377;
+    f392 = MUL_C(COEF_CONST(0.7071067811865476), f391);
+    f393 = MUL_C(COEF_CONST(0.7071067811865476), f390);
+    f394 = f367 + f373;
+    f395 = f367 - f373;
+    f396 = MUL_C(COEF_CONST(0.7071067811865476), f395);
+    f397 = MUL_C(COEF_CONST(0.7071067811865476), f394);
+    f398 = f365 + f375;
+    f399 = f375 - f365;
+    f400 = MUL_C(COEF_CONST(0.7071067811865476), f399);
+    f401 = MUL_C(COEF_CONST(0.7071067811865476), f398);
+    f402 = f355 - f388;
+    f403 = f355 + f388;
+    f404 = f389 - f385;
+    f405 = f385 + f389;
+    f406 = f361 + f392;
+    f407 = f392 - f361;
+    f408 = f379 - f393;
+    f409 = f379 + f393;
+    f410 = f357 + f396;
+    f411 = f396 - f357;
+    f412 = f383 - f397;
+    f413 = f383 + f397;
+    f414 = f359 - f400;
+    f415 = f359 + f400;
+    f416 = f401 - f381;
+    f417 = f381 + f401;
+    f418 = f409 + f407;
+    f419 = MUL_C(COEF_CONST((-0.5411961001461969)), f409);
+    f420 = MUL_C(COEF_CONST(0.9238795325112867), f418);
+    f421 = MUL_C(COEF_CONST(1.3065629648763766), f407);
+    f422 = f419 + f420;
+    f423 = f421 - f420;
+    f424 = f408 - f406;
+    f425 = MUL_C(COEF_CONST(1.3065629648763770), f408);
+    f426 = MUL_C(COEF_CONST((-0.3826834323650904)), f424);
+    f427 = MUL_C(COEF_CONST(0.5411961001461961), f406);
+    f428 = f425 + f426;
+    f429 = f426 + f427;
+    f430 = f415 - f417;
+    f431 = MUL_C(COEF_CONST((-0.5411961001461969)), f417);
+    f432 = MUL_C(COEF_CONST(0.9238795325112867), f430);
+    f433 = MUL_C(COEF_CONST(1.3065629648763766), f415);
+    f434 = f432 - f431;
+    f435 = f433 - f432;
+    f436 = f416 + f414;
+    f437 = MUL_C(COEF_CONST(1.3065629648763770), f416);
+    f438 = MUL_C(COEF_CONST((-0.3826834323650904)), f436);
+    f439 = MUL_C(COEF_CONST(0.5411961001461961), f414);
+    f440 = f437 + f438;
+    f441 = f439 - f438;
+    f442 = f403 - f422;
+    f443 = f403 + f422;
+    f444 = f405 + f423;
+    f445 = f423 - f405;
+    f446 = f402 - f428;
+    f447 = f402 + f428;
+    f448 = f404 + f429;
+    f449 = f404 - f429;
+    f450 = f411 - f434;
+    f451 = f411 + f434;
+    f452 = f413 - f435;
+    f453 = f413 + f435;
+    f454 = f410 + f440;
+    f455 = f440 - f410;
+    f456 = f412 - f441;
+    f457 = f412 + f441;
+    f458 = f453 + f451;
+    f459 = MUL_C(COEF_CONST((-0.7856949583871021)), f453);
+    f460 = MUL_C(COEF_CONST(0.9807852804032304), f458);
+    f461 = MUL_C(COEF_CONST(1.1758756024193588), f451);
+    f462 = f459 + f460;
+    f463 = f461 - f460;
+    f464 = f457 + f455;
+    f465 = MUL_C(COEF_CONST(0.2758993792829431), f457);
+    f466 = MUL_C(COEF_CONST(0.5555702330196022), f464);
+    f467 = MUL_C(COEF_CONST(1.3870398453221475), f455);
+    f468 = f465 + f466;
+    f469 = f467 - f466;
+    f470 = f452 + f450;
+    f471 = MUL_C(COEF_CONST(1.1758756024193591), f452);
+    f472 = MUL_C(COEF_CONST((-0.1950903220161287)), f470);
+    f473 = MUL_C(COEF_CONST(0.7856949583871016), f450);
+    f474 = f471 + f472;
+    f475 = f473 - f472;
+    f476 = f456 - f454;
+    f477 = MUL_C(COEF_CONST(1.3870398453221473), f456);
+    f478 = MUL_C(COEF_CONST((-0.8314696123025455)), f476);
+    f479 = MUL_C(COEF_CONST((-0.2758993792829436)), f454);
+    f480 = f477 + f478;
+    f481 = f478 + f479;
+    f482 = f443 - f462;
+    f483 = f443 + f462;
+    f484 = f445 - f463;
+    f485 = f445 + f463;
+    f486 = f447 - f468;
+    f487 = f447 + f468;
+    f488 = f449 - f469;
+    f489 = f449 + f469;
+    f490 = f442 - f474;
+    f491 = f442 + f474;
+    f492 = f444 + f475;
+    f493 = f475 - f444;
+    f494 = f446 - f480;
+    f495 = f446 + f480;
+    f496 = f448 + f481;
+    f497 = f448 - f481;
+    f498 = f485 + f483;
+    f499 = MUL_C(COEF_CONST((-0.9497277818777543)), f485);
+    f500 = MUL_C(COEF_CONST(0.9987954562051724), f498);
+    f501 = MUL_C(COEF_CONST(1.0478631305325905), f483);
+    y[61] = f499 + f500;
+    y[1] = f501 - f500;
+    f504 = f489 + f487;
+    f505 = MUL_C(COEF_CONST((-0.7270510732912801)), f489);
+    f506 = MUL_C(COEF_CONST(0.9700312531945440), f504);
+    f507 = MUL_C(COEF_CONST(1.2130114330978079), f487);
+    y[53] = f505 + f506;
+    y[9] = f507 - f506;
+    f510 = f493 + f491;
+    f511 = MUL_C(COEF_CONST((-0.4764341996931611)), f493);
+    f512 = MUL_C(COEF_CONST(0.9039892931234433), f510);
+    f513 = MUL_C(COEF_CONST(1.3315443865537255), f491);
+    y[45] = f511 + f512;
+    y[17] = f513 - f512;
+    f516 = f497 + f495;
+    f517 = MUL_C(COEF_CONST((-0.2075082269882114)), f497);
+    f518 = MUL_C(COEF_CONST(0.8032075314806448), f516);
+    f519 = MUL_C(COEF_CONST(1.3989068359730783), f495);
+    y[37] = f517 + f518;
+    y[25] = f519 - f518;
+    f522 = f484 + f482;
+    f523 = MUL_C(COEF_CONST(0.0693921705079408), f484);
+    f524 = MUL_C(COEF_CONST(0.6715589548470183), f522);
+    f525 = MUL_C(COEF_CONST(1.4125100802019774), f482);
+    y[29] = f523 + f524;
+    y[33] = f525 - f524;
+    f528 = f488 + f486;
+    f529 = MUL_C(COEF_CONST(0.3436258658070505), f488);
+    f530 = MUL_C(COEF_CONST(0.5141027441932217), f528);
+    f531 = MUL_C(COEF_CONST(1.3718313541934939), f486);
+    y[21] = f529 + f530;
+    y[41] = f531 - f530;
+    f534 = f490 - f492;
+    f535 = MUL_C(COEF_CONST(0.6046542117908007), f492);
+    f536 = MUL_C(COEF_CONST(0.3368898533922201), f534);
+    f537 = MUL_C(COEF_CONST(1.2784339185752409), f490);
+    y[13] = f536 - f535;
+    y[49] = f537 - f536;
+    f540 = f496 + f494;
+    f541 = MUL_C(COEF_CONST(0.8424460355094192), f496);
+    f542 = MUL_C(COEF_CONST(0.1467304744553618), f540);
+    f543 = MUL_C(COEF_CONST(1.1359069844201428), f494);
+    y[5] = f541 + f542;
+    y[57] = f543 - f542;
+    f546 = f354 + f384;
+    f547 = f354 - f384;
+    f548 = f356 + f382;
+    f549 = f382 - f356;
+    f550 = f358 + f380;
+    f551 = f358 - f380;
+    f552 = f360 + f378;
+    f553 = f378 - f360;
+    f554 = f362 + f376;
+    f555 = f362 - f376;
+    f556 = f364 + f374;
+    f557 = f374 - f364;
+    f558 = f366 + f372;
+    f559 = f366 - f372;
+    f560 = f368 + f370;
+    f561 = f370 - f368;
+    f562 = f547 - f561;
+    f563 = f547 + f561;
+    f564 = f549 - f559;
+    f565 = f549 + f559;
+    f566 = f551 - f557;
+    f567 = f551 + f557;
+    f568 = f553 - f555;
+    f569 = f553 + f555;
+    f570 = f563 - f569;
+    f571 = f563 + f569;
+    f572 = f565 - f567;
+    f573 = f565 + f567;
+    f574 = f571 - f573;
+    y[63] = f571 + f573;
+    y[31] = MUL_C(COEF_CONST(0.7071067811865476), f574);
+    f577 = f570 + f572;
+    f578 = MUL_C(COEF_CONST(1.3065629648763766), f570);
+    f579 = MUL_C(COEF_CONST((-0.9238795325112866)), f577);
+    f580 = MUL_C(COEF_CONST((-0.5411961001461967)), f572);
+    y[15] = f578 + f579;
+    y[47] = f580 - f579;
+    f583 = f564 + f562;
+    f584 = f566 + f564;
+    f585 = f568 + f566;
+    f586 = MUL_C(COEF_CONST(0.7071067811865476), f584);
+    f587 = f562 - f586;
+    f588 = f562 + f586;
+    f589 = f583 + f585;
+    f590 = MUL_C(COEF_CONST(1.3065629648763766), f583);
+    f591 = MUL_C(COEF_CONST((-0.9238795325112866)), f589);
+    f592 = MUL_C(COEF_CONST((-0.5411961001461967)), f585);
+    f593 = f590 + f591;
+    f594 = f592 - f591;
+    f595 = f588 - f594;
+    f596 = f588 + f594;
+    f597 = f587 - f593;
+    f598 = f587 + f593;
+    y[55] = MUL_C(COEF_CONST(0.5097955791041592), f596);
+    y[39] = MUL_C(COEF_CONST(0.6013448869350453), f598);
+    y[23] = MUL_C(COEF_CONST(0.8999762231364156), f597);
+    y[7] = MUL_C(COEF_CONST(2.5629154477415055), f595);
+    f603 = MUL_C(COEF_CONST(0.5024192861881557), f546);
+    f604 = MUL_C(COEF_CONST(0.5224986149396889), f548);
+    f605 = MUL_C(COEF_CONST(0.5669440348163577), f550);
+    f606 = MUL_C(COEF_CONST(0.6468217833599901), f552);
+    f607 = MUL_C(COEF_CONST(0.7881546234512502), f554);
+    f608 = MUL_C(COEF_CONST(1.0606776859903471), f556);
+    f609 = MUL_C(COEF_CONST(1.7224470982383342), f558);
+    f610 = MUL_C(COEF_CONST(5.1011486186891553), f560);
+    f611 = f603 + f610;
+    f612 = f603 - f610;
+    f613 = f604 + f609;
+    f614 = f609 - f604;
+    f615 = f605 + f608;
+    f616 = f605 - f608;
+    f617 = f606 + f607;
+    f618 = f607 - f606;
+    f619 = f612 - f618;
+    f620 = f612 + f618;
+    f621 = f614 - f616;
+    f622 = f614 + f616;
+    f623 = f620 - f622;
+    f624 = f620 + f622;
+    f625 = MUL_C(COEF_CONST(0.7071067811865476), f623);
+    f626 = f619 + f621;
+    f627 = MUL_C(COEF_CONST(1.3065629648763766), f619);
+    f628 = MUL_C(COEF_CONST((-0.9238795325112866)), f626);
+    f629 = MUL_C(COEF_CONST((-0.5411961001461967)), f621);
+    f630 = f627 + f628;
+    f631 = f629 - f628;
+    f632 = f611 - f613;
+    f633 = f615 - f613;
+    f634 = f615 - f617;
+    f635 = MUL_C(COEF_CONST(0.7071067811865476), f633);
+    f636 = f611 - f635;
+    f637 = f611 + f635;
+    f638 = f632 + f634;
+    f639 = MUL_C(COEF_CONST(1.3065629648763766), f632);
+    f640 = MUL_C(COEF_CONST((-0.9238795325112866)), f638);
+    f641 = MUL_C(COEF_CONST((-0.5411961001461967)), f634);
+    f642 = f639 + f640;
+    f643 = f641 - f640;
+    f644 = f637 - f643;
+    f645 = f637 + f643;
+    f646 = f636 - f642;
+    f647 = f636 + f642;
+    f648 = MUL_C(COEF_CONST(0.5097955791041592), f645);
+    f649 = MUL_C(COEF_CONST(0.6013448869350453), f647);
+    f650 = MUL_C(COEF_CONST(0.8999762231364156), f646);
+    y[3] = MUL_C(COEF_CONST(2.5629154477415055), f644);
+    y[59] = f624 + f648;
+    y[51] = f648 + f631;
+    y[43] = f631 + f649;
+    y[35] = f649 + f625;
+    y[27] = f625 + f650;
+    y[19] = f650 + f630;
+    y[11] = f630 + y[3];
 }
 
 #else
@@ -1098,7 +1879,7 @@
 void DCT4_64(real_t *y, real_t *x)
 {
     int16_t i0;
-    static real_t t2[64];
+    ALIGN static real_t t2[64];
 
     t2[0] = x[0];
     for (i0=0; i0<31; i0++)
@@ -1113,744 +1894,112 @@
 
 void DCT4_64_kernel(real_t *y, real_t *t2)
 {
-    real_t f2;
-    real_t f3;
-    real_t f4;
-    real_t f5;
-    real_t f6;
-    real_t f7;
-    real_t f8;
-    real_t f9;
-    real_t f10;
-    real_t f11;
-    real_t f12;
-    real_t f13;
-    real_t f14;
-    real_t f15;
-    real_t f16;
-    real_t f17;
-    real_t f18;
-    real_t f19;
-    real_t f20;
-    real_t f21;
-    real_t f22;
-    real_t f23;
-    real_t f24;
-    real_t f25;
-    real_t f26;
-    real_t f27;
-    real_t f28;
-    real_t f29;
-    real_t f30;
-    real_t f31;
-    real_t f32;
-    real_t f33;
-    real_t f34;
-    real_t f35;
-    real_t f36;
-    real_t f37;
-    real_t f38;
-    real_t f39;
-    real_t f40;
-    real_t f41;
-    real_t f42;
-    real_t f43;
-    real_t f44;
-    real_t f45;
-    real_t f46;
-    real_t f47;
-    real_t f48;
-    real_t f49;
-    real_t f50;
-    real_t f51;
-    real_t f52;
-    real_t f53;
-    real_t f54;
-    real_t f55;
-    real_t f56;
-    real_t f57;
-    real_t f58;
-    real_t f59;
-    real_t f60;
-    real_t f61;
-    real_t f62;
-    real_t f63;
-    real_t f64;
-    real_t f65;
-    real_t f66;
-    real_t f67;
-    real_t f68;
-    real_t f69;
-    real_t f70;
-    real_t f71;
-    real_t f72;
-    real_t f73;
-    real_t f74;
-    real_t f75;
-    real_t f76;
-    real_t f77;
-    real_t f78;
-    real_t f79;
-    real_t f80;
-    real_t f81;
-    real_t f82;
-    real_t f83;
-    real_t f84;
-    real_t f85;
-    real_t f86;
-    real_t f87;
-    real_t f88;
-    real_t f89;
-    real_t f90;
-    real_t f91;
-    real_t f92;
-    real_t f93;
-    real_t f94;
-    real_t f95;
-    real_t f96;
-    real_t f97;
-    real_t f98;
-    real_t f99;
-    real_t f100;
-    real_t f101;
-    real_t f102;
-    real_t f103;
-    real_t f104;
-    real_t f105;
-    real_t f106;
-    real_t f107;
-    real_t f108;
-    real_t f109;
-    real_t f110;
-    real_t f111;
-    real_t f112;
-    real_t f113;
-    real_t f114;
-    real_t f115;
-    real_t f116;
-    real_t f117;
-    real_t f118;
-    real_t f119;
-    real_t f120;
-    real_t f121;
-    real_t f122;
-    real_t f123;
-    real_t f124;
-    real_t f125;
-    real_t f126;
-    real_t f127;
-    real_t f128;
-    real_t f129;
-    real_t f130;
-    real_t f131;
-    real_t f132;
-    real_t f133;
-    real_t f134;
-    real_t f135;
-    real_t f136;
-    real_t f137;
-    real_t f138;
-    real_t f139;
-    real_t f140;
-    real_t f141;
-    real_t f142;
-    real_t f143;
-    real_t f144;
-    real_t f145;
-    real_t f146;
-    real_t f147;
-    real_t f148;
-    real_t f149;
-    real_t f150;
-    real_t f151;
-    real_t f152;
-    real_t f153;
-    real_t f154;
-    real_t f155;
-    real_t f156;
-    real_t f157;
-    real_t f158;
-    real_t f159;
-    real_t f160;
-    real_t f161;
-    real_t f162;
-    real_t f163;
-    real_t f164;
-    real_t f165;
-    real_t f166;
-    real_t f167;
-    real_t f168;
-    real_t f169;
-    real_t f170;
-    real_t f171;
-    real_t f172;
-    real_t f173;
-    real_t f174;
-    real_t f175;
-    real_t f176;
-    real_t f177;
-    real_t f178;
-    real_t f179;
-    real_t f180;
-    real_t f181;
-    real_t f182;
-    real_t f183;
-    real_t f184;
-    real_t f185;
-    real_t f186;
-    real_t f187;
-    real_t f188;
-    real_t f189;
-    real_t f190;
-    real_t f191;
-    real_t f192;
-    real_t f193;
-    real_t f194;
-    real_t f195;
-    real_t f196;
-    real_t f197;
-    real_t f198;
-    real_t f199;
-    real_t f200;
-    real_t f201;
-    real_t f202;
-    real_t f203;
-    real_t f204;
-    real_t f205;
-    real_t f206;
-    real_t f207;
-    real_t f208;
-    real_t f209;
-    real_t f210;
-    real_t f211;
-    real_t f212;
-    real_t f213;
-    real_t f214;
-    real_t f215;
-    real_t f216;
-    real_t f217;
-    real_t f218;
-    real_t f219;
-    real_t f220;
-    real_t f221;
-    real_t f222;
-    real_t f223;
-    real_t f224;
-    real_t f225;
-    real_t f226;
-    real_t f227;
-    real_t f228;
-    real_t f229;
-    real_t f230;
-    real_t f231;
-    real_t f232;
-    real_t f233;
-    real_t f234;
-    real_t f235;
-    real_t f236;
-    real_t f237;
-    real_t f238;
-    real_t f239;
-    real_t f240;
-    real_t f241;
-    real_t f242;
-    real_t f243;
-    real_t f244;
-    real_t f245;
-    real_t f246;
-    real_t f247;
-    real_t f248;
-    real_t f249;
-    real_t f250;
-    real_t f251;
-    real_t f252;
-    real_t f253;
-    real_t f254;
-    real_t f255;
-    real_t f256;
-    real_t f257;
-    real_t f258;
-    real_t f259;
-    real_t f260;
-    real_t f261;
-    real_t f262;
-    real_t f263;
-    real_t f264;
-    real_t f265;
-    real_t f266;
-    real_t f267;
-    real_t f268;
-    real_t f269;
-    real_t f270;
-    real_t f271;
-    real_t f272;
-    real_t f273;
-    real_t f274;
-    real_t f275;
-    real_t f276;
-    real_t f277;
-    real_t f278;
-    real_t f279;
-    real_t f280;
-    real_t f281;
-    real_t f282;
-    real_t f283;
-    real_t f284;
-    real_t f285;
-    real_t f286;
-    real_t f287;
-    real_t f288;
-    real_t f289;
-    real_t f290;
-    real_t f291;
-    real_t f292;
-    real_t f293;
-    real_t f294;
-    real_t f295;
-    real_t f296;
-    real_t f297;
-    real_t f298;
-    real_t f299;
-    real_t f300;
-    real_t f301;
-    real_t f302;
-    real_t f303;
-    real_t f304;
-    real_t f305;
-    real_t f306;
-    real_t f307;
-    real_t f308;
-    real_t f309;
-    real_t f310;
-    real_t f311;
-    real_t f312;
-    real_t f313;
-    real_t f314;
-    real_t f315;
-    real_t f316;
-    real_t f317;
-    real_t f318;
-    real_t f319;
-    real_t f320;
-    real_t f321;
-    real_t f322;
-    real_t f323;
-    real_t f324;
-    real_t f325;
-    real_t f326;
-    real_t f327;
-    real_t f328;
-    real_t f329;
-    real_t f330;
-    real_t f331;
-    real_t f332;
-    real_t f333;
-    real_t f334;
-    real_t f335;
-    real_t f336;
-    real_t f337;
-    real_t f338;
-    real_t f339;
-    real_t f340;
-    real_t f341;
-    real_t f342;
-    real_t f343;
-    real_t f344;
-    real_t f345;
-    real_t f346;
-    real_t f347;
-    real_t f348;
-    real_t f349;
-    real_t f350;
-    real_t f351;
-    real_t f352;
-    real_t f353;
-    real_t f354;
-    real_t f355;
-    real_t f356;
-    real_t f357;
-    real_t f358;
-    real_t f359;
-    real_t f360;
-    real_t f361;
-    real_t f362;
-    real_t f363;
-    real_t f364;
-    real_t f365;
-    real_t f366;
-    real_t f367;
-    real_t f368;
-    real_t f369;
-    real_t f370;
-    real_t f371;
-    real_t f372;
-    real_t f373;
-    real_t f374;
-    real_t f375;
-    real_t f376;
-    real_t f377;
-    real_t f378;
-    real_t f379;
-    real_t f380;
-    real_t f381;
-    real_t f382;
-    real_t f383;
-    real_t f384;
-    real_t f385;
-    real_t f386;
-    real_t f387;
-    real_t f388;
-    real_t f389;
-    real_t f390;
-    real_t f391;
-    real_t f392;
-    real_t f393;
-    real_t f394;
-    real_t f395;
-    real_t f396;
-    real_t f397;
-    real_t f398;
-    real_t f399;
-    real_t f400;
-    real_t f401;
-    real_t f402;
-    real_t f403;
-    real_t f404;
-    real_t f405;
-    real_t f406;
-    real_t f407;
-    real_t f408;
-    real_t f409;
-    real_t f410;
-    real_t f411;
-    real_t f412;
-    real_t f413;
-    real_t f414;
-    real_t f415;
-    real_t f416;
-    real_t f417;
-    real_t f418;
-    real_t f419;
-    real_t f420;
-    real_t f421;
-    real_t f422;
-    real_t f423;
-    real_t f424;
-    real_t f425;
-    real_t f426;
-    real_t f427;
-    real_t f428;
-    real_t f429;
-    real_t f430;
-    real_t f431;
-    real_t f432;
-    real_t f433;
-    real_t f434;
-    real_t f435;
-    real_t f436;
-    real_t f437;
-    real_t f438;
-    real_t f439;
-    real_t f440;
-    real_t f441;
-    real_t f442;
-    real_t f443;
-    real_t f444;
-    real_t f445;
-    real_t f446;
-    real_t f447;
-    real_t f448;
-    real_t f449;
-    real_t f450;
-    real_t f451;
-    real_t f452;
-    real_t f453;
-    real_t f454;
-    real_t f455;
-    real_t f456;
-    real_t f457;
-    real_t f458;
-    real_t f459;
-    real_t f460;
-    real_t f461;
-    real_t f462;
-    real_t f463;
-    real_t f464;
-    real_t f465;
-    real_t f466;
-    real_t f467;
-    real_t f468;
-    real_t f469;
-    real_t f470;
-    real_t f471;
-    real_t f472;
-    real_t f473;
-    real_t f474;
-    real_t f475;
-    real_t f476;
-    real_t f477;
-    real_t f478;
-    real_t f479;
-    real_t f480;
-    real_t f481;
-    real_t f482;
-    real_t f483;
-    real_t f484;
-    real_t f485;
-    real_t f486;
-    real_t f487;
-    real_t f488;
-    real_t f489;
-    real_t f490;
-    real_t f491;
-    real_t f492;
-    real_t f493;
-    real_t f494;
-    real_t f495;
-    real_t f496;
-    real_t f497;
-    real_t f498;
-    real_t f499;
-    real_t f500;
-    real_t f501;
-    real_t f502;
-    real_t f503;
-    real_t f504;
-    real_t f505;
-    real_t f506;
-    real_t f507;
-    real_t f508;
-    real_t f509;
-    real_t f510;
-    real_t f511;
-    real_t f512;
-    real_t f513;
-    real_t f514;
-    real_t f515;
-    real_t f516;
-    real_t f517;
-    real_t f518;
-    real_t f519;
-    real_t f520;
-    real_t f521;
-    real_t f522;
-    real_t f523;
-    real_t f524;
-    real_t f525;
-    real_t f526;
-    real_t f527;
-    real_t f528;
-    real_t f529;
-    real_t f530;
-    real_t f531;
-    real_t f532;
-    real_t f533;
-    real_t f534;
-    real_t f535;
-    real_t f536;
-    real_t f537;
-    real_t f538;
-    real_t f539;
-    real_t f540;
-    real_t f541;
-    real_t f542;
-    real_t f543;
-    real_t f544;
-    real_t f545;
-    real_t f546;
-    real_t f547;
-    real_t f548;
-    real_t f549;
-    real_t f550;
-    real_t f551;
-    real_t f552;
-    real_t f553;
-    real_t f554;
-    real_t f555;
-    real_t f556;
-    real_t f557;
-    real_t f558;
-    real_t f559;
-    real_t f560;
-    real_t f561;
-    real_t f562;
-    real_t f563;
-    real_t f564;
-    real_t f565;
-    real_t f566;
-    real_t f567;
-    real_t f568;
-    real_t f569;
-    real_t f570;
-    real_t f571;
-    real_t f572;
-    real_t f573;
-    real_t f574;
-    real_t f575;
-    real_t f576;
-    real_t f577;
-    real_t f578;
-    real_t f579;
-    real_t f580;
-    real_t f581;
-    real_t f582;
-    real_t f583;
-    real_t f584;
-    real_t f585;
-    real_t f586;
-    real_t f587;
-    real_t f588;
-    real_t f589;
-    real_t f590;
-    real_t f591;
-    real_t f592;
-    real_t f593;
-    real_t f594;
-    real_t f595;
-    real_t f596;
-    real_t f597;
-    real_t f598;
-    real_t f599;
-    real_t f600;
-    real_t f601;
-    real_t f602;
-    real_t f603;
-    real_t f604;
-    real_t f605;
-    real_t f606;
-    real_t f607;
-    real_t f608;
-    real_t f609;
-    real_t f610;
-    real_t f611;
-    real_t f612;
-    real_t f613;
-    real_t f614;
-    real_t f615;
-    real_t f618;
-    real_t f619;
-    real_t f620;
-    real_t f621;
-    real_t f624;
-    real_t f625;
-    real_t f626;
-    real_t f627;
-    real_t f630;
-    real_t f631;
-    real_t f632;
-    real_t f633;
-    real_t f636;
-    real_t f637;
-    real_t f638;
-    real_t f639;
-    real_t f642;
-    real_t f643;
-    real_t f644;
-    real_t f645;
-    real_t f648;
-    real_t f649;
-    real_t f650;
-    real_t f651;
-    real_t f654;
-    real_t f655;
-    real_t f656;
-    real_t f657;
-    real_t f660;
-    real_t f661;
-    real_t f662;
-    real_t f663;
-    real_t f666;
-    real_t f667;
-    real_t f668;
-    real_t f669;
-    real_t f672;
-    real_t f673;
-    real_t f674;
-    real_t f675;
-    real_t f678;
-    real_t f679;
-    real_t f680;
-    real_t f681;
-    real_t f684;
-    real_t f685;
-    real_t f686;
-    real_t f687;
-    real_t f690;
-    real_t f691;
-    real_t f692;
-    real_t f693;
-    real_t f696;
-    real_t f697;
-    real_t f698;
-    real_t f699;
-    real_t f702;
-    real_t f703;
-    real_t f704;
-    real_t f705;
-    real_t f708;
-    real_t f709;
-    real_t f710;
-    real_t f711;
-    real_t f714;
-    real_t f715;
-    real_t f716;
-    real_t f717;
-    real_t f720;
-    real_t f721;
-    real_t f722;
-    real_t f723;
-    real_t f726;
-    real_t f727;
-    real_t f728;
-    real_t f729;
-    real_t f732;
-    real_t f733;
-    real_t f734;
-    real_t f735;
-    real_t f738;
-    real_t f739;
-    real_t f740;
-    real_t f741;
-    real_t f744;
-    real_t f745;
-    real_t f746;
-    real_t f747;
-    real_t f750;
-    real_t f751;
-    real_t f752;
-    real_t f753;
-    real_t f756;
-    real_t f757;
-    real_t f758;
-    real_t f759;
-    real_t f762;
-    real_t f763;
-    real_t f764;
-    real_t f765;
-    real_t f768;
-    real_t f769;
-    real_t f770;
-    real_t f771;
-    real_t f774;
-    real_t f775;
-    real_t f776;
-    real_t f777;
-    real_t f780;
-    real_t f781;
-    real_t f782;
-    real_t f783;
-    real_t f786;
-    real_t f787;
-    real_t f788;
-    real_t f789;
-    real_t f792;
-    real_t f793;
-    real_t f794;
-    real_t f795;
-    real_t f798;
-    real_t f799;
-    real_t f800;
-    real_t f801;
+    real_t f2, f3, f4, f5, f6, f7, f8;
+    real_t f9, f10, f11, f12, f13, f14, f15;
+    real_t f16, f17, f18, f19, f20, f21, f22;
+    real_t f23, f24, f25, f26, f27, f28, f29;
+    real_t f30, f31, f32, f33, f34, f35, f36;
+    real_t f37, f38, f39, f40, f41, f42, f43;
+    real_t f44, f45, f46, f47, f48, f49, f50;
+    real_t f51, f52, f53, f54, f55, f56, f57;
+    real_t f58, f59, f60, f61, f62, f63, f64;
+    real_t f65, f66, f67, f68, f69, f70, f71;
+    real_t f72, f73, f74, f75, f76, f77, f78;
+    real_t f79, f80, f81, f82, f83, f84, f85;
+    real_t f86, f87, f88, f89, f90, f91, f92;
+    real_t f93, f94, f95, f96, f97, f98, f99;
+    real_t f100, f101, f102, f103, f104, f105, f106;
+    real_t f107, f108, f109, f110, f111, f112, f113;
+    real_t f114, f115, f116, f117, f118, f119, f120;
+    real_t f121, f122, f123, f124, f125, f126, f127;
+    real_t f128, f129, f130, f131, f132, f133, f134;
+    real_t f135, f136, f137, f138, f139, f140, f141;
+    real_t f142, f143, f144, f145, f146, f147, f148;
+    real_t f149, f150, f151, f152, f153, f154, f155;
+    real_t f156, f157, f158, f159, f160, f161, f162;
+    real_t f163, f164, f165, f166, f167, f168, f169;
+    real_t f170, f171, f172, f173, f174, f175, f176;
+    real_t f177, f178, f179, f180, f181, f182, f183;
+    real_t f184, f185, f186, f187, f188, f189, f190;
+    real_t f191, f192, f193, f194, f195, f196, f197;
+    real_t f198, f199, f200, f201, f202, f203, f204;
+    real_t f205, f206, f207, f208, f209, f210, f211;
+    real_t f212, f213, f214, f215, f216, f217, f218;
+    real_t f219, f220, f221, f222, f223, f224, f225;
+    real_t f226, f227, f228, f229, f230, f231, f232;
+    real_t f233, f234, f235, f236, f237, f238, f239;
+    real_t f240, f241, f242, f243, f244, f245, f246;
+    real_t f247, f248, f249, f250, f251, f252, f253;
+    real_t f254, f255, f256, f257, f258, f259, f260;
+    real_t f261, f262, f263, f264, f265, f266, f267;
+    real_t f268, f269, f270, f271, f272, f273, f274;
+    real_t f275, f276, f277, f278, f279, f280, f281;
+    real_t f282, f283, f284, f285, f286, f287, f288;
+    real_t f289, f290, f291, f292, f293, f294, f295;
+    real_t f296, f297, f298, f299, f300, f301, f302;
+    real_t f303, f304, f305, f306, f307, f308, f309;
+    real_t f310, f311, f312, f313, f314, f315, f316;
+    real_t f317, f318, f319, f320, f321, f322, f323;
+    real_t f324, f325, f326, f327, f328, f329, f330;
+    real_t f331, f332, f333, f334, f335, f336, f337;
+    real_t f338, f339, f340, f341, f342, f343, f344;
+    real_t f345, f346, f347, f348, f349, f350, f351;
+    real_t f352, f353, f354, f355, f356, f357, f358;
+    real_t f359, f360, f361, f362, f363, f364, f365;
+    real_t f366, f367, f368, f369, f370, f371, f372;
+    real_t f373, f374, f375, f376, f377, f378, f379;
+    real_t f380, f381, f382, f383, f384, f385, f386;
+    real_t f387, f388, f389, f390, f391, f392, f393;
+    real_t f394, f395, f396, f397, f398, f399, f400;
+    real_t f401, f402, f403, f404, f405, f406, f407;
+    real_t f408, f409, f410, f411, f412, f413, f414;
+    real_t f415, f416, f417, f418, f419, f420, f421;
+    real_t f422, f423, f424, f425, f426, f427, f428;
+    real_t f429, f430, f431, f432, f433, f434, f435;
+    real_t f436, f437, f438, f439, f440, f441, f442;
+    real_t f443, f444, f445, f446, f447, f448, f449;
+    real_t f450, f451, f452, f453, f454, f455, f456;
+    real_t f457, f458, f459, f460, f461, f462, f463;
+    real_t f464, f465, f466, f467, f468, f469, f470;
+    real_t f471, f472, f473, f474, f475, f476, f477;
+    real_t f478, f479, f480, f481, f482, f483, f484;
+    real_t f485, f486, f487, f488, f489, f490, f491;
+    real_t f492, f493, f494, f495, f496, f497, f498;
+    real_t f499, f500, f501, f502, f503, f504, f505;
+    real_t f506, f507, f508, f509, f510, f511, f512;
+    real_t f513, f514, f515, f516, f517, f518, f519;
+    real_t f520, f521, f522, f523, f524, f525, f526;
+    real_t f527, f528, f529, f530, f531, f532, f533;
+    real_t f534, f535, f536, f537, f538, f539, f540;
+    real_t f541, f542, f543, f544, f545, f546, f547;
+    real_t f548, f549, f550, f551, f552, f553, f554;
+    real_t f555, f556, f557, f558, f559, f560, f561;
+    real_t f562, f563, f564, f565, f566, f567, f568;
+    real_t f569, f570, f571, f572, f573, f574, f575;
+    real_t f576, f577, f578, f579, f580, f581, f582;
+    real_t f583, f584, f585, f586, f587, f588, f589;
+    real_t f590, f591, f592, f593, f594, f595, f596;
+    real_t f597, f598, f599, f600, f601, f602, f603;
+    real_t f604, f605, f606, f607, f608, f609, f610;
+    real_t f611, f612, f613, f614, f615, f618, f619;
+    real_t f620, f621, f624, f625, f626, f627, f630;
+    real_t f631, f632, f633, f636, f637, f638, f639;
+    real_t f642, f643, f644, f645, f648, f649, f650;
+    real_t f651, f654, f655, f656, f657, f660, f661;
+    real_t f662, f663, f666, f667, f668, f669, f672;
+    real_t f673, f674, f675, f678, f679, f680, f681;
+    real_t f684, f685, f686, f687, f690, f691, f692;
+    real_t f693, f696, f697, f698, f699, f702, f703;
+    real_t f704, f705, f708, f709, f710, f711, f714;
+    real_t f715, f716, f717, f720, f721, f722, f723;
+    real_t f726, f727, f728, f729, f732, f733, f734;
+    real_t f735, f738, f739, f740, f741, f744, f745;
+    real_t f746, f747, f750, f751, f752, f753, f756;
+    real_t f757, f758, f759, f762, f763, f764, f765;
+    real_t f768, f769, f770, f771, f774, f775, f776;
+    real_t f777, f780, f781, f782, f783, f786, f787;
+    real_t f788, f789, f792, f793, f794, f795, f798;
+    real_t f799, f800, f801;
 
     f2 = 0.7071067811865476 * t2[32];
     f3 = t2[0] - f2;
--- a/libfaad/sbr_dct.h
+++ b/libfaad/sbr_dct.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_dct.h,v 1.8 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_dct.h,v 1.9 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __SBR_DCT_H__
@@ -34,6 +34,7 @@
 
 void DCT3_32_unscaled(real_t *y, real_t *x);
 void DCT2_64_unscaled(real_t *y, real_t *x);
+void DST2_64_unscaled(real_t *y, real_t *x);
 void DCT4_64(real_t *y, real_t *x);
 void DCT4_64_kernel(real_t *y, real_t *t2);
 
--- a/libfaad/sbr_dec.c
+++ b/libfaad/sbr_dec.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_dec.c,v 1.17 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_dec.c,v 1.18 2003/12/17 14:43:16 menno Exp $
 **/
 
 
@@ -31,6 +31,7 @@
 
 #ifdef SBR_DEC
 
+#include <string.h>
 #include <stdlib.h>
 
 #include "syntax.h"
@@ -47,7 +48,7 @@
 #endif
                         )
 {
-    sbr_info *sbr = malloc(sizeof(sbr_info));
+    sbr_info *sbr = faad_malloc(sizeof(sbr_info));
     memset(sbr, 0, sizeof(sbr_info));
 
     sbr->bs_freq_scale = 2;
@@ -65,22 +66,11 @@
     sbr->header_count = 0;
 
 #ifdef DRM
-    sbr->Is_DRM_SBR = 0;
-    if (IsDRM)
-    {
-        sbr->Is_DRM_SBR = 1;
-        sbr->tHFGen = T_HFGEN_DRM;
-        sbr->tHFAdj = T_HFADJ_DRM;
-
-        /* "offset" is different in DRM */
-        sbr->bs_samplerate_mode = 0;
-    } else
+    sbr->Is_DRM_SBR = IsDRM;
 #endif
-    {
-        sbr->bs_samplerate_mode = 1;
-        sbr->tHFGen = T_HFGEN;
-        sbr->tHFAdj = T_HFADJ;
-    }
+    sbr->bs_samplerate_mode = 1;
+    sbr->tHFGen = T_HFGEN;
+    sbr->tHFAdj = T_HFADJ;
 
     /* force sbr reset */
     sbr->bs_start_freq_prev = -1;
@@ -111,20 +101,15 @@
             qmfs_end(sbr->qmfs[1]);
         }
 
-        //if (sbr->Xcodec[0]) free(sbr->Xcodec[0]);
-        //if (sbr->Xsbr[0]) free(sbr->Xsbr[0]);
-        //if (sbr->Xcodec[1]) free(sbr->Xcodec[1]);
-        //if (sbr->Xsbr[1]) free(sbr->Xsbr[1]);
-
         for (j = 0; j < 5; j++)
         {
-            if (sbr->G_temp_prev[0][j]) free(sbr->G_temp_prev[0][j]);
-            if (sbr->Q_temp_prev[0][j]) free(sbr->Q_temp_prev[0][j]);
-            if (sbr->G_temp_prev[1][j]) free(sbr->G_temp_prev[1][j]);
-            if (sbr->Q_temp_prev[1][j]) free(sbr->Q_temp_prev[1][j]);
+            if (sbr->G_temp_prev[0][j]) faad_free(sbr->G_temp_prev[0][j]);
+            if (sbr->Q_temp_prev[0][j]) faad_free(sbr->Q_temp_prev[0][j]);
+            if (sbr->G_temp_prev[1][j]) faad_free(sbr->G_temp_prev[1][j]);
+            if (sbr->Q_temp_prev[1][j]) faad_free(sbr->Q_temp_prev[1][j]);
         }
 
-        free(sbr);
+        faad_free(sbr);
     }
 }
 
@@ -166,9 +151,9 @@
     uint8_t ch, channels, ret;
     real_t *ch_buf;
 
-    qmf_t X[MAX_NTSR][64];
+    ALIGN qmf_t X[MAX_NTSR][64];
 #ifdef SBR_LOW_POWER
-    real_t deg[64];
+    ALIGN real_t deg[64];
 #endif
 
     bitfile *ld = NULL;
@@ -179,20 +164,31 @@
     {
         ret = 1;
     } else {
-        ld = (bitfile*)malloc(sizeof(bitfile));
+        ld = (bitfile*)faad_malloc(sizeof(bitfile));
 
         /* initialise and read the bitstream */
         faad_initbits(ld, sbr->data, sbr->data_size);
 
+#ifdef DRM
+        if (sbr->Is_DRM_SBR)
+            faad_getbits(ld, 8); /* Skip 8-bit CRC */
+#endif
+
         ret = sbr_extension_data(ld, sbr);
 
+#ifdef DRM
+        /* Check CRC */
+        if (sbr->Is_DRM_SBR)
+            ld->error = faad_check_CRC(ld, faad_get_processed_bits(ld) - 8);
+#endif
+
         ret = ld->error ? ld->error : ret;
         faad_endbits(ld);
-        if (ld) free(ld);
+        if (ld) faad_free(ld);
         ld = NULL;
     }
 
-    if (sbr->data) free(sbr->data);
+    if (sbr->data) faad_free(sbr->data);
     sbr->data = NULL;
 
     if (ret || (sbr->header_count == 0))
@@ -219,11 +215,11 @@
             uint8_t j;
             sbr->qmfa[ch] = qmfa_init(32);
             sbr->qmfs[ch] = qmfs_init(64);
-            
+
             for (j = 0; j < 5; j++)
             {
-                sbr->G_temp_prev[ch][j] = malloc(64*sizeof(real_t));
-                sbr->Q_temp_prev[ch][j] = malloc(64*sizeof(real_t));
+                sbr->G_temp_prev[ch][j] = faad_malloc(64*sizeof(real_t));
+                sbr->Q_temp_prev[ch][j] = faad_malloc(64*sizeof(real_t));
             }
 
             memset(sbr->Xsbr[ch], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t));
@@ -243,6 +239,7 @@
 
         if (!dont_process)
         {
+#if 1
             /* insert high frequencies here */
             /* hf generation using patching */
             hf_generation(sbr, sbr->Xcodec[ch], sbr->Xsbr[ch]
@@ -250,6 +247,7 @@
                 ,deg
 #endif
                 ,ch);
+#endif
 
 #ifdef SBR_LOW_POWER
             for (l = sbr->t_E[ch][0]; l < sbr->t_E[ch][sbr->L_E[ch]]; l++)
@@ -261,6 +259,7 @@
             }
 #endif
 
+#if 1
             /* hf adjustment */
             hf_adjustment(sbr, sbr->Xsbr[ch]
 #ifdef SBR_LOW_POWER
@@ -267,6 +266,7 @@
                 ,deg
 #endif
                 ,ch);
+#endif
         }
 
         if ((sbr->just_seeked != 0) || dont_process)
@@ -298,11 +298,6 @@
                 else
                     xover_band = sbr->kx;
 
-#ifdef DRM
-				if (sbr->Is_DRM_SBR)
-					xover_band = sbr->kx;
-#endif
-
                 for (k = 0; k < xover_band; k++)
                 {
                     QMF_RE(X[l][k]) = QMF_RE(sbr->Xcodec[ch][l + sbr->tHFAdj][k]);
@@ -320,21 +315,15 @@
 #ifdef SBR_LOW_POWER
                 QMF_RE(X[l][xover_band - 1]) += QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][xover_band - 1]);
 #endif
-#ifdef DRM
-                if (sbr->Is_DRM_SBR)
-                {
-                    for (k = xover_band; k < xover_band + 4; k++)
-                    {
-                        QMF_RE(X[l][k]) += QMF_RE(sbr->Xcodec[ch][l + sbr->tHFAdj][k]);
-                        QMF_IM(X[l][k]) += QMF_IM(sbr->Xcodec[ch][l + sbr->tHFAdj][k]);
-                    }
-                }
-#endif
             }
         }
 
         /* subband synthesis */
+#ifndef USE_SSE
         sbr_qmf_synthesis_64(sbr, sbr->qmfs[ch], X, ch_buf);
+#else
+        sbr->qmfs[ch]->qmf_func(sbr, sbr->qmfs[ch], X, ch_buf);
+#endif
 
         for (i = 0; i < sbr->tHFGen; i++)
         {
--- a/libfaad/sbr_dec.h
+++ b/libfaad/sbr_dec.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_dec.h,v 1.12 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_dec.h,v 1.13 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __SBR_DEC_H__
@@ -33,13 +33,9 @@
 #endif
 
 
-/* MAX_NTSRHFG: maximum of number_time_slots * rate + HFGen. DRM: 15*2+32, else 16*2+8 */
-#ifdef DRM
-# define MAX_NTSRHFG 62
-#else
-# define MAX_NTSRHFG 40
-#endif
-#define MAX_NTSR     32 /* max number_time_slots * rate, ok for DRM and not DRM mode */
+/* MAX_NTSRHFG: maximum of number_time_slots * rate + HFGen. 16*2+8 */
+#define MAX_NTSRHFG 40
+#define MAX_NTSR    32 /* max number_time_slots * rate, ok for DRM and not DRM mode */
 
 
 typedef struct {
@@ -51,6 +47,9 @@
     real_t *v[2];
     uint8_t v_index;
     uint8_t channels;
+#ifdef USE_SSE
+    void (*qmf_func)(void *a, void *b, void *c, void *d);
+#endif
 } qmfs_info;
 
 typedef struct
@@ -158,8 +157,8 @@
     uint8_t Is_DRM_SBR;
 #endif
 
-	uint16_t numTimeSlotsRate;
-	uint16_t numTimeSlots;
+	uint8_t numTimeSlotsRate;
+	uint8_t numTimeSlots;
 	uint8_t tHFGen;
 	uint8_t tHFAdj;
 
--- a/libfaad/sbr_e_nf.c
+++ b/libfaad/sbr_e_nf.c
@@ -1,19 +1,19 @@
 /*
 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
 ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com
-**
+**  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 ** the Free Software Foundation; either version 2 of the License, or
 ** (at your option) any later version.
-**
+** 
 ** This program is distributed in the hope that it will be useful,
 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ** GNU General Public License for more details.
-**
+** 
 ** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
+** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
 ** Any non-GPL usage of this software or parts of this software is strictly
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_e_nf.c,v 1.9 2003/11/14 15:15:51 menno Exp $
+** $Id: sbr_e_nf.c,v 1.10 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -35,6 +35,110 @@
 #include "sbr_syntax.h"
 #include "sbr_e_nf.h"
 
+ALIGN static const real_t pow2deq[] = {
+    REAL_CONST(2.9103830456733704E-011), REAL_CONST(5.8207660913467407E-011),
+    REAL_CONST(1.1641532182693481E-010), REAL_CONST(2.3283064365386963E-010),
+    REAL_CONST(4.6566128730773926E-010), REAL_CONST(9.3132257461547852E-010),
+    REAL_CONST(1.862645149230957E-009), REAL_CONST(3.7252902984619141E-009),
+    REAL_CONST(7.4505805969238281E-009), REAL_CONST(1.4901161193847656E-008),
+    REAL_CONST(2.9802322387695313E-008), REAL_CONST(5.9604644775390625E-008),
+    REAL_CONST(1.1920928955078125E-007), REAL_CONST(2.384185791015625E-007),
+    REAL_CONST(4.76837158203125E-007), REAL_CONST(9.5367431640625E-007),
+    REAL_CONST(1.9073486328125E-006), REAL_CONST(3.814697265625E-006),
+    REAL_CONST(7.62939453125E-006), REAL_CONST(1.52587890625E-005),
+    REAL_CONST(3.0517578125E-005), REAL_CONST(6.103515625E-005),
+    REAL_CONST(0.0001220703125), REAL_CONST(0.000244140625),
+    REAL_CONST(0.00048828125), REAL_CONST(0.0009765625),
+    REAL_CONST(0.001953125), REAL_CONST(0.00390625),
+    REAL_CONST(0.0078125), REAL_CONST(0.015625),
+    REAL_CONST(0.03125), REAL_CONST(0.0625),
+    REAL_CONST(0.125), REAL_CONST(0.25),
+    REAL_CONST(0.5), REAL_CONST(1),
+    REAL_CONST(2), REAL_CONST(4),
+    REAL_CONST(8), REAL_CONST(16),
+    REAL_CONST(32), REAL_CONST(64),
+    REAL_CONST(128), REAL_CONST(256),
+    REAL_CONST(512), REAL_CONST(1024),
+    REAL_CONST(2048), REAL_CONST(4096),
+    REAL_CONST(8192), REAL_CONST(16384),
+    REAL_CONST(32768), REAL_CONST(65536),
+    REAL_CONST(131072), REAL_CONST(262144),
+    REAL_CONST(524288), REAL_CONST(1048576),
+    REAL_CONST(2097152), REAL_CONST(4194304),
+    REAL_CONST(8388608), REAL_CONST(16777216),
+    REAL_CONST(33554432), REAL_CONST(67108864),
+    REAL_CONST(134217728), REAL_CONST(268435456),
+    REAL_CONST(536870912), REAL_CONST(1073741824),
+    REAL_CONST(2147483648), REAL_CONST(4294967296),
+    REAL_CONST(8589934592), REAL_CONST(17179869184),
+    REAL_CONST(34359738368), REAL_CONST(68719476736),
+    REAL_CONST(137438953472), REAL_CONST(274877906944),
+    REAL_CONST(549755813888), REAL_CONST(1099511627776),
+    REAL_CONST(2199023255552), REAL_CONST(4398046511104),
+    REAL_CONST(8796093022208), REAL_CONST(17592186044416),
+    REAL_CONST(35184372088832), REAL_CONST(70368744177664),
+    REAL_CONST(140737488355328), REAL_CONST(281474976710656),
+    REAL_CONST(562949953421312), REAL_CONST(1125899906842624),
+    REAL_CONST(2251799813685248), REAL_CONST(4503599627370496),
+    REAL_CONST(9007199254740992), REAL_CONST(18014398509481984),
+    REAL_CONST(36028797018963968), REAL_CONST(72057594037927936),
+    REAL_CONST(144115188075855870), REAL_CONST(288230376151711740),
+    REAL_CONST(576460752303423490), REAL_CONST(1152921504606847000),
+    REAL_CONST(2305843009213694000), REAL_CONST(4611686018427387900),
+    REAL_CONST(9223372036854775800), REAL_CONST(1.8446744073709552E+019),
+    REAL_CONST(3.6893488147419103E+019), REAL_CONST(7.3786976294838206E+019),
+    REAL_CONST(1.4757395258967641E+020), REAL_CONST(2.9514790517935283E+020),
+    REAL_CONST(5.9029581035870565E+020), REAL_CONST(1.1805916207174113E+021),
+    REAL_CONST(2.3611832414348226E+021), REAL_CONST(4.7223664828696452E+021),
+    REAL_CONST(9.4447329657392904E+021), REAL_CONST(1.8889465931478581E+022),
+    REAL_CONST(3.7778931862957162E+022), REAL_CONST(7.5557863725914323E+022),
+    REAL_CONST(1.5111572745182865E+023), REAL_CONST(3.0223145490365729E+023),
+    REAL_CONST(6.0446290980731459E+023), REAL_CONST(1.2089258196146292E+024),
+    REAL_CONST(2.4178516392292583E+024), REAL_CONST(4.8357032784585167E+024),
+    REAL_CONST(9.6714065569170334E+024), REAL_CONST(1.9342813113834067E+025),
+    REAL_CONST(3.8685626227668134E+025), REAL_CONST(7.7371252455336267E+025),
+    REAL_CONST(1.5474250491067253E+026), REAL_CONST(3.0948500982134507E+026),
+    REAL_CONST(6.1897001964269014E+026), REAL_CONST(1.2379400392853803E+027),
+    REAL_CONST(2.4758800785707605E+027)
+};
+
+/* 1.0 / (1.0 + pow(2.0, x - 12) */
+ALIGN static const real_t pow2deq_rcp[] = {
+    FRAC_CONST(0.99975591896509641),
+    FRAC_CONST(0.99951195705222062),
+    FRAC_CONST(0.99902439024390244),
+    FRAC_CONST(0.99805068226120852),
+    FRAC_CONST(0.99610894941634243),
+    FRAC_CONST(0.99224806201550386),
+    FRAC_CONST(0.98461538461538467),
+    FRAC_CONST(0.96969696969696972),
+    FRAC_CONST(0.94117647058823528),
+    FRAC_CONST(0.88888888888888884),
+    FRAC_CONST(0.80000000000000004),
+    FRAC_CONST(0.66666666666666663),
+    FRAC_CONST(0.5),
+    FRAC_CONST(0.33333333333333331),
+    FRAC_CONST(0.20000000000000001),
+    FRAC_CONST(0.1111111111111111),
+    FRAC_CONST(0.058823529411764705),
+    FRAC_CONST(0.030303030303030304),
+    FRAC_CONST(0.015384615384615385),
+    FRAC_CONST(0.0077519379844961239),
+    FRAC_CONST(0.0038910505836575876),
+    FRAC_CONST(0.0019493177387914229),
+    FRAC_CONST(0.00097560975609756097),
+    FRAC_CONST(0.0004880429477794046),
+    FRAC_CONST(0.00024408103490358799),
+    FRAC_CONST(0.00012205541315757354),
+    FRAC_CONST(6.1031431187061336E-005),
+    FRAC_CONST(3.0516646830846227E-005),
+    FRAC_CONST(1.5258556235409006E-005),
+    FRAC_CONST(7.6293363240331724E-006),
+    FRAC_CONST(3.8146827137652828E-006),
+    FRAC_CONST(1.9073449948406318E-006),
+    FRAC_CONST(9.5367340691241559E-007)
+};
+
 void extract_envelope_data(sbr_info *sbr, uint8_t ch)
 {
     uint8_t l, k;
@@ -137,20 +241,40 @@
     }
 }
 
-/* FIXME: pow() not needed */
 void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch)
 {
     if (sbr->bs_coupling == 0)
     {
+        int16_t exp;
         uint8_t l, k;
-        real_t amp = (sbr->amp_res[ch]) ? 1.0f : 0.5f;
+        uint8_t amp = (sbr->amp_res[ch]) ? 0 : 1;
 
         for (l = 0; l < sbr->L_E[ch]; l++)
         {
             for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++)
             {
-                /* +6 for the *64 */
-                sbr->E_orig[ch][k][l] = (real_t)pow(2, sbr->E[ch][k][l]*amp + 6);
+                /* +6 for the *64 and -10 for the /32 in the synthesis QMF
+                 * since this is a energy value: (x/32)^2 = (x^2)/1024
+                 */
+                exp = (sbr->E[ch][k][l] >> amp) + 6
+#ifdef FIXED_POINT
+                    - 10
+#endif
+                    ;
+
+                if ((exp < -P2_TABLE_OFFSET) || (exp > P2_TABLE_MAX))
+                {
+                    sbr->E_orig[ch][k][l] = 0;
+                } else {
+                    /* FIXED POINT TODO: E_orig: INTEGER!! */
+                    sbr->E_orig[ch][k][l] = pow2deq[exp + P2_TABLE_OFFSET];
+
+                    /* save half the table size at the cost of 1 multiply */
+                    if (amp && (sbr->E[ch][k][l] & 1))
+                    {
+                        sbr->E_orig[ch][k][l] = MUL_R(sbr->E_orig[ch][k][l], REAL_CONST(1.414213562));
+                    }
+                }
             }
         }
 
@@ -162,7 +286,12 @@
                 {
                     sbr->Q_orig[ch][k][l] = 0;
                 } else {
-                    sbr->Q_orig[ch][k][l] = (real_t)pow(2, NOISE_FLOOR_OFFSET - sbr->Q[ch][k][l]);
+                    exp = NOISE_FLOOR_OFFSET - sbr->Q[ch][k][l];
+#ifdef FIXED_POINT
+                    sbr->Q_orig[ch][k][l] = pow2deq_q[exp + P2Q_TABLE_OFFSET];
+#else
+                    sbr->Q_orig[ch][k][l] = pow2deq[exp + P2_TABLE_OFFSET];
+#endif
                 }
             }
         }
@@ -171,23 +300,46 @@
 
 void unmap_envelope_noise(sbr_info *sbr)
 {
+    real_t tmp;
+    int16_t exp0, exp1;
     uint8_t l, k;
-    real_t amp0 = (sbr->amp_res[0]) ? (real_t)1.0 : (real_t)0.5;
-    real_t amp1 = (sbr->amp_res[1]) ? (real_t)1.0 : (real_t)0.5;
+    uint8_t amp0 = (sbr->amp_res[0]) ? 0 : 1;
+    uint8_t amp1 = (sbr->amp_res[1]) ? 0 : 1;
 
     for (l = 0; l < sbr->L_E[0]; l++)
     {
         for (k = 0; k < sbr->n[sbr->f[0][l]]; k++)
         {
-            real_t l_temp, r_temp;
-
-            /* +6: * 64 ; +1: * 2 */
-            l_temp = (real_t)pow(2, sbr->E[0][k][l]*amp0 + 7);
+            /* +6: * 64 ; +1: * 2 ; -10: /1024 QMF */
+            exp0 = (sbr->E[0][k][l] >> amp0) + 7
+#ifdef FIXED_POINT
+                - 10
+#endif
+                ;
             /* UN_MAP removed: (x / 4096) same as (x >> 12) */
-            r_temp = (real_t)pow(2, sbr->E[1][k][l]*amp1 - 12);
+            /* E[1] is always even so no need for compensating the divide by 2 with
+             * an extra multiplication
+             */
+            exp1 = (sbr->E[1][k][l] >> amp1) - 12;
 
-            sbr->E_orig[1][k][l] = l_temp / ((real_t)1.0 + r_temp);
-            sbr->E_orig[0][k][l] = MUL_R(r_temp, sbr->E_orig[1][k][l]);
+            if ((exp0 < -P2_TABLE_OFFSET) || (exp0 > P2_TABLE_MAX) ||
+                (exp1 < -P2_TABLE_RCP_OFFSET) || (exp1 > P2_TABLE_RCP_MAX))
+            {
+                sbr->E_orig[1][k][l] = 0;
+                sbr->E_orig[0][k][l] = 0;
+            } else {
+                tmp = pow2deq[exp0 + P2_TABLE_OFFSET];
+                if (amp0 && (sbr->E[0][k][l] & 1))
+                    tmp = MUL_R(tmp, REAL_CONST(1.414213562));
+
+                /* FIXED POINT TODO: E_orig: INTEGER!! */
+                sbr->E_orig[1][k][l] = MUL_F(tmp, pow2deq_rcp[exp1 + P2_TABLE_RCP_OFFSET]);
+#ifdef FIXED_POINT
+                sbr->E_orig[0][k][l] = MUL_R(sbr->E_orig[1][k][l], pow2deq[exp1 + P2_TABLE_OFFSET]);
+#else
+                sbr->E_orig[0][k][l] = MUL_R(sbr->E_orig[1][k][l], pow2deq[exp1 + P2_TABLE_OFFSET]);
+#endif
+            }
         }
     }
     for (l = 0; l < sbr->L_Q[0]; l++)
@@ -200,13 +352,16 @@
                 sbr->Q_orig[0][k][l] = 0;
                 sbr->Q_orig[1][k][l] = 0;
             } else {
-                real_t l_temp, r_temp;
+                exp0 = NOISE_FLOOR_OFFSET - sbr->Q[0][k][l] + 1;
+                exp1 = sbr->Q[1][k][l] - 12;
 
-                l_temp = (real_t)pow(2.0, NOISE_FLOOR_OFFSET - sbr->Q[0][k][l] + 1);
-                r_temp = (real_t)pow(2.0, sbr->Q[1][k][l] - 12);
-
-                sbr->Q_orig[1][k][l] = l_temp / ((real_t)1.0 + r_temp);
-                sbr->Q_orig[0][k][l] = MUL_R(r_temp, sbr->Q_orig[1][k][l]);
+#ifdef FIXED_POINT
+                sbr->Q_orig[1][k][l] = MUL_F(pow2deq_q[exp0 + P2Q_TABLE_OFFSET], pow2deq_rcp[exp1 + P2_TABLE_RCP_OFFSET]);
+                sbr->Q_orig[0][k][l] = MUL_R(sbr->Q_orig[1][k][l], pow2deq_q[exp1 + P2Q_TABLE_OFFSET]);
+#else
+                sbr->Q_orig[1][k][l] = MUL_F(pow2deq[exp0 + P2_TABLE_OFFSET], pow2deq_rcp[exp1 + P2_TABLE_RCP_OFFSET]);
+                sbr->Q_orig[0][k][l] = MUL_R(sbr->Q_orig[1][k][l], pow2deq[exp1 + P2_TABLE_OFFSET]);
+#endif
             }
         }
     }
--- a/libfaad/sbr_e_nf.h
+++ b/libfaad/sbr_e_nf.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_e_nf.h,v 1.7 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_e_nf.h,v 1.8 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __SBR_E_NF_H__
@@ -32,11 +32,24 @@
 extern "C" {
 #endif
 
+
+#ifndef FIXED_POINT
+#define P2_TABLE_OFFSET 35
+#define P2_TABLE_MAX 91
+#else
+#define P2Q_TABLE_OFFSET 24
+#define P2Q_TABLE_MAX 7
+#define P2_TABLE_OFFSET 0
+#define P2_TABLE_MAX 31
+#endif
+#define P2_TABLE_RCP_OFFSET 12
+#define P2_TABLE_RCP_MAX 21
+
+
 void extract_envelope_data(sbr_info *sbr, uint8_t ch);
 void extract_noise_floor_data(sbr_info *sbr, uint8_t ch);
 void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch);
 void unmap_envelope_noise(sbr_info *sbr);
-
 
 #ifdef __cplusplus
 }
--- a/libfaad/sbr_fbt.c
+++ b/libfaad/sbr_fbt.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_fbt.c,v 1.7 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_fbt.c,v 1.8 2003/12/17 14:43:16 menno Exp $
 **/
 
 /* Calculate frequency band tables */
@@ -98,9 +98,9 @@
     }
 }
 
-static int32_t longcmp(const void *a, const void *b)
+static int longcmp(const void *a, const void *b)
 {
-    return ((int32_t)(*(int32_t*)a - *(int32_t*)b));
+    return ((int)(*(int32_t*)a - *(int32_t*)b));
 }
 
 /* calculate the stop QMF channel for the master frequency band table */
@@ -259,7 +259,7 @@
 
 static real_t find_initial_power(uint8_t bands, uint8_t a0, uint8_t a1)
 {
-    return pow((real_t)a1/(real_t)a0, 1.0/(real_t)bands);
+    return (real_t)pow((real_t)a1/(real_t)a0, 1.0/(real_t)bands);
 }
 
 /*
--- a/libfaad/sbr_hfadj.c
+++ b/libfaad/sbr_hfadj.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_hfadj.c,v 1.8 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_hfadj.c,v 1.9 2003/12/17 14:43:16 menno Exp $
 **/
 
 /* High Frequency adjustment */
@@ -43,7 +43,7 @@
 #endif
                    ,uint8_t ch)
 {
-    sbr_hfadj_info adj = {0};
+    ALIGN sbr_hfadj_info adj = {0};
 
     map_noise_data(sbr, &adj, ch);
     map_sinusoids(sbr, &adj, ch);
@@ -262,21 +262,21 @@
     }
 }
 
+
 #define EPS (1e-12)
 
 #define ONE (1)
 
-
 static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch)
 {
     static real_t limGain[] = { 0.5, 1.0, 2.0, 1e10 };
     uint8_t m, l, k, i;
 
-    real_t Q_M_lim[64];
-    real_t G_lim[64];
-    real_t G_boost;
-    real_t S_M[64];
-    uint8_t table_map_res_to_m[64];
+    ALIGN real_t Q_M_lim[64];
+    ALIGN real_t G_lim[64];
+    ALIGN real_t G_boost;
+    ALIGN real_t S_M[64];
+    ALIGN uint8_t table_map_res_to_m[64];
 
 
     for (l = 0; l < sbr->L_E[ch]; l++)
@@ -599,10 +599,9 @@
                     + MUL_F(Q_filt, IM(V[fIndexNoise]));
 #endif
 
-
-                if (adj->S_index_mapped[m][l])
+                //if (adj->S_index_mapped[m][l])
                 {
-                    int8_t rev = ((m + sbr->kx) & 1) ? -1 : 1;
+                    int8_t rev = (((m + sbr->kx) & 1) ? -1 : 1);
                     QMF_RE(psi) = MUL_R(adj->S_M_boost[l][m], phi_re[fIndexSine]);
                     QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += QMF_RE(psi);
 
@@ -616,9 +615,12 @@
                     if (m == 0)
                     {
                         QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx - 1]) -=
-                            (rev * MUL_C(MUL_R(adj->S_M_boost[l][0], phi_re[i_plus1]), COEF_CONST(0.00815)));
-                        QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -=
-                            (rev * MUL_C(MUL_R(adj->S_M_boost[l][1], phi_re[i_plus1]), COEF_CONST(0.00815)));
+                            (-1*rev * MUL_C(MUL_R(adj->S_M_boost[l][0], phi_re[i_plus1]), COEF_CONST(0.00815)));
+                        if(m < sbr->M - 1)
+                        {
+                            QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -=
+                                (rev * MUL_C(MUL_R(adj->S_M_boost[l][1], phi_re[i_plus1]), COEF_CONST(0.00815)));
+                        }
                     }
                     if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16))
                     {
@@ -627,15 +629,22 @@
                         QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -=
                             (rev * MUL_C(MUL_R(adj->S_M_boost[l][m + 1], phi_re[i_plus1]), COEF_CONST(0.00815)));
                     }
-                    if ((m == sbr->M - 1) && (sinusoids < 16) && (m + sbr->kx + 1 < 63))
+                    if ((m == sbr->M - 1) && (sinusoids < 16))
                     {
-                        QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -=
-                            (rev * MUL_C(MUL_R(adj->S_M_boost[l][m - 1], phi_re[i_min1]), COEF_CONST(0.00815)));
-                        QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) -=
-                            (rev * MUL_C(MUL_R(adj->S_M_boost[l][m + 1], phi_re[i_min1]), COEF_CONST(0.00815)));
+                        if (m > 0)
+                        {
+                            QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -=
+                                (rev * MUL_C(MUL_R(adj->S_M_boost[l][m - 1], phi_re[i_min1]), COEF_CONST(0.00815)));
+                        }
+                        if (m + sbr->kx < 64)
+                        {
+                            QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) -=
+                                (-1*rev * MUL_C(MUL_R(adj->S_M_boost[l][m], phi_re[i_min1]), COEF_CONST(0.00815)));
+                        }
                     }
 
-                    sinusoids++;
+                    if (adj->S_M_boost[l][m] != 0)
+                        sinusoids++;
 #endif
                 }
             }
--- a/libfaad/sbr_hfgen.c
+++ b/libfaad/sbr_hfgen.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_hfgen.c,v 1.10 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_hfgen.c,v 1.11 2003/12/17 14:43:16 menno Exp $
 **/
 
 /* High Frequency generation */
@@ -44,26 +44,17 @@
                    ,uint8_t ch)
 {
     uint8_t l, i, x;
-    uint8_t offset, first, last;
-    complex_t alpha_0[64], alpha_1[64];
+    ALIGN complex_t alpha_0[64], alpha_1[64];
 #ifdef SBR_LOW_POWER
-    real_t rxx[64];
+    ALIGN real_t rxx[64];
 #endif
 
-#ifdef DRM
-    if (sbr->Is_DRM_SBR)
-    {
-        offset = sbr->tHFGen;
-        first = 0;
-        last = sbr->numTimeSlotsRate;
-    } else
-#endif
-    {
-        offset = sbr->tHFAdj;
-        first = sbr->t_E[ch][0];
-        last = sbr->t_E[ch][sbr->L_E[ch]];
-    }
+    uint8_t offset = sbr->tHFAdj;
+    uint8_t first = sbr->t_E[ch][0];
+    uint8_t last = sbr->t_E[ch][sbr->L_E[ch]];
 
+//    printf("%d %d\n", first, last);
+
     calc_chirp_factors(sbr, ch);
 
     for (i = first; i < last; i++)
@@ -114,7 +105,6 @@
             bw = sbr->bwArray[ch][g];
             bw2 = MUL_C(bw, bw);
 
-
             /* do the patching */
             /* with or without filtering */
             if (bw2 > 0)
@@ -187,23 +177,14 @@
 {
     real_t r01 = 0, r02 = 0, r11 = 0;
     int8_t j;
-    uint8_t offset;
+    uint8_t offset = sbr->tHFAdj;
     const real_t rel = 1 / (1 + 1e-6f);
 
-#ifdef DRM
-    if (sbr->Is_DRM_SBR)
-        offset = sbr->tHFGen;
-    else
-#endif
-    {
-        offset = sbr->tHFAdj;
-    }
-
     for (j = offset; j < len + offset; j++)
     {
-        RE(ac->r01) += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-1][bd]);
-        RE(ac->r02) += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-2][bd]);
-        RE(ac->r11) += QMF_RE(buffer[j-1][bd]) * QMF_RE(buffer[j-1][bd]);
+        r01 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-1][bd]);
+        r02 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-2][bd]);
+        r11 += QMF_RE(buffer[j-1][bd]) * QMF_RE(buffer[j-1][bd]);
     }
     RE(ac->r12) = r01 -
         QMF_RE(buffer[len+offset-1][bd]) * QMF_RE(buffer[len+offset-2][bd]) +
@@ -224,16 +205,8 @@
     real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0;
     const real_t rel = 1 / (1 + 1e-6f);
     int8_t j;
-    uint8_t offset;
+    uint8_t offset = sbr->tHFAdj;
 
-#ifdef DRM
-    if (sbr->Is_DRM_SBR)
-        offset = sbr->tHFGen;
-    else
-#endif
-    {
-        offset = sbr->tHFAdj;
-    }
 
     for (j = offset; j < len + offset; j++)
     {
@@ -283,14 +256,7 @@
 
     for (k = 1; k < sbr->f_master[0]; k++)
     {
-#ifdef DRM
-        if (sbr->Is_DRM_SBR)
-            auto_correlation(sbr, &ac, Xlow, k, 30);
-        else
-#endif
-        {
-            auto_correlation(sbr, &ac, Xlow, k, 38);
-        }
+        auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6);
 
 #ifdef SBR_LOW_POWER
         if (ac.det == 0)
@@ -316,7 +282,7 @@
         }
 
         /* reflection coefficient */
-        if (RE(ac.r11) == REAL_CONST(0.0))
+        if (RE(ac.r11) == 0)
         {
             rxx[k] = REAL_CONST(0.0);
         } else {
@@ -402,6 +368,7 @@
 }
 #endif
 
+/* FIXED POINT: bwArray = COEF */
 static real_t mapNewBw(uint8_t invf_mode, uint8_t invf_mode_prev)
 {
     switch (invf_mode)
@@ -426,6 +393,7 @@
     }
 }
 
+/* FIXED POINT: bwArray = COEF */
 static void calc_chirp_factors(sbr_info *sbr, uint8_t ch)
 {
     uint8_t i;
@@ -435,9 +403,9 @@
         sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]);
 
         if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i])
-            sbr->bwArray[ch][i] = MUL_C(COEF_CONST(0.75), sbr->bwArray[ch][i]) + MUL_C(COEF_CONST(0.25), sbr->bwArray_prev[ch][i]);
+            sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.75)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.25));
         else
-            sbr->bwArray[ch][i] = MUL_C(COEF_CONST(0.90625), sbr->bwArray[ch][i]) + MUL_C(COEF_CONST(0.09375), sbr->bwArray_prev[ch][i]);
+            sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.90625)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.09375));
 
         if (sbr->bwArray[ch][i] < COEF_CONST(0.015625))
             sbr->bwArray[ch][i] = COEF_CONST(0.0);
@@ -456,7 +424,9 @@
     uint8_t odd, sb;
     uint8_t msb = sbr->k0;
     uint8_t usb = sbr->kx;
-    uint8_t goalSb = (uint8_t)(2.048e6/sbr->sample_rate + 0.5);
+    uint8_t goalSbTab[] = { 21, 23, 43, 46, 64, 85, 93, 128, 0, 0, 0 };
+    /* (uint8_t)(2.048e6/sbr->sample_rate + 0.5); */
+    uint8_t goalSb = goalSbTab[get_sr_index(sbr->sample_rate)];
 
     sbr->noPatches = 0;
 
--- a/libfaad/sbr_huff.c
+++ b/libfaad/sbr_huff.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_huff.c,v 1.11 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_huff.c,v 1.12 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -241,17 +241,10 @@
     int8_t delta = 0;
     sbr_huff_tab t_huff, f_huff;
 
-#ifdef DRM
-    if (sbr->Is_DRM_SBR)
-        sbr->amp_res[ch] = sbr->bs_amp_res;
+    if ((sbr->L_E[ch] == 1) && (sbr->bs_frame_class[ch] == FIXFIX))
+        sbr->amp_res[ch] = 0;
     else
-#endif
-    {
-        if ((sbr->L_E[ch] == 1) && (sbr->bs_frame_class[ch] == FIXFIX))
-            sbr->amp_res[ch] = 0;
-        else
-            sbr->amp_res[ch] = sbr->bs_amp_res;
-    }
+        sbr->amp_res[ch] = sbr->bs_amp_res;
 
     if ((sbr->bs_coupling) && (ch == 1))
     {
@@ -284,19 +277,19 @@
             {
                 if (sbr->amp_res[ch])
                 {
-                    sbr->E[ch][0][env] = (faad_getbits(ld, 5
+                    sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 5
                         DEBUGVAR(1,272,"sbr_envelope(): bs_data_env")) << delta);
                 } else {
-                    sbr->E[ch][0][env] = (faad_getbits(ld, 6
+                    sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6
                         DEBUGVAR(1,273,"sbr_envelope(): bs_data_env")) << delta);
                 }
             } else {
                 if (sbr->amp_res[ch])
                 {
-                    sbr->E[ch][0][env] = (faad_getbits(ld, 6
+                    sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6
                         DEBUGVAR(1,274,"sbr_envelope(): bs_data_env")) << delta);
                 } else {
-                    sbr->E[ch][0][env] = (faad_getbits(ld, 7
+                    sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 7
                         DEBUGVAR(1,275,"sbr_envelope(): bs_data_env")) << delta);
                 }
             }
--- a/libfaad/sbr_noise.h
+++ b/libfaad/sbr_noise.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_noise.h,v 1.7 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_noise.h,v 1.8 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __SBR_NOISE_H__
@@ -39,7 +39,7 @@
 
 
 /* Table 1.A.13 Noise table V */
-complex_t V[] = {
+ALIGN static const complex_t V[] = {
     { FRAC_CONST(-0.99948155879974), FRAC_CONST(-0.59483414888382) },
     { FRAC_CONST(0.97113454341888), FRAC_CONST(-0.67528516054153) },
     { FRAC_CONST(0.14130051434040), FRAC_CONST(-0.95090985298157) },
--- a/libfaad/sbr_qmf.c
+++ b/libfaad/sbr_qmf.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_qmf.c,v 1.17 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_qmf.c,v 1.18 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -41,8 +41,8 @@
 
 qmfa_info *qmfa_init(uint8_t channels)
 {
-    qmfa_info *qmfa = (qmfa_info*)malloc(sizeof(qmfa_info));
-    qmfa->x = (real_t*)malloc(channels * 10 * sizeof(real_t));
+    qmfa_info *qmfa = (qmfa_info*)faad_malloc(sizeof(qmfa_info));
+    qmfa->x = (real_t*)faad_malloc(channels * 10 * sizeof(real_t));
     memset(qmfa->x, 0, channels * 10 * sizeof(real_t));
 
     qmfa->channels = channels;
@@ -54,8 +54,8 @@
 {
     if (qmfa)
     {
-        if (qmfa->x) free(qmfa->x);
-        free(qmfa);
+        if (qmfa->x) faad_free(qmfa->x);
+        faad_free(qmfa);
     }
 }
 
@@ -62,11 +62,11 @@
 void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input,
                          qmf_t X[MAX_NTSRHFG][32], uint8_t offset, uint8_t kx)
 {
-    real_t u[64];
+    ALIGN real_t u[64];
 #ifndef SBR_LOW_POWER
-    real_t x[64], y[64];
+    ALIGN real_t x[64], y[64];
 #else
-    real_t y[32];
+    ALIGN real_t y[32];
 #endif
     uint16_t in = 0;
     uint8_t l;
@@ -82,11 +82,7 @@
         /* add new samples to input buffer x */
         for (n = 32 - 1; n >= 0; n--)
         {
-#ifdef FIXED_POINT
-            qmfa->x[n] = (input[in++]) >> 5;
-#else
             qmfa->x[n] = input[in++];
-#endif
         }
 
         /* window and summation to create array u */
@@ -113,11 +109,7 @@
         {
             if (n < kx)
             {
-#ifdef FIXED_POINT
-                QMF_RE(X[l + offset][n]) = u[n] << 1;
-#else
                 QMF_RE(X[l + offset][n]) = 2. * u[n];
-#endif
             } else {
                 QMF_RE(X[l + offset][n]) = 0;
             }
@@ -137,13 +129,8 @@
         {
             if (n < kx)
             {
-#ifdef FIXED_POINT
-                QMF_RE(X[l + offset][n]) = y[n] << 1;
-                QMF_IM(X[l + offset][n]) = -y[63-n] << 1;
-#else
                 QMF_RE(X[l + offset][n]) = 2. * y[n];
                 QMF_IM(X[l + offset][n]) = -2. * y[63-n];
-#endif
             } else {
                 QMF_RE(X[l + offset][n]) = 0;
                 QMF_IM(X[l + offset][n]) = 0;
@@ -155,17 +142,32 @@
 
 qmfs_info *qmfs_init(uint8_t channels)
 {
-    qmfs_info *qmfs = (qmfs_info*)malloc(sizeof(qmfs_info));
+    qmfs_info *qmfs = (qmfs_info*)faad_malloc(sizeof(qmfs_info));
 
-    qmfs->v[0] = (real_t*)malloc(channels * 10 * sizeof(real_t));
+#ifndef SBR_LOW_POWER
+    qmfs->v[0] = (real_t*)faad_malloc(channels * 10 * sizeof(real_t));
     memset(qmfs->v[0], 0, channels * 10 * sizeof(real_t));
-    qmfs->v[1] = (real_t*)malloc(channels * 10 * sizeof(real_t));
+    qmfs->v[1] = (real_t*)faad_malloc(channels * 10 * sizeof(real_t));
     memset(qmfs->v[1], 0, channels * 10 * sizeof(real_t));
+#else
+    qmfs->v[0] = (real_t*)faad_malloc(channels * 20 * sizeof(real_t));
+    memset(qmfs->v[0], 0, channels * 20 * sizeof(real_t));
+    qmfs->v[1] = NULL;
+#endif
 
     qmfs->v_index = 0;
 
     qmfs->channels = channels;
 
+#ifdef USE_SSE
+    if (cpu_has_sse())
+    {
+        qmfs->qmf_func = sbr_qmf_synthesis_64_sse;
+    } else {
+        qmfs->qmf_func = sbr_qmf_synthesis_64;
+    }
+#endif
+
     return qmfs;
 }
 
@@ -173,9 +175,11 @@
 {
     if (qmfs)
     {
-        if (qmfs->v[0]) free(qmfs->v[0]);
-        if (qmfs->v[1]) free(qmfs->v[1]);
-        free(qmfs);
+        if (qmfs->v[0]) faad_free(qmfs->v[0]);
+#ifndef SBR_LOW_POWER
+        if (qmfs->v[1]) faad_free(qmfs->v[1]);
+#endif
+        faad_free(qmfs);
     }
 }
 
@@ -183,7 +187,8 @@
 void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64],
                           real_t *output)
 {
-    real_t x[64];
+    ALIGN real_t x[64];
+    ALIGN real_t y[64];
     int16_t n, k, out = 0;
     uint8_t l;
 
@@ -191,44 +196,174 @@
     /* qmf subsample l */
     for (l = 0; l < sbr->numTimeSlotsRate; l++)
     {
-        real_t *v0, *v1;
+        //real_t *v0, *v1;
 
         /* shift buffers */
-        memmove(qmfs->v[0] + 64, qmfs->v[0], (640-64)*sizeof(real_t));
-        memmove(qmfs->v[1] + 64, qmfs->v[1], (640-64)*sizeof(real_t));
+        //memmove(qmfs->v[0] + 64, qmfs->v[0], (640-64)*sizeof(real_t));
+        //memmove(qmfs->v[1] + 64, qmfs->v[1], (640-64)*sizeof(real_t));
+        memmove(qmfs->v[0] + 128, qmfs->v[0], (1280-128)*sizeof(real_t));
 
-        v0 = qmfs->v[qmfs->v_index];
-        v1 = qmfs->v[(qmfs->v_index + 1) & 0x1];
-        qmfs->v_index = (qmfs->v_index + 1) & 0x1;
+        //v0 = qmfs->v[qmfs->v_index];
+        //v1 = qmfs->v[(qmfs->v_index + 1) & 0x1];
+        //qmfs->v_index = (qmfs->v_index + 1) & 0x1;
 
         /* calculate 128 samples */
         for (k = 0; k < 64; k++)
         {
-#ifdef FIXED_POINT
-            x[k] = QMF_RE(X[l][k]);
-#else
             x[k] = QMF_RE(X[l][k]) / 32.;
+        }
+
+        for (n = 0; n < 32; n++)
+        {
+            y[2*n]   = -x[2*n];
+            y[2*n+1] =  x[2*n+1];
+        }
+
+        DCT2_64_unscaled(x, x);
+
+        for (n = 0; n < 64; n++)
+        {
+            qmfs->v[0][n+32] = x[n];
+        }
+        for (n = 0; n < 32; n++)
+        {
+            qmfs->v[0][31 - n] = x[n + 1];
+        }
+        DST2_64_unscaled(x, y);
+        qmfs->v[0][96] = 0;
+        for (n = 1; n < 32; n++)
+        {
+            qmfs->v[0][n + 96] = x[n-1];
+        }
+
+        /* calculate 64 output samples and window */
+        for (k = 0; k < 64; k++)
+        {
+#if 1
+             output[out++] = MUL_F(qmfs->v[0][k], qmf_c[k]) +
+                 MUL_F(qmfs->v[0][192 + k], qmf_c[64 + k]) +
+                 MUL_F(qmfs->v[0][256 + k], qmf_c[128 + k]) +
+                 MUL_F(qmfs->v[0][256 + 192 + k], qmf_c[128 + 64 + k]) +
+                 MUL_F(qmfs->v[0][512 + k], qmf_c[256 + k]) +
+                 MUL_F(qmfs->v[0][512 + 192 + k], qmf_c[256 + 64 + k]) +
+                 MUL_F(qmfs->v[0][768 + k], qmf_c[384 + k]) +
+                 MUL_F(qmfs->v[0][768 + 192 + k], qmf_c[384 + 64 + k]) +
+                 MUL_F(qmfs->v[0][1024 + k], qmf_c[512 + k]) +
+                 MUL_F(qmfs->v[0][1024 + 192 + k], qmf_c[512 + 64 + k]);
+#else
+            output[out++] = MUL_F(v0[k], qmf_c[k]) +
+                MUL_F(v0[64 + k], qmf_c[64 + k]) +
+                MUL_F(v0[128 + k], qmf_c[128 + k]) +
+                MUL_F(v0[192 + k], qmf_c[192 + k]) +
+                MUL_F(v0[256 + k], qmf_c[256 + k]) +
+                MUL_F(v0[320 + k], qmf_c[320 + k]) +
+                MUL_F(v0[384 + k], qmf_c[384 + k]) +
+                MUL_F(v0[448 + k], qmf_c[448 + k]) +
+                MUL_F(v0[512 + k], qmf_c[512 + k]) +
+                MUL_F(v0[576 + k], qmf_c[576 + k]);
 #endif
         }
+    }
+}
 
+void DST2(real_t *in, real_t *out, int32_t len)
+{
+    int r, i;
+
+    for (r = 1; r <= len; r++)
+    {
+        double sum = 0;
+        for (i = 1; i <= len; i++)
+        {
+            sum += in[i-1] * sin(((real_t)r)*((real_t)i-0.5)*M_PI/(real_t)len);
+        }
+        out[r-1] = (real_t)sum;
+    }
+}
+
+void DCT2(real_t *in, real_t *out, int32_t len)
+{
+    int r, i;
+
+    for (r = 0; r < len; r++)
+    {
+        double sum = 0;
+        for (i = 0; i < len; i++)
+        {
+            sum += in[i] * cos(((real_t)r)*((real_t)i+0.5)*M_PI/(real_t)len);
+        }
+        out[r] = (real_t)sum;
+    }
+}
+
+void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64],
+                              real_t *output)
+{
+    ALIGN real_t x[64];
+    ALIGN real_t y[64];
+    ALIGN real_t y2[64];
+    int16_t n, k, out = 0;
+    uint8_t l;
+
+    /* qmf subsample l */
+    for (l = 0; l < sbr->numTimeSlotsRate; l++)
+    {
+        //real_t *v0, *v1;
+
+        /* shift buffers */
+        //memmove(qmfs->v[0] + 64, qmfs->v[0], (640-64)*sizeof(real_t));
+        //memmove(qmfs->v[1] + 64, qmfs->v[1], (640-64)*sizeof(real_t));
+        memmove(qmfs->v[0] + 128, qmfs->v[0], (1280-128)*sizeof(real_t));
+
+        //v0 = qmfs->v[qmfs->v_index];
+        //v1 = qmfs->v[(qmfs->v_index + 1) & 0x1];
+        //qmfs->v_index = (qmfs->v_index + 1) & 0x1;
+
+        /* calculate 128 samples */
+        for (k = 0; k < 64; k++)
+        {
+            x[k] = QMF_RE(X[l][k]) / 32.;
+        }
+
+        for (n = 0; n < 32; n++)
+        {
+            y[2*n]   = -x[2*n];
+            y[2*n+1] =  x[2*n+1];
+        }
+
         DCT2_64_unscaled(x, x);
 
+        for (n = 0; n < 64; n++)
+        {
+            qmfs->v[0][n+32] = x[n];
+        }
         for (n = 0; n < 32; n++)
         {
-            v0[n+32] = x[n];
-            v1[n] = x[n+32];
+            qmfs->v[0][31 - n] = x[n + 1];
         }
-        v0[0] = v1[0];
+
+        DST2_64_unscaled(x, y);
+        qmfs->v[0][96] = 0;
         for (n = 1; n < 32; n++)
         {
-            v0[32 - n] =  v0[n + 32];
-            v1[n + 32] = -v1[32 - n];
+            qmfs->v[0][n + 96] = x[n-1];
         }
-        v1[32] = 0;
 
         /* calculate 64 output samples and window */
         for (k = 0; k < 64; k++)
         {
+#if 1
+             output[out++] = MUL_F(qmfs->v[0][k], qmf_c[k]) +
+                 MUL_F(qmfs->v[0][192 + k], qmf_c[64 + k]) +
+                 MUL_F(qmfs->v[0][256 + k], qmf_c[128 + k]) +
+                 MUL_F(qmfs->v[0][256 + 192 + k], qmf_c[128 + 64 + k]) +
+                 MUL_F(qmfs->v[0][512 + k], qmf_c[256 + k]) +
+                 MUL_F(qmfs->v[0][512 + 192 + k], qmf_c[256 + 64 + k]) +
+                 MUL_F(qmfs->v[0][768 + k], qmf_c[384 + k]) +
+                 MUL_F(qmfs->v[0][768 + 192 + k], qmf_c[384 + 64 + k]) +
+                 MUL_F(qmfs->v[0][1024 + k], qmf_c[512 + k]) +
+                 MUL_F(qmfs->v[0][1024 + 192 + k], qmf_c[512 + 64 + k]);
+#else
             output[out++] = MUL_F(v0[k], qmf_c[k]) +
                 MUL_F(v0[64 + k], qmf_c[64 + k]) +
                 MUL_F(v0[128 + k], qmf_c[128 + k]) +
@@ -239,6 +374,7 @@
                 MUL_F(v0[448 + k], qmf_c[448 + k]) +
                 MUL_F(v0[512 + k], qmf_c[512 + k]) +
                 MUL_F(v0[576 + k], qmf_c[576 + k]);
+#endif
         }
     }
 }
@@ -246,7 +382,7 @@
 void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64],
                           real_t *output)
 {
-    real_t x1[64], x2[64];
+    ALIGN real_t x1[64], x2[64];
     real_t scale = 1.f/64.f;
     int16_t n, k, out = 0;
     uint8_t l;
@@ -306,6 +442,128 @@
         }
     }
 }
+
+#ifdef USE_SSE
+void memmove_sse_576(real_t *out, const real_t *in)
+{
+    __m128 m[144];
+    uint16_t i;
+
+    for (i = 0; i < 144; i++)
+    {
+        m[i] = _mm_load_ps(&in[i*4]);
+    }
+    for (i = 0; i < 144; i++)
+    {
+        _mm_store_ps(&out[i*4], m[i]);
+    }
+}
+
+void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64],
+                              real_t *output)
+{
+    ALIGN real_t x1[64], x2[64];
+    real_t scale = 1.f/64.f;
+    int16_t n, k, out = 0;
+    uint8_t l;
+
+
+    /* qmf subsample l */
+    for (l = 0; l < sbr->numTimeSlotsRate; l++)
+    {
+        real_t *v0, *v1;
+
+        /* shift buffers */
+        memmove_sse_576(qmfs->v[0] + 64, qmfs->v[0]);
+        memmove_sse_576(qmfs->v[1] + 64, qmfs->v[1]);
+
+        v0 = qmfs->v[qmfs->v_index];
+        v1 = qmfs->v[(qmfs->v_index + 1) & 0x1];
+        qmfs->v_index = (qmfs->v_index + 1) & 0x1;
+
+        /* calculate 128 samples */
+        x1[0] = scale*QMF_RE(X[l][0]);
+        x2[63] = scale*QMF_IM(X[l][0]);
+        for (k = 0; k < 31; k++)
+        {
+            x1[2*k+1] = scale*(QMF_RE(X[l][2*k+1]) - QMF_RE(X[l][2*k+2]));
+            x1[2*k+2] = scale*(QMF_RE(X[l][2*k+1]) + QMF_RE(X[l][2*k+2]));
+
+            x2[61 - 2*k] = scale*(QMF_IM(X[l][2*k+2]) - QMF_IM(X[l][2*k+1]));
+            x2[62 - 2*k] = scale*(QMF_IM(X[l][2*k+2]) + QMF_IM(X[l][2*k+1]));
+        }
+        x1[63] = scale*QMF_RE(X[l][63]);
+        x2[0] = scale*QMF_IM(X[l][63]);
+
+        DCT4_64_kernel(x1, x1);
+        DCT4_64_kernel(x2, x2);
+
+        for (n = 0; n < 32; n++)
+        {
+            v0[    2*n   ] =  x2[2*n]   - x1[2*n];
+            v1[63- 2*n   ] =  x2[2*n]   + x1[2*n];
+            v0[    2*n+1 ] = -x2[2*n+1] - x1[2*n+1];
+            v1[63-(2*n+1)] = -x2[2*n+1] + x1[2*n+1];
+        }
+
+        /* calculate 64 output samples and window */
+        for (k = 0; k < 64; k+=4)
+        {
+            __m128 m0, m1, m2, m3, m4, m5, m6, m7, m8, m9;
+            __m128 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9;
+            __m128 s1, s2, s3, s4, s5, s6, s7, s8, s9;
+
+            m0 = _mm_load_ps(&v0[k]);
+            m1 = _mm_load_ps(&v0[k + 64]);
+            m2 = _mm_load_ps(&v0[k + 128]);
+            m3 = _mm_load_ps(&v0[k + 192]);
+            m4 = _mm_load_ps(&v0[k + 256]);
+            c0 = _mm_load_ps(&qmf_c[k]);
+            c1 = _mm_load_ps(&qmf_c[k + 64]);
+            c2 = _mm_load_ps(&qmf_c[k + 128]);
+            c3 = _mm_load_ps(&qmf_c[k + 192]);
+            c4 = _mm_load_ps(&qmf_c[k + 256]);
+
+            m0 = _mm_mul_ps(m0, c0);
+            m1 = _mm_mul_ps(m1, c1);
+            m2 = _mm_mul_ps(m2, c2);
+            m3 = _mm_mul_ps(m3, c3);
+            m4 = _mm_mul_ps(m4, c4);
+
+            s1 = _mm_add_ps(m0, m1);
+            s2 = _mm_add_ps(m2, m3);
+            s6 = _mm_add_ps(s1, s2);
+
+            m5 = _mm_load_ps(&v0[k + 320]);
+            m6 = _mm_load_ps(&v0[k + 384]);
+            m7 = _mm_load_ps(&v0[k + 448]);
+            m8 = _mm_load_ps(&v0[k + 512]);
+            m9 = _mm_load_ps(&v0[k + 576]);
+            c5 = _mm_load_ps(&qmf_c[k + 320]);
+            c6 = _mm_load_ps(&qmf_c[k + 384]);
+            c7 = _mm_load_ps(&qmf_c[k + 448]);
+            c8 = _mm_load_ps(&qmf_c[k + 512]);
+            c9 = _mm_load_ps(&qmf_c[k + 576]);
+
+            m5 = _mm_mul_ps(m5, c5);
+            m6 = _mm_mul_ps(m6, c6);
+            m7 = _mm_mul_ps(m7, c7);
+            m8 = _mm_mul_ps(m8, c8);
+            m9 = _mm_mul_ps(m9, c9);
+
+            s3 = _mm_add_ps(m4, m5);
+            s4 = _mm_add_ps(m6, m7);
+            s5 = _mm_add_ps(m8, m9);
+            s7 = _mm_add_ps(s3, s4);
+            s8 = _mm_add_ps(s5, s6);
+            s9 = _mm_add_ps(s7, s8);
+
+            _mm_store_ps(&output[out], s9);
+            out += 4;
+        }
+    }
+}
+#endif
 #endif
 
 #endif
--- a/libfaad/sbr_qmf.h
+++ b/libfaad/sbr_qmf.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_qmf.h,v 1.12 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_qmf.h,v 1.13 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __SBR_QMF_H__
@@ -43,6 +43,10 @@
                           real_t *output);
 void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64],
                           real_t *output);
+#ifdef USE_SSE
+void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, const qmf_t X[MAX_NTSRHFG][64],
+                              real_t *output);
+#endif
 
 
 #ifdef __cplusplus
--- a/libfaad/sbr_qmf_c.h
+++ b/libfaad/sbr_qmf_c.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_qmf_c.h,v 1.7 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_qmf_c.h,v 1.8 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __SBR_QMF_C_H__
@@ -38,7 +38,7 @@
 #pragma warning(disable:4244)
 #endif
 
-static real_t qmf_c[640] = {
+ALIGN static const real_t qmf_c[640] = {
     FRAC_CONST(0), FRAC_CONST(-0.00055252865047),
     FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00049475180896),
     FRAC_CONST(-0.00048752279712), FRAC_CONST(-0.00048937912498),
--- a/libfaad/sbr_syntax.c
+++ b/libfaad/sbr_syntax.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_syntax.c,v 1.15 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_syntax.c,v 1.16 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -90,12 +90,9 @@
 uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr)
 {
     uint8_t result;
-#ifdef DRM
-    uint8_t crc_len;
 
-    if (sbr->Is_DRM_SBR)
-        faad_getbits(ld, 8); /* 8-bit CRC */
-    else
+#ifdef DRM
+    if (!sbr->Is_DRM_SBR)
 #endif
     {
         uint8_t bs_extension_type = (uint8_t)faad_getbits(ld, 4
@@ -111,41 +108,6 @@
     sbr->bs_header_flag = faad_get1bit(ld
         DEBUGVAR(1,200,"sbr_bitstream(): bs_header_flag"));
 
-#ifdef DRM
-    if (sbr->Is_DRM_SBR)
-    {
-        /* Check CRC, get number of bits for check */
-        if (sbr->id_aac == ID_SCE)
-        {
-            if (sbr->lcstereo_flag)
-            {
-                if (sbr->bs_header_flag)
-                    crc_len = min(76, sbr->data_size_bits);
-                else
-                    crc_len = min(47, sbr->data_size_bits);
-            } else {
-                if (sbr->bs_header_flag)
-                    crc_len = min(74, sbr->data_size_bits);
-                else
-                    crc_len = min(47, sbr->data_size_bits);
-            }
-        } else {
-            if (sbr->bs_header_flag)
-                crc_len = min(120, sbr->data_size_bits);
-            else
-                crc_len = min(93, sbr->data_size_bits);
-        }
-
-        if ((result = faad_check_CRC(ld, crc_len)) > 0)
-            return result;
-
-        /* Rewind and read bits again to set correct position in bit-stream */
-        faad_rewindbits(ld);
-        faad_getbits(ld, 8);
-        faad_get1bit(ld);
-    }
-#endif
-
     if (sbr->bs_header_flag)
         sbr_header(ld, sbr);
 
@@ -204,46 +166,31 @@
 
     sbr->header_count++;
 
-#ifdef DRM
-    /* protocol_version (should be 0) */
-    if (sbr->Is_DRM_SBR)
-        faad_getbits(ld, 2);
-#endif
-
     sbr->bs_amp_res = faad_get1bit(ld
         DEBUGVAR(1,203,"sbr_header(): bs_amp_res"));
 
     /* bs_start_freq and bs_stop_freq must define a fequency band that does
        not exceed 48 channels */
-    sbr->bs_start_freq = faad_getbits(ld, 4
+    sbr->bs_start_freq = (uint8_t)faad_getbits(ld, 4
         DEBUGVAR(1,204,"sbr_header(): bs_start_freq"));
-    sbr->bs_stop_freq = faad_getbits(ld, 4
+    sbr->bs_stop_freq = (uint8_t)faad_getbits(ld, 4
         DEBUGVAR(1,205,"sbr_header(): bs_stop_freq"));
-    sbr->bs_xover_band = faad_getbits(ld, 3
+    sbr->bs_xover_band = (uint8_t)faad_getbits(ld, 3
         DEBUGVAR(1,206,"sbr_header(): bs_xover_band"));
     faad_getbits(ld, 2
         DEBUGVAR(1,207,"sbr_header(): bs_reserved_bits_hdr"));
-#ifdef DRM
-    if (sbr->Is_DRM_SBR)
-        sbr->bs_dataextra = faad_getbits(ld, 1);
-#endif
-    bs_header_extra_1 = faad_get1bit(ld
+    bs_header_extra_1 = (uint8_t)faad_get1bit(ld
         DEBUGVAR(1,208,"sbr_header(): bs_header_extra_1"));
-    bs_header_extra_2 = faad_get1bit(ld
+    bs_header_extra_2 = (uint8_t)faad_get1bit(ld
         DEBUGVAR(1,209,"sbr_header(): bs_header_extra_2"));
-#ifdef DRM
-    /* No low complexity stereo support so far */
-    if ((sbr->lcstereo_flag) && (sbr->Is_DRM_SBR))
-        faad_getbits(ld, 2);
-#endif
 
     if (bs_header_extra_1)
     {
-        sbr->bs_freq_scale = faad_getbits(ld, 2
+        sbr->bs_freq_scale = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,211,"sbr_header(): bs_freq_scale"));
-        sbr->bs_alter_scale = faad_get1bit(ld
+        sbr->bs_alter_scale = (uint8_t)faad_get1bit(ld
             DEBUGVAR(1,212,"sbr_header(): bs_alter_scale"));
-        sbr->bs_noise_bands = faad_getbits(ld, 2
+        sbr->bs_noise_bands = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,213,"sbr_header(): bs_noise_bands"));
     } else {
         /* Default values */
@@ -254,19 +201,14 @@
 
     if (bs_header_extra_2)
     {
-        sbr->bs_limiter_bands = faad_getbits(ld, 2
+        sbr->bs_limiter_bands = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,214,"sbr_header(): bs_limiter_bands"));
-        sbr->bs_limiter_gains = faad_getbits(ld, 2
+        sbr->bs_limiter_gains = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,215,"sbr_header(): bs_limiter_gains"));
-        sbr->bs_interpol_freq = faad_get1bit(ld
+        sbr->bs_interpol_freq = (uint8_t)faad_get1bit(ld
             DEBUGVAR(1,216,"sbr_header(): bs_interpol_freq"));
-        sbr->bs_smoothing_mode = faad_get1bit(ld
+        sbr->bs_smoothing_mode = (uint8_t)faad_get1bit(ld
             DEBUGVAR(1,217,"sbr_header(): bs_smoothing_mode"));
-#ifdef DRM
-        /* reserved */
-        if (sbr->Is_DRM_SBR)
-            faad_get1bit(ld);
-#endif
     } else {
         /* Default values */
         sbr->bs_limiter_bands = 2;
@@ -309,11 +251,6 @@
 
     sbr->rate = (sbr->bs_samplerate_mode) ? 2 : 1;
 
-#ifdef DRM
-    if (sbr->Is_DRM_SBR)
-        sbr->rate = 2;
-#endif
-
     switch (sbr->id_aac)
     {
     case ID_SCE:
@@ -334,32 +271,23 @@
 {
     uint8_t result;
 
-#ifdef DRM
-    if (!sbr->Is_DRM_SBR)
-#endif
+    if (faad_get1bit(ld
+        DEBUGVAR(1,220,"sbr_single_channel_element(): bs_data_extra")))
     {
-        if (faad_get1bit(ld
-            DEBUGVAR(1,220,"sbr_single_channel_element(): bs_data_extra")))
-        {
-            faad_getbits(ld, 4
-                DEBUGVAR(1,221,"sbr_single_channel_element(): bs_reserved_bits_data"));
-        }
+        faad_getbits(ld, 4
+            DEBUGVAR(1,221,"sbr_single_channel_element(): bs_reserved_bits_data"));
     }
 
+#ifdef DRM
+    /* bs_coupling, from sbr_channel_pair_base_element(bs_amp_res) */
+    if (sbr->Is_DRM_SBR)
+        faad_get1bit(ld);
+#endif
+
     if ((result = sbr_grid(ld, sbr, 0)) > 0)
         return result;
     sbr_dtdf(ld, sbr, 0);
     invf_mode(ld, sbr, 0);
-#ifdef DRM
-    if (sbr->Is_DRM_SBR)
-    {
-        /* sbr mode not needed in V1.0. Should be set to 2 by a V1.0 encoder */
-        faad_getbits(ld, 2);
-
-        if (sbr->bs_dataextra)
-            faad_getbits(ld, 3); /* reserved */
-    }
-#endif
     sbr_envelope(ld, sbr, 0);
     sbr_noise(ld, sbr, 0);
 
@@ -367,15 +295,8 @@
 
     memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t));
 
-#ifdef DRM
-    if (sbr->Is_DRM_SBR)
-        sbr->bs_add_harmonic_flag[0] = 0;
-    else
-#endif
-    {
-        sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld
-            DEBUGVAR(1,223,"sbr_single_channel_element(): bs_add_harmonic_flag[0]"));
-    }
+    sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld
+        DEBUGVAR(1,223,"sbr_single_channel_element(): bs_add_harmonic_flag[0]"));
     if (sbr->bs_add_harmonic_flag[0])
         sinusoidal_coding(ld, sbr, 0);
 
@@ -384,11 +305,11 @@
     if (sbr->bs_extended_data)
     {
         uint16_t nr_bits_left;
-        uint16_t cnt = faad_getbits(ld, 4
+        uint16_t cnt = (uint16_t)faad_getbits(ld, 4
             DEBUGVAR(1,225,"sbr_single_channel_element(): bs_extension_size"));
         if (cnt == 15)
         {
-            cnt += faad_getbits(ld, 8
+            cnt += (uint16_t)faad_getbits(ld, 8
                 DEBUGVAR(1,226,"sbr_single_channel_element(): bs_esc_count"));
         }
 
@@ -395,17 +316,12 @@
         nr_bits_left = 8 * cnt;
         while (nr_bits_left > 7)
         {
-            sbr->bs_extension_id = faad_getbits(ld, 2
+            sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2
                 DEBUGVAR(1,227,"sbr_single_channel_element(): bs_extension_id"));
             nr_bits_left -= 2;
             /* sbr_extension(ld, sbr, 0, nr_bits_left); */
-#ifdef DRM
-            if (!sbr->Is_DRM_SBR)
-#endif
-            {
-                sbr->bs_extension_data = faad_getbits(ld, 6
-                    DEBUGVAR(1,279,"sbr_single_channel_element(): bs_extension_data"));
-            }
+            sbr->bs_extension_data = (uint8_t)faad_getbits(ld, 6
+                DEBUGVAR(1,279,"sbr_single_channel_element(): bs_extension_data"));
         }
 
         /* Corrigendum */
@@ -421,18 +337,13 @@
 {
     uint8_t n, result;
 
-#ifdef DRM
-    if (!sbr->Is_DRM_SBR)
-#endif
+    if (faad_get1bit(ld
+        DEBUGVAR(1,228,"sbr_single_channel_element(): bs_data_extra")))
     {
-        if (faad_get1bit(ld
-            DEBUGVAR(1,228,"sbr_single_channel_element(): bs_data_extra")))
-        {
-            faad_getbits(ld, 4
-                DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data"));
-            faad_getbits(ld, 4
-                DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data"));
-        }
+        faad_getbits(ld, 4
+            DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data"));
+        faad_getbits(ld, 4
+            DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data"));
     }
 
     sbr->bs_coupling = faad_get1bit(ld
@@ -460,17 +371,7 @@
         sbr_dtdf(ld, sbr, 0);
         sbr_dtdf(ld, sbr, 1);
         invf_mode(ld, sbr, 0);
-#ifdef DRM
-        if (sbr->Is_DRM_SBR)
-        {
-            /* sbr mode not needed in V1.0. Should be set to 2 by a V1.0 encoder */
-            faad_getbits(ld, 2);
 
-            if (sbr->bs_dataextra)
-                faad_getbits(ld, 3); /* reserved */
-        }
-#endif
-
         /* more copying */
         for (n = 0; n < sbr->N_Q; n++)
             sbr->bs_invf_mode[1][n] = sbr->bs_invf_mode[0][n];
@@ -483,27 +384,13 @@
         memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t));
         memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t));
 
-#ifdef DRM
-        if (sbr->Is_DRM_SBR)
-            sbr->bs_add_harmonic_flag[0] = 0;
-        else
-#endif
-        {
-            sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld
-                DEBUGVAR(1,231,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]"));
-        }
+        sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld
+            DEBUGVAR(1,231,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]"));
         if (sbr->bs_add_harmonic_flag[0])
             sinusoidal_coding(ld, sbr, 0);
 
-#ifdef DRM
-        if (sbr->Is_DRM_SBR)
-            sbr->bs_add_harmonic_flag[1] = 0;
-        else
-#endif
-        {
-            sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld
-                DEBUGVAR(1,232,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]"));
-        }
+        sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld
+            DEBUGVAR(1,232,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]"));
         if (sbr->bs_add_harmonic_flag[1])
             sinusoidal_coding(ld, sbr, 1);
     } else {
@@ -515,17 +402,6 @@
         sbr_dtdf(ld, sbr, 1);
         invf_mode(ld, sbr, 0);
         invf_mode(ld, sbr, 1);
-#ifdef DRM
-        if (sbr->Is_DRM_SBR)
-        {
-            /* sbr mode not needed in V1.0. Should be set to 2 by a V1.0 encoder */
-            faad_getbits(ld, 2);
-            faad_getbits(ld, 2);
-
-            if (sbr->bs_dataextra)
-                faad_getbits(ld, 6); /* reserved */
-        }
-#endif
         sbr_envelope(ld, sbr, 0);
         sbr_envelope(ld, sbr, 1);
         sbr_noise(ld, sbr, 0);
@@ -534,27 +410,13 @@
         memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t));
         memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t));
 
-#ifdef DRM
-        if (sbr->Is_DRM_SBR)
-            sbr->bs_add_harmonic_flag[0] = 0;
-        else
-#endif
-        {
-            sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld
-                DEBUGVAR(1,239,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]"));
-        }
+        sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld
+            DEBUGVAR(1,239,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]"));
         if (sbr->bs_add_harmonic_flag[0])
             sinusoidal_coding(ld, sbr, 0);
 
-#ifdef DRM
-        if (sbr->Is_DRM_SBR)
-            sbr->bs_add_harmonic_flag[1] = 0;
-        else
-#endif
-        {
-            sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld
-                DEBUGVAR(1,240,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]"));
-        }
+        sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld
+            DEBUGVAR(1,240,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]"));
         if (sbr->bs_add_harmonic_flag[1])
             sinusoidal_coding(ld, sbr, 1);
     }
@@ -569,11 +431,11 @@
     if (sbr->bs_extended_data)
     {
         uint16_t nr_bits_left;
-        uint16_t cnt = faad_getbits(ld, 4
+        uint16_t cnt = (uint16_t)faad_getbits(ld, 4
             DEBUGVAR(1,234,"sbr_channel_pair_element(): bs_extension_size"));
         if (cnt == 15)
         {
-            cnt += faad_getbits(ld, 8
+            cnt += (uint16_t)faad_getbits(ld, 8
                 DEBUGVAR(1,235,"sbr_channel_pair_element(): bs_esc_count"));
         }
 
@@ -580,17 +442,12 @@
         nr_bits_left = 8 * cnt;
         while (nr_bits_left > 7)
         {
-            sbr->bs_extension_id = faad_getbits(ld, 2
+            sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2
                 DEBUGVAR(1,236,"sbr_channel_pair_element(): bs_extension_id"));
             nr_bits_left -= 2;
             /* sbr_extension(ld, sbr, 0, nr_bits_left); */
-#ifdef DRM
-            if (!sbr->Is_DRM_SBR)
-#endif
-            {
-                sbr->bs_extension_data = faad_getbits(ld, 6
-                    DEBUGVAR(1,280,"sbr_channel_pair_element(): bs_extension_data"));
-            }
+            sbr->bs_extension_data = (uint8_t)faad_getbits(ld, 6
+                DEBUGVAR(1,280,"sbr_channel_pair_element(): bs_extension_data"));
         }
 
         /* Corrigendum */
@@ -601,25 +458,36 @@
     return 0;
 }
 
+/* integer log[2](x): input range [0,10) */
+static int8_t sbr_log2(const int8_t val)
+{
+    int8_t log2tab[] = { 0, 0, 1, 2, 2, 3, 3, 3, 3, 4 };
+    if (val < 10 && val >= 0)
+        return log2tab[val];
+    else
+        return 0;
+}
+
+
 /* table 7 */
 static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch)
 {
     uint8_t i, env, rel, result;
     uint8_t bs_abs_bord, bs_abs_bord_1;
-    uint16_t bs_num_env;
+    uint8_t bs_num_env;
 
-    sbr->bs_frame_class[ch] = faad_getbits(ld, 2
+    sbr->bs_frame_class[ch] = (uint8_t)faad_getbits(ld, 2
         DEBUGVAR(1,248,"sbr_grid(): bs_frame_class"));
 
     switch (sbr->bs_frame_class[ch])
     {
     case FIXFIX:
-        i = faad_getbits(ld, 2
+        i = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,249,"sbr_grid(): bs_num_env_raw"));
 
         bs_num_env = min(1 << i, 5);
 
-        i = faad_get1bit(ld
+        i = (uint8_t)faad_get1bit(ld
             DEBUGVAR(1,250,"sbr_grid(): bs_freq_res_flag"));
         for (env = 0; env < bs_num_env; env++)
             sbr->f[ch][env] = i;
@@ -631,32 +499,23 @@
         break;
 
     case FIXVAR:
-#ifdef DRM
-        if (sbr->Is_DRM_SBR)
-        {
-            bs_abs_bord = faad_getbits(ld, 3
-                DEBUGVAR(1,251,"sbr_grid(): bs_abs_bord")) + sbr->numTimeSlots;
-        } else
-#endif
-        {
-            bs_abs_bord = faad_getbits(ld, 2
-                DEBUGVAR(1,251,"sbr_grid(): bs_abs_bord")) + sbr->numTimeSlots;
-        }
-        bs_num_env = faad_getbits(ld, 2
+        bs_abs_bord = (uint8_t)faad_getbits(ld, 2
+            DEBUGVAR(1,251,"sbr_grid(): bs_abs_bord")) + sbr->numTimeSlots;
+        bs_num_env = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,252,"sbr_grid(): bs_num_env")) + 1;
 
         for (rel = 0; rel < bs_num_env-1; rel++)
         {
-            sbr->bs_rel_bord[ch][rel] = 2 * faad_getbits(ld, 2
+            sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2
                 DEBUGVAR(1,253,"sbr_grid(): bs_rel_bord")) + 2;
         }
-        i = int_log2((int32_t)(bs_num_env + 1));
-        sbr->bs_pointer[ch] = faad_getbits(ld, i
+        i = sbr_log2(bs_num_env + 1);
+        sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i
             DEBUGVAR(1,254,"sbr_grid(): bs_pointer"));
 
         for (env = 0; env < bs_num_env; env++)
         {
-            sbr->f[ch][bs_num_env - env - 1] = faad_get1bit(ld
+            sbr->f[ch][bs_num_env - env - 1] = (uint8_t)faad_get1bit(ld
                 DEBUGVAR(1,255,"sbr_grid(): bs_freq_res"));
         }
 
@@ -667,32 +526,23 @@
         break;
 
     case VARFIX:
-#ifdef DRM
-        if (sbr->Is_DRM_SBR)
-        {
-            bs_abs_bord = faad_getbits(ld, 3
-                DEBUGVAR(1,256,"sbr_grid(): bs_abs_bord"));
-        } else
-#endif
-        {
-            bs_abs_bord = faad_getbits(ld, 2
-                DEBUGVAR(1,256,"sbr_grid(): bs_abs_bord"));
-        }
-        bs_num_env = faad_getbits(ld, 2
+        bs_abs_bord = (uint8_t)faad_getbits(ld, 2
+            DEBUGVAR(1,256,"sbr_grid(): bs_abs_bord"));
+        bs_num_env = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,257,"sbr_grid(): bs_num_env")) + 1;
 
         for (rel = 0; rel < bs_num_env-1; rel++)
         {
-            sbr->bs_rel_bord[ch][rel] = 2 * faad_getbits(ld, 2
+            sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2
                 DEBUGVAR(1,258,"sbr_grid(): bs_rel_bord")) + 2;
         }
-        i = int_log2((int32_t)(bs_num_env + 1));
-        sbr->bs_pointer[ch] = faad_getbits(ld, i
+        i = sbr_log2(bs_num_env + 1);
+        sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i
             DEBUGVAR(1,259,"sbr_grid(): bs_pointer"));
 
         for (env = 0; env < bs_num_env; env++)
         {
-            sbr->f[ch][env] = faad_get1bit(ld
+            sbr->f[ch][env] = (uint8_t)faad_get1bit(ld
                 DEBUGVAR(1,260,"sbr_grid(): bs_freq_res"));
         }
 
@@ -703,25 +553,13 @@
         break;
 
     case VARVAR:
-#ifdef DRM
-        if (sbr->Is_DRM_SBR)
-        {
-            bs_abs_bord = faad_getbits(ld, 3
-                DEBUGVAR(1,261,"sbr_grid(): bs_abs_bord_0"));
-            bs_abs_bord_1 = faad_getbits(ld, 3
-                DEBUGVAR(1,262,"sbr_grid(): bs_abs_bord_1")) + sbr->numTimeSlots;
-        }
-        else
-#endif
-        {
-            bs_abs_bord = faad_getbits(ld, 2
-                DEBUGVAR(1,261,"sbr_grid(): bs_abs_bord_0"));
-            bs_abs_bord_1 = faad_getbits(ld, 2
-                DEBUGVAR(1,262,"sbr_grid(): bs_abs_bord_1")) + sbr->numTimeSlots;
-        }
-        sbr->bs_num_rel_0[ch] = faad_getbits(ld, 2
+        bs_abs_bord = (uint8_t)faad_getbits(ld, 2
+            DEBUGVAR(1,261,"sbr_grid(): bs_abs_bord_0"));
+        bs_abs_bord_1 = (uint8_t)faad_getbits(ld, 2
+            DEBUGVAR(1,262,"sbr_grid(): bs_abs_bord_1")) + sbr->numTimeSlots;
+        sbr->bs_num_rel_0[ch] = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,263,"sbr_grid(): bs_num_rel_0"));
-        sbr->bs_num_rel_1[ch] = faad_getbits(ld, 2
+        sbr->bs_num_rel_1[ch] = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,264,"sbr_grid(): bs_num_rel_1"));
 
         bs_num_env = min(5, sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 1);
@@ -728,21 +566,21 @@
 
         for (rel = 0; rel < sbr->bs_num_rel_0[ch]; rel++)
         {
-            sbr->bs_rel_bord_0[ch][rel] = 2 * faad_getbits(ld, 2
+            sbr->bs_rel_bord_0[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2
                 DEBUGVAR(1,265,"sbr_grid(): bs_rel_bord")) + 2;
         }
         for(rel = 0; rel < sbr->bs_num_rel_1[ch]; rel++)
         {
-            sbr->bs_rel_bord_1[ch][rel] = 2 * faad_getbits(ld, 2
+            sbr->bs_rel_bord_1[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2
                 DEBUGVAR(1,266,"sbr_grid(): bs_rel_bord")) + 2;
         }
-        i = int_log2((int32_t)(sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 2));
-        sbr->bs_pointer[ch] = faad_getbits(ld, i
+        i = sbr_log2(sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 2);
+        sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i
             DEBUGVAR(1,267,"sbr_grid(): bs_pointer"));
 
         for (env = 0; env < bs_num_env; env++)
         {
-            sbr->f[ch][env] = faad_get1bit(ld
+            sbr->f[ch][env] = (uint8_t)faad_get1bit(ld
                 DEBUGVAR(1,268,"sbr_grid(): bs_freq_res"));
         }
 
@@ -794,23 +632,10 @@
 {
     uint8_t n;
 
-#ifdef DRM
-    if (sbr->Is_DRM_SBR)
+    for (n = 0; n < sbr->N_Q; n++)
     {
-        /* Only one inv_mode in DRM */
-        uint8_t invf_mode;
-        invf_mode = faad_getbits(ld, 2
+        sbr->bs_invf_mode[ch][n] = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,271,"invf_mode(): bs_invf_mode"));
-        for (n = 0; n < sbr->N_Q; n++)
-            sbr->bs_invf_mode[ch][n] = invf_mode;
-    } else
-#endif
-    {
-        for (n = 0; n < sbr->N_Q; n++)
-        {
-            sbr->bs_invf_mode[ch][n] = faad_getbits(ld, 2
-                DEBUGVAR(1,271,"invf_mode(): bs_invf_mode"));
-        }
     }
 }
 
--- a/libfaad/sbr_syntax.h
+++ b/libfaad/sbr_syntax.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sbr_syntax.h,v 1.12 2003/11/12 20:47:58 menno Exp $
+** $Id: sbr_syntax.h,v 1.13 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __SBR_SYNTAX_H__
@@ -34,10 +34,6 @@
 
 #include "bits.h"
 
-#ifdef DRM
-# define T_HFGEN_DRM 32
-# define T_HFADJ_DRM 0
-#endif
 #define T_HFGEN 8
 #define T_HFADJ 2
 
@@ -56,7 +52,7 @@
 #define NO_TIME_SLOTS     16
 #define RATE              2
 
-#define NOISE_FLOOR_OFFSET 6.0
+#define NOISE_FLOOR_OFFSET 6
 
 
 uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr);
--- a/libfaad/sine_win.h
+++ b/libfaad/sine_win.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: sine_win.h,v 1.9 2003/11/12 20:47:59 menno Exp $
+** $Id: sine_win.h,v 1.10 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __SINE_WIN_H__
@@ -37,7 +37,7 @@
 #pragma warning(disable:4244)
 #endif
 
-real_t sine_long_1024[] =
+ALIGN static const real_t sine_long_1024[] =
 {
     FRAC_CONST(0.00076699031874270449),
     FRAC_CONST(0.002300969151425805),
@@ -1066,7 +1066,7 @@
 };
 
 #ifdef ALLOW_SMALL_FRAMELENGTH
-real_t sine_long_960[] =
+ALIGN static const real_t sine_long_960[] =
 {
     FRAC_CONST(0.00081812299560725323),
     FRAC_CONST(0.0024543667964602917),
@@ -2031,7 +2031,7 @@
 };
 #endif
 
-real_t sine_short_128[] =
+ALIGN static const real_t sine_short_128[] =
 {
     FRAC_CONST(0.0061358846491544753),
     FRAC_CONST(0.01840672990580482),
@@ -2164,7 +2164,7 @@
 };
 
 #ifdef ALLOW_SMALL_FRAMELENGTH
-real_t sine_short_120[] =
+ALIGN static const real_t sine_short_120[] =
 {
     FRAC_CONST(0.0065449379673518581),
     FRAC_CONST(0.019633692460628301),
@@ -2290,7 +2290,7 @@
 #endif
 
 #ifdef LD_DEC
-real_t sine_mid_512[] =
+ALIGN static const real_t sine_mid_512[] =
 {
     FRAC_CONST(0.0015339801862847655),
     FRAC_CONST(0.0046019261204485705),
@@ -2807,7 +2807,7 @@
 };
 
 #ifdef ALLOW_SMALL_FRAMELENGTH
-real_t sine_mid_480[] =
+ALIGN static const real_t sine_mid_480[] =
 {
     FRAC_CONST(0.0016362454436240478),
     FRAC_CONST(0.00490871880799799),
@@ -3292,7 +3292,7 @@
 };
 #endif
 
-real_t ld_mid_512[] =
+ALIGN static const real_t ld_mid_512[] =
 {
     FRAC_CONST(0),
     FRAC_CONST(0),
@@ -3809,7 +3809,7 @@
 };
 
 #ifdef ALLOW_SMALL_FRAMELENGTH
-real_t ld_mid_480[] =
+ALIGN static const real_t ld_mid_480[] =
 {
     FRAC_CONST(0),
     FRAC_CONST(0),
--- a/libfaad/specrec.c
+++ b/libfaad/specrec.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: specrec.c,v 1.33 2003/11/12 20:47:59 menno Exp $
+** $Id: specrec.c,v 1.34 2003/12/17 14:43:16 menno Exp $
 **/
 
 /*
@@ -36,6 +36,7 @@
 #include "structs.h"
 
 #include <string.h>
+#include <stdlib.h>
 #include "specrec.h"
 #include "syntax.h"
 #include "iq_table.h"
@@ -50,33 +51,34 @@
 #include "ssr_fb.h"
 #endif
 
+
 #ifdef LD_DEC
-static uint8_t num_swb_512_window[] =
+ALIGN static const uint8_t num_swb_512_window[] =
 {
     0, 0, 0, 36, 36, 37, 31, 31, 0, 0, 0, 0
 };
-static uint8_t num_swb_480_window[] =
+ALIGN static const uint8_t num_swb_480_window[] =
 {
     0, 0, 0, 35, 35, 37, 30, 30, 0, 0, 0, 0
 };
 #endif
 
-static uint8_t num_swb_960_window[] =
+ALIGN static const uint8_t num_swb_960_window[] =
 {
     40, 40, 45, 49, 49, 49, 46, 46, 42, 42, 42, 40
 };
 
-static uint8_t num_swb_1024_window[] =
+ALIGN static const uint8_t num_swb_1024_window[] =
 {
     41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40
 };
 
-static uint8_t num_swb_128_window[] =
+ALIGN static const uint8_t num_swb_128_window[] =
 {
     12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15
 };
 
-static uint16_t swb_offset_1024_96[] =
+ALIGN static const uint16_t swb_offset_1024_96[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56,
     64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, 240,
@@ -83,12 +85,12 @@
     276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024
 };
 
-static uint16_t swb_offset_128_96[] =
+ALIGN static const uint16_t swb_offset_128_96[] =
 {
     0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
 };
 
-static uint16_t swb_offset_1024_64[] =
+ALIGN static const uint16_t swb_offset_1024_64[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56,
     64, 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268,
@@ -96,13 +98,12 @@
     864, 904, 944, 984, 1024
 };
 
-static uint16_t swb_offset_128_64[] =
+ALIGN static const uint16_t swb_offset_128_64[] =
 {
     0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
 };
 
-
-static uint16_t swb_offset_1024_48[] =
+ALIGN static const uint16_t swb_offset_1024_48[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72,
     80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292,
@@ -111,7 +112,7 @@
 };
 
 #ifdef LD_DEC
-static uint16_t swb_offset_512_48[] =
+ALIGN static const uint16_t swb_offset_512_48[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84,
     92, 100, 112, 124, 136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396,
@@ -118,7 +119,7 @@
     428, 460, 512
 };
 
-static uint16_t swb_offset_480_48[] =
+ALIGN static const uint16_t swb_offset_480_48[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72 ,80 ,88,
     96, 108, 120, 132, 144, 156, 172, 188, 212, 240, 272, 304, 336, 368, 400,
@@ -126,12 +127,12 @@
 };
 #endif
 
-static uint16_t swb_offset_128_48[] =
+ALIGN static const uint16_t swb_offset_128_48[] =
 {
     0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128
 };
 
-static uint16_t swb_offset_1024_32[] =
+ALIGN static const uint16_t swb_offset_1024_32[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72,
     80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292,
@@ -140,7 +141,7 @@
 };
 
 #ifdef LD_DEC
-static uint16_t swb_offset_512_32[] =
+ALIGN static const uint16_t swb_offset_512_32[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80,
     88, 96, 108, 120, 132, 144, 160, 176, 192, 212, 236, 260, 288, 320, 352,
@@ -147,7 +148,7 @@
     384, 416, 448, 480, 512
 };
 
-static uint16_t swb_offset_480_32[] =
+ALIGN static const uint16_t swb_offset_480_32[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80,
     88, 96, 104, 112, 124, 136, 148, 164, 180, 200, 224, 256, 288, 320, 352,
@@ -155,7 +156,7 @@
 };
 #endif
 
-static uint16_t swb_offset_1024_24[] =
+ALIGN static const uint16_t swb_offset_1024_24[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68,
     76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220,
@@ -164,7 +165,7 @@
 };
 
 #ifdef LD_DEC
-static uint16_t swb_offset_512_24[] =
+ALIGN static const uint16_t swb_offset_512_24[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68,
     80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416,
@@ -171,7 +172,7 @@
     448, 480, 512
 };
 
-static uint16_t swb_offset_480_24[] =
+ALIGN static const uint16_t swb_offset_480_24[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120,
     140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480
@@ -178,12 +179,12 @@
 };
 #endif
 
-static uint16_t swb_offset_128_24[] =
+ALIGN static const uint16_t swb_offset_128_24[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128
 };
 
-static uint16_t swb_offset_1024_16[] =
+ALIGN static const uint16_t swb_offset_1024_16[] =
 {
     0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124,
     136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344,
@@ -190,12 +191,12 @@
     368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024
 };
 
-static uint16_t swb_offset_128_16[] =
+ALIGN static const uint16_t swb_offset_128_16[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128
 };
 
-static uint16_t swb_offset_1024_8[] =
+ALIGN static const uint16_t swb_offset_1024_8[] =
 {
     0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172,
     188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448,
@@ -202,12 +203,12 @@
     476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024
 };
 
-static uint16_t swb_offset_128_8[] =
+ALIGN static const uint16_t swb_offset_128_8[] =
 {
     0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128
 };
 
-static uint16_t *swb_offset_1024_window[] =
+ALIGN static const uint16_t *swb_offset_1024_window[] =
 {
     swb_offset_1024_96,      /* 96000 */
     swb_offset_1024_96,      /* 88200 */
@@ -224,7 +225,7 @@
 };
 
 #ifdef LD_DEC
-static uint16_t *swb_offset_512_window[] =
+ALIGN static const uint16_t *swb_offset_512_window[] =
 {
     0,                       /* 96000 */
     0,                       /* 88200 */
@@ -240,7 +241,7 @@
     0                        /* 8000  */
 };
 
-static uint16_t *swb_offset_480_window[] =
+ALIGN static const uint16_t *swb_offset_480_window[] =
 {
     0,                       /* 96000 */
     0,                       /* 88200 */
@@ -257,7 +258,7 @@
 };
 #endif
 
-static uint16_t *swb_offset_128_window[] =
+ALIGN static const  uint16_t *swb_offset_128_window[] =
 {
     swb_offset_128_96,       /* 96000 */
     swb_offset_128_96,       /* 88200 */
@@ -425,7 +426,7 @@
     uint8_t g, sfb, win;
     uint16_t width, bin, k, gindex;
 
-    real_t tmp_spec[1024] = {0};
+    ALIGN real_t tmp_spec[1024] = {0};
 
     k = 0;
     gindex = 0;
@@ -460,21 +461,8 @@
     memcpy(spec_data, tmp_spec, frame_len*sizeof(real_t));
 }
 
-#ifndef FIXED_POINT
-void build_tables(real_t *pow2_table)
+static INLINE real_t iquant(int16_t q, const real_t *tab)
 {
-    uint16_t i;
-
-    /* build pow(2, 0.25*x) table for scalefactors */
-    for(i = 0; i < POW_TABLE_SIZE; i++)
-    {
-        pow2_table[i] = REAL_CONST(pow(2.0, 0.25 * (i-100)));
-    }
-}
-#endif
-
-static INLINE real_t iquant(int16_t q, real_t *tab)
-{
 #ifdef FIXED_POINT
     static const real_t errcorr[] = {
         REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0),
@@ -498,25 +486,27 @@
     x2 = tab[(q>>3) + 1];
     return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1);
 #else
-    real_t sgn = REAL_CONST(1.0);
-
     if (q < 0)
     {
-        q = -q;
-        sgn = REAL_CONST(-1.0);
+        if (-q > IQ_TABLE_SIZE)
+            return 0;
+
+        /* tab contains a value for all possible q [0,8192] */
+        return -tab[-q];
     }
 
-    if (q < IQ_TABLE_SIZE)
-        return sgn * tab[q];
+    if (q > IQ_TABLE_SIZE)
+        return 0;
 
-    return sgn * (real_t)pow(q, 4.0/3.0);
+    /* tab contains a value for all possible q [0,8192] */
+    return tab[q];
 #endif
 }
 
-static void inverse_quantization(real_t *x_invquant, int16_t *x_quant, uint16_t frame_len)
+static void inverse_quantization(real_t *x_invquant, const int16_t *x_quant, const uint16_t frame_len)
 {
     int16_t i;
-    real_t *tab = iq_table;
+    const real_t *tab = iq_table;
 
     for(i = 0; i < frame_len; i+=4)
     {
@@ -527,17 +517,32 @@
     }
 }
 
-#ifndef FIXED_POINT
-static INLINE real_t get_scale_factor_gain(uint16_t scale_factor, real_t *pow2_table)
+ALIGN static const real_t pow2sf_tab[] = {
+    2.9802322387695313E-008, 5.9604644775390625E-008, 1.1920928955078125E-007,
+    2.384185791015625E-007, 4.76837158203125E-007, 9.5367431640625E-007,
+    1.9073486328125E-006, 3.814697265625E-006, 7.62939453125E-006,
+    1.52587890625E-005, 3.0517578125E-005, 6.103515625E-005,
+    0.0001220703125, 0.000244140625, 0.00048828125,
+    0.0009765625, 0.001953125, 0.00390625,
+    0.0078125, 0.015625, 0.03125,
+    0.0625, 0.125, 0.25,
+    0.5, 1, 2,
+    4, 8, 16, 32,
+    64, 128, 256,
+    512, 1024, 2048,
+    4096, 8192, 16384,
+    32768, 65536, 131072,
+    262144, 524288, 1048576,
+    2097152, 4194304, 8388608,
+    16777216, 33554432, 67108864,
+    134217728, 268435456, 536870912,
+    1073741824, 2147483648, 4294967296,
+    8589934592, 17179869184, 34359738368,
+    68719476736, 137438953472, 274877906944
+};
+
+ALIGN static real_t pow2_table[] =
 {
-    if (scale_factor < POW_TABLE_SIZE)
-        return pow2_table[scale_factor];
-    else
-        return REAL_CONST(pow(2.0, 0.25 * (scale_factor - 100)));
-}
-#else
-static real_t pow2_table[] =
-{
     COEF_CONST(0.59460355750136053335874998528024), /* 2^-0.75 */
     COEF_CONST(0.70710678118654752440084436210485), /* 2^-0.5 */
     COEF_CONST(0.84089641525371454303112547623321), /* 2^-0.25 */
@@ -546,18 +551,13 @@
     COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */
     COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */
 };
-#endif
 
-static void apply_scalefactors(faacDecHandle hDecoder, ic_stream *ics,
-                               real_t *x_invquant, uint16_t frame_len)
+void apply_scalefactors(faacDecHandle hDecoder, ic_stream *ics,
+                        real_t *x_invquant, uint16_t frame_len)
 {
     uint8_t g, sfb;
     uint16_t top;
-#ifndef FIXED_POINT
-    real_t scale;
-#else
     int32_t exp, frac;
-#endif
     uint8_t groups = 0;
     uint16_t nshort = frame_len/8;
 
@@ -573,12 +573,10 @@
         {
             top = ics->sect_sfb_offset[g][sfb+1];
 
-#ifndef FIXED_POINT
-            scale = get_scale_factor_gain(ics->scale_factors[g][sfb], hDecoder->pow2_table);
-#else
-            exp = (ics->scale_factors[g][sfb] - 100) / 4;
-            frac = (ics->scale_factors[g][sfb] - 100) % 4;
+            exp = (ics->scale_factors[g][sfb] - 100) >> 2;
+            frac = (ics->scale_factors[g][sfb] - 100) & 3;
 
+#ifdef FIXED_POINT
             /* IMDCT pre-scaling */
             if (hDecoder->object_type == LD)
             {
@@ -589,20 +587,12 @@
                 else
                     exp -= 7 /*10*/;
             }
-#if (REAL_BITS == 16)
-            exp--;
 #endif
-#endif
 
             /* minimum size of a sf band is 4 and always a multiple of 4 */
             for ( ; k < top; k += 4)
             {
-#ifndef FIXED_POINT
-                x_invquant[k+(groups*nshort)]   = x_invquant[k+(groups*nshort)]   * scale;
-                x_invquant[k+(groups*nshort)+1] = x_invquant[k+(groups*nshort)+1] * scale;
-                x_invquant[k+(groups*nshort)+2] = x_invquant[k+(groups*nshort)+2] * scale;
-                x_invquant[k+(groups*nshort)+3] = x_invquant[k+(groups*nshort)+3] * scale;
-#else
+#ifdef FIXED_POINT
                 if (exp < 0)
                 {
                     x_invquant[k+(groups*nshort)] >>= -exp;
@@ -615,32 +605,88 @@
                     x_invquant[k+(groups*nshort)+2] <<= exp;
                     x_invquant[k+(groups*nshort)+3] <<= exp;
                 }
+#else
+                x_invquant[k+(groups*nshort)]   = x_invquant[k+(groups*nshort)]   * pow2sf_tab[exp+25];
+                x_invquant[k+(groups*nshort)+1] = x_invquant[k+(groups*nshort)+1] * pow2sf_tab[exp+25];
+                x_invquant[k+(groups*nshort)+2] = x_invquant[k+(groups*nshort)+2] * pow2sf_tab[exp+25];
+                x_invquant[k+(groups*nshort)+3] = x_invquant[k+(groups*nshort)+3] * pow2sf_tab[exp+25];
+#endif
 
-                if (frac)
-                {
-                    x_invquant[k+(groups*nshort)]   = MUL_C(x_invquant[k+(groups*nshort)],pow2_table[frac + 3]);
-                    x_invquant[k+(groups*nshort)+1] = MUL_C(x_invquant[k+(groups*nshort)+1],pow2_table[frac + 3]);
-                    x_invquant[k+(groups*nshort)+2] = MUL_C(x_invquant[k+(groups*nshort)+2],pow2_table[frac + 3]);
-                    x_invquant[k+(groups*nshort)+3] = MUL_C(x_invquant[k+(groups*nshort)+3],pow2_table[frac + 3]);
-                }
-#endif
+                x_invquant[k+(groups*nshort)]   = MUL_C(x_invquant[k+(groups*nshort)],pow2_table[frac + 3]);
+                x_invquant[k+(groups*nshort)+1] = MUL_C(x_invquant[k+(groups*nshort)+1],pow2_table[frac + 3]);
+                x_invquant[k+(groups*nshort)+2] = MUL_C(x_invquant[k+(groups*nshort)+2],pow2_table[frac + 3]);
+                x_invquant[k+(groups*nshort)+3] = MUL_C(x_invquant[k+(groups*nshort)+3],pow2_table[frac + 3]);
+            }
+        }
+        groups += ics->window_group_length[g];
+    }
+}
+
+#ifdef USE_SSE
+void apply_scalefactors_sse(faacDecHandle hDecoder, ic_stream *ics,
+                            real_t *x_invquant, uint16_t frame_len)
+{
+    uint8_t g, sfb;
+    uint16_t top;
+    int32_t exp, frac;
+    uint8_t groups = 0;
+    uint16_t nshort = frame_len/8;
+
+    for (g = 0; g < ics->num_window_groups; g++)
+    {
+        uint16_t k = 0;
+
+        /* using this nshort*groups doesn't hurt long blocks, because
+           long blocks only have 1 group, so that means 'groups' is
+           always 0 for long blocks
+        */
+        for (sfb = 0; sfb < ics->max_sfb; sfb++)
+        {
+            top = ics->sect_sfb_offset[g][sfb+1];
+
+            exp = (ics->scale_factors[g][sfb] - 100) >> 2;
+            frac = (ics->scale_factors[g][sfb] - 100) & 3;
+
+            /* minimum size of a sf band is 4 and always a multiple of 4 */
+            for ( ; k < top; k += 4)
+            {
+                __m128 m1 = _mm_load_ps(&x_invquant[k+(groups*nshort)]);
+                __m128 m2 = _mm_load_ps1(&pow2sf_tab[exp+25]);
+                __m128 m4 = _mm_mul_ps(m1, m2);
+                __m128 m3 = _mm_load_ps1(&pow2_table[frac + 3]);
+                __m128 m5 = _mm_mul_ps(m3, m4);
+                _mm_store_ps(&x_invquant[k+(groups*nshort)], m5);
             }
         }
         groups += ics->window_group_length[g];
     }
 }
+#endif
 
 void reconstruct_single_channel(faacDecHandle hDecoder, ic_stream *ics,
                                 element *sce, int16_t *spec_data)
 {
-    real_t spec_coef[1024];
+    ALIGN real_t spec_coef[1024];
 
+#ifdef PROFILE
+    int64_t count = faad_get_ts();
+#endif
+
     /* inverse quantization */
     inverse_quantization(spec_coef, spec_data, hDecoder->frameLength);
 
     /* apply scalefactors */
+#ifndef USE_SSE
     apply_scalefactors(hDecoder, ics, spec_coef, hDecoder->frameLength);
+#else
+    hDecoder->apply_sf_func(hDecoder, ics, spec_coef, hDecoder->frameLength);
+#endif
 
+#ifdef PROFILE
+    count = faad_get_ts() - count;
+    hDecoder->requant_cycles += count;
+#endif
+
     /* deinterleave short block grouping */
     if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
         quant_to_spec(ics, spec_coef, hDecoder->frameLength);
@@ -656,7 +702,7 @@
         /* allocate the state only when needed */
         if (hDecoder->pred_stat[sce->channel] == NULL)
         {
-            hDecoder->pred_stat[sce->channel] = (pred_state*)malloc(hDecoder->frameLength * sizeof(pred_state));
+            hDecoder->pred_stat[sce->channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state));
             reset_all_predictors(hDecoder->pred_stat[sce->channel], hDecoder->frameLength);
         }
 
@@ -690,7 +736,7 @@
         /* allocate the state only when needed */
         if (hDecoder->lt_pred_stat[sce->channel] == NULL)
         {
-            hDecoder->lt_pred_stat[sce->channel] = (int16_t*)malloc(hDecoder->frameLength*4 * sizeof(int16_t));
+            hDecoder->lt_pred_stat[sce->channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t));
             memset(hDecoder->lt_pred_stat[sce->channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));
         }
 
@@ -714,7 +760,7 @@
 
     if (hDecoder->time_out[sce->channel] == NULL)
     {
-        hDecoder->time_out[sce->channel] = (real_t*)malloc(hDecoder->frameLength*2*sizeof(real_t));
+        hDecoder->time_out[sce->channel] = (real_t*)faad_malloc(hDecoder->frameLength*2*sizeof(real_t));
         memset(hDecoder->time_out[sce->channel], 0, hDecoder->frameLength*2*sizeof(real_t));
     }
 
@@ -723,20 +769,26 @@
     if (hDecoder->object_type != SSR)
     {
 #endif
+#ifdef USE_SSE
+        hDecoder->fb->if_func(hDecoder->fb, ics->window_sequence, ics->window_shape,
+            hDecoder->window_shape_prev[sce->channel], spec_coef,
+            hDecoder->time_out[sce->channel], hDecoder->object_type, hDecoder->frameLength);
+#else
         ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape,
             hDecoder->window_shape_prev[sce->channel], spec_coef,
             hDecoder->time_out[sce->channel], hDecoder->object_type, hDecoder->frameLength);
+#endif
 #ifdef SSR_DEC
     } else {
         if (hDecoder->ssr_overlap[sce->channel] == NULL)
         {
-            hDecoder->ssr_overlap[sce->channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
+            hDecoder->ssr_overlap[sce->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
             memset(hDecoder->ssr_overlap[sce->channel], 0, 2*hDecoder->frameLength*sizeof(real_t));
         }
         if (hDecoder->prev_fmd[sce->channel] == NULL)
         {
             uint16_t k;
-            hDecoder->prev_fmd[sce->channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
+            hDecoder->prev_fmd[sce->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
             for (k = 0; k < 2*hDecoder->frameLength; k++)
                 hDecoder->prev_fmd[sce->channel][k] = REAL_CONST(-1);
         }
@@ -763,17 +815,31 @@
 void reconstruct_channel_pair(faacDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2,
                               element *cpe, int16_t *spec_data1, int16_t *spec_data2)
 {
-    real_t spec_coef1[1024];
-    real_t spec_coef2[1024];
+    ALIGN real_t spec_coef1[1024];
+    ALIGN real_t spec_coef2[1024];
 
+#ifdef PROFILE
+    int64_t count = faad_get_ts();
+#endif
+
     /* inverse quantization */
     inverse_quantization(spec_coef1, spec_data1, hDecoder->frameLength);
     inverse_quantization(spec_coef2, spec_data2, hDecoder->frameLength);
 
     /* apply scalefactors */
+#ifndef USE_SSE
     apply_scalefactors(hDecoder, ics1, spec_coef1, hDecoder->frameLength);
     apply_scalefactors(hDecoder, ics2, spec_coef2, hDecoder->frameLength);
+#else
+    hDecoder->apply_sf_func(hDecoder, ics1, spec_coef1, hDecoder->frameLength);
+    hDecoder->apply_sf_func(hDecoder, ics2, spec_coef2, hDecoder->frameLength);
+#endif
 
+#ifdef PROFILE
+    count = faad_get_ts() - count;
+    hDecoder->requant_cycles += count;
+#endif
+
     /* deinterleave short block grouping */
     if (ics1->window_sequence == EIGHT_SHORT_SEQUENCE)
         quant_to_spec(ics1, spec_coef1, hDecoder->frameLength);
@@ -803,12 +869,12 @@
         /* allocate the state only when needed */
         if (hDecoder->pred_stat[cpe->channel] == NULL)
         {
-            hDecoder->pred_stat[cpe->channel] = (pred_state*)malloc(hDecoder->frameLength * sizeof(pred_state));
+            hDecoder->pred_stat[cpe->channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state));
             reset_all_predictors(hDecoder->pred_stat[cpe->channel], hDecoder->frameLength);
         }
         if (hDecoder->pred_stat[cpe->paired_channel] == NULL)
         {
-            hDecoder->pred_stat[cpe->paired_channel] = (pred_state*)malloc(hDecoder->frameLength * sizeof(pred_state));
+            hDecoder->pred_stat[cpe->paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state));
             reset_all_predictors(hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength);
         }
 
@@ -853,12 +919,12 @@
         /* allocate the state only when needed */
         if (hDecoder->lt_pred_stat[cpe->channel] == NULL)
         {
-            hDecoder->lt_pred_stat[cpe->channel] = (int16_t*)malloc(hDecoder->frameLength*4 * sizeof(int16_t));
+            hDecoder->lt_pred_stat[cpe->channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t));
             memset(hDecoder->lt_pred_stat[cpe->channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));
         }
         if (hDecoder->lt_pred_stat[cpe->paired_channel] == NULL)
         {
-            hDecoder->lt_pred_stat[cpe->paired_channel] = (int16_t*)malloc(hDecoder->frameLength*4 * sizeof(int16_t));
+            hDecoder->lt_pred_stat[cpe->paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t));
             memset(hDecoder->lt_pred_stat[cpe->paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));
         }
 
@@ -889,12 +955,12 @@
 
     if (hDecoder->time_out[cpe->channel] == NULL)
     {
-        hDecoder->time_out[cpe->channel] = (real_t*)malloc(hDecoder->frameLength*2*sizeof(real_t));
+        hDecoder->time_out[cpe->channel] = (real_t*)faad_malloc(hDecoder->frameLength*2*sizeof(real_t));
         memset(hDecoder->time_out[cpe->channel], 0, hDecoder->frameLength*2*sizeof(real_t));
     }
     if (hDecoder->time_out[cpe->paired_channel] == NULL)
     {
-        hDecoder->time_out[cpe->paired_channel] = (real_t*)malloc(hDecoder->frameLength*2*sizeof(real_t));
+        hDecoder->time_out[cpe->paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*2*sizeof(real_t));
         memset(hDecoder->time_out[cpe->paired_channel], 0, hDecoder->frameLength*2*sizeof(real_t));
     }
 
@@ -903,6 +969,14 @@
     if (hDecoder->object_type != SSR)
     {
 #endif
+#ifdef USE_SSE
+        hDecoder->fb->if_func(hDecoder->fb, ics1->window_sequence, ics1->window_shape,
+            hDecoder->window_shape_prev[cpe->channel], spec_coef1,
+            hDecoder->time_out[cpe->channel], hDecoder->object_type, hDecoder->frameLength);
+        hDecoder->fb->if_func(hDecoder->fb, ics2->window_sequence, ics2->window_shape,
+            hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2,
+            hDecoder->time_out[cpe->paired_channel], hDecoder->object_type, hDecoder->frameLength);
+#else
         ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape,
             hDecoder->window_shape_prev[cpe->channel], spec_coef1,
             hDecoder->time_out[cpe->channel], hDecoder->object_type, hDecoder->frameLength);
@@ -909,22 +983,23 @@
         ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape,
             hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2,
             hDecoder->time_out[cpe->paired_channel], hDecoder->object_type, hDecoder->frameLength);
+#endif
 #ifdef SSR_DEC
     } else {
         if (hDecoder->ssr_overlap[cpe->channel] == NULL)
         {
-            hDecoder->ssr_overlap[cpe->channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
+            hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
             memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t));
         }
         if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL)
         {
-            hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
+            hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
             memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t));
         }
         if (hDecoder->prev_fmd[cpe->channel] == NULL)
         {
             uint16_t k;
-            hDecoder->prev_fmd[cpe->channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
+            hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
             for (k = 0; k < 2*hDecoder->frameLength; k++)
                 hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1);
         }
@@ -931,7 +1006,7 @@
         if (hDecoder->prev_fmd[cpe->paired_channel] == NULL)
         {
             uint16_t k;
-            hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
+            hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));
             for (k = 0; k < 2*hDecoder->frameLength; k++)
                 hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1);
         }
--- a/libfaad/specrec.h
+++ b/libfaad/specrec.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: specrec.h,v 1.20 2003/11/12 20:47:59 menno Exp $
+** $Id: specrec.h,v 1.21 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __SPECREC_H__
@@ -36,13 +36,13 @@
 
 uint8_t window_grouping_info(faacDecHandle hDecoder, ic_stream *ics);
 static void quant_to_spec(ic_stream *ics, real_t *spec_data, uint16_t frame_len);
-static void inverse_quantization(real_t *x_invquant, int16_t *x_quant, uint16_t frame_len);
-static void apply_scalefactors(faacDecHandle hDecoder, ic_stream *ics, real_t *x_invquant,
-                               uint16_t frame_len);
-#ifndef FIXED_POINT
-void build_tables(real_t *pow2_table);
+static void inverse_quantization(real_t *x_invquant, const int16_t *x_quant, const uint16_t frame_len);
+void apply_scalefactors(faacDecHandle hDecoder, ic_stream *ics, real_t *x_invquant,
+                        uint16_t frame_len);
+#ifdef USE_SSE
+void apply_scalefactors_sse(faacDecHandle hDecoder, ic_stream *ics, real_t *x_invquant,
+                            uint16_t frame_len);
 #endif
-
 void reconstruct_channel_pair(faacDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2,
                               element *cpe, int16_t *spec_data1, int16_t *spec_data2);
 void reconstruct_single_channel(faacDecHandle hDecoder, ic_stream *ics, element *sce,
--- a/libfaad/ssr_fb.c
+++ b/libfaad/ssr_fb.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: ssr_fb.c,v 1.8 2003/11/12 20:47:59 menno Exp $
+** $Id: ssr_fb.c,v 1.9 2003/12/17 14:43:16 menno Exp $
 **/
 
 #include "common.h"
@@ -42,7 +42,7 @@
 {
     uint16_t nshort = frame_len/8;
 
-    fb_info *fb = (fb_info*)malloc(sizeof(fb_info));
+    fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info));
     memset(fb, 0, sizeof(fb_info));
 
     /* normal */
@@ -62,7 +62,7 @@
     faad_mdct_end(fb->mdct256);
     faad_mdct_end(fb->mdct2048);
 
-    if (fb) free(fb);
+    if (fb) faad_free(fb);
 }
 
 static INLINE void imdct_ssr(fb_info *fb, real_t *in_data,
@@ -102,7 +102,7 @@
 
     uint16_t nflat_ls = (nlong-nshort)/2;
 
-    transf_buf = (real_t*)malloc(2*nlong*sizeof(real_t));
+    transf_buf = (real_t*)faad_malloc(2*nlong*sizeof(real_t));
 
     window_long       = fb->long_window[window_shape];
     window_long_prev  = fb->long_window[window_shape_prev];
@@ -175,7 +175,7 @@
 		break;
     }
 
-    free(transf_buf);
+    faad_free(transf_buf);
 }
 
 
--- a/libfaad/structs.h
+++ b/libfaad/structs.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: structs.h,v 1.21 2003/11/12 20:47:59 menno Exp $
+** $Id: structs.h,v 1.22 2003/12/17 14:43:16 menno Exp $
 **/
 
 #ifndef __STRUCTS_H__
@@ -55,14 +55,17 @@
     uint16_t N;
     cfft_info *cfft;
     complex_t *sincos;
+#ifdef PROFILE
+    int64_t cycles;
+#endif
 } mdct_info;
 
 typedef struct
 {
-    real_t *long_window[2];
-    real_t *short_window[2];
+    const real_t *long_window[2];
+    const real_t *short_window[2];
 #ifdef LD_DEC
-    real_t *ld_window[2];
+    const real_t *ld_window[2];
 #endif
 
     mdct_info *mdct256;
@@ -70,6 +73,12 @@
     mdct_info *mdct1024;
 #endif
     mdct_info *mdct2048;
+#ifdef PROFILE
+    int64_t cycles;
+#endif
+#ifdef USE_SSE
+    void (*if_func)(void *a, uint8_t b, uint8_t c, uint8_t d, real_t *e, real_t *f, uint8_t g, uint16_t h);
+#endif
 } fb_info;
 
 typedef struct
@@ -411,12 +420,6 @@
     int16_t *lt_pred_stat[MAX_CHANNELS];
 #endif
 
-#ifndef FIXED_POINT
-#if POW_TABLE_SIZE
-    real_t *pow2_table;
-#endif
-#endif
-
     /* Program Config Element */
     uint8_t pce_set;
     program_config pce;
@@ -426,6 +429,18 @@
 
     /* Configuration data */
     faacDecConfiguration config;
+
+#ifdef USE_SSE
+    void (*apply_sf_func)(void *a, void *b, void *c, uint16_t d);
+#endif
+
+#ifdef PROFILE
+    int64_t cycles;
+    int64_t spectral_cycles;
+    int64_t output_cycles;
+    int64_t scalefac_cycles;
+    int64_t requant_cycles;
+#endif
 } faacDecStruct, *faacDecHandle;
 
 
--- a/libfaad/syntax.c
+++ b/libfaad/syntax.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: syntax.c,v 1.61 2003/11/12 20:47:59 menno Exp $
+** $Id: syntax.c,v 1.62 2003/12/17 14:43:16 menno Exp $
 **/
 
 /*
@@ -516,12 +516,8 @@
     uint8_t retval = 0;
     element sce = {0};
     ic_stream *ics = &(sce.ics1);
-    int16_t spec_data[1024] = {0};
-#ifdef DRM
-    uint8_t result;
+    ALIGN int16_t spec_data[1024] = {0};
 
-    if (hDecoder->object_type != DRM_ER_LC)
-#endif
     sce.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG
         DEBUGVAR(1,38,"single_lfe_channel_element(): element_instance_tag"));
 
@@ -529,40 +525,10 @@
     sce.channel = channel;
     sce.paired_channel = -1;
 
-#ifdef DRM
-    if (hDecoder->object_type == DRM_ER_LC)
-    {
-        individual_channel_stream(hDecoder, &sce, ld, ics, 0, spec_data);
+    retval = individual_channel_stream(hDecoder, &sce, ld, ics, 0, spec_data);
+    if (retval > 0)
+        return retval;
 
-        if (ics->tns_data_present)
-            tns_data(ics, &(ics->tns), ld);
-
-        if ((result = faad_check_CRC( ld, faad_get_processed_bits(ld) - 8 )) > 0)
-            return result;
-
-        /* error resilient spectral data decoding */
-        if ((result = reordered_spectral_data(hDecoder, ics, ld, spec_data)) > 0)
-            return result;
-
-        /* pulse coding reconstruction */
-        if (ics->pulse_data_present)
-        {
-            if (ics->window_sequence != EIGHT_SHORT_SEQUENCE)
-            {
-                if ((result = pulse_decode(ics, spec_data, hDecoder->frameLength)) > 0)
-                    return result;
-            } else {
-                return 2; /* pulse coding not allowed for short blocks */
-            }
-        }
-    } else
-#endif
-    {
-        retval = individual_channel_stream(hDecoder, &sce, ld, ics, 0, spec_data);
-        if (retval > 0)
-            return retval;
-    }
-
     /* noiseless coding is done, spectral reconstruction is done now */
     reconstruct_single_channel(hDecoder, ics, &sce, spec_data);
 
@@ -573,8 +539,8 @@
 static uint8_t channel_pair_element(faacDecHandle hDecoder, bitfile *ld,
                                     uint8_t channels, uint8_t *tag)
 {
-    int16_t spec_data1[1024] = {0};
-    int16_t spec_data2[1024] = {0};
+    ALIGN int16_t spec_data1[1024] = {0};
+    ALIGN int16_t spec_data2[1024] = {0};
     element cpe = {0};
     ic_stream *ics1 = &(cpe.ics1);
     ic_stream *ics2 = &(cpe.ics2);
@@ -583,9 +549,6 @@
     cpe.channel        = channels;
     cpe.paired_channel = channels+1;
 
-#ifdef DRM
-    if (hDecoder->object_type != DRM_ER_LC)
-#endif
     cpe.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG
         DEBUGVAR(1,39,"channel_pair_element(): element_instance_tag"));
     *tag = cpe.element_instance_tag;
@@ -652,47 +615,6 @@
         return result;
     }
 
-#ifdef DRM
-    if (hDecoder->object_type == DRM_ER_LC)
-    {
-        if (ics1->tns_data_present)
-            tns_data(ics1, &(ics1->tns), ld);
-
-        if (ics1->tns_data_present)
-            tns_data(ics2, &(ics2->tns), ld);
-
-        if ((result = faad_check_CRC( ld, faad_get_processed_bits(ld) - 8 )) > 0)
-            return result;
-
-        /* error resilient spectral data decoding */
-        if ((result = reordered_spectral_data(hDecoder, ics1, ld, spec_data1)) > 0)
-            return result;
-        if ((result = reordered_spectral_data(hDecoder, ics2, ld, spec_data2)) > 0)
-            return result;
-        /* pulse coding reconstruction */
-        if (ics1->pulse_data_present)
-        {
-            if (ics1->window_sequence != EIGHT_SHORT_SEQUENCE)
-            {
-                if ((result = pulse_decode(ics1, spec_data1, hDecoder->frameLength)) > 0)
-                    return result;
-            } else {
-                return 2; /* pulse coding not allowed for short blocks */
-            }
-        }
-        if (ics2->pulse_data_present)
-        {
-            if (ics2->window_sequence != EIGHT_SHORT_SEQUENCE)
-            {
-                if ((result = pulse_decode(ics2, spec_data2, hDecoder->frameLength)) > 0)
-                    return result;
-            } else {
-                return 2; /* pulse coding not allowed for short blocks */
-            }
-        }
-    }
-#endif
-
     /* noiseless coding is done, spectral reconstruction is done now */
     reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, spec_data1, spec_data2);
 
@@ -929,7 +851,7 @@
 
     for (i = 0; i < count; i++)
     {
-        uint8_t data = faad_getbits(ld, LEN_BYTE
+        uint8_t data = (uint8_t)faad_getbits(ld, LEN_BYTE
             DEBUGVAR(1,64,"data_stream_element(): data_stream_byte"));
     }
 
@@ -1092,6 +1014,176 @@
 }
 #endif
 
+#ifdef SCALABLE_DEC
+/* Table 4.4.13 ASME */
+void aac_scalable_main_element(faacDecHandle hDecoder, faacDecFrameInfo *hInfo,
+                               bitfile *ld, program_config *pce, drc_info *drc)
+{
+    uint8_t retval = 0;
+    uint8_t channels = hDecoder->fr_channels = 0;
+    uint8_t ch;
+    uint8_t this_layer_stereo = (hDecoder->channelConfiguration > 1) ? 1 : 0;
+    element cpe = {0};
+    ic_stream *ics1 = &(cpe.ics1);
+    ic_stream *ics2 = &(cpe.ics2);
+    int16_t *spec_data;
+    ALIGN int16_t spec_data1[1024] = {0};
+    ALIGN int16_t spec_data2[1024] = {0};
+
+    hDecoder->fr_ch_ele = 0;
+
+    hInfo->error = aac_scalable_main_header(hDecoder, ics1, ics2, ld, this_layer_stereo);
+    if (hInfo->error > 0)
+        return;
+
+    cpe.common_window = 1;
+    if (this_layer_stereo)
+        cpe.ele_id = ID_CPE;
+    else
+        cpe.ele_id = ID_SCE;
+
+    for (ch = 0; ch < (this_layer_stereo ? 2 : 1); ch++)
+    {
+        ic_stream *ics;
+        if (ch == 0)
+        {
+            ics = ics1;
+            spec_data = spec_data1;
+        } else {
+            ics = ics2;
+            spec_data = spec_data2;
+        }
+
+        hDecoder->internal_channel[channels+ch] = channels+ch;
+        hDecoder->channel_element[channels+ch] = hDecoder->fr_ch_ele;
+
+        hInfo->error = individual_channel_stream(hDecoder, &cpe, ld, ics, 1, spec_data);
+        if (hInfo->error > 0)
+            return;
+    }
+
+    if (this_layer_stereo)
+    {
+        reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, spec_data1, spec_data2);
+    } else {
+        reconstruct_single_channel(hDecoder, ics1, &cpe, spec_data1);
+    }
+
+    hDecoder->element_id[hDecoder->fr_ch_ele] = cpe.ele_id;
+
+    hDecoder->fr_channels += (this_layer_stereo ? 2 : 1);
+    hDecoder->fr_ch_ele++;
+
+    return;
+}
+
+/* Table 4.4.15 */
+static int8_t aac_scalable_main_header(faacDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2,
+                                       bitfile *ld, uint8_t this_layer_stereo)
+{
+    uint8_t retval = 0;
+    uint8_t ch;
+    ic_stream *ics;
+
+    /* ics1->ics_reserved_bit = */ faad_get1bit(ld
+        DEBUGVAR(1,300,"aac_scalable_main_header(): ics_reserved_bits"));
+    ics1->window_sequence = (uint8_t)faad_getbits(ld, 2
+        DEBUGVAR(1,301,"aac_scalable_main_header(): window_sequence"));
+    ics1->window_shape = faad_get1bit(ld
+        DEBUGVAR(1,302,"aac_scalable_main_header(): window_shape"));
+
+    if (ics1->window_sequence == EIGHT_SHORT_SEQUENCE)
+    {
+        ics1->max_sfb = (uint8_t)faad_getbits(ld, 4
+            DEBUGVAR(1,303,"aac_scalable_main_header(): max_sfb (short)"));
+        ics1->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7
+            DEBUGVAR(1,304,"aac_scalable_main_header(): scale_factor_grouping"));
+    } else {
+        ics1->max_sfb = (uint8_t)faad_getbits(ld, 6
+            DEBUGVAR(1,305,"aac_scalable_main_header(): max_sfb (long)"));
+    }
+
+    /* get the grouping information */
+    if ((retval = window_grouping_info(hDecoder, ics1)) > 0)
+        return retval;
+
+    /* should be an error */
+    /* check the range of max_sfb */
+    if (ics1->max_sfb > ics1->num_swb)
+        return 16;
+
+    if (this_layer_stereo)
+    {
+        ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2
+            DEBUGVAR(1,306,"aac_scalable_main_header(): ms_mask_present"));
+        if (ics1->ms_mask_present == 1)
+        {
+            uint8_t g, sfb;
+            for (g = 0; g < ics1->num_window_groups; g++)
+            {
+                for (sfb = 0; sfb < ics1->max_sfb; sfb++)
+                {
+                    ics1->ms_used[g][sfb] = faad_get1bit(ld
+                        DEBUGVAR(1,307,"aac_scalable_main_header(): faad_get1bit"));
+                }
+            }
+        }
+
+        memcpy(ics2, ics1, sizeof(ic_stream));
+    } else {
+        ics1->ms_mask_present = 0;
+    }
+
+    if (0)
+    {
+        faad_get1bit(ld
+            DEBUGVAR(1,308,"aac_scalable_main_header(): tns_channel_mono_layer"));
+    }
+
+    for (ch = 0; ch < (this_layer_stereo ? 2 : 1); ch++)
+    {
+        if (ch == 0)
+            ics = ics1;
+        else
+            ics = ics2;
+
+        if ( 1 /*!tvq_layer_pesent || (tns_aac_tvq_en[ch] == 1)*/)
+        {
+            if ((ics->tns_data_present = faad_get1bit(ld
+                DEBUGVAR(1,309,"aac_scalable_main_header(): tns_data_present"))) & 1)
+            {
+#ifdef DRM
+                /* different order of data units in DRM */
+                if (hDecoder->object_type != DRM_ER_LC)
+#endif
+                {
+                    tns_data(ics, &(ics->tns), ld);
+                }
+            }
+        }
+#if 0
+        if (0 /*core_flag || tvq_layer_pesent*/)
+        {
+            if ((ch==0) || ((ch==1) && (core_stereo || tvq_stereo))
+                diff_control_data();
+            if (mono_stereo_flag)
+                diff_control_data_lr();
+        } else {
+#endif
+            if ((ics->ltp.data_present = faad_get1bit(ld
+                DEBUGVAR(1,310,"aac_scalable_main_header(): ltp.data_present"))) & 1)
+            {
+                ltp_data(hDecoder, ics, &(ics->ltp), ld);
+            }
+#if 0
+        }
+#endif
+    }
+
+    return 0;
+}
+#endif
+
 /* Table 4.4.24 */
 static uint8_t individual_channel_stream(faacDecHandle hDecoder, element *ele,
                                          bitfile *ld, ic_stream *ics, uint8_t scal_flag,
@@ -1182,11 +1274,6 @@
             return result;
     }
 
-#ifdef DRM
-    if (hDecoder->object_type == DRM_ER_LC)
-        return 0;
-#endif
-
     if (hDecoder->object_type >= ER_OBJECT_START) 
     {
         if (ics->tns_data_present)
@@ -1193,6 +1280,13 @@
             tns_data(ics, &(ics->tns), ld);
     }
 
+#ifdef DRM
+    /* CRC check */
+    if (hDecoder->object_type == DRM_ER_LC)
+        if ((result = faad_check_CRC(ld, faad_get_processed_bits(ld) - 8)) > 0)
+            return result;
+#endif
+
     if (hDecoder->aacSpectralDataResilienceFlag)
     {
         /* error resilient spectral data decoding */
@@ -1415,11 +1509,16 @@
 /* Table 4.4.26 */
 static uint8_t scale_factor_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld)
 {
+    uint8_t ret = 0;
+#ifdef PROFILE
+    int64_t count = faad_get_ts();
+#endif
+
 #ifdef ERROR_RESILIENCE
     if (!hDecoder->aacScalefactorDataResilienceFlag)
     {
 #endif
-        return decode_scale_factors(ics, ld);
+        ret = decode_scale_factors(ics, ld);
 #ifdef ERROR_RESILIENCE
     } else {
         /* In ER AAC the parameters for RVLC are seperated from the actual
@@ -1426,9 +1525,16 @@
            data that holds the scale_factors.
            Strangely enough, 2 parameters for HCR are put inbetween them.
         */
-        return rvlc_scale_factor_data(ics, ld);
+        ret = rvlc_scale_factor_data(ics, ld);
     }
 #endif
+
+#ifdef PROFILE
+    count = faad_get_ts() - count;
+    hDecoder->scalefac_cycles += count;
+#endif
+
+    return ret;
 }
 
 /* Table 4.4.27 */
@@ -1492,6 +1598,8 @@
 {
     uint8_t sfb, w;
 
+    ltp->lag = 0;
+
 #ifdef LD_DEC
     if (hDecoder->object_type == LD)
     {
@@ -1510,6 +1618,11 @@
 #ifdef LD_DEC
     }
 #endif
+
+    /* Check length of lag */
+    if (ltp->lag > (hDecoder->frameLength << 1))
+        ltp->lag = 0; // FIXME: Error handling
+
     ltp->coef = (uint8_t)faad_getbits(ld, 3
         DEBUGVAR(1,82,"ltp_data(): coef"));
 
@@ -1554,6 +1667,10 @@
     uint8_t result;
     uint16_t nshort = hDecoder->frameLength/8;
 
+#ifdef PROFILE
+    int64_t count = faad_get_ts();
+#endif
+
     sp = spectral_data;
     /*memset(sp, 0, hDecoder->frameLength*sizeof(int16_t));*/
 
@@ -1595,6 +1712,11 @@
         groups += ics->window_group_length[g];
     }
 
+#ifdef PROFILE
+    count = faad_get_ts() - count;
+    hDecoder->spectral_cycles += count;
+#endif
+
     return 0;
 }
 
@@ -1624,7 +1746,7 @@
         }
         return count;
     case EXT_DATA_ELEMENT:
-        data_element_version = faad_getbits(ld, 4
+        data_element_version = (uint8_t)faad_getbits(ld, 4
             DEBUGVAR(1,400,"extension_payload(): data_element_version"));
         switch (data_element_version)
         {
@@ -1632,7 +1754,7 @@
             loopCounter = 0;
             dataElementLength = 0;
             do {
-                dataElementLengthPart = faad_getbits(ld, 8
+                dataElementLengthPart = (uint8_t)faad_getbits(ld, 8
                     DEBUGVAR(1,401,"extension_payload(): dataElementLengthPart"));
                 dataElementLength += dataElementLengthPart;
                 loopCounter++;
--- a/libfaad/syntax.h
+++ b/libfaad/syntax.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: syntax.h,v 1.42 2003/11/12 20:47:59 menno Exp $
+** $Id: syntax.h,v 1.43 2003/12/17 14:43:17 menno Exp $
 **/
 
 #ifndef __SYNTAX_H__
@@ -155,7 +155,10 @@
 static void adts_error_check(adts_header *adts, bitfile *ld);
 static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc);
 static uint8_t excluded_channels(bitfile *ld, drc_info *drc);
-
+#ifdef SCALABLE_DEC
+static int8_t aac_scalable_main_header(faacDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2,
+                                       bitfile *ld, uint8_t this_layer_stereo);
+#endif
 
 #ifdef __cplusplus
 }