/// <summary>
        /// use to rebase current meta data to a newer memory address(affects reflexive,extended and data ref fields only)
        /// </summary>
        /// <param name="new_base">the new memory address to which the meta has to rebased</param>
        public void Rebase_meta(int new_base)
        {
            //first rebase reflexive fields
            foreach (int off in ref_reflexive)
            {
                int old_mem_addr = DATA_READ.ReadINT_LE(off + 4, data);
                int new_mem_addr = new_base + (old_mem_addr - mem_off);

                DATA_READ.WriteINT_LE(new_mem_addr, off + 4, data);
            }
            //then we rebase all the dataref fields
            foreach (int off in ref_data)
            {
                int old_mem_addr = DATA_READ.ReadINT_LE(off + 4, data);
                int new_mem_addr = new_base + (old_mem_addr - mem_off);

                DATA_READ.WriteINT_LE(new_mem_addr, off + 4, data);
            }
            //we venture in extended meta if it is even concerned
            if (list_extended != null)
            {
                //for extended meta stuff we are gonna first rebase the extended meta(s) first and set the offsets accordingly
                //well extende meta are gonna follow meta one by one
                int extended_new_base = new_base + size;

                List <int> key_mems = list_extended.Keys.ToList <int>();
                //Rebase extended meta
                foreach (int temp_key in key_mems)
                {
                    extended_meta temp_meta = list_extended[temp_key];
                    temp_meta.Rebase_meta(extended_new_base);

                    extended_new_base += temp_meta.Get_Total_size();
                }
                //now lets update the offsets with the newer values
                List <int> extend_off = ref_extended.Keys.ToList <int>();
                foreach (int temp_off in extend_off)
                {
                    int           extend_mem_addr = ref_extended[temp_off];
                    extended_meta temp_ext        = list_extended[extend_mem_addr];

                    int new_mem_addr = temp_ext.Get_mem_addr();

                    DATA_READ.WriteINT_LE(new_mem_addr, temp_off + 4, data);
                }
            }

            //update the base to which meta has been compiled
            mem_off = new_base;
        }
        /// <summary>
        /// Generates a full self dependent meta file(except tag refs)
        /// </summary>
        /// <returns></returns>
        public byte[] Generate_meta_file()
        {
            byte[] ret = new byte[this.Get_Total_size()];

            //we first copy the root meta data into it
            DATA_READ.ArrayCpy(ret, data, 0x0, size);

            //now we go for extended meta
            List <int> extend_keys = list_extended.Keys.ToList <int>();

            //here we go
            foreach (int temp_key in extend_keys)
            {
                extended_meta temp_meta = list_extended[temp_key];
                int           start_off = temp_meta.Get_mem_addr() - mem_off;
                DATA_READ.ArrayCpy(ret, temp_meta.Generate_meta_file(), start_off, temp_meta.Get_Total_size());
            }

            return(ret);
        }