You know Valentine's Day is coming in a month so I just thought it would be nice to give you guys a list of my favorite romance books. Go read them with your partner or if you don't have one you can enjoy them the same anyways.
I hope you can find one that you like. Personally, I always put Colleen Hoover on the 1st place when I want to read some romance, that's why I selected more than one book by her because she's just good at it. Crazy good.
30 Days Book Challenge: Day 20.
You might have heard of this one and if you didn't then I don't know where you've been. Caraval, Stephanie Garber.
It was pretty hard to believe that this one's her debut novel… like… wait WHAAAAT?! You know talent, hard work and lots of creativity when you see it. That's what made Caraval. Just like The Night Circus the game happens only at night but what happens during the day, you just have to brace yourself.
I was pretty obsessed with it and any minute I had free I had to come to this book. You just can't be ready for all the twists and turns and it has stuff that you just can't figure out no matter what. Stephanie knows how to play. Get ready to meet charming characters, well developed that will stick with you for some time.
This is the only book I really wished for to have a happy ending. I couldn't take any other ending for how rich it is and entertaining, mysterious and catchy.
The idea was unique and awesome. The thing that didn't let me give it a 5/5 was the clues of the game. They seemed pretty random and I just couldn't figure out what sense they have, they just seemed illogical. And I don't think they only seemed illogical. They actually were. "Surprisingly", she figured them out somehow and I was like …uhm… alright then… as long as it worked.
I'm super curious about what Tella owes Legend. I can't even think of something because everything that happened was magical and insane. I'm so pumped for the series!
October's winner is totally Colleen Hoover's Slammed. It was everything I wanted in a romance book. The characters are awesome and he reminded me of Jim Halpert from The Office lol.
The story line was catchy and as usual Colleen added original ideas to it and she always knows how to build the conversations and make the reader get attached to the characters no matter how important they are. I literally had a major hangover over it especially after her mom died and I actually felt so sad like I knew her (I know it sounds crazy but when I read, I'm all heart and soul especially if the book is good).
If you're into this kind of books please start reading it and check out some more of her books like It Ends With Us, Confess or November 9. Let me know what you think of any of them.
I thought I'm gonna have a heart attack or faint or something. THAT'S HOW MUCH I LOVE COLLEEN HOOVER'S BOOKS.
I think it is pretty clear, since this is a Colleen Hoover book, that I've read it in a few hours. I found myself in the same situation as "I don't know what to read, I'm gonna get myself a cup of Colleen Hoover" which turned into 2 cups cause I HAD to read the next one too because I didn't calm down with it.
I love both Layken and Will. I love Will more though, he kinda reminds me of Jim Halpert's character from The Office. Always funny and cute and smart.
I was impressed by the idea of slamming. I didn't know that it is actually a thing, initially I thought Colleen came up with the idea but afterwards I found out that people are actually doing it. And I love it. Also, I think it was awesome that Colleen actually wrote the slams the characters performed and I loooved theeeem!
Colleen has some really awesome ideas, like the glass vase full of life tips stars to help them when they need it the most when they won't have anyone else besides them and their brothers (and Will's grandparents).
By the end of the book my chest was aching. Literally. And then I couldn't stop thinking about them. And then I've read the second book. Review to come.
As a conclusion, YES GO READ IT!!
Everything, Everything by Nicola Yoon owns my heart momentarily.
When you start reading it be ready to drown in cuteness. I love Madeline! I love how she deals with her "sickness" and her way of being generally. I love the conversations between Olly and her and I love her courage.
All the adventures they have actually made me want to be there too and do the same things. I think they're one of my favorite couples in the YA world. They both have to deal with stuff but their personalities make up for any trouble they have.
What do I think of what her mom did?
I'm glad they found out she needs some treatment and a psychiatrist because I just couldn't believe that she is serious tho' I was glad this book can give you a glimpse of what trauma can actually do to a person. Her intention was pure but it was the wrong way of protecting everything she has left which is Madeline. Yes I was angry at her when I found out what was going on and yes I came to my senses and I began to understand her.
Carla is just awesome. She's the type of person anyone needs in their life. So trustworthy and kind and serious about everything she does, I just loved her.
The illustrations in it are so adorable sometimes I just wanted to take a picture of them and instagram it or something. They're the cherry on the cake.
Yes, I pretty much loved every character in this book because they're just beautifully constructed.
I totally recommend it even if you're gonna watch the movie or not. You HAVE to read it. Did I mention the cute illustrations in it?


text:
Montres Cimier SA, ist ein unabhängiger Schweizer Uhrenhersteller mit Sitz in Biel. Cimier entwirft, entwickelt und montiert ihre Uhren selbst, wobei grösstenteils personalisierte Werke, teilweise mit Modifikationen, verwendet werden. Das Unternehmen stellt auch Quarzuhren her.

Geschichte
Die Ursprünge von Cimier reichen zurück ins Jahr 1924, als der Uhrmacher Joseph Lapanouse in Hölstein (BL) die Uhrenmanufaktur Lapanouse SA gründete und seine Uhren unter der Marke "Cimier" verkaufte. Dabei handelte es sich um so genannte Stiftanker-Uhren, preiswerte Uhren mit robusten und preisgünstigen Werken.

In den 1950er Jahren lancierte die inzwischen in LAPANOUSE-CIMIER SA umbenannte Uhrenmanufaktur den ersten Stiftanker-Chronographen, von dem 21 Millionen Stück gebaut wurden. Bis Ende der 1960er Jahre stieg die Jahresproduktion auf bis zu 1.5 Millionen Uhren und das Unternehmen beschäftigte in Bubendorf über 500 Mitarbeiter.

Als im Zuge der Quarzkrise in den 1970er Jahren der Absatz mechanischer Uhren stark rückläufig war, entwickelte und industrialisierte Cimier eigene Quarzwerke. Die für eine rentable Produktion von Quarzwerken erforderlichen Stückzahlen wurden indes nicht erreicht, so dass die Uhrenherstellung 1985 einstweilig eingestellt wurde.   Ab 2003 erfolgte eine Wiederbelebung der Marke Cimier unter der heutigen Firma und ein Ausbau der Kollektion. Heute umfasst die Cimier-Kollektion mehrere Modelllinien von mechanischen und Quarzuhren.

Watch Academy
2010 eröffnete die Watch Academy, in der Endkonsumenten in einem Tag eine eigene mechanische Uhr kreieren und montieren können. Mittlerweile stehen mehrerer Handaufzugskaliber sowie ein Automatikwerk zur Auswahl.

Weblinks

Einzelnachweise

Uhrenhersteller (Schweiz)
Unternehmen (Baar ZG)

redpajama_set_name: RedPajamaWikipedia


text:
using System;
using System.Diagnostics;
using System.Windows.Data;
using Autofac;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.CommandWpf;
using GalaSoft.MvvmLight.Messaging;
using IO2.Messages;
using IO2.Model;
using IO2.Services;

namespace IO2.ViewModel
{
    public class NoteViewModel : ObservableObject
    {
        private bool performingUpdates = false;
        private PromptService prompt = new PromptService();

        private bool isDirty;

        public bool IsDirty
        {
            get { return isDirty; }
            set
            {
                isDirty = value;
                RaisePropertyChanged();
            }
        }

        private bool @readonly;

        public bool Readonly
        {
            get { return @readonly; }
            set
            {
                @readonly = value;
                RaisePropertyChanged();
            }
        }

        private Note selectedNote;

        public Note SelectedNote
        {
            get { return selectedNote; }
            set
            {
                /*
                if (value != null && selectedNote != value && IsDirty)
                    AskDirty();
                IsDirty = false;*/
                selectedNote = value;
                RaisePropertyChanged();
            }
        }

        private void AskDirty()
        {
            if (SelectedNote == null)
                return;

            var confirmation = prompt.OkCancel("Zapisać zmiany?");

            switch (confirmation)
            {
                case true:
                    SelectedNote.Updated = DateTime.Now;
                    SelectedNote.Content = Content;
                    SelectedNote.Title = Title;
                    repo.Upsert(SelectedNote);
                    repo.Save();
                    IsDirty = false;
                    break;
                case false:
                    SelectedNote = null;
                    IsDirty = false;
                    break;
            }
        }

        private string title;

        public string Title
        {
            get { return title; }
            set
            {
                title = value;
                RaisePropertyChanged();
            }
        }

        private string content;

        public string Content
        {
            get { return content; }
            set
            {
                content = value;
                RaisePropertyChanged();
            }
        }

        public RelayCommand AddCommand { get; set; }
        public RelayCommand DeleteCommand { get; set; }
        public RelayCommand SaveCommand { get; set; }
        public RelayCommand EditCommand { get; set; }

        private readonly INoteRepository repo;

        public NoteViewModel()
        {
            Messenger.Default.Register<Messages.NoteSelectedMessage>(this, OnNoteSelected);
            AddCommand = new RelayCommand(PerformAdd, () => true);
            DeleteCommand = new RelayCommand(PerformDelete, () => SelectedNote != null);
            SaveCommand = new RelayCommand(PerformSave, () => SelectedNote != null && IsDirty);
            EditCommand = new RelayCommand(PerformEdit, () => SelectedNote  != null && !IsDirty);

            repo = IoCKernel.Container.Resolve<INoteRepository>();
        }

        private void PerformEdit()
        {
            Readonly = false;
            IsDirty = true;
            CreatingNew = false;
            ModyfyingExisting = true;
        }

        public bool SaveConfirmationRequired { get; set; } = false;
        public bool CreatingNew { get; set; } = false;
        public bool ModyfyingExisting { get; set; } = false;

        private void PerformSave()
        {
            if (ModyfyingExisting)
            {
                var answer = prompt.YesNoCancel("Zapisać zmiany?");
                if (answer == false)
                {
                    // użytkownik anulował chęć zapisu zmian
                    CreatingNew = false;
                    ModyfyingExisting = false;
                    OnNoteSelected(new NoteSelectedMessage(SelectedNote));
                    return;
                }
                else if (answer == true)
                {
                    // tak, zapisac zmiany
                }
                else
                {
                    return; //nic się nie stało, Polacy nic się nie stało...
                }
            }

            SelectedNote.Updated = DateTime.Now;
            SelectedNote.Content = Content;
            SelectedNote.Title = Title;
            repo.Upsert(SelectedNote);
            repo.Save();
            IsDirty = false;
            CreatingNew = false;
            ModyfyingExisting = false;
            OnNoteSelected(new NoteSelectedMessage(SelectedNote));

            return;

            performingUpdates = true;
            if (SelectedNote == null)
                return;

            var confirmation = prompt.YesNoCancel("Zapisać zmiany?");

            switch (confirmation)
            {
                case true:
                    SelectedNote.Updated = DateTime.Now;
                    SelectedNote.Content = Content;
                    SelectedNote.Title = Title;
                    repo.Upsert(SelectedNote);
                    repo.Save();
                    IsDirty = false;
                    Readonly = true;
                    break;
                case false:
                    SelectedNote = null;
                    IsDirty = false;
                    Readonly = true;
                    break;
                default:
                    break;
            }
            performingUpdates = false;
        }

        private void PerformDelete()
        {
            if (SelectedNote == null)
            {
                return;
            }

            if (CreatingNew)
            {
                var result = prompt.OkCancel("Anulować tworzenie notatki?");
                if (result)
                {
                    // tak, na pewno chcemy anulować
                    SelectedNote = null;
                    Readonly = true;
                    CreatingNew = false;
                    IsDirty = false;
                    SaveConfirmationRequired = false;
                }
                else
                {
                    // pomyłka, pracujemy dalej
                }
                return;
            }

            if (prompt.OkCancel("Na pewno usunąć?"))
            {
                repo.Delete(SelectedNote);
                SelectedNote = null;
                Readonly = true;
                CreatingNew = false;
                IsDirty = false;
                SaveConfirmationRequired = false;
            }
        }

        private void PerformAdd()
        {
            if (CreatingNew)
            {
                var result = prompt.OkCancel("Anulować tworzenie notatki?");
                if (result)
                {
                    // tak, na pewno chcemy anulować
                }
                else
                {
                    // pomyłka, pracujemy dalej
                    return;
                }
            }
            SelectedNote = new Note();
            Title = "";
            Content = "";
            SaveConfirmationRequired = false;
            IsDirty = true;
            Readonly = false;
            CreatingNew = true;
            ModyfyingExisting = false;
        }

        private void OnNoteSelected(NoteSelectedMessage msg)
        {
            Debug.Assert(msg != null);
            // mamy niezapisane zmiany, co z nimi?
            if (CreatingNew)
            {
                var result = prompt.OkCancel("Anulować tworzenie notatki?");
                if (result)
                {
                    // tak, na pewno chcemy anulować
                }
                else
                {
                    // pomyłka, pracujemy dalej
                    return;
                }
            }
            if (ModyfyingExisting)
            {
                //
            }

            //if(performingUpdates) return;

            //performingUpdates = true;
            SelectedNote = msg.Note;
            IsDirty = false;
            Readonly = true;
            Title = msg.Note?.Title;
            Content = msg.Note?.Content;
            CreatingNew = false;
            ModyfyingExisting = false;
            //performingUpdates = false;
        }
    }
}

redpajama_set_name: RedPajamaGithub


text:
Level by Mr. XY (December, 2007)
Walkthrough by Harry Laudie
You start with a flyby of the area showing a stable and a closed gate. Notice the dairy in the lower right corner of the screen. The diary serves as the LOAD, SAVE, and READ functions. Read the diary.
"Arrival
I just arrived in Snowwhite
It's a really lovely village. I should look around,
maybe I can do something useful"
Go north and look to the left to see Renoit's Book Store. Open the door and enter the room. Go to the east and stand in front of the woman called Estelle Renoit. Press CTRL and get a cut scene where Estelle explains about a theft of two books. She promises a reward if you find the books. The diary appears again to show an update. Read the diary.
"Quest 1
Someone stole 2 very important books from Estelle.
I should search them and get the promised reward."
Go to the north wall and pull down the jump switch behind a table lamp. A block rises in the room so you can access the upper balcony later. Ignore it for now and exit the room. Go west and see that the gate to the stable is open. Enter the stable and the camera view changes. Go to the north-west corner and pull back the bale of hay at the north wall. Go behind the bale of hay and jump over the short fence. Go into the comer and pick up Magic Book #1, the note, and a green key. Read the note and see:
"The second book is in the secret room
in case you forget where I hid it.
Just let the promised money there.
Seems to be a message from the thief."
The diary appears again to show an update. Read the diary.
I found the first stolen book in the stables.
Besides of a key, I also found a note.
I should continue my search for the second book now."
Exit the stable and go south. Look to the south-west corner and see the angel statue. Go behind the statue and use the green key in the key lock. The door opens in the west wall. Enter the large room and you see a mathematical puzzle at the north wall. There are two closed gates in the west wall. The lighter blue blocks are moveable and they have numbers on them. You can see a block with #12. Push the block by the column to the east and see that it has #2. The corner block with #2 is fixed. There are three empty places.
Climb the block in the south-east corner. Stand jump to the west to grab the pole. Swing forward and use grab to land on the block ahead of you. Run and jump to grab the north balcony. Pull up and see a block with #3. The corner block with #30 is fixed. There are three empty places. Go east and see a wall switch that raises and lowers a column in the hole beside the wall switch.
I am not familiar with ":" as a mathematical symbol. I assume that it means divide and the symbol "/" was not available
Upper floor: The equation is 30:3+2=12
Drop down to the lower floor. Move #2 block onto the tile at the east wall. Use the pole and get to the upper balcony again. Use the wall switch and #2 block rises. Pull #2 block off the tile and reset the switch. Drop down to the lower floor. Move the #12 block onto the tile at the east wall. Use the pole and get to the upper balcony again. Use the wall switch and #12 block rises. Place the three blocks in front of the correct empty place and push them into the openings. You hear a gate open. Look down to the west wall and see that the inner gate has opened.
Lower floor: The equation is 12:3-2=2
Pull out the blocks and do the tedious work of moving the three blocks down to the first floor. I pull out all three blocks before I started to move them down. Place the blocks in front of the correct empty place and push them into the openings. You gear a gate open. Look to the west wall and see that the outer gate has opened.
Go west and go through the two open gates. Enter the room and go onto the raised floor in the middle to pick up Magic Book #2. Go behind the north-west column and pick up the pistols from the floor. The diary appears again to show an update. Read the diary.
I found the second book.
I should go back to place
the two books in the book store."
Go east to exit the room. Go east to get outside and continue east to Renoit's book store. Enter the room and use the raised block to get onto the upper balcony. Follow the balcony around to the west wall. Place the two magic books on the two empty pedestals. You get a cut scene of Estelle giving you a reward of a key. Go north and pick up flares from the floor. Drop down to the first floor and pick up the Gold Key. The diary appears again to show an update. Read the diary.
"Quest 1(Finished)
I delivered both books to Estelle.
She was very glad and gave
me the promised reward."
Estelle Renoit gave me, as reward,
the key to the "Snowwhite Palace".
I should continue my little adventure"
Go south and shoot out the section of south wall under the face picture next to the stool with the green cushion. Enter the alcove and pick up secret #1 and a Golden Rose. Exit the room and go north to find the closed gates. Use the Gold Key and the east gate of the four gates open. Enter the gate and face a huge palace. The doors are closed so run to the east. Go pass the open gate to the column in front of a tree. Turn to the right and pick up a large medipack from the ground.
Now run to the west and go pass the front of the palace. Run to the west end of the area and find a tree and a snowman. To the north are windows. Shoot the window with the red vase on the inside ledge. The other windows are bulletproof. Enter the room and go to the piano. Use CTRL at the piano keys and Lara plays some Christmas music. You get a cut scene of large gates opening. Go north-east into a corridor. Go to the end of the corridor and find the open gates. Go through the open gate and get a flyby of the central room.
In the middle of the room is a pedestal with a vase. Push the pedestal into the empty position between the steps at the east wall. The gate opens at the south-east steps. Enter the corridor and go east to a room with a large plant. Pick up a small medipack off the floor nearest the entrance. Go behind the plant and pick up the Desert Eagle off the floor. Exit this room and go back to the central room.
Go up the middle steps at the west wall. Go to the end and use the wall switch to open the gates. You enter a room with a large table and a ticking clock. Search the three shelves at the west wall. You find Desert Eagle ammo and flares. Search the three shelves at the east wall. You find a wine bottle. Go to the north wall and stand in front of the fireplace. Turn around and stand jump south onto the table. You should be in the correct position to pick up a glass from the table. Go to the south-west corner of the room. Stand jump through the upper blue curtains and into an alcove in the west wall. Use the floor lever and get a cut scene of another gate opening. Get down and go east to go back to the central room.
Go east and up the middle steps in the east wall. Continue up more steps and follow the corridor to a balcony above the room that you left. Go to the north balcony and combine the glass with the wine bottle. Place the glass of wine on the left pedestal. Go around to the south balcony and pick up the crowbar from the south-east window ledge. Go back down the steps to the central room.
Go up the south-west steps and return to the room with the piano. Jump out the broken window to get back outside. Go east and turn to the right at the first column. Use the crowbar to pry the cross off the wall. Go east to the next column and place the cross. The gate opens behind you in the north fence. Enter the fountain area and pick up the laser sight off the ground near the west wall fountain. Exit and return through the broken window back to the central room in the palace.
Go up the north-east steps and through the open gate. Follow the corridor and turn the first corner to see windows at the east wall. Shoot the left window of the first window pair. Jump outside into the snowy area. Go behind the first tree and pick up Desert Eagle ammo near the south wall. Go west and into the south-west alcove. Pick up a torch from the pile of torches in the corner. Notice the two unlit wall torches in the alcove. Return to the corridor and light the torch on the long flaming candlestick next to the windows. Return outside to the unlit wall torches. Light the wall torches and get a cut scene of closed gates. Exit this area and return to the corridor. Bring the lit torch with you.
Continue north and follow to another corridor with two horse statues. You pass the closed gates of the cut scene. You run pass another two horse statues. Go east into another corridor with windows. Shoot the most south window and jump outside into another snowy area. Go to the south-east alcove and see unlit wall torches. Light the wall torches and get a cut scene of closed gates. On the last wall torch, you see the gates open. Exit this area to return to the corridor. Go north and follow the corridor to the open gates.
Go through the gates and pick up Desert Eagle ammo off the floor. You enter a room with a highly reflective floor. On the upper east and west ledges you can see four vases. Combine the Desert Eagle and laser sight and shoot the four vases. The door in the north-east corner opens. Enter that alcove and pull down the wall switch. Return to the room and go west to a raised block. Hop onto the block and pull up onto the west ledge. Go into the north wall alcove. Stand near the east corner. Stand jump to grab the pole, spin, and jump forward to grab the east ledge. Pull up and go east to the white gem. Pick up the white gem off the floor and the level ends.

redpajama_set_name: RedPajamaCommonCrawl


Our unique Mint Tins are a cute way of tying all the elements of your party together. They come available in many different designs and act as great conversation starters. Baptism/ Christening themed Mint Tins are the favor to have at your next party!


The TextArea type provides a display for multiple lines of editable plain text.
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
The TextArea width and height should generally be set, otherwise the area will be sized to fit the entered text.
The displayed text can be formatted through the font and color properties. Text alignment is controlled through the horizontalAlignment and verticalAlignment properties, and text wrapping is controlled through the wrapMode property.
Holds whether the text area will automatically scroll the Flickable that contains it to ensure visibility, when the text area gains active focus and when input is provided.
The Component to use to draw the background of the text area.
The horizontal and vertical alignment of the text within the text area's width and height.
When using the attached property LayoutMirroring::enabled to mirror application layouts, the horizontal alignment of text will also be mirrored. However, the property horizontalAlignment will remain unchanged. To query the effective horizontal alignment of TextArea, use the property LayoutMirroring::enabled.
Text to display below the text entry area when text is not empty. This is useful for providing a description of the information to be entered in the text area. It is typically used in conjunction with placeholderText.
Holds whether the label text will be displayed below the input area when text is not empty.
By default, the color is Theme.secondaryHighlightColor when the text area has active focus, and Theme.secondaryColor otherwise.
The text to be displayed when text is empty. This is useful for providing an indication of the information to be entered in the text area. It is typically used in conjunction with label.
See also text and placeholderColor.
Holds whether the text area is in read-only mode.
TextEdit.SelectWords - The selection is updated word by word.
Holds whether the on-screen key input panel is displayed when the text area gains active focus.
The margin to the left of the displayed text, within the bounds of the text area.
The margin to the left and the right of the displayed text, within the bounds of the text area.
The margin to the right of the displayed text, within the bounds of the text area.
Holds the mode used to wrap text to the width of the text area. The text will only wrap if an explicit width has been set.
TextEdit.NoWrap - no wrapping will be performed. If the text contains insufficient newlines, then implicitWidth will exceed a set width.
TextEdit.WordWrap - wrapping is done on word boundaries only. If a word is too long, implicitWidth will exceed a set width.
This signal handler is called when the text area is clicked. The mouse parameter provides information about the click.
This signal handler is called when there is a long press on the text area. The mouse parameter provides information about the press.
Forces active focus on the text area.


LISTEN NOW! Greg, John and Pat discuss how Nigeria has become the killing fields of Radical Islam as they have killed more Christians than in any country in the world. According to CBN the Muslims are not just killing Christians but they are killing any Muslims that are sympathetic of Christians. It is being reported that no other country is prepared for religious war like Nigeria. They continue to discuss that just like Hitler was used to progressively take the Jews down even to their death this same hatred is being waged against Christians in Nigeria. You cannot mix Christianity and Islam; the two don't mix they are on complete opposite ends of the spectrum. The presence of Christianity is the antithesis of Islam. According to the Koran they will either have to convert to Islam, enter into servitude, or be killed. Satan hates "JJ" Jews and Christians.


A Primer for Collectors, Investors, Players and Enthusiasts. By George Gruhn. Homespun Tapes. Guitar Reference. DVD. Homespun #DVDGRUVG21. Published by Homespun (HL.642128).
Includes Gruhn's Guide to Vintage Guitars book and How to Buy a Vintage Guitar DVD. Homespun Tapes. Guitar Reference. Hardcover with DVD. 628 pages. Published by Homespun (HL.642137).
Book. Reference. Softcover. 316 pages. Published by Centerstream Publications (HL.260960).
Composed by Walter Carter and George Gruhn. Book. 352 pages. Handelsware #HLS 183899. Published by Handelsware (M7.HLS-183899).


text:
Q: What is the difference between formik.handleChange and formik.setFieldValue In formik, inside the property onChange, sometimes onChange = {formik.handleChange} is called and sometimes onChange = {v => formik.setFieldValue('field', v)} is called. Whats the difference between these two?
Is it possible to replace the use of formik.setFieldValue with just formik.handleChange?

A: handleChange returns:
handleChange: (e: React.ChangeEvent<any>) => void

General input change event handler. This will update the values[key] where key is the event-emitting input's name attribute. If the name attribute is not present, handleChange will look for an input's id attribute. Note: "input" here means all HTML inputs.
setFieldValue returns:
setFieldValue: (field: string, value: any, shouldValidate?: boolean) => void

Set values imperatively. Calling this will trigger validation to run if validateOnChange is set to true (which it is by default). You can also explicitly prevent/skip validation by passing a third argument as false.
There can find doc where differences written.

redpajama_set_name: RedPajamaStackExchange


If your business operates in the Education, Serviced Apartments, Hotel, Restaurant or Catering industries, and you're based in Berkshire, Oxfordshire, Wiltshire or Hampshire, then look no further for a quality, reliable linen hire and laundry service. We specialise in serving the linen hire requirements of these market sectors.
If you have a contract linen hire enquiry, please feel free to contact us and let us see what we can do for you.
We also specialize in one off hire for weddings, parties & corporate events. We have a vast range of plain & coloured table linen and chair covers for hire.
If you have a casual linen hire enquiry, please feel free to contact us and let us see what we can do for you.


An increasing number of consumers are choosing to incorporate organic foods into their diet.
Perhaps recommended by their nutritionist or physician, but primarily due to the growing awareness of the damage that pesticides and hormones, can cause in the human body.
Many people have told us that they can taste a difference in our organically raised beef. Additionally, the quality of hormone-free beef makes you feel better about the food you eat.
We at Danda Farms are excited to offer you certified organic beef and dairy products!
It is with future generations in mind that we go to extra effort to ensure our farming practices are sustaining the land and the community. As a family owned and operated farm in Lancaster County, Pennsylvania, we work together to give families the best they can have.
Our farm store, open 3 days a week, also carries a few other locally raised, quality products. Check out our website to learn more!
All of our beef is raised in Lancaster County, Pa. The animals are fed a grass based diet including some organic grains. In the rare instance that you have a cut that you are unhappy with, please let us know. Please save and return the package label to us and we will be happy to credit your purchase.


'The most important book about our economy and society to be published in my lifetime' Irvine Welsh From Paul Mason, the award-winning Channel 4 presenter, Postcapitalism is a guide to our era of seismic economic change, and how we can build a more equal society. Over the past two centuries or so, capitalism has undergone continual change - economic cycles that lurch from boom to bust - and has always emerged transformed and strengthened. Surveying this turbulent history, Paul Mason wonders whether today we are on the brink of a change so big, so profound, that this time capitalism itself, the immensely complex system by which entire societies function, has reached its limits and is changing into something wholly new. At the heart of this change is information technology: a revolution that, as Mason shows, has the potential to reshape utterly our familiar notions of work, production and value; and to destroy an economy based on markets and private ownership - in fact, he contends, it is already doing so. In this groundbreaking, Sunday Times top ten book, Mason shows how, from the ashes of the recent financial crisis, we have the chance to create a more socially just and sustainable global economy.


text:
Development of electrostatic separator of foreign objects in dried foods
Masumi Suzuki, Shun Iwase, Yoshitaka Koike, Masato Saeki
The number of occurrences of foreign objects in food is becoming less frequent. However, it is very difficult to remove small foreign objects such as hair and soft plastics in food. In this paper, the results of an experimental study of the performance of a new electrostatic separator of small foreign objects in dried food are presented. The separator consists of an inclined rotating drum, which is grounded, a cylindrical electrode fixed at the center of the drum and a suction device. The principle of the separation is based on the difference in the charge per unit mass of the dried food and foreign objects. Separation tests were performed on two types of mixtures. The effects of operating parameters, such as the applied voltage and the angular speed of the drum, on the separation efficiency were examined. In the separation of a mixture of plastic fragments and dried lettuce, the recovery rate of the lettuce was greater than 96% for a purity of 100%. In the separation of a mixture of hairs and dried lettuce, the recovery rate of the lettuce was greater than 94% for a purity of 100%.
Japan Journal of Food Engineering
https://doi.org/10.11301/jsfe.16482
Published - 2017 Mar
Corona charging
Electric field strength
Electrostatic separation
Image force
10.11301/jsfe.16482
Dive into the research topics of 'Development of electrostatic separator of foreign objects in dried foods'. Together they form a unique fingerprint.
Electrostatic separators Engineering & Materials Science 100%
Preserved Food Medicine & Life Sciences 91%
Lettuce Medicine & Life Sciences 90%
dried foods Agriculture & Biology 84%
separators Agriculture & Biology 71%
Static Electricity Medicine & Life Sciences 67%
Foreign Bodies Medicine & Life Sciences 59%
lettuce Agriculture & Biology 44%
Suzuki, M., Iwase, S., Koike, Y., & Saeki, M. (2017). Development of electrostatic separator of foreign objects in dried foods. Japan Journal of Food Engineering, 18(1), 61-69. https://doi.org/10.11301/jsfe.16482
Development of electrostatic separator of foreign objects in dried foods. / Suzuki, Masumi; Iwase, Shun; Koike, Yoshitaka et al.
In: Japan Journal of Food Engineering, Vol. 18, No. 1, 03.2017, p. 61-69.
Suzuki, M, Iwase, S, Koike, Y & Saeki, M 2017, 'Development of electrostatic separator of foreign objects in dried foods', Japan Journal of Food Engineering, vol. 18, no. 1, pp. 61-69. https://doi.org/10.11301/jsfe.16482
Suzuki M, Iwase S, Koike Y, Saeki M. Development of electrostatic separator of foreign objects in dried foods. Japan Journal of Food Engineering. 2017 Mar;18(1):61-69. doi: 10.11301/jsfe.16482
Suzuki, Masumi ; Iwase, Shun ; Koike, Yoshitaka et al. / Development of electrostatic separator of foreign objects in dried foods. In: Japan Journal of Food Engineering. 2017 ; Vol. 18, No. 1. pp. 61-69.
@article{cf6546a9611a4ecdade70dcf953c3ba3,
title = "Development of electrostatic separator of foreign objects in dried foods",
abstract = "The number of occurrences of foreign objects in food is becoming less frequent. However, it is very difficult to remove small foreign objects such as hair and soft plastics in food. In this paper, the results of an experimental study of the performance of a new electrostatic separator of small foreign objects in dried food are presented. The separator consists of an inclined rotating drum, which is grounded, a cylindrical electrode fixed at the center of the drum and a suction device. The principle of the separation is based on the difference in the charge per unit mass of the dried food and foreign objects. Separation tests were performed on two types of mixtures. The effects of operating parameters, such as the applied voltage and the angular speed of the drum, on the separation efficiency were examined. In the separation of a mixture of plastic fragments and dried lettuce, the recovery rate of the lettuce was greater than 96% for a purity of 100%. In the separation of a mixture of hairs and dried lettuce, the recovery rate of the lettuce was greater than 94% for a purity of 100%.",
keywords = "Corona charging, Electric field strength, Electrostatic separation, Image force",
author = "Masumi Suzuki and Shun Iwase and Yoshitaka Koike and Masato Saeki",
note = "Publisher Copyright: {\textcopyright} 2017 Japan Society for Food Engineering.",
doi = "10.11301/jsfe.16482",
journal = "Japan Journal of Food Engineering",
publisher = "Japan Society for Food Engineering",
T1 - Development of electrostatic separator of foreign objects in dried foods
AU - Suzuki, Masumi
AU - Iwase, Shun
AU - Koike, Yoshitaka
AU - Saeki, Masato
N1 - Publisher Copyright: © 2017 Japan Society for Food Engineering.
N2 - The number of occurrences of foreign objects in food is becoming less frequent. However, it is very difficult to remove small foreign objects such as hair and soft plastics in food. In this paper, the results of an experimental study of the performance of a new electrostatic separator of small foreign objects in dried food are presented. The separator consists of an inclined rotating drum, which is grounded, a cylindrical electrode fixed at the center of the drum and a suction device. The principle of the separation is based on the difference in the charge per unit mass of the dried food and foreign objects. Separation tests were performed on two types of mixtures. The effects of operating parameters, such as the applied voltage and the angular speed of the drum, on the separation efficiency were examined. In the separation of a mixture of plastic fragments and dried lettuce, the recovery rate of the lettuce was greater than 96% for a purity of 100%. In the separation of a mixture of hairs and dried lettuce, the recovery rate of the lettuce was greater than 94% for a purity of 100%.
AB - The number of occurrences of foreign objects in food is becoming less frequent. However, it is very difficult to remove small foreign objects such as hair and soft plastics in food. In this paper, the results of an experimental study of the performance of a new electrostatic separator of small foreign objects in dried food are presented. The separator consists of an inclined rotating drum, which is grounded, a cylindrical electrode fixed at the center of the drum and a suction device. The principle of the separation is based on the difference in the charge per unit mass of the dried food and foreign objects. Separation tests were performed on two types of mixtures. The effects of operating parameters, such as the applied voltage and the angular speed of the drum, on the separation efficiency were examined. In the separation of a mixture of plastic fragments and dried lettuce, the recovery rate of the lettuce was greater than 96% for a purity of 100%. In the separation of a mixture of hairs and dried lettuce, the recovery rate of the lettuce was greater than 94% for a purity of 100%.
KW - Corona charging
KW - Electric field strength
KW - Electrostatic separation
KW - Image force
U2 - 10.11301/jsfe.16482
DO - 10.11301/jsfe.16482
JO - Japan Journal of Food Engineering
JF - Japan Journal of Food Engineering


Habit: Annual, perennial herb, glabrous or strigose. Stem: prostrate or ascending, 1--10 dm. Leaf: irregularly pinnate or subpalmate, well spaced; stipules gland-like; leaflets 3--6, 4--10 mm, oblanceolate to obovate. Inflorescence: 3--8-flowered, peduncle 8--30 mm, bracted. Flower: calyx 2--3 mm, lobes << tube, strigose; corolla 5--7 mm, yellow often with red, wings >= keel. Fruit: indehiscent, spreading or reflexed, exserted, 1--1.5 cm, linear, curved, not flat, occasionally with small horn-like processes; beak hooked, tapered, 2--3 mm. Seed: 2.
Citation for this treatment: Luc Brouillet 2012, Acmispon prostratus, in Jepson Flora Project (eds.) Jepson eFlora, http://ucjeps.berkeley.edu/eflora/eflora_display.php?tid=91719, accessed on April 22, 2019.
s SCo (w San Diego Co.); Markers link to CCH specimen records. Yellow markers indicate records that may provide evidence for eFlora range revision or may have georeferencing or identification issues. Purple markers indicate specimens collected from a garden, greenhouse, or other non-wild location.


Van Mossevelde + N Flashes Sean Levy In Simple Athletic Looks For D La Repubblica The perfect simplicity in this athletic shoot by Model Sean Levy is strikingly beautiful. The movements are real and the minimal athletic looks by fashion editor Roberta Rusconi are paired perfectly. Photographer team Van Mossevelde + N for D La Repubblica. Hair by Marco Minunno Images via ANNE OF CARVERSVILLE.


text:
package com.jme3.scene;

import com.jme3.bounding.BoundingBox;
import com.jme3.bounding.BoundingVolume;
import com.jme3.collision.Collidable;
import com.jme3.collision.CollisionResults;
import com.jme3.collision.bih.BIHTree;
import com.jme3.export.*;
import com.jme3.material.RenderState;
import com.jme3.math.Matrix4f;
import com.jme3.math.Triangle;
import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f;
import com.jme3.scene.VertexBuffer.Format;
import com.jme3.scene.VertexBuffer.Type;
import com.jme3.scene.VertexBuffer.Usage;
import com.jme3.scene.mesh.*;
import com.jme3.util.BufferUtils;
import com.jme3.util.IntMap;
import com.jme3.util.IntMap.Entry;
import com.jme3.util.SafeArrayList;
import java.io.IOException;
import java.nio.*;
import java.util.ArrayList;

/**
 * Mesh is used to store rendering data.
 *

 * All visible elements in a scene are represented by meshes.
 * Meshes may contain three types of geometric primitives:
 *

 *
Points - Every vertex represents a single point in space,
 * the size of each point is specified via {@link Mesh#setPointSize(float) }.
 * Points can also be used for {@link RenderState#setPointSprite(boolean) point
 * sprite} mode.

 *
Lines - 2 vertices represent a line segment, with the width specified
 * via {@link Mesh#setLineWidth(float) }.

 *
Triangles - 3 vertices represent a solid triangle primitive.

 *

 *
 * @author Kirill Vainer
 */
public class Mesh implements Savable, Cloneable {

    /**
     * The mode of the Mesh specifies both the type of primitive represented
     * by the mesh and how the data should be interpreted.
     */
    public enum Mode {
        /**
         * A primitive is a single point in space. The size of the points
         * can be specified with {@link Mesh#setPointSize(float) }.
         */
        Points(true),

        /**
         * A primitive is a line segment. Every two vertices specify
         * a single line. {@link Mesh#setLineWidth(float) } can be used
         * to set the width of the lines.
         */
        Lines(true),

        /**
         * A primitive is a line segment. The first two vertices specify
         * a single line, while subsequent vertices are combined with the
         * previous vertex to make a line. {@link Mesh#setLineWidth(float) } can
         * be used to set the width of the lines.
         */
        LineStrip(false),

        /**
         * Identical to {@link #LineStrip} except that at the end
         * the last vertex is connected with the first to form a line.
         * {@link Mesh#setLineWidth(float) } can be used
         * to set the width of the lines.
         */
        LineLoop(false),

        /**
         * A primitive is a triangle. Each 3 vertices specify a single
         * triangle.
         */
        Triangles(true),

        /**
         * Similar to {@link #Triangles}, the first 3 vertices
         * specify a triangle, while subsequent vertices are combined with
         * the previous two to form a triangle.
         */
        TriangleStrip(false),

        /**
         * Similar to {@link #Triangles}, the first 3 vertices
         * specify a triangle, each 2 subsequent vertices are combined
         * with the very first vertex to make a triangle.
         */
        TriangleFan(false),

        /**
         * A combination of various triangle modes. It is best to avoid
         * using this mode as it may not be supported by all renderers.
         * The {@link Mesh#setModeStart(int[]) mode start points} and
         * {@link Mesh#setElementLengths(int[]) element lengths} must
         * be specified for this mode.
         */
        Hybrid(false);

        private boolean listMode = false;

        private Mode(boolean listMode){
            this.listMode = listMode;
        }

        /**
         * Returns true if the specified mode is a list mode (meaning
         * ,it specifies the indices as a linear list and not some special
         * format).
         * Will return true for the types {@link #Points}, {@link #Lines} and
         * {@link #Triangles}.
         *
         * @return true if the mode is a list type mode
         */
        public boolean isListMode(){
            return listMode;
        }
    }

    /**
     * The bounding volume that contains the mesh entirely.
     * By default a BoundingBox (AABB).
     */
    private BoundingVolume meshBound =  new BoundingBox();

    private CollisionData collisionTree = null;

    private SafeArrayList<VertexBuffer> buffersList = new SafeArrayList<VertexBuffer>(VertexBuffer.class);
    private IntMap<VertexBuffer> buffers = new IntMap<VertexBuffer>();
    private VertexBuffer[] lodLevels;
    private float pointSize = 1;
    private float lineWidth = 1;

    private transient int vertexArrayID = -1;

    private int vertCount = -1;
    private int elementCount = -1;
    private int maxNumWeights = -1; // only if using skeletal animation

    private int[] elementLengths;
    private int[] modeStart;

    private Mode mode = Mode.Triangles;

    /**
     * Creates a new mesh with no {@link VertexBuffer vertex buffers}.
     */
    public Mesh(){
    }

    /**
     * Create a shallow clone of this Mesh. The {@link VertexBuffer vertex
     * buffers} are shared between this and the clone mesh, the rest
     * of the data is cloned.
     *
     * @return A shallow clone of the mesh
     */
    @Override
    public Mesh clone() {
        try {
            Mesh clone = (Mesh) super.clone();
            clone.meshBound = meshBound.clone();
            clone.collisionTree = collisionTree != null ? collisionTree : null;
            clone.buffers = buffers.clone();
            clone.buffersList = new SafeArrayList<VertexBuffer>(VertexBuffer.class,buffersList);
            clone.vertexArrayID = -1;
            if (elementLengths != null) {
                clone.elementLengths = elementLengths.clone();
            }
            if (modeStart != null) {
                clone.modeStart = modeStart.clone();
            }
            return clone;
        } catch (CloneNotSupportedException ex) {
            throw new AssertionError();
        }
    }

    /**
     * Creates a deep clone of this mesh.
     * The {@link VertexBuffer vertex buffers} and the data inside them
     * is cloned.
     *
     * @return a deep clone of this mesh.
     */
    public Mesh deepClone(){
        try{
            Mesh clone = (Mesh) super.clone();
            clone.meshBound = meshBound != null ? meshBound.clone() : null;

            // TODO: Collision tree cloning
            //clone.collisionTree = collisionTree != null ? collisionTree : null;
            clone.collisionTree = null; // it will get re-generated in any case

            clone.buffers = new IntMap<VertexBuffer>();
            clone.buffersList = new SafeArrayList<VertexBuffer>(VertexBuffer.class);
            for (VertexBuffer vb : buffersList.getArray()){
                VertexBuffer bufClone = vb.clone();
                clone.buffers.put(vb.getBufferType().ordinal(), bufClone);
                clone.buffersList.add(bufClone);
            }

            clone.vertexArrayID = -1;
            clone.vertCount = -1;
            clone.elementCount = -1;

            // although this could change
            // if the bone weight/index buffers are modified
            clone.maxNumWeights = maxNumWeights;

            clone.elementLengths = elementLengths != null ? elementLengths.clone() : null;
            clone.modeStart = modeStart != null ? modeStart.clone() : null;
            return clone;
        }catch (CloneNotSupportedException ex){
            throw new AssertionError();
        }
    }

    /**
     * Clone the mesh for animation use.
     * This creates a shallow clone of the mesh, sharing most
     * of the {@link VertexBuffer vertex buffer} data, however the
     * {@link Type#Position}, {@link Type#Normal}, and {@link Type#Tangent} buffers
     * are deeply cloned.
     *
     * @return A clone of the mesh for animation use.
     */
    public Mesh cloneForAnim(){
        Mesh clone = clone();
        if (getBuffer(Type.BindPosePosition) != null){
            VertexBuffer oldPos = getBuffer(Type.Position);

            // NOTE: creates deep clone
            VertexBuffer newPos = oldPos.clone();
            clone.clearBuffer(Type.Position);
            clone.setBuffer(newPos);

            if (getBuffer(Type.BindPoseNormal) != null){
                VertexBuffer oldNorm = getBuffer(Type.Normal);
                VertexBuffer newNorm = oldNorm.clone();
                clone.clearBuffer(Type.Normal);
                clone.setBuffer(newNorm);

                if (getBuffer(Type.BindPoseTangent) != null){
                    VertexBuffer oldTang = getBuffer(Type.Tangent);
                    VertexBuffer newTang = oldTang.clone();
                    clone.clearBuffer(Type.Tangent);
                    clone.setBuffer(newTang);
                }
            }
        }
        return clone;
    }

    /**
     * Generates the {@link Type#BindPosePosition}, {@link Type#BindPoseNormal},
     * and {@link Type#BindPoseTangent}
     * buffers for this mesh by duplicating them based on the position and normal
     * buffers already set on the mesh.
     * This method does nothing if the mesh has no bone weight or index
     * buffers.
     *
     * @param forSoftwareAnim Should be true if the bind pose is to be generated.
     */
    public void generateBindPose(boolean forSoftwareAnim){
        if (forSoftwareAnim){
            VertexBuffer pos = getBuffer(Type.Position);
            if (pos == null || getBuffer(Type.BoneIndex) == null) {
                // ignore, this mesh doesn't have positional data
                // or it doesn't have bone-vertex assignments, so its not animated
                return;
            }

            VertexBuffer bindPos = new VertexBuffer(Type.BindPosePosition);
            bindPos.setupData(Usage.CpuOnly,
                    3,
                    Format.Float,
                    BufferUtils.clone(pos.getData()));
            setBuffer(bindPos);

            // XXX: note that this method also sets stream mode
            // so that animation is faster. this is not needed for hardware skinning
            pos.setUsage(Usage.Stream);

            VertexBuffer norm = getBuffer(Type.Normal);
            if (norm != null) {
                VertexBuffer bindNorm = new VertexBuffer(Type.BindPoseNormal);
                bindNorm.setupData(Usage.CpuOnly,
                        3,
                        Format.Float,
                        BufferUtils.clone(norm.getData()));
                setBuffer(bindNorm);
                norm.setUsage(Usage.Stream);
            }

            VertexBuffer tangents = getBuffer(Type.Tangent);
            if (tangents != null) {
                VertexBuffer bindTangents = new VertexBuffer(Type.BindPoseTangent);
                bindTangents.setupData(Usage.CpuOnly,
                        4,
                        Format.Float,
                        BufferUtils.clone(tangents.getData()));
                setBuffer(bindTangents);
                tangents.setUsage(Usage.Stream);
            }
        }
    }

    /**
     * Prepares the mesh for software skinning by converting the bone index
     * and weight buffers to heap buffers.
     *
     * @param forSoftwareAnim Should be true to enable the conversion.
     */
    public void prepareForAnim(boolean forSoftwareAnim){
        if (forSoftwareAnim){
            // convert indices
            VertexBuffer indices = getBuffer(Type.BoneIndex);
            ByteBuffer originalIndex = (ByteBuffer) indices.getData();
            ByteBuffer arrayIndex = ByteBuffer.allocate(originalIndex.capacity());
            originalIndex.clear();
            arrayIndex.put(originalIndex);
            indices.updateData(arrayIndex);

            // convert weights
            VertexBuffer weights = getBuffer(Type.BoneWeight);
            FloatBuffer originalWeight = (FloatBuffer) weights.getData();
            FloatBuffer arrayWeight = FloatBuffer.allocate(originalWeight.capacity());
            originalWeight.clear();
            arrayWeight.put(originalWeight);
            weights.updateData(arrayWeight);
        }
    }

    /**
     * Set the LOD (level of detail) index buffers on this mesh.
     *
     * @param lodLevels The LOD levels to set
     */
    public void setLodLevels(VertexBuffer[] lodLevels){
        this.lodLevels = lodLevels;
    }

    /**
     * @return The number of LOD levels set on this mesh, including the main
     * index buffer, returns zero if there are no lod levels.
     */
    public int getNumLodLevels(){
        return lodLevels != null ? lodLevels.length : 0;
    }

    /**
     * Returns the lod level at the given index.
     *
     * @param lod The lod level index, this does not include
     * the main index buffer.
     * @return The LOD index buffer at the index
     *
     * @throws IndexOutOfBoundsException If the index is outside of the
     * range [0, {@link #getNumLodLevels()}].
     *
     * @see #setLodLevels(com.jme3.scene.VertexBuffer[])
     */
    public VertexBuffer getLodLevel(int lod){
        return lodLevels[lod];
    }

    /**
     * Get the element lengths for {@link Mode#Hybrid} mesh mode.
     *
     * @return element lengths
     */
    public int[] getElementLengths() {
        return elementLengths;
    }

    /**
     * Set the element lengths for {@link Mode#Hybrid} mesh mode.
     *
     * @param elementLengths The element lengths to set
     */
    public void setElementLengths(int[] elementLengths) {
        this.elementLengths = elementLengths;
    }

    /**
     * Set the mode start indices for {@link Mode#Hybrid} mesh mode.
     *
     * @return mode start indices
     */
    public int[] getModeStart() {
        return modeStart;
    }

    /**
     * Get the mode start indices for {@link Mode#Hybrid} mesh mode.
     *
     * @return mode start indices
     */
    public void setModeStart(int[] modeStart) {
        this.modeStart = modeStart;
    }

    /**
     * Returns the mesh mode
     *
     * @return the mesh mode
     *
     * @see #setMode(com.jme3.scene.Mesh.Mode)
     */
    public Mode getMode() {
        return mode;
    }

    /**
     * Change the Mesh's mode. By default the mode is {@link Mode#Triangles}.
     *
     * @param mode The new mode to set
     *
     * @see Mode
     */
    public void setMode(Mode mode) {
        this.mode = mode;
        updateCounts();
    }

    /**
     * Returns the maximum number of weights per vertex on this mesh.
     *
     * @return maximum number of weights per vertex
     *
     * @see #setMaxNumWeights(int)
     */
    public int getMaxNumWeights() {
        return maxNumWeights;
    }

    /**
     * Set the maximum number of weights per vertex on this mesh.
     * Only relevant if this mesh has bone index/weight buffers.
     * This value should be between 0 and 4.
     *
     * @param maxNumWeights
     */
    public void setMaxNumWeights(int maxNumWeights) {
        this.maxNumWeights = maxNumWeights;
    }

    /**
     * Returns the size of points for point meshes
     *
     * @return the size of points
     *
     * @see #setPointSize(float)
     */
    public float getPointSize() {
        return pointSize;
    }

    /**
     * Set the size of points for meshes of mode {@link Mode#Points}.
     * The point size is specified as on-screen pixels, the default
     * value is 1.0. The point size
     * does nothing if {@link RenderState#setPointSprite(boolean) point sprite}
     * render state is enabled, in that case, the vertex shader must specify the
     * point size by writing to gl_PointSize.
     *
     * @param pointSize The size of points
     */
    public void setPointSize(float pointSize) {
        this.pointSize = pointSize;
    }

    /**
     * Returns the line width for line meshes.
     *
     * @return the line width
     */
    public float getLineWidth() {
        return lineWidth;
    }

    /**
     * Specify the line width for meshes of the line modes, such
     * as {@link Mode#Lines}. The line width is specified as on-screen pixels,
     * the default value is 1.0.
     *
     * @param lineWidth The line width
     */
    public void setLineWidth(float lineWidth) {
        this.lineWidth = lineWidth;
    }

    /**
     * Indicates to the GPU that this mesh will not be modified (a hint).
     * Sets the usage mode to {@link Usage#Static}
     * for all {@link VertexBuffer vertex buffers} on this Mesh.
     */
    public void setStatic() {
        for (VertexBuffer vb : buffersList.getArray()){
            vb.setUsage(Usage.Static);
        }
    }

    /**
     * Indicates to the GPU that this mesh will be modified occasionally (a hint).
     * Sets the usage mode to {@link Usage#Dynamic}
     * for all {@link VertexBuffer vertex buffers} on this Mesh.
     */
    public void setDynamic() {
        for (VertexBuffer vb : buffersList.getArray()){
            vb.setUsage(Usage.Dynamic);
        }
    }

    /**
     * Indicates to the GPU that this mesh will be modified every frame (a hint).
     * Sets the usage mode to {@link Usage#Stream}
     * for all {@link VertexBuffer vertex buffers} on this Mesh.
     */
    public void setStreamed(){
        for (VertexBuffer vb : buffersList.getArray()){
            vb.setUsage(Usage.Stream);
        }
    }

    /**
     * Interleaves the data in this mesh. This operation cannot be reversed.
     * Some GPUs may prefer the data in this format, however it is a good idea
     * to avoid using this method as it disables some engine features.
     */
    @Deprecated
    public void setInterleaved(){
        ArrayList<VertexBuffer> vbs = new ArrayList<VertexBuffer>();
        vbs.addAll(buffersList);

//        ArrayList<VertexBuffer> vbs = new ArrayList<VertexBuffer>(buffers.values());
        // index buffer not included when interleaving
        vbs.remove(getBuffer(Type.Index));

        int stride = 0; // aka bytes per vertex
        for (int i = 0; i < vbs.size(); i++){
            VertexBuffer vb = vbs.get(i);
//            if (vb.getFormat() != Format.Float){
//                throw new UnsupportedOperationException("Cannot interleave vertex buffer.\n" +
//                                                        "Contains not-float data.");
//            }
            stride += vb.componentsLength;
            vb.getData().clear(); // reset position & limit (used later)
        }

        VertexBuffer allData = new VertexBuffer(Type.InterleavedData);
        ByteBuffer dataBuf = BufferUtils.createByteBuffer(stride * getVertexCount());
        allData.setupData(Usage.Static, 1, Format.UnsignedByte, dataBuf);

        // adding buffer directly so that no update counts is forced
        buffers.put(Type.InterleavedData.ordinal(), allData);
        buffersList.add(allData);

        for (int vert = 0; vert < getVertexCount(); vert++){
            for (int i = 0; i < vbs.size(); i++){
                VertexBuffer vb = vbs.get(i);
                switch (vb.getFormat()){
                    case Float:
                        FloatBuffer fb = (FloatBuffer) vb.getData();
                        for (int comp = 0; comp < vb.components; comp++){
                            dataBuf.putFloat(fb.get());
                        }
                        break;
                    case Byte:
                    case UnsignedByte:
                        ByteBuffer bb = (ByteBuffer) vb.getData();
                        for (int comp = 0; comp < vb.components; comp++){
                            dataBuf.put(bb.get());
                        }
                        break;
                    case Half:
                    case Short:
                    case UnsignedShort:
                        ShortBuffer sb = (ShortBuffer) vb.getData();
                        for (int comp = 0; comp < vb.components; comp++){
                            dataBuf.putShort(sb.get());
                        }
                        break;
                    case Int:
                    case UnsignedInt:
                        IntBuffer ib = (IntBuffer) vb.getData();
                        for (int comp = 0; comp < vb.components; comp++){
                            dataBuf.putInt(ib.get());
                        }
                        break;
                    case Double:
                        DoubleBuffer db = (DoubleBuffer) vb.getData();
                        for (int comp = 0; comp < vb.components; comp++){
                            dataBuf.putDouble(db.get());
                        }
                        break;
                }
            }
        }

        int offset = 0;
        for (VertexBuffer vb : vbs){
            vb.setOffset(offset);
            vb.setStride(stride);

            vb.updateData(null);
            //vb.setupData(vb.usage, vb.components, vb.format, null);
            offset += vb.componentsLength;
        }
    }

    private int computeNumElements(int bufSize){
        switch (mode){
            case Triangles:
                return bufSize / 3;
            case TriangleFan:
            case TriangleStrip:
                return bufSize - 2;
            case Points:
                return bufSize;
            case Lines:
                return bufSize / 2;
            case LineLoop:
                return bufSize;
            case LineStrip:
                return bufSize - 1;
            default:
                throw new UnsupportedOperationException();
        }
    }

    /**
     * Update the {@link #getVertexCount() vertex} and
     * {@link #getTriangleCount() triangle} counts for this mesh
     * based on the current data. This method should be called
     * after the {@link Buffer#capacity() capacities} of the mesh's
     * {@link VertexBuffer vertex buffers} has been altered.
     *
     * @throws IllegalStateException If this mesh is in
     * {@link #setInterleaved() interleaved} format.
     */
    public void updateCounts(){
        if (getBuffer(Type.InterleavedData) != null)
            throw new IllegalStateException("Should update counts before interleave");

        VertexBuffer pb = getBuffer(Type.Position);
        VertexBuffer ib = getBuffer(Type.Index);
        if (pb != null){
            vertCount = pb.getData().capacity() / pb.getNumComponents();
        }
        if (ib != null){
            elementCount = computeNumElements(ib.getData().capacity());
        }else{
            elementCount = computeNumElements(vertCount);
        }
    }

    /**
     * Returns the triangle count for the given LOD level.
     *
     * @param lod The lod level to look up
     * @return The triangle count for that LOD level
     */
    public int getTriangleCount(int lod){
        if (lodLevels != null){
            if (lod < 0)
                throw new IllegalArgumentException("LOD level cannot be < 0");

            if (lod >= lodLevels.length)
                throw new IllegalArgumentException("LOD level "+lod+" does not exist!");

            return computeNumElements(lodLevels[lod].getData().capacity());
        }else if (lod == 0){
            return elementCount;
        }else{
            throw new IllegalArgumentException("There are no LOD levels on the mesh!");
        }
    }

    /**
     * Returns how many triangles or elements are on this Mesh.
     * This value is only updated when {@link #updateCounts() } is called.
     * If the mesh mode is not a triangle mode, then this returns the
     * number of elements/primitives, e.g. how many lines or how many points,
     * instead of how many triangles.
     *
     * @return how many triangles/elements are on this Mesh.
     */
    public int getTriangleCount(){
        return elementCount;
    }

    /**
     * Returns the number of vertices on this mesh.
     * The value is computed based on the position buffer, which
     * must be set on all meshes.
     *
     * @return Number of vertices on the mesh
     */
    public int getVertexCount(){
        return vertCount;
    }

    /**
     * Gets the triangle vertex positions at the given triangle index
     * and stores them into the v1, v2, v3 arguments.
     *
     * @param index The index of the triangle.
     * Should be between 0 and {@link #getTriangleCount()}.
     *
     * @param v1 Vector to contain first vertex position
     * @param v2 Vector to contain second vertex position
     * @param v3 Vector to contain third vertex position
     */
    public void getTriangle(int index, Vector3f v1, Vector3f v2, Vector3f v3){
        VertexBuffer pb = getBuffer(Type.Position);
        IndexBuffer ib = getIndicesAsList();
        if (pb != null && pb.getFormat() == Format.Float && pb.getNumComponents() == 3){
            FloatBuffer fpb = (FloatBuffer) pb.getData();

            // aquire triangle's vertex indices
            int vertIndex = index * 3;
            int vert1 = ib.get(vertIndex);
            int vert2 = ib.get(vertIndex+1);
            int vert3 = ib.get(vertIndex+2);

            BufferUtils.populateFromBuffer(v1, fpb, vert1);
            BufferUtils.populateFromBuffer(v2, fpb, vert2);
            BufferUtils.populateFromBuffer(v3, fpb, vert3);
        }else{
            throw new UnsupportedOperationException("Position buffer not set or "
                                                  + " has incompatible format");
        }
    }

    /**
     * Gets the triangle vertex positions at the given triangle index
     * and stores them into the {@link Triangle} argument.
     * Also sets the triangle index to the index argument.
     *
     * @param index The index of the triangle.
     * Should be between 0 and {@link #getTriangleCount()}.
     *
     * @param tri The triangle to store the positions in
     */
    public void getTriangle(int index, Triangle tri){
        getTriangle(index, tri.get1(), tri.get2(), tri.get3());
        tri.setIndex(index);
        tri.setNormal(null);
    }

    /**
     * Gets the triangle vertex indices at the given triangle index
     * and stores them into the given int array.
     *
     * @param index The index of the triangle.
     * Should be between 0 and {@link #getTriangleCount()}.
     *
     * @param indices Indices of the triangle's vertices
     */
    public void getTriangle(int index, int[] indices){
        IndexBuffer ib = getIndicesAsList();

        // acquire triangle's vertex indices
        int vertIndex = index * 3;
        indices[0] = ib.get(vertIndex);
        indices[1] = ib.get(vertIndex+1);
        indices[2] = ib.get(vertIndex+2);
    }

    /**
     * Returns the mesh's VAO ID. Internal use only.
     */
    public int getId(){
        return vertexArrayID;
    }

    /**
     * Sets the mesh's VAO ID. Internal use only.
     */
    public void setId(int id){
        if (vertexArrayID != -1)
            throw new IllegalStateException("ID has already been set.");

        vertexArrayID = id;
    }

    /**
     * Generates a collision tree for the mesh.
     * Called automatically by {@link #collideWith(com.jme3.collision.Collidable,
     * com.jme3.math.Matrix4f,
     * com.jme3.bounding.BoundingVolume,
     * com.jme3.collision.CollisionResults) }.
     */
    public void createCollisionData(){
        BIHTree tree = new BIHTree(this);
        tree.construct();
        collisionTree = tree;
    }

    /**
     * Handles collision detection, internal use only.
     * User code should only use collideWith() on scene
     * graph elements such as {@link Spatial}s.
     */
    public int collideWith(Collidable other,
                           Matrix4f worldMatrix,
                           BoundingVolume worldBound,
                           CollisionResults results){

        if (collisionTree == null){
            createCollisionData();
        }

        return collisionTree.collideWith(other, worldMatrix, worldBound, results);
    }

    /**
     * Sets the {@link VertexBuffer} on the mesh.
     * This will update the vertex/triangle counts if needed.
     *
     * @param vb The buffer to set
     * @throws IllegalArgumentException If the buffer type is already set
     */
    public void setBuffer(VertexBuffer vb){
        if (buffers.containsKey(vb.getBufferType().ordinal()))
            throw new IllegalArgumentException("Buffer type already set: "+vb.getBufferType());

        buffers.put(vb.getBufferType().ordinal(), vb);
        buffersList.add(vb);
        updateCounts();
    }

    /**
     * Unsets the {@link VertexBuffer} set on this mesh
     * with the given type. Does nothing if the vertex buffer type is not set
     * initially.
     *
     * @param type The buffer type to remove
     */
    public void clearBuffer(VertexBuffer.Type type){
        VertexBuffer vb = buffers.remove(type.ordinal());
        if (vb != null){
            buffersList.remove(vb);
            updateCounts();
        }
    }

    /**
     * Creates a {@link VertexBuffer} for the mesh or modifies
     * the existing one per the parameters given.
     *
     * @param type The type of the buffer
     * @param components Number of components
     * @param format Data format
     * @param buf The buffer data
     *
     * @throws UnsupportedOperationException If the buffer already set is
     * incompatible with the parameters given.
     */
    public void setBuffer(Type type, int components, Format format, Buffer buf){
        VertexBuffer vb = buffers.get(type.ordinal());
        if (vb == null){
            vb = new VertexBuffer(type);
            vb.setupData(Usage.Dynamic, components, format, buf);
            setBuffer(vb);
        }else{
            if (vb.getNumComponents() != components || vb.getFormat() != format){
                throw new UnsupportedOperationException("The buffer already set "
                        + "is incompatible with the given parameters");
            }
            vb.updateData(buf);
            updateCounts();
        }
    }

    /**
     * Set a floating point {@link VertexBuffer} on the mesh.
     *
     * @param type The type of {@link VertexBuffer},
     * e.g. {@link Type#Position}, {@link Type#Normal}, etc.
     *
     * @param components Number of components on the vertex buffer, should
     * be between 1 and 4.
     *
     * @param buf The floating point data to contain
     */
    public void setBuffer(Type type, int components, FloatBuffer buf) {
        setBuffer(type, components, Format.Float, buf);
    }

    public void setBuffer(Type type, int components, float[] buf){
        setBuffer(type, components, BufferUtils.createFloatBuffer(buf));
    }

    public void setBuffer(Type type, int components, IntBuffer buf) {
        setBuffer(type, components, Format.UnsignedInt, buf);
    }

    public void setBuffer(Type type, int components, int[] buf){
        setBuffer(type, components, BufferUtils.createIntBuffer(buf));
    }

    public void setBuffer(Type type, int components, ShortBuffer buf) {
        setBuffer(type, components, Format.UnsignedShort, buf);
    }

    public void setBuffer(Type type, int components, byte[] buf){
        setBuffer(type, components, BufferUtils.createByteBuffer(buf));
    }

    public void setBuffer(Type type, int components, ByteBuffer buf) {
        setBuffer(type, components, Format.UnsignedByte, buf);
    }

    public void setBuffer(Type type, int components, short[] buf){
        setBuffer(type, components, BufferUtils.createShortBuffer(buf));
    }

    /**
     * Get the {@link VertexBuffer} stored on this mesh with the given
     * type.
     *
     * @param type The type of VertexBuffer
     * @return the VertexBuffer data, or null if not set
     */
    public VertexBuffer getBuffer(Type type){
        return buffers.get(type.ordinal());
    }

    /**
     * Get the {@link VertexBuffer} data stored on this mesh in float
     * format.
     *
     * @param type The type of VertexBuffer
     * @return the VertexBuffer data, or null if not set
     */
    public FloatBuffer getFloatBuffer(Type type) {
        VertexBuffer vb = getBuffer(type);
        if (vb == null)
            return null;

        return (FloatBuffer) vb.getData();
    }

    /**
     * Get the {@link VertexBuffer} data stored on this mesh in short
     * format.
     *
     * @param type The type of VertexBuffer
     * @return the VertexBuffer data, or null if not set
     */
    public ShortBuffer getShortBuffer(Type type) {
        VertexBuffer vb = getBuffer(type);
        if (vb == null)
            return null;

        return (ShortBuffer) vb.getData();
    }

    /**
     * Acquires an index buffer that will read the vertices on the mesh
     * as a list.
     *
     * @return A virtual or wrapped index buffer to read the data as a list
     */
    public IndexBuffer getIndicesAsList(){
        if (mode == Mode.Hybrid)
            throw new UnsupportedOperationException("Hybrid mode not supported");

        IndexBuffer ib = getIndexBuffer();
        if (ib != null){
            if (mode.isListMode()){
                // already in list mode
                return ib;
            }else{
                // not in list mode but it does have an index buffer
                // wrap it so the data is converted to list format
                return new WrappedIndexBuffer(this);
            }
        }else{
            // return a virtual index buffer that will supply
            // "fake" indices in list format
            return new VirtualIndexBuffer(vertCount, mode);
        }
    }

    /**
     * Get the index buffer for this mesh.
     * Will return null if no index buffer is set.
     *
     * @return The index buffer of this mesh.
     *
     * @see Type#Index
     */
    public IndexBuffer getIndexBuffer() {
        VertexBuffer vb = getBuffer(Type.Index);
        if (vb == null)
            return null;

        Buffer buf = vb.getData();
        if (buf instanceof ByteBuffer) {
            return new IndexByteBuffer((ByteBuffer) buf);
        } else if (buf instanceof ShortBuffer) {
            return new IndexShortBuffer((ShortBuffer) buf);
        } else if (buf instanceof IntBuffer) {
            return new IndexIntBuffer((IntBuffer) buf);
        } else {
            throw new UnsupportedOperationException("Index buffer type unsupported: "+ buf.getClass());
        }
    }

    /**
     * Extracts the vertex attributes from the given mesh into
     * this mesh, by using this mesh's {@link #getIndexBuffer() index buffer}
     * to index into the attributes of the other mesh.
     * Note that this will also change this mesh's index buffer so that
     * the references to the vertex data match the new indices.
     *
     * @param other The mesh to extract the vertex data from
     */
    public void extractVertexData(Mesh other) {
        // Determine the number of unique vertices need to
        // be created. Also determine the mappings
        // between old indices to new indices (since we avoid duplicating
        // vertices, this is a map and not an array).
        VertexBuffer oldIdxBuf = getBuffer(Type.Index);
        IndexBuffer indexBuf = getIndexBuffer();
        int numIndices = indexBuf.size();

        IntMap<Integer> oldIndicesToNewIndices = new IntMap<Integer>(numIndices);
        ArrayList<Integer> newIndicesToOldIndices = new ArrayList<Integer>();
        int newIndex = 0;

        for (int i = 0; i < numIndices; i++) {
            int oldIndex = indexBuf.get(i);

            if (!oldIndicesToNewIndices.containsKey(oldIndex)) {
                // this vertex has not been added, so allocate a
                // new index for it and add it to the map
                oldIndicesToNewIndices.put(oldIndex, newIndex);
                newIndicesToOldIndices.add(oldIndex);

                // increment to have the next index
                newIndex++;
            }
        }

        // Number of unique verts to be created now available
        int newNumVerts = newIndicesToOldIndices.size();

        if (newIndex != newNumVerts) {
            throw new AssertionError();
        }

        // Create the new index buffer.
        // Do not overwrite the old one because we might be able to
        // convert from int index buffer to short index buffer
        IndexBuffer newIndexBuf;
        if (newNumVerts >= 65536) {
            newIndexBuf = new IndexIntBuffer(BufferUtils.createIntBuffer(numIndices));
        } else {
            newIndexBuf = new IndexShortBuffer(BufferUtils.createShortBuffer(numIndices));
        }

        for (int i = 0; i < numIndices; i++) {
            // Map the old indices to the new indices
            int oldIndex = indexBuf.get(i);
            newIndex = oldIndicesToNewIndices.get(oldIndex);

            newIndexBuf.put(i, newIndex);
        }

        VertexBuffer newIdxBuf = new VertexBuffer(Type.Index);
        newIdxBuf.setupData(oldIdxBuf.getUsage(),
                            oldIdxBuf.getNumComponents(),
                            newIndexBuf instanceof IndexIntBuffer ? Format.UnsignedInt : Format.UnsignedShort,
                            newIndexBuf.getBuffer());
        clearBuffer(Type.Index);
        setBuffer(newIdxBuf);

        // Now, create the vertex buffers
        SafeArrayList<VertexBuffer> oldVertexData = other.getBufferList();
        for (VertexBuffer oldVb : oldVertexData) {
            if (oldVb.getBufferType() == VertexBuffer.Type.Index) {
                // ignore the index buffer
                continue;
            }

            // Create a new vertex buffer with similar configuration, but
            // with the capacity of number of unique vertices
            Buffer buffer = VertexBuffer.createBuffer(oldVb.getFormat(), oldVb.getNumComponents(), newNumVerts);

            VertexBuffer newVb = new VertexBuffer(oldVb.getBufferType());
            newVb.setNormalized(oldVb.isNormalized());
            newVb.setupData(oldVb.getUsage(), oldVb.getNumComponents(), oldVb.getFormat(), buffer);

            // Copy the vertex data from the old buffer into the new buffer
            for (int i = 0; i < newNumVerts; i++) {
                int oldIndex = newIndicesToOldIndices.get(i);

                // Copy the vertex attribute from the old index
                // to the new index
                oldVb.copyElement(oldIndex, newVb, i);
            }

            // Set the buffer on the mesh
            clearBuffer(newVb.getBufferType());
            setBuffer(newVb);
        }

        // Copy max weights per vertex as well
        setMaxNumWeights(other.getMaxNumWeights());

        // The data has been copied over, update informations
        updateCounts();
        updateBound();
    }

    /**
     * Scales the texture coordinate buffer on this mesh by the given
     * scale factor.
     *

     * Note that values above 1 will cause the
     * texture to tile, while values below 1 will cause the texture
     * to stretch.
     *

     *
     * @param scaleFactor The scale factor to scale by. Every texture
     * coordinate is multiplied by this vector to get the result.
     *
     * @throws IllegalStateException If there's no texture coordinate
     * buffer on the mesh
     * @throws UnsupportedOperationException If the texture coordinate
     * buffer is not in 2D float format.
     */
    public void scaleTextureCoordinates(Vector2f scaleFactor){
        VertexBuffer tc = getBuffer(Type.TexCoord);
        if (tc == null)
            throw new IllegalStateException("The mesh has no texture coordinates");

        if (tc.getFormat() != VertexBuffer.Format.Float)
            throw new UnsupportedOperationException("Only float texture coord format is supported");

        if (tc.getNumComponents() != 2)
            throw new UnsupportedOperationException("Only 2D texture coords are supported");

        FloatBuffer fb = (FloatBuffer) tc.getData();
        fb.clear();
        for (int i = 0; i < fb.capacity() / 2; i++){
            float x = fb.get();
            float y = fb.get();
            fb.position(fb.position()-2);
            x *= scaleFactor.getX();
            y *= scaleFactor.getY();
            fb.put(x).put(y);
        }
        fb.clear();
        tc.updateData(fb);
    }

    /**
     * Updates the bounding volume of this mesh.
     * The method does nothing if the mesh has no {@link Type#Position} buffer.
     * It is expected that the position buffer is a float buffer with 3 components.
     */
    public void updateBound(){
        VertexBuffer posBuf = getBuffer(VertexBuffer.Type.Position);
        if (meshBound != null && posBuf != null){
            meshBound.computeFromPoints((FloatBuffer)posBuf.getData());
        }
    }

    /**
     * Returns the {@link BoundingVolume} of this Mesh.
     * By default the bounding volume is a {@link BoundingBox}.
     *
     * @return the bounding volume of this mesh
     */
    public BoundingVolume getBound() {
        return meshBound;
    }

    /**
     * Sets the {@link BoundingVolume} for this Mesh.
     * The bounding volume is recomputed by calling {@link #updateBound() }.
     *
     * @param modelBound The model bound to set
     */
    public void setBound(BoundingVolume modelBound) {
        meshBound = modelBound;
    }

    /**
     * Returns a map of all {@link VertexBuffer vertex buffers} on this Mesh.
     * The integer key for the map is the {@link Enum#ordinal() ordinal}
     * of the vertex buffer's {@link Type}.
     * Note that the returned map is a reference to the map used internally,
     * modifying it will cause undefined results.
     *
     * @return map of vertex buffers on this mesh.
     */
    public IntMap<VertexBuffer> getBuffers(){
        return buffers;
    }

    /**
     * Returns a list of all {@link VertexBuffer vertex buffers} on this Mesh.
     * Using a list instead an IntMap via the {@link #getBuffers() } method is
     * better for iteration as there's no need to create an iterator instance.
     * Note that the returned list is a reference to the list used internally,
     * modifying it will cause undefined results.
     *
     * @return list of vertex buffers on this mesh.
     */
    public SafeArrayList<VertexBuffer> getBufferList(){
        return buffersList;
    }

    public void write(JmeExporter ex) throws IOException {
        OutputCapsule out = ex.getCapsule(this);

//        HashMap<String, VertexBuffer> map = new HashMap<String, VertexBuffer>();
//        for (Entry<VertexBuffer> buf : buffers){
//            if (buf.getValue() != null)
//                map.put(buf.getKey()+"a", buf.getValue());
//        }
//        out.writeStringSavableMap(map, "buffers", null);

        out.write(meshBound, "modelBound", null);
        out.write(vertCount, "vertCount", -1);
        out.write(elementCount, "elementCount", -1);
        out.write(maxNumWeights, "max_num_weights", -1);
        out.write(mode, "mode", Mode.Triangles);
        out.write(collisionTree, "collisionTree", null);
        out.write(elementLengths, "elementLengths", null);
        out.write(modeStart, "modeStart", null);
        out.write(pointSize, "pointSize", 1f);

        out.writeIntSavableMap(buffers, "buffers", null);
        out.write(lodLevels, "lodLevels", null);
    }

    public void read(JmeImporter im) throws IOException {
        InputCapsule in = im.getCapsule(this);
        meshBound = (BoundingVolume) in.readSavable("modelBound", null);
        vertCount = in.readInt("vertCount", -1);
        elementCount = in.readInt("elementCount", -1);
        maxNumWeights = in.readInt("max_num_weights", -1);
        mode = in.readEnum("mode", Mode.class, Mode.Triangles);
        elementLengths = in.readIntArray("elementLengths", null);
        modeStart = in.readIntArray("modeStart", null);
        collisionTree = (BIHTree) in.readSavable("collisionTree", null);
        elementLengths = in.readIntArray("elementLengths", null);
        modeStart = in.readIntArray("modeStart", null);
        pointSize = in.readFloat("pointSize", 1f);

//        in.readStringSavableMap("buffers", null);
        buffers = (IntMap<VertexBuffer>) in.readIntSavableMap("buffers", null);
        for (Entry<VertexBuffer> entry : buffers){
            buffersList.add(entry.getValue());
        }

        Savable[] lodLevelsSavable = in.readSavableArray("lodLevels", null);
        if (lodLevelsSavable != null) {
            lodLevels = new VertexBuffer[lodLevelsSavable.length];
            System.arraycopy( lodLevelsSavable, 0, lodLevels, 0, lodLevels.length);
        }
    }

}


text:
Members Vault
May 23, 2022 by Olly
Hey, my name's Olly, and I want to share with you what I have started to understand about the gut microbiome from people much smarter than me and walk you through the shifts and skillsets I believe everyone must know to help not only upgrade your energy, mood and metabolism. But completely shift how you look after your health and the health of the people you love around you.
From a birdseye view, we see advances in food production, advancements in medical science and the general extension of the lifespan of the population.
However, as I've had the opportunity to work with thousands of clients at a much deeper level, my team and I have uncovered so many silent "health anchors" making it nearly impossible to drop the stubborn body fat, have strong energy all day and stay healthy & active long into your 70, 80s and even 90s. And I'd like to share with you.
There are so many people that I feel have been labelled with a certain condition or disease without being given a strategy to manage or even recover and instead simply accept a new limitation and new drug prescription.
And while my intention is to by no means belittle any condition you or others around you are struggling with, I feel many of us are living lives through limitations set out for us rather than empowered with further environmental, lifestyle and nutrition changes that could greatly impact the improvement and even recovery of certain conditions.
I believe the world is slowly waking up to the limitations of going to their local GP for health advice but ultimately I do not think it is their fault or yours. Medical degrees do not include sound nutrition guidance nor is it supposed it, it's simply a lack of awareness of their scope. Health within the lens of medical practice is simply the absence of disease. If you aspire not just to be alive, but also to live and thrive, you need to take ownership of your own health journey.
In today's training, I want to show you where you must start to take control of your health and body, so you can lead and be a role model for the people in your life you care about in a body that matches the task.
Although we are seeing advances in acute solutions for disease, we are seeing a silent killer emerge in the form of more chronic conditions.
These advances in antibiotics, cleaning processes and sanitisers have had life-changing results in the medical field that are not to be dismissed. However, when this is taken from a field focused on the prevention of disease and given to the masses, there are very real consequences.
When we take an antibiotic to kill off a deadly disease, it saves a life. However, in the process, it also decimates the gut.
If we start to demonise all bacteria like we historically have with dietary fats (which many of us know are crucial to our health), we start to see a huge reduction in gut microbiota and the body's ability to regulate its own natural defence response which has seen rise to huge levels of chronic inflammation.
While acute inflammation is a very normal and helpful process in the response to injury, chronic inflammation is becoming a very real epidemic in the modern world and is growing at a rapid rate.
Examples of how widespread this is seen are in the rise in autism. We had one in 5,000 children with autism in 1975. Today we have one in 36 children with an autism spectrum disorder. Between 2012 and today where we're seeing a doubling time, every two to three years in that autism rate at the current rate, we'll see one in three children with autism in 2035.
From my interactions, the huge rise in infertility cases seems to still be under the radar. The use of assisted reproductive technology (ART) by infertile couples is increasing by 5% to 10% per year. "If it continues at this rate, the human race will be unable to reproduce itself and by 2050, many couples will have to turn to technology," says Shanna Swan.
The incidence of type 1 diabetes has been increasing throughout the globe at rates that range from 3 to 5 per cent per year. "Increases such as the ones that have been reported cannot be explained by a change in genes in such a short period," says Giuseppina Imperatore, who leads a team of epidemiologists in the Division of Diabetes Translation at the U.S. Centers for Disease Control and Prevention. "So environmental factors are probably major players in this increase."
All of these diseases are on the rise, yet there is nowhere near enough time for genes to change in this time frame, it's our environment that has. Which really begs the question, what's the root cause and where do we start to really be able to take care of our health, possible prevent disease and understand the role of the gut.
We must start with the soil.
We have drastically changed the way we farmed this the late 1800s.
We went from stone grinding the steel grinding which allows for a much more refined carbohydrate with this fibre. The increased demands in produce by our soil through increased crop rotation that led to a massive death of topsoil and the nutrients it contained.
This led to the massive dust bowl crisis in the southern plains region of the states in the 1930s. All of this soil that has lost its topsoil was getting swept up and blown around causing havoc on the people and animals in the region, and forcing food production to be imported because the soil was no longer able to be used for crops.
After world war 2, which saw a huge rise in demands for petroleum now drastically changed, they started to uncover that they could extract nitrogen, phosphorus and potassium from the petrol which saw the rise of the chemical-based fertilizers.
This became a very easy sell to farmers at the time because the quality of the solid was still suffering from the lack of topsoil to grow crops. The message was a very easy sell as rather than crop rotation and caring for the soil, they simply start spraying the soil with fertilizers.
Now, this is where things start to go downhill, remember we are what we eat, and if we see this development in plants first, it's not long before it happens to us.
Through the chemicals sprayed on the plants, the farmers were getting positive reinforcement because they saw green plants, but what they didn't know is nitrogen and phosphorus will turn plants green, but it also made the plants weak and unable to fight off viruses, pests and have a strong root system to stay strong. Along with that, the plants didn't contain the same nutrients so the immune system of both the plant and eventually humans was also weakened.
Rather than identify that these chemicals were causing the plants to be weak, they did what we are seeing with humans now. Rather than seek the root cause, they developed herbicides that allowed farmers to fix the problem their first product had caused to keep them alive while not fixing the weakened plant below the surface. As long as it looked good and was growing, they continued.
As we see in the medicine world, many drugs are being used in the same way. We are given a drug from an initial diagnosis and then we are given another drug to deal with the symptoms that the drug has caused and as with the farmers, you enter a co-dependant relationship with these drugs.
Around the same time as this fertilizer was invented, modern medicine had a big breakthrough with penicillin, our first antibiotic that was developed in the 1940s. Essentially we had an antibiotic to kill off bacteria for the body and we developed an antibiotic to kill off the weeds.
Glyphosate was never even patented as a weed killer, it was patented as an antibiotic. The trouble is, this herbicide doesn't just impact the weeds. Glyphosate works by blocking a chemical pathway in plant. The reason glyphosate was originally deemed safe for humans is that human cells don't use the Shikimate pathway to make amino acids.
However, all of our gut bacteria do. Micro-doses of glyphosate in our food, may not actually cause damage to our human cells but it can harm our gut bugs, leading to reduced gut diversity.
This has become the most successful chemical warfare on the planet. We currently use 2 billion kilos of glyphosate on our soils every year. The trouble is it's reported that less than 0.01% of the glyphosate on the planet actually hits weeds. The other 99.99% gets into the soil and the water system, from there it is evaporated in the air we breathe and then dumped back down through the rainfall.. So even before we look at the food you are eating, you're being hit with an antibiotic.
This reduction in gut diversity is associated with many health issues from weight gain, to chronic inflammatory conditions and digestive issues.
Since it was originally deemed safe, glyphosate has been reclassified by the World Health Organisation as "probably a carcinogen" due to emerging evidence of its impact on other areas of human cell function.
The key point is that its primary negative effects were not first recognized because when it was first made we basically knew nothing about the role of gut bacteria in health and well-being.
In the last 15 years, we've completed adjusted our body's abilities to build a strong gut microbiome not just through the food but now through the air, water and normal house products we use.
If we don't stop this vicious cycle of these "chemical deletes" from happening, not only are you going to see it harder to drop body fat and feel energetic, we are going to see a catastrophic increase in autism, diabetes, infertility and more defects.
We have become so good at fixing acute issues by clearing everything out, that in the process we had killed the bacteria balance in our gut which has led to massive surges in chronic inflammatory conditions in the human race.
This is ONE of seven "system spoilers" that we address with all of our clients to rebuild their gut health, energy and body to live a long, strong and healthy life in a body they feel in control of.
This is not an issue that is fixed with a pill or 6-week detox.
This is only fixed through taking ownership of your own health and awareness to the world around you.
It can be so easy to sit here and blame whole industries and governments for this information, but as we know from the outdated nutrition recommendations that are 30yrs behind, we cannot wait for anyone to save us.
This comes from the ownership of your own health and the decision to understand how to look after your health and the health of the people you care about through the power of the gut.
If your body is feeling sluggish, run-down and getting in the way of your feeling and functioning at your best day to day, please feel free to dive deeper into our free trainings HERE.
Alternatively, if you want us to help you build out a game plan to work with you personally to get your health and body back on track, click here to book in a time with one of our coaches.
All Disease Starts In The Gut
The Seven System Spoilers
Suffering from allergies?
Avoiding the slippery slopes of depression
© 2023 Body Reset • Built with GeneratePress


text:
St Inez man held for allegedly kidnapping and raping minor girl
NT NETWORK
police have arrested a 22-year-old man
for allegedly kidnapping and raping a
minor girl.
said the accused Sahil Shaik is a resident of St Inez, and was traced in Mumbai
along with the 14-year-old victim girl after their disappearance over a month.
are known to each other, police said, adding
that a complaint was lodged by the girl's father claiming that his
daughter was allegedly kidnapped by the accused.
were tracked to Mumbai.
on the medical examination and the statement of the girl, police booked Sahil for allegedly raping the minor
girl.
has been remanded to seven-day
police custody, police said.