text:
Currently, there are no shows listed. Check back soon for an updated list of shows in your area.
Previous Shows:
Gillian Hobbs will be hosting a song-writing workshop at the Burnaby Public Library for youth 12-18 years old from 4-6pm. For more information, please visit: http://www.bpl.bc.ca/
Gillian Hobbs and Fiona McLachlin will be performing at the Folklife Cafe at the renown Seattle Folklife Music Festival at 2:30pm on Monday, May 30th, 2011. This is the biggest music festival of its type in the North America! For more information, please visit: http://www.nwfolklife.org/
March 12th, 2011 6pm
"Don't Break My Heart" – Benefit for the Heart and Stroke Foundation
Delta Firehall Center for the Arts, 11489 84th Avenue, Delta
Come out for "don't break my heart!", a concert benefiting the Heart & Stoke Foundation of BC & Yukon. All proceeds from the event will be donated to the Heart & Stroke Foundation.
We will be featuring local artists including:
Gillian Hobbs
Sheldon Witt
A Cold City Night
The Gathering Place, Port Coquitlam, BC 8pm.
The Crossroads Hospice Society is having Gillian back for her 4th time playing for people of Port Coquitlam, at the beautiful Gathering Place (just off Shaughnessy).
Backstage Lounge on Granville Island 8pm. Tix: $5 at the door.
Join Gillian Hobbs, Bobby Richards, Sheldon Witt, Jody Quine and Aaron Grant as they do a show full of love songs for you and yours!
Terry Fox Theatre – The City of Port Coquitlam's Spirit Week Celebration
Gillian will be leading a songwriting workshop after the Felice Women's Choir performs a concert of classical music for your enjoyment.
February 6th, 2011 (To be rescheduled – Canceled due to SuperBowl)
Canadian Music Week Showcase at Falconetti's!!!
1812 Commercial Drive Vancouver, BC V5N 4A5 (604) 251-7287.
For more information, please visit: http://www.falconettis.com/
Trees Coffeehouse in Yaletown 1391 Richards Street (at Pacific) 8pm.
St. James Hall, Vancouver. 8pm.
Join Gillian and several other fantastic Rave On Studios artists as they sing their songs from the Very Vancouver Christmas Collection (with all proceeds benefiting the BC SPCA.) For more information, please visit: http://www.veryvancouverchristmas.com/
Rave On Studios presents the first of two REALLY REALLY BIG Christmas shows at the Inlet Theatre. Join Gillian Hobbs, Sillken, Sheldon Witt, the Light Machines, Danny Echo and many more amazing artists as they sing their songs from the Very Vancouver Christmas Collection (with all proceeds benefiting the BC SPCA.)
For more information, please visit: http://www.veryvancouverchristmas.com/
The City of Port Coquitlam presents: Gillian Hobbs, Sheldon Witt and the Light Machines at the Gathering Place. There will be a performance from each artist/band followed by a songwriting session where the audience will help write Port Coquitlam's Christmas song: "Christmas in Leigh Square."
Check out Gillian on CO-OP Radio at 9pm tonight!
Check out Gillian at the UBC SUB Gallery as she performs for the World AIDS Day Benefit.
Gillian Hobbs plays UBC's Thunderbird Arena (Centre Ice!!!) for the BC Children's Hospital & Rare Disease Foundation's "Lace Up Your Skates" fundraiser!
You can now view Gillian's appearance on Shaw's the Express on her youtube channel: http://www.youtube.com/user/GillianHobbs#p/u/3/whznOqTNyxo
November 23rd 2010
Watch Shaw TV's: The Express at 3,6,8,and 10pm to see Gillian talk about her song: "Sit 'Round the Fire" on the BC Lung Association's Christmas CD, "Breathe."
Trees Organic Coffee House in Yaletown.
Join Gillian Hobbs, Lindsey May and Sillken for a great night of music!
Gillian Hobbs live at the Second Story Theatre.
Gillian Hobbs initiates Port Coquitlam's Second Story Theatre as a musical venue with her guest: Chika Buston.
Gillian Hobbs at Sailor Dan's
Gillian makes her debut in beautiful Gibsons, BC taking her music to the audience at Sailor Dan's.
Chevron Family Movie Night in Confederation Park
(Also) August 29th, 2010
Gillian Hobbs and Sheldon Witt perform at Confederation Park as part of Chevron's family movie night.
Gillian Hobbs at Lions Park
Gillian Hobbs, Tony Prophet and Doug Rolling perform at Loins Park in Port Coquitlam as part of the City of Port Coquitlam's summer concert series: Music in the Park.
Gillian Hobbs at Cates Park Concert Series
Sat, July 24 @ 5:00 PM PDT
Cates Park, North Vancvouer, BC 00000
Gillian Hobbs at Burnaby Civic Square Sundays
Sun, July 18 @ 1:00 PM PDT
6100 Willingdon Ave, Burnaby, BC 00000
Gillian Hobbs Live at Cafe Barcelona
Gillian Hobbs at Cafe Barcelona
Sun, July 18 @ 8:00 PM IST
1049 Granville St, Vancouver, BC 0000
Gillian Hobbs at Summerfest in Grimston Park
Grimston Park, New Westminster, BC 00000
Gillian Hobbs at Queen B's
Queen Charlotte, BC
Gillian Hobbs at Subaru Vancouver Triathalon
Sun, July 04 @ 9:00 AM PDT
Jericho Beach, Vancouver, British Co
Gillian Hobbs at Sunset Community Centre
Thu, July 01 @ 12:00 PM PDT
6810 Main Street, Vancouver, BC 00000
Riley Park Community Festival
Gillian Hobbs at Riley Park Community Festival
Sun, June 27 @ 12:30 PM IST
50 East 30th Avenue, Vancvouver, BC 00000
June 25 10
8:00 PM – 10:00 PM PDT
@ MP Bill Siksay Cabaret Fundraiser
Denman Car Free Day
10:00 AM – 10:30 PM IST
BC Regional Women's Conference for the Public Service Alliance of Canada
@ Hyatt Regency Hotel
PSACBC Conference
June 6 10
Brockton SummerFest
@ Brockton Preparatory School
Sylvia's B DAY Party (Private Function)
8:30 AM – 10:30 pm PDT
12:00 PM – 2:00 PM PDT
@ Kitsilano Farmer's Market
@ CAFE BARCELONA
@ Trees Organic Coffee House
May 15, 2010 3:00 PM – 4:00 PM PDT
Where: Shop for Shelter
3333 Main Street, Vancouver (Main and 17th ~ old car dealership lot)
May 6 10
@ The Edge Gastropub
Tues May 4 2010
The Cellar Night Club
Granville St
@ Cafe Montmartre
April 25 10
9:00 AM – 11:00 AM PDT
@ David Suzuki's Vancouver Earthrun 2010
@ Slainte by the Pier
April 15, 2010 8:00 PM – 10:00 PM PDT
Where: The Edge Gastropub
303 Columbia Street
Mar 18, 2010 11:30 AM – Nat Bailey Stadium for the Paralympic Games – Curling
4601 Ontario Street
Mar 17, 2010 5:00 PM – Nat Bailey Stadium for the Paralympic Games – Curling
Mar 16, 2010 8:15 AM – Global TV Morning News Channel 11 Cable & Channel 8 antenna
EVERYWHERE, BC!!!!!, British Columbia
Description:Gillian will be the featured artist on Global TV's morning news show. She will be playing live and doing an interview about her involvement in the Paralympics, her show at the Vancouver Sun Run, and her upcoming summer tour. Check it out!
Mar 12, 2010 7:00 PM – Vancouver City Limits: The Vancouver Rowing Club
450 Stanley Park Drive (at the Georgia street entrance to Stanley Park)
Description:Come check out Vancouver's hottest night of new talent at the Vancouver Rowing club, as Vancouver City Limits presents Vancouver's hottest Indie showcase. This is a night that you won't want to miss! Great food & Drink specials as well!
Mar 4, 2010 6:30 PM – Liberty Place
Burnaby, BC, British Columbia
Description:Gillian will be hanging out after the show to chat and sign CDs.
Feb 23, 2010 6:45 PM – 2010 Olympic Celebration Edgewater Celebration Stage
The old Plaza of Nations stage 750 Pacific Boulevard
Description:Gillian and her band are pleased to team up with Steel Productions and Long & McQuade to perform at the 2010 Olympic Celebration Edgewater Celebration Stage from 6:45-7:15pm. Don't miss this spectacular event!
Description:Gillian and her band are pleased to team up with Steel Productions and Long & McQuade to perform at the 2010 Olympic Celebration Edgewater Celebration Stage from 2:30-3pm. Don't miss this spectacular event!
Jan 29, 2010 7:30 PM – Vancouver City Limits: The Vancouver Rowing Club
Description:Gillian is excited to be playing at Vancouver City Limits and to be promoting her upcoming Olympic performances. Vancouver City Limits is an exciting weekly music showcase of emerging talent that offers performers an opportunity to present their music in a concert like setting. Each week features three new acts from the city's burgeoning music scene. For a map, to the location, please visit: http://www.vancouverrowingclub.ca/EN/location/
Jan 8, 2010 7:30 PM – The Gathering Place (next to Port Coquitlam's City Hall)
Port Coquitlam, British Columbia
Description:Gillian will be the featured performer at the Crossroads Coffeehouse Night at the Gathering Place, in support of the Crossroads Hospice Society. Come out for some great music and support a great cause.
Dec 20, 2009 8:00 PM – St. James Hall
3214 West 10th Avenue (Corner of 10th & Trutch)
Description:Join Gillian Hobbs and some of Rave On Studio's best talent as they launch: A Very Vancouver Christmas Vol. 4, a wonderful compilation of some of Vancouver's best emerging talent and their original Christmas tunes. All proceeds benefit the Vancouver SPCA.
Dec 17, 2009 8:00 PM – Trees Organic Coffee House
Description:Come check out Gillian Hobbs and other fabulous emerging artists at Downtown Vancouver's coolest coffee house.
Nov 18, 2009 8:00 PM – Vancouver Folk Song Society @ The Friends Meeting Hall
1090 W. 70th Ave
Description:Gillian will be the feature performer at the Vancouver Folk Song Society's Song Circle and Concert night.
Nov 13, 2009 7:30 PM – The Gathering Place (next to Port Coquitlam's City Hall) [Edit] [Cancel]
Description:Gillian will be doing a half hour preview of her upcoming show on January 8th 2010 during the open stage at the Crossroads Coffeehouse Night at the Gathering Place. All proceeds go to the Crossroads Hospice Society.
Nov 9, 2009 8:00 PM – The Bottle Tipper
2066 Kingsway (the corner of Kingsway & Victoria Drive)
Description:Gillian's coming back to the place where it all began, doing a set at Solace Music Nation's Monday night Music night. Come check out Gillian in her natural habitat.
Oct 1, 2009 8:00 PM – Slainte by the Pier
15057 Marine Drive, West Beach, White Rock, B.C.
Description:Come join Gillian Hobbs and other amazingly talented songwriters at White Rock's newest live music venue Slainte. This songwriters night is akin to many in music hot spots like Nashville and New York. Come down for an incredible night of music by some immensely talented artists! http://www.slaintebythepier.ca/
Sep 20, 2009 12:00 PM – Kitsilano Farmer's Market
Sep 19, 2009 8:00 PM – Lugz Coffee Lounge
2525 Main St (at Broadway)
Description:With Sarah Cole and Tim Smith Details TBA
Sep 19, 2009 10:00 AM – Douglas College Coquitlam Campus
Coquitlam, British Columbia
Sep 17, 2009 6:30 PM – Bill Siksay MP Cabaret Night Fundraiser
Scandinavian Community Centre 6540 Thomas Street
Description:Join Gillian and several other talented artists for a great night in support of Burnaby Douglas MP Bill Siksay. For more information, please call Lil at 604-309-7134.
Sep 5, 2009 9:00 AM – Trout Lake Farmer's Market
Trout Lake Community Centre
Aug 29, 2009 8:00 PM – House Concert on the Songs of Leonard Cohen
Description:Join Gillian Hobbs and Simon Trevelyan for an evening of some of the best folk songs ever written as they do a tribute to the Legendary Leonard Cohen.
Aug 23, 2009 11:00 AM – Gastown Farmer's Market
Description:Gillian will be playing at the Gastown Farmer's Market August 23rd from 11am – 1pm.
Aug 13, 2009 8:30 PM – The Rusty Gull Neighbourhood Pub
175 East st Street
North Vancouver, British Columbia
Description:Gillian will be playing a short set during Steel Productions' Jam Night at the Rusty Gull on Thursday August 13th. Come check out some of the Lower Mainland's most talented artists at "B.C.'s Best Pub."
Aug 9, 2009 12:15 PM – Edge of the World Festival
Queen Charlotte City, British Columbia
Description:Gillian will be performing as part of this year's EdgeFest in the Queen Charlotte Islands. She hits the stage on Sunday, August 9th at 12:20pm. Don't miss it!!! For more information, please visit: http://www.edgefestival.com/2009.htm
Jul 31, 2009 8:00 PM – Lugz Coffee Lounge
Description:Join Australian band Nice Verdes and Gillian Hobbs for a night of absolutely smashing music at Lugz Coffee Lounge!
Jul 26, 2009 1:00 PM – Islands Folk Festival – Providence Farm
1843 Tzouhalem Road, Duncan, BC
Duncan, British Columbia
Description:Gillian will be performing at the Islands Stage Sunday during the Youth Showcase and at the Youth Jam from 1:00 – 3:00pm : Hosted by Tad Ruszel
Description:Gillian will be performing on the Tzouhalem Stage: Saturday, July 25th at 4:30pm.
Jul 14, 2009 8:00 PM – CJSF 90.1 FM Melodies in Mind with Ryan Fletcher
SFU Burnaby Campus and online
Description:Gillian will be Ryan's featured artist interview on his program Melodies in Mind. She will be playing songs from her album, "Something to Write Home About" and will be talking about her Spring/Summer tour dates.
Jul 12, 2009 12:00 PM – Kitsilano Farmers Market
10th Ave and Larch (parking lot of the Kitsilano community centre)
Description:Gillian will be performing at one of Vancouver's finest farmers markets: the Kitsilano Farmers Market, this Sunday from 12-2pm. Come check it out!
Jul 5, 2009 10:00 AM – Kitsilano Farmer's Market
Jul 1, 2009 1:00 PM – Queen B's
Description:Join Taylor Hett and Gillian Hobbs for a great afternoon of song at Queen B's Coffee House.
Jun 18, 2009 7:00 PM – Oasis Lounge
1240 Thurlow St
Description:Gillian will be playing along side Gina-Lily D'attillo and some of Vancouver's finest up-and-coming musicians. Check it out!
Jun 13, 2009 8:00 PM – Lugz Coffee Lounge
Description:Gillian is happy to join Toronto singer/songwriter Andrea Ramolo at Lugz Coffee Lounge as Andrea stops by Vancouver during her cross-Canada tour.
May 22, 2009 10:00 PM – The Main
Description:Come out to the Main for Ross Fairbairn's CD release party and special guests Rob Fillo, Gillian Hobbs and other amazing VACA members for an intense songwriter's circle that will bring down the house! 10pm-1am!
May 22, 2009 8:00 PM – The Tipper Restaraunt and Review Room
2066 Kingway (At Victoria Drive)
Description:Gillian will be playing as the Tipper hosts "Earthsave Canada Dineout." For more information please visit: http://www.earthsave.ca/dineoutsregister
May 16, 2009 11:30 AM – Trout Lake Farmer's Market
May 15, 2009 8:00 PM – Trees Organic Coffee House
Description:Come down and join Gillian Hobbs and fellow songwriters at Trees Organic Coffee House for a great night of music!
May 12, 2009 8:00 PM – Oasis Lounge
Description:Gillian will be performing at the opening night of the Oasis Lounge's new live music night, hosted by Gina-Lily D'Attilio. Come check out Gillian and other fantastic Vancouver acts! Admission by donation.
May 5, 2009 9:00 PM – CJSF 90.1 FM Melodies in Mind with Ryan Fletcher
Description:Listen to Gillian promoting her new album, "Something to Write Home About" on CJSF's Radio program "Melodies in Mind" Tuesday, May 5th 9 to 10 PM on CJSF 90.1FM
Apr 25, 2009 8:00 PM – The Tipper Restaraunt and Review Room
Description:Gillian will be hosting a singer/songwriter night at The Tipper, featuring herself and 2 other awesome singer/songwriters. Come check it out. This is a night not to be missed!
Apr 19, 2009 2:45 PM – Things We Lost In The Fire Benefit WISE Hall
1882 Adanac Street, Vancouver, BC, V5L 2E2
Description:Gillian will be performing with several other local artists in support of relief for people who lost their homes in the brush fires in Australia. Performances go from 11am-11pm at the WISE Hall. Come down and support a great cause!
Apr 4, 2009 7:30 PM – Douglas College Performing Arts Theatre
New Westminster, British Columbia
Description:Gillian will be joining the Douglas College Composition concert.
Mar 23, 2009 8:00 PM – Solace Music at the Bottle Tipper
2066 Kingsway (at Victoria Drive)
Description:Gillian will be hosting Solace Music this week at teh Bottle Tipper. Come check out a night of extraordinary new music, featuring 5 singer/songwriters showcasing their new music!
Mar 20, 2009 8:00 PM – The Bottle Tipper Restuarant and Lounge
2066 Kingsway, Vancouver B.C. (Kingsway and Victoria)
Description:Join Gillian for a special night of music as she plays tunes of her debut album, "Something to Write Home About," and classic folk songs from the 60's and 70's. If you like Joni Mitchell, Jann Arden and Sarah McLachlan, be sure to catch Gillian live at the Tipper!
Mar 9, 2009 8:00 PM – The Bottle Tipper Restuarant and Review Room
Description:Gillian will be taking stage with Gina-Lily and Solace Music tonight. Come on by!
Mar 8, 2009 8:00 PM – Speakeasy
1239 Davie St, just north of Bute St
Description:Gillian will be taking the stage with four other songwriters showcased at the Speakeasy's New Music Night. For more information call the Speakeasy at: 604-685-5761
Mar 8, 2009 1:00 PM – Coquitlam Farmer's Market
Port Moody Recreation Complex at 300 Ioco Rd
Mar 6, 2009 8:00 PM – The Bottle Tipper Restuarant and Lounge
Description:Join Gillian and special guests at the Bottle Tipper for a great night of live music.
Feb 28, 2009 7:30 PM – Lava
Description:Join Gillian for a night of great music in this lovely intimate venue. She will be playing songs of her new album, "Something to Write Home About" as well as showcasing some of her new material. Be sure to check it out! Visit: http://www.lavasteakhouse.com/ for more information.
Feb 23, 2009 8:00 PM – Highland Pub (SFU)
SFU's Burnaby Mountain Campus
Feb 22, 2009 5:00 PM – Granville Island Market Courtyard
Description:Gillian will be performing in Granville Island's Market Courtyard, as part of Granville Island's Winterruption Festival. Come by and check her out.
Feb 20, 2009 8:00 PM – The Bottle Tipper Restuarant and Lounge
Cost:$5
Description:Join Gillian for her regular gig at Vancouver's newest nightlife hot spot: the Bottle Tipper Restaurant and Lounge.
Feb 17, 2009 8:00 PM – MELODIES IN MIND ON CJSF RADIO 90.1FM
Broadcast across the lowermainland and online
Description:Listen to Gillian promoting her new album, "Something to Write Home About" on CJSF's Radio program "Melodies in Mind" Tuesday, February17th 8 to 10 PM on CJSF 90.1FM
Description:Gillian will be joining host Gina-Lily D'Attilio on the stage at the Bottle Tipper for Solace Music, a night of great local artists. Come on down and check it out!
Feb 13, 2009 7:30 PM – Michael J. Fox Theatre
7373 MacPherson Avenue
Description:The Burnaby Arts Council presents an evening featuring the best emerging musicians, dancers, and actors in the lower mainland: Stars of Tomorrow, formerly Cavalcade of Stars, is a variety show showcasing these talented "up-and-comers" and is part of the Spirit of BC countdown to the 2010 Olympic Games. For directions, please visit: www.michaeljfoxtheatre.ca
Feb 6, 2009 9:00 PM – Lugz Coffee Lounge
2525 Main St., at Main & Broadway
Jan 24, 2009 9:00 PM – Montmartre Cafe
Description:Tim Readman and musical friends @ Montmartre Cafe, 9 -11:30 pm Vancouver, BC with special guest GILLIAN HOBBS www. myspace. com/gillianhobbsmusic Join the immensely talented Tim Readman and guest Gillian Hobbs for a great night of live music! Bring your friends and neighbours. This is not a night to be missed!
Jan 23, 2009 8:00 PM – The Bottle Tipper Restuarant and Lounge
Description:Join Vancouver singer/songwriter Gillian Hobbs at Vancouver's newest live venue. Bring your friends and an appetite. For more information, checkout: http://thetipperrestaurant.blogspot.com/
Jan 11, 2009 8:00 PM – Lugz Coffee House
Description:Come watch Gillian perform songs from her album, "Something to Write Home About."
Jan 10, 2009 5:00 PM – Private Function
Jan 9, 2009 8:00 PM – The Bottle Tipper Restuarant and Lounge
Vancouver, BC, British Columbia
Description:Join Gillian for an intimate evening of song at Vancouver's newest live venue, the Bottle Tipper. Good food, good music, good times!
Description:Join Gillian for an intimate evening of song at Vancouver's newest live venue, the Bottle Tipper.
Dec 11 08? Light up the Lake Celebration – Park Across from Douglas' Coquitlam Campus
Dec 6, 2008 4:00 PM – HYACK SQARE SANTA PARADE AND CONCERT
Hyack Square (Beside the Keg) Columbia and 8th St.
Description:Come watch Gillian and the boys perform a short set on the main stage after the Hyack Christmas Parade. The parade starts at 4pm and the route terminates at Hyack Square. It's a fun and festive event for the whole family! Bring your Santa hats!
Nov 24, 2008 8:00 PM – The Tipper
Kingsway and Victoria
Description:Join Gillian and other local acoustic artists for a night of music and entertainment. Show your support for local artists and enjoy some great music.
Nov 23, 2008 5:00 PM – The Foggy Dew Pub (Coquitlam Location)
Description:Come join Gillian and her band celebrate the release of Gillian's debut cd, "Something to Write Home About," from 5-7pm at the Foggy Dew pub in Coquitlam. Gillian and the boys will be playing two sets and Gillian will be on hand to sign cds, etc. She hopes to see you all there!
Nov 13, 2008 4:30 PM – Douglas College: Amelia Douglas Gallery
Description:Gillian will be playing solo from 4:30-7:30pm at the opening reception of a tattoo exhibit at Douglas College's Amelia Douglas Gallery.
Nov 9, 2008 1:00 PM – Coquitlam Farmer's Market
Port Moody, British Columbia
Description:Gillian will be playing at the Coquitlam Farmer's Market between 1-5pm.
Oct 10, 2008 8:00 PM – Cuppa Joe Coffee House
3744 West 4th Ave, Vancouver, BC
Description:Gillian and the boys will be performing as part of an open mic performance happening between 8-10pm at the Cuppa Joe coffee house. They will be doing an acoustic set with guitars and hand percussion. See: http://www.cuppajoecoffee.com/cajc/stores/kits.html for a directions.
Oct 7, 2008 8:00 PM – CJSF RADIO CJSF 90.1FM
Description:Gillian will be performing as part of a songwriter's circle in the second half of CJSF's radio show: Melodies in Mind. The show runs Tuesdays 8 to 10 PM on CJSF 90.1FM. Gillian and the other guests: Bryan Anderson and the Keys, Clare Morgan, and David Blair will all be taking turns, showcasing some of their material. The broadcast will be put up on the show's myspace page: www.myspace.com/melodiesinmind for a week after the broadcast. Check it out. Gillian will be playing a few of her tracks from her upcoming album, which will be released in November.
Aug 3, 2008 12:00 AM – Steveston Farmer's Market
4th and Chatham
Steveston (Richmond), British Columbia
Jul 21, 2008 8:30 PM – Myles of Beans Coffee House
Jul 5, 2008 7:00 PM – Myles of Beans Coffee House
Mar 17, 2008 8:00 PM – Professor Mug's (BCIT Campus Pub)
Burnaby, British Columbia CA


text:
define([
    'underscore',
    'backbone',
    'knockout',
    'contrail-config-model',
    'config/alarm/common/ui/js/models/AlarmRuleOrModel'
], function (_, Backbone, Knockout, ContrailConfigModel, AlarmRuleOrModel) {
    var AlarmModel = ContrailConfigModel.extend({

        defaultConfig: {
            name: null,
            display_name: null,
            alarm_severity: 2, //Default minor severity
            uve_keys: {
                uve_key: []
            },
            orRules: null,
            alarm_rules: {
                or_list: []
            },
            id_perms: {
                enable: true,
                description: null
            }
        },

        formatModelConfig: function (config) {
            var modelConfig = $.extend({}, true, config);
            var ruleModels = [];
            var orList = getValueByJsonPath(modelConfig, "alarm_rules;or_list", []);
            if (orList != null && orList.length > 0) {
                for (var i = 0; i < orList.length; i++) {
                    var orRuleObj = orList[i];
                    var orRuleModel = new AlarmRuleOrModel(this, orRuleObj);
                    ruleModels.push(orRuleModel)
                }
            } else {
                ruleModels.push(new AlarmRuleOrModel(this, {}));
            }

            var orRuleCollection = new Backbone.Collection(ruleModels);
            modelConfig['orRules'] = orRuleCollection;
            modelConfig['display_name'] =
                ctwu.getDisplayNameOrName(modelConfig);
            //permissions
            this.formatRBACPermsModelConfig(modelConfig);
            return modelConfig;
        },

        configRule: function (options, callbackObj) {
            var ajaxConfig = {}, returnFlag = true,
            validations = [{
                key: null,
                type: cowc.OBJECT_TYPE_MODEL,
                getValidation: 'configAlarmValidations'
            }, {
                key: ['orRules', 'andRules'],
                type: cowc.OBJECT_TYPE_COLLECTION_OF_COLLECTION,
                getValidation: 'alarmRuleValidations'
            },
            //permissions
            ctwu.getPermissionsValidation()];
            if (this.isDeepValid(validations)) {
                var newRuleData = $.extend(true, {}, this.model().attributes);
                var url = ctwc.URL_CREATE_CONFIG_OBJECT;
                var orRules = newRuleData['orRules'].models, orRuleList = [];
                ctwu.setNameFromDisplayName(newRuleData);
                for (var i = 0; i < orRules.length; i++) {
                    var orRuleObj = orRules[i],
                        andRuleList = orRuleObj['attributes']['andRules'](),
                        andRulePostObjArr = [];
                    for (var j = 0; j < andRuleList.length; j++) {
                        var andRuleObj = andRuleList[j];
                        var vars = andRuleObj.variables()();
                        if (vars != null && vars != "" && typeof vars == 'string') {
                            vars = vars.split(',')
                            vars = $.map(vars, $.trim);
                        } else if (vars == "") {
                            vars = [];
                        }
                        var operation = andRuleObj.operation()();
                            operationArr = operation.split(cowc.DROPDOWN_VALUE_SEPARATOR),
                            operand2 = andRuleObj.operand2()(),
                            operand1 = andRuleObj.operand1()(),
                            operand2Obj = {};
                            operand2 = operand2.toString().trim();
                        if (operationArr[1] == 'uve_attribute') {
                            operand2Obj = {
                                uve_attribute: operand2
                            }
                        } else if (operationArr[1] == 'json_value') {
                            operand2Obj = {
                                json_value: operand2
                            }
                        }
                        andRulePostObjArr.push({
                            operand1: operand1.toString().trim(),
                            operand2: operand2Obj,
                            operation: operationArr[0],
                            variables: vars
                        });
                    }
                    orRuleList.push({
                        and_list: andRulePostObjArr
                    });
                }
                newRuleData['alarm_rules'] = {
                    or_list: orRuleList
                };
                newRuleData['alarm_severity'] = parseInt(newRuleData['alarm_severity']);
                var uve_keys = getValueByJsonPath(newRuleData, 'uve_keys;uve_key', []);
                if (typeof uve_keys == 'string') {
                    uve_keys = uve_keys.split(',');
                }
                if (newRuleData['uve_keys'] != null) {
                    newRuleData['uve_keys']['uve_key'] = uve_keys;
                }
                if (options['mode'] === ctwl.CREATE_ACTION) {
                    var parent = 'global-system-config'
                        fqName = ['default-global-system-config', newRuleData['name']];
                    if (options.isProject) {
                        parent = 'project',
                        fqName = [contrail.getCookie(cowc.COOKIE_DOMAIN),
                                  contrail.getCookie(cowc.COOKIE_PROJECT),
                                  newRuleData['name']];
                    }
                    newRuleData['fq_name'] = fqName;
                    newRuleData['parent_type'] = parent;
                    /*newRuleData['id_perms'] = {
                        enable: newRuleData['enable'],
                        description: newRuleData['description']
                    };*/
                } else if (options['mode'] === ctwl.EDIT_ACTION) {
                    /*if (newRuleData['id_perms'] != null) {
                        newRuleData['id_perms']['enable'] = newRuleData['enable'];
                        newRuleData['id_perms']['description'] = newRuleData['description'];
                    }*/
                    url = ctwc.URL_UPDATE_CONFIG_OBJECT;
                }
                //permissions
                this.updateRBACPermsAttrs(newRuleData);
                delete newRuleData['orRules'];
                delete newRuleData['enable'];
                delete newRuleData['description'];
                ctwu.deleteCGridData(newRuleData);
                var postData = {alarm: newRuleData};
                ajaxConfig = {};
                ajaxConfig.url = url;
                ajaxConfig.type = 'POST';
                ajaxConfig.data = JSON.stringify(postData);
                contrail.ajaxHandler(ajaxConfig, function () {
                    if (contrail.checkIfFunction(callbackObj.init)) {
                        callbackObj.init();
                    }
                }, function (response) {
                    if (contrail.checkIfFunction(callbackObj.success)) {
                        callbackObj.success();
                    }
                    returnFlag = true;
                }, function (error) {
                    if (contrail.checkIfFunction(callbackObj.error)) {
                        callbackObj.error(error);
                    }
                    returnFlag = false;
                });
                returnFlag = true;
            } else {
                if (contrail.checkIfFunction(callbackObj.error)) {
                    callbackObj.error(this.getFormErrorText
                    ('Alarm'));
                }
            }
            return returnFlag;
        },

        deleteRule: function(selectedGridData, callbackObj) {
            var ajaxConfig = {}, returnFlag = false;
            var uuid = selectedGridData[0]["uuid"];
            var delDataID = [];
            for (var i = 0; i < selectedGridData.length; i++) {
                delDataID.push(selectedGridData[i]["uuid"]);
            }
            var sentData = [{"type": "alarm", "deleteIDs": delDataID}];
            ajaxConfig.async = false;
            ajaxConfig.type = "POST";
            ajaxConfig.data = JSON.stringify(sentData);
            ajaxConfig.url = "/api/tenants/config/delete";
            contrail.ajaxHandler(ajaxConfig, function () {
                if (contrail.checkIfFunction(callbackObj.init)) {
                    callbackObj.init();
                }
            }, function (response) {
                console.log(response);
                if (contrail.checkIfFunction(callbackObj.success)) {
                    callbackObj.success();
                }
                returnFlag = true;
            }, function (error) {
                console.log(error);
                if (contrail.checkIfFunction(callbackObj.error)) {
                    callbackObj.error(error);
                }
                returnFlag = false;
            });
            return returnFlag;
        },
        validations: {
            configAlarmValidations: {
                'display_name': {
                    required: true,
                    msg: 'Enter Name'
                }, 'uve_keys.uve_key': {
                    required: true,
                    msg: "Select UVE"
                },'id_perms.description': {
                    required: true,
                    msg: 'Enter Description'
                }
            }
        }
    });

    return AlarmModel;
});

redpajama_set_name: RedPajamaGithub


Protein is one of the three major, or macro, nutrients. Unlike carbohydrates and fats (the other two types of macronutrents), proteins are comprised of nitrogen-containing groups called amino acids. There are about 20 different types of amino acids commonly found in foods. All of them are important for building and maintaining muscle, but 8 are vital. These are what's known as the Essential Amino Acids (EAAs). Contrary to what most athletes believe, there is no actual requirement for protein; the body simply has a requirement for the eight essentials.
The EAAs cannot be synthesized in any of your tissues, so they must be obtained through high protein foods. Lean meats, fish, poultry, eggs, milk, cheese, and soybeans are good food sources of protein. Powdered whey, casein, egg, and soy protein offer the same amino acids as whole food sources in more concentrated doses – with lower levels of calories, fat, carbs, cholesterol, and other non-protein ingredients.
DIFFERENT TYPES OF PROTEIN - PROTEINS IN DISGUISE?
While not true protein powders in the traditional sense, these products provide more than enough protein to fill in for one or more of your daily protein shakes.
Take a hefty dose of protein, add some carbohydrates and/or a little bit of fat, some vitamins, minerals and fiber, mix them all together, and you've got a meal replacement powder (MRP). If you're the type of person who gets too busy to eat, grab one of these. Just add a packet to a shaker cup full of water and agitate your way to a complete meal in under a minute.
There are two basic types: traditional gainers and lean gainers, the main differences being the amounts calories and protein per serving. If you're a metabolic machine or you look like a beanpole, you'll need the 1,000-plus calories of traditional weight gainer shake. Most will do just fine with the higher-protein lean gainer though.
Currently the undisputed king of proteins. Here's why: whey proteins are quickly and easily digested (hence the "fast-acting" description that they're often given), they are loaded with essential amino acids (EAAs) – including the three branched chain amino acids (BCAAs), and they contain subcomponents (microfractions) that appear to provide benefits above and beyond amino acids and elemental nitrogen. Whey is one of two major dairy proteins and accounts for about 20% of the protein in milk.
Comprising 80% of the protein in milk, casein is the dominant dairy protein. Oft referred to as a "slower-acting" or "time-released" protein, because they are digested and absorbed much more slowly than whey or soy protein. Casein proteins are especially useful when taken at bedtime and during other prolonged periods without eating.
Milk proteins are pretty much what you'd expect: dried milk with most of the fat and carbohydrate removed. Like liquid moo juice, powdered milk proteins are about 20% whey protein and 80% casein protein, so utilization is somewhere in between the two.
Ask any dietitian, "What's the best source of protein?" and eggs will probably top the list. In fact, most nutrition textbooks still refer to eggs as the "gold standard" for protein quality. With loads of essential amino acids (EAAs) and some of the highest scores in all measures of protein quality, we're not going to argue. Naturally dairy-free, eggs are a great alternative to whey, casein, and whole milk proteins for those with milk allergies or severe lactose intolerance.
Vegetarian? Don't do well with dairy or egg? Go green. Like their animal counterparts, soy proteins contain all of the required amino acids in sufficient amounts to support muscle growth and development.


In a Georgia at-will employment, discrimination is the most common illegal ground for terminating an employee. Termination by an employer cannot be done on the basis of race, nationality, gender, or religion. Employers in Savannah may also not terminate at-will employees as an act of retaliation if they have filed a legal discrimination claim or prompted an investigation into discrimination.
Local Savannah, Georgia lawyers can properly inform you regarding whether a wrongful termination has in fact occurred. They can also help you gather the necessary documents for your case, and can guide you through any procedures that may be unique or unfamiliar.


With the recent advances in neutron sources and instrumentation, and the start-up of ESS, there is an urgent need for deuterating complex molecular architectures for studying a range of advanced materials with neutron scattering.
A range of compounds will be synthesized on request. There are already a number of priorities for new compounds including oleic acid and non-ionic surfactants with deuterated headgroups.
This task will focus on the chemical synthesis of complex deuterated molecules based on both biological and non-biological starting materials, and on developing novel deuteration methods.
synthesize a selection of labelled compounds in collaboration. In particular, we will develop the enzyme-catalysed synthesis of chiral deuterated compounds, such as L- and D-lactic acid, which will be applicable to many other cell-free syntheses of biomolecules. Polylactic acid polymers (biodegradable plastics) will be polymerised.
In the framework of the platform, we will develop new synthesis procedures for deuterated monomers and polymers of topical interest that cannot be obtained via commercial suppliers, including isoprene, the basis of natural and synthetic rubbers, and polythiophenes, which are of high relevance for photovoltaic or LED applications. We will devise synthesis routes for thiophene-based labelled monomers. The technologies for the synthesis of the polymers are already established in our lab. In addition, we will synthesise polymer modification of lipids (PEGylated lipids) for biomedical applications and in the synthesis of biodegradable polymers based on polylactic acids, for which the enantiomerically pure L- and D- lactic acid monomers are synthesised.


text:
Chain Link Fencing Black Line Rail Clamps
Line Rail Clamps, also known as Boulevard Clamps, hold two horizontal chain link fence rails together. The fence post then inserts into the center of the clamp, forming a strong, stable T-shaped connection. They're crafted from steel, which means they not only have a stylish outward appearance, but they're also built to withstand the demands and impacts that come their way. With multiple sizes available, we have the line rail clamps to fit the needs of a litany of applications.
Pressed Steel (10)
Chain Link 1 3/8" x 1 3/8" Black Line Rail Clamp - Boulevard Clamp (Galvanized Steel)
Chain Link 1 5/8" x 1 3/8" Black Line Rail Clamp - Boulevard Clamp (Steel)
Chain Link 2 1/2" [2 3/8" OD] x 1 5/8" Black Line Rail Clamp - Boulevard Clamp (Steel)
Chain Link 2" [1 7/8" OD] x 1 3/8" Black Line Rail Clamp - Boulevard Clamp (Steel)
Chain Link 2" [1 7/8" OD] x 2" [1 7/8" OD] Black Line Rail Clamp - Boulevard Clamp (Galvanized Steel)
Increments of 50
$4.92 each x 50
Chain Link 4" x 1 5/8" Black Line Rail Clamp - Boulevard Clamp (Steel)
$28.24 each x 25

redpajama_set_name: RedPajamaCommonCrawl


text:
package org.joda.beans;

import java.lang.reflect.Array;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.function.Function;

import org.joda.beans.impl.direct.DirectBean;
import org.joda.beans.impl.flexi.FlexiBean;
import org.joda.collect.grid.DenseGrid;
import org.joda.collect.grid.Grid;
import org.joda.collect.grid.ImmutableGrid;
import org.joda.collect.grid.SparseGrid;
import org.joda.convert.StringConvert;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableTable;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.LinkedHashMultiset;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multiset;
import com.google.common.collect.SetMultimap;
import com.google.common.collect.SortedMultiset;
import com.google.common.collect.Table;
import com.google.common.collect.TreeMultiset;

/**
 * A set of utilities to assist when working with beans and properties.
 */
public final class JodaBeanUtils {

    /**
     * The cache of meta-beans.
     */
    private static final StringConvert converter = new StringConvert();

    /**
     * Restricted constructor.
     */
    private JodaBeanUtils() {
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains a meta-bean from a {@code Class}.
     *

     * This will return a meta-bean if it has been registered, or if the class
     * implements {@link DynamicBean} and has a no-args constructor.
     * Note that the common case where the meta-bean is registered by a static initializer is handled.
     *
     * @param cls  the class to get the meta-bean for, not null
     * @return the meta-bean, not null
     * @throws IllegalArgumentException if unable to obtain the meta-bean
     * @deprecated Use {@link MetaBean#of(Class)}
     */
    @Deprecated
    public static MetaBean metaBean(Class<?> cls) {
        return MetaBean.of(cls);
    }

    /**
     * Registers a meta-bean.
     *

     * This should be done for all beans in a static factory where possible.
     * If the meta-bean is dynamic, this method should not be called.
     *
     * @param metaBean  the meta-bean, not null
     * @throws IllegalArgumentException if unable to register
     * @deprecated Use {@link MetaBean#register(MetaBean)}
     */
    @Deprecated
    public static void registerMetaBean(MetaBean metaBean) {
        MetaBean.register(metaBean);
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the standard string format converter.
     *

     * This returns a singleton that may be mutated (holds a concurrent map).
     * New conversions should be registered at program startup.
     *
     * @return the standard string converter, not null
     */
    public static StringConvert stringConverter() {
        return converter;
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if two objects are equal handling null.
     *
     * @param obj1  the first object, may be null
     * @param obj2  the second object, may be null
     * @return true if equal
     */
    public static boolean equal(Object obj1, Object obj2) {
        if (obj1 == obj2) {
            return true;
        }
        if (obj1 == null || obj2 == null) {
            return false;
        }
        if (obj1.getClass().isArray()) {
            return equalsArray(obj1, obj2);
        }
        // this does not handle arrays embedded in objects, such as in lists/maps
        // but you shouldn't use arrays like that, should you?
        return obj1.equals(obj2);
    }

    // extracted from equal(Object,Object) to aid hotspot inlining
    private static boolean equalsArray(Object obj1, Object obj2) {
        if (obj1 instanceof Object[] && obj2 instanceof Object[] && obj1.getClass() == obj2.getClass()) {
            return Arrays.deepEquals((Object[]) obj1, (Object[]) obj2);
        } else if (obj1 instanceof int[] && obj2 instanceof int[]) {
            return Arrays.equals((int[]) obj1, (int[]) obj2);
        } else if (obj1 instanceof long[] && obj2 instanceof long[]) {
            return Arrays.equals((long[]) obj1, (long[]) obj2);
        } else if (obj1 instanceof byte[] && obj2 instanceof byte[]) {
            return Arrays.equals((byte[]) obj1, (byte[]) obj2);
        } else if (obj1 instanceof double[] && obj2 instanceof double[]) {
            return Arrays.equals((double[]) obj1, (double[]) obj2);
        } else if (obj1 instanceof float[] && obj2 instanceof float[]) {
            return Arrays.equals((float[]) obj1, (float[]) obj2);
        } else if (obj1 instanceof char[] && obj2 instanceof char[]) {
            return Arrays.equals((char[]) obj1, (char[]) obj2);
        } else if (obj1 instanceof short[] && obj2 instanceof short[]) {
            return Arrays.equals((short[]) obj1, (short[]) obj2);
        } else if (obj1 instanceof boolean[] && obj2 instanceof boolean[]) {
            return Arrays.equals((boolean[]) obj1, (boolean[]) obj2);
        }
        // reachable if obj1 is an array and obj2 is not
        return false;
    }

    /**
     * Checks if two floats are equal based on identity.
     *

     * This performs the same check as {@link Float#equals(Object)}.
     *
     * @param val1  the first value, may be null
     * @param val2  the second value, may be null
     * @return true if equal
     */
    public static boolean equal(float val1, float val2) {
        return Float.floatToIntBits(val1) == Float.floatToIntBits(val2);
    }

    /**
     * Checks if two floats are equal within the specified tolerance.
     *

     * Two NaN values are equal. Positive and negative infinity are only equal with themselves.
     * Otherwise, the difference between the values is compared to the tolerance.
     *
     * @param val1  the first value, may be null
     * @param val2  the second value, may be null
     * @param tolerance  the tolerance used to compare equal
     * @return true if equal
     */
    public static boolean equalWithTolerance(float val1, float val2, double tolerance) {
        return (Float.floatToIntBits(val1) == Float.floatToIntBits(val2)) || Math.abs(val1 - val2) <= tolerance;
    }

    /**
     * Checks if two doubles are equal based on identity.
     *

     * This performs the same check as {@link Double#equals(Object)}.
     *
     * @param val1  the first value, may be null
     * @param val2  the second value, may be null
     * @return true if equal
     */
    public static boolean equal(double val1, double val2) {
        return Double.doubleToLongBits(val1) == Double.doubleToLongBits(val2);
    }

    /**
     * Checks if two doubles are equal within the specified tolerance.
     *

     * Two NaN values are equal. Positive and negative infinity are only equal with themselves.
     * Otherwise, the difference between the values is compared to the tolerance.
     * The tolerance is expected to be a finite value, not NaN or infinity.
     *
     * @param val1  the first value, may be null
     * @param val2  the second value, may be null
     * @param tolerance  the tolerance used to compare equal
     * @return true if equal
     */
    public static boolean equalWithTolerance(double val1, double val2, double tolerance) {
        return (Double.doubleToLongBits(val1) == Double.doubleToLongBits(val2)) || Math.abs(val1 - val2) <= tolerance;
    }

    /**
     * Returns a hash code for an object handling null.
     *
     * @param obj  the object, may be null
     * @return the hash code
     */
    public static int hashCode(Object obj) {
        if (obj == null) {
            return 0;
        }
        if (obj.getClass().isArray()) {
            return hashCodeArray(obj);
        }
        return obj.hashCode();
    }

    // extracted from hashCode(Object) to aid hotspot inlining
    private static int hashCodeArray(Object obj) {
        if (obj instanceof Object[]) {
            return Arrays.deepHashCode((Object[]) obj);
        } else if (obj instanceof int[]) {
            return Arrays.hashCode((int[]) obj);
        } else if (obj instanceof long[]) {
            return Arrays.hashCode((long[]) obj);
        } else if (obj instanceof byte[]) {
            return Arrays.hashCode((byte[]) obj);
        } else if (obj instanceof double[]) {
            return Arrays.hashCode((double[]) obj);
        } else if (obj instanceof float[]) {
            return Arrays.hashCode((float[]) obj);
        } else if (obj instanceof char[]) {
            return Arrays.hashCode((char[]) obj);
        } else if (obj instanceof short[]) {
            return Arrays.hashCode((short[]) obj);
        } else if (obj instanceof boolean[]) {
            return Arrays.hashCode((boolean[]) obj);
        }
        // unreachable?
        return obj.hashCode();
    }

    /**
     * Returns a hash code for a {@code boolean}.
     *
     * @param value  the value to convert to a hash code
     * @return the hash code
     */
    public static int hashCode(boolean value) {
        return value ? 1231 : 1237;
    }

    /**
     * Returns a hash code for an {@code int}.
     *
     * @param value  the value to convert to a hash code
     * @return the hash code
     */
    public static int hashCode(int value) {
        return value;
    }

    /**
     * Returns a hash code for a {@code long}.
     *
     * @param value  the value to convert to a hash code
     * @return the hash code
     */
    public static int hashCode(long value) {
        return (int) (value ^ value >>> 32);
    }

    /**
     * Returns a hash code for a {@code float}.
     *
     * @param value  the value to convert to a hash code
     * @return the hash code
     */
    public static int hashCode(float value) {
        return Float.floatToIntBits(value);
    }

    /**
     * Returns a hash code for a {@code double}.
     *
     * @param value  the value to convert to a hash code
     * @return the hash code
     */
    public static int hashCode(double value) {
        return hashCode(Double.doubleToLongBits(value));
    }

    //-----------------------------------------------------------------------
    /**
     * Returns the {@code toString} value handling arrays.
     *
     * @param obj  the object, may be null
     * @return the string, not null
     */
    public static String toString(Object obj) {
        if (obj == null) {
            return "null";
        }
        if (obj.getClass().isArray()) {
            return toStringArray(obj);
        }
        return obj.toString();
    }

    // extracted from toString(Object) to aid hotspot inlining
    private static String toStringArray(Object obj) {
        if (obj instanceof Object[]) {
            return Arrays.deepToString((Object[]) obj);
        } else if (obj instanceof int[]) {
            return Arrays.toString((int[]) obj);
        } else if (obj instanceof long[]) {
            return Arrays.toString((long[]) obj);
        } else if (obj instanceof byte[]) {
            return Arrays.toString((byte[]) obj);
        } else if (obj instanceof double[]) {
            return Arrays.toString((double[]) obj);
        } else if (obj instanceof float[]) {
            return Arrays.toString((float[]) obj);
        } else if (obj instanceof char[]) {
            return Arrays.toString((char[]) obj);
        } else if (obj instanceof short[]) {
            return Arrays.toString((short[]) obj);
        } else if (obj instanceof boolean[]) {
            return Arrays.toString((boolean[]) obj);
        }
        // unreachable?
        return obj.toString();
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if the two beans have the same set of properties.
     *

     * This comparison checks that both beans have the same set of property names
     * and that the value of each property name is also equal.
     * It does not check the bean type, thus a {@link FlexiBean} may be equal
     * to a {@link DirectBean}.
     *

     * This comparison is usable with the {@link #propertiesHashCode} method.
     * The result is the same as that if each bean was converted to a {@code Map}
     * from name to value.
     *
     * @param bean1  the first bean to compare, not null
     * @param bean2  the second bean to compare, not null
     * @return true if equal
     */
    public static boolean propertiesEqual(Bean bean1, Bean bean2) {
        Set<String> names = bean1.propertyNames();
        if (names.equals(bean2.propertyNames()) == false) {
            return false;
        }
        for (String name : names) {
            Object value1 = bean1.property(name).get();
            Object value2 = bean2.property(name).get();
            if (equal(value1, value2) == false) {
                return false;
            }
        }
        return true;
    }

    /**
     * Returns a hash code based on the set of properties on a bean.
     *

     * This hash code is usable with the {@link #propertiesEqual} method.
     * The result is the same as that if each bean was converted to a {@code Map}
     * from name to value.
     *
     * @param bean  the bean to generate a hash code for, not null
     * @return the hash code
     */
    public static int propertiesHashCode(Bean bean) {
        int hash = 7;
        Set<String> names = bean.propertyNames();
        for (String name : names) {
            Object value = bean.property(name).get();
            hash += hashCode(value);
        }
        return hash;
    }

    /**
     * Returns a string describing the set of properties on a bean.
     *

     * The result is the same as that if the bean was converted to a {@code Map}
     * from name to value.
     *
     * @param bean  the bean to generate a string for, not null
     * @param prefix  the prefix to use, null ignored
     * @return the string form of the bean, not null
     */
    public static String propertiesToString(Bean bean, String prefix) {
        Set<String> names = bean.propertyNames();
        StringBuilder buf;
        if (prefix != null) {
            buf = new StringBuilder((names.size()) * 32 + prefix.length()).append(prefix);
        } else {
            buf = new StringBuilder((names.size()) * 32);
        }
        buf.append('{');
        if (names.size() > 0) {
            for (String name : names) {
                Object value = bean.property(name).get();
                buf.append(name).append('=').append(value).append(',').append(' ');
            }
            buf.setLength(buf.length() - 2);
        }
        buf.append('}');
        return buf.toString();
    }

    /**
     * Flattens a bean to a {@code Map}.
     *

     * The returned map will contain all the properties from the bean with their actual values.
     *
     * @param bean  the bean to generate a string for, not null
     * @return the bean as a map, not null
     */
    public static Map<String, Object> flatten(Bean bean) {
        Map<String, MetaProperty<?>> propertyMap = bean.metaBean().metaPropertyMap();
        Map<String, Object> map = new LinkedHashMap<>(propertyMap.size());
        for (Entry<String, MetaProperty<?>> entry : propertyMap.entrySet()) {
            map.put(entry.getKey(), entry.getValue().get(bean));
        }
        return Collections.unmodifiableMap(map);
    }

    //-----------------------------------------------------------------------
    /**
     * Copies properties from a bean to a different bean type.
     *

     * This copies each non-null property value from the source bean to the destination builder
     * provided that the destination builder supports the property name and the type is compatible.
     *
     * @param <T>  the type of the bean to create
     * @param sourceBean  the bean to copy from, not null
     * @param destType  the type of the destination bean, not null
     * @return the copied bean as a builder
     * @throws RuntimeException if unable to copy a property
     */
    public static <T extends Bean> BeanBuilder<T> copy(Bean sourceBean, Class<T> destType) {
        MetaBean destMeta = MetaBean.of(destType);
        @SuppressWarnings("unchecked")
        BeanBuilder<T> destBuilder = (BeanBuilder<T>) destMeta.builder();
        return copyInto(sourceBean, destMeta, destBuilder);
    }

    /**
     * Copies properties from a bean to a builder, which may be for a different type.
     *

     * This copies each non-null property value from the source bean to the destination builder
     * provided that the destination builder supports the property name and the type is compatible.
     *
     * @param <T>  the type of the bean to create
     * @param sourceBean  the bean to copy from, not null
     * @param destMeta  the meta bean of the destination, not null
     * @param destBuilder  the builder to populate, not null
     * @return the updated builder
     * @throws RuntimeException if unable to copy a property
     */
    public static <T extends Bean> BeanBuilder<T> copyInto(Bean sourceBean, MetaBean destMeta, BeanBuilder<T> destBuilder) {
        MetaBean sourceMeta = sourceBean.metaBean();
        for (MetaProperty<?> sourceProp : sourceMeta.metaPropertyIterable()) {
            if (destMeta.metaPropertyExists(sourceProp.name())) {
                MetaProperty<?> destProp = destMeta.metaProperty(sourceProp.name());
                if (destProp.propertyType().isAssignableFrom(sourceProp.propertyType())) {
                    Object sourceValue = sourceProp.get(sourceBean);
                    if (sourceValue != null) {
                        destBuilder.set(destProp, sourceValue);
                    }
                }
            }
        }
        return destBuilder;
    }

    //-----------------------------------------------------------------------
    /**
     * Clones a bean.
     *

     * This performs a deep clone. There is no protection against cycles in
     * the object graph beyond {@code StackOverflowError}.
     *
     * @param <T>  the type of the bean
     * @param original  the original bean to clone, null returns null
     * @return the cloned bean, null if null input
     */
    public static <T extends Bean> T clone(T original) {
        if (original == null || original instanceof ImmutableBean) {
            return original;
        }
        return cloneAlways(original);
    }

    /**
     * Clones a bean always.
     *

     * This performs a deep clone. There is no protection against cycles in
     * the object graph beyond {@code StackOverflowError}.
     * This differs from {@link #clone()} in that immutable beans are also cloned.
     *
     * @param <T>  the type of the bean
     * @param original  the original bean to clone, not null
     * @return the cloned bean, not null
     */
    public static <T extends Bean> T cloneAlways(T original) {
        @SuppressWarnings("unchecked")
        BeanBuilder<T> builder = (BeanBuilder<T>) original.metaBean().builder();
        for (MetaProperty<?> mp : original.metaBean().metaPropertyIterable()) {
            if (mp.style().isBuildable()) {
                Object value = mp.get(original);
                builder.set(mp.name(), Cloner.INSTANCE.clone(value));
            }
        }
        return builder.build();
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if the value is not null, throwing an exception if it is.
     *
     * @param value  the value to check, may be null
     * @param propertyName  the property name, should not be null
     * @throws IllegalArgumentException if the value is null
     */
    public static void notNull(Object value, String propertyName) {
        if (value == null) {
            throw new IllegalArgumentException(notNullMsg(propertyName));
        }
    }

    // extracted from notNull(Object,String) to aid hotspot inlining
    private static String notNullMsg(String propertyName) {
        return "Argument '" + propertyName + "' must not be null";
    }

    /**
     * Checks if the value is not blank, throwing an exception if it is.
     *

     * Validate that the specified argument is not null and has at least one non-whitespace character.
     *
     * @param value  the value to check, may be null
     * @param propertyName  the property name, should not be null
     * @throws IllegalArgumentException if the value is null or empty
     */
    public static void notBlank(String value, String propertyName) {
        if (isBlank(value)) {
            throw new IllegalArgumentException(notBlank(propertyName));
        }
    }

    @SuppressWarnings("null")
    private static boolean isBlank(String str) {
        int strLen = (str != null ? str.length() : 0);
        if (strLen != 0) {
            for (int i = 0; i < strLen; i++) {
                if (!Character.isWhitespace(str.charAt(i))) {
                    return false;
                }
            }
        }
        return true;
    }

    private static String notBlank(String propertyName) {
        return "Argument '" + propertyName + "' must not be empty";
    }

    /**
     * Checks if the value is not empty, throwing an exception if it is.
     *
     * @param value  the value to check, may be null
     * @param propertyName  the property name, should not be null
     * @throws IllegalArgumentException if the value is null or empty
     */
    public static void notEmpty(String value, String propertyName) {
        if (value == null || value.length() == 0) {
            throw new IllegalArgumentException(notEmpty(propertyName));
        }
    }

    // extracted from notEmpty(?,String) to aid hotspot inlining
    private static String notEmpty(String propertyName) {
        return "Argument '" + propertyName + "' must not be empty";
    }

    /**
     * Checks if the collection value is not empty, throwing an exception if it is.
     *
     * @param value  the value to check, may be null
     * @param propertyName  the property name, should not be null
     * @throws IllegalArgumentException if the value is null or empty
     */
    public static void notEmpty(Collection<?> value, String propertyName) {
        if (value == null || value.isEmpty()) {
            throw new IllegalArgumentException(notEmpty(propertyName));
        }
    }

    /**
     * Checks if the map value is not empty, throwing an exception if it is.
     *
     * @param value  the value to check, may be null
     * @param propertyName  the property name, should not be null
     * @throws IllegalArgumentException if the value is null or empty
     */
    public static void notEmpty(Map<?, ?> value, String propertyName) {
        if (value == null || value.isEmpty()) {
            throw new IllegalArgumentException(notEmpty(propertyName));
        }
    }

    //-----------------------------------------------------------------------
    /**
     * Extracts the collection content type as a {@code Class} from a property.
     *

     * This method allows the resolution of generics in certain cases.
     *
     * @param prop  the property to examine, not null
     * @return the collection content type, null if unable to determine or type has no generic parameters
     */
    public static Class<?> collectionType(Property<?> prop) {
        return collectionType(prop.metaProperty(), prop.bean().getClass());
    }

    /**
     * Extracts the collection content type as a {@code Class} from a meta-property.
     *

     * The target type is the type of the object, not the declaring type of the meta-property.
     *
     * @param prop  the property to examine, not null
     * @param targetClass  the target type to evaluate against, not null
     * @return the collection content type, null if unable to determine or type has no generic parameters
     */
    public static Class<?> collectionType(MetaProperty<?> prop, Class<?> targetClass) {
        return extractTypeClass(prop, targetClass, 1, 0);
    }

    /**
     * Extracts the map value type generic type parameters as a {@code Class} from a meta-property.
     *

     * The target type is the type of the object, not the declaring type of the meta-property.
     *

     * This is used when the collection generic parameter is a map or collection.
     *
     * @param prop  the property to examine, not null
     * @param targetClass  the target type to evaluate against, not null
     * @return the collection content type generic parameters, empty if unable to determine, no nulls
     */
    public static List<Class<?>> collectionTypeTypes(MetaProperty<?> prop, Class<?> targetClass) {
        Type type = extractType(targetClass, prop, 1, 0);
        return extractTypeClasses(targetClass, type);
    }

    /**
     * Extracts the map key type as a {@code Class} from a meta-property.
     *
     * @param prop  the property to examine, not null
     * @return the map key type, null if unable to determine or type has no generic parameters
     */
    public static Class<?> mapKeyType(Property<?> prop) {
        return mapKeyType(prop.metaProperty(), prop.bean().getClass());
    }

    /**
     * Extracts the map key type as a {@code Class} from a meta-property.
     *

     * The target type is the type of the object, not the declaring type of the meta-property.
     *
     * @param prop  the property to examine, not null
     * @param targetClass  the target type to evaluate against, not null
     * @return the map key type, null if unable to determine or type has no generic parameters
     */
    public static Class<?> mapKeyType(MetaProperty<?> prop, Class<?> targetClass) {
        return extractTypeClass(prop, targetClass, 2, 0);
    }

    /**
     * Extracts the map value type as a {@code Class} from a meta-property.
     *
     * @param prop  the property to examine, not null
     * @return the map value type, null if unable to determine or type has no generic parameters
     */
    public static Class<?> mapValueType(Property<?> prop) {
        return mapValueType(prop.metaProperty(), prop.bean().getClass());
    }

    /**
     * Extracts the map value type as a {@code Class} from a meta-property.
     *

     * The target type is the type of the object, not the declaring type of the meta-property.
     *
     * @param prop  the property to examine, not null
     * @param targetClass  the target type to evaluate against, not null
     * @return the map value type, null if unable to determine or type has no generic parameters
     */
    public static Class<?> mapValueType(MetaProperty<?> prop, Class<?> targetClass) {
        return extractTypeClass(prop, targetClass, 2, 1);
    }

    /**
     * Extracts the map value type generic type parameters as a {@code Class} from a meta-property.
     *

     * The target type is the type of the object, not the declaring type of the meta-property.
     *

     * This is used when the map value generic parameter is a map or collection.
     *
     * @param prop  the property to examine, not null
     * @param targetClass  the target type to evaluate against, not null
     * @return the map value type generic parameters, empty if unable to determine, no nulls
     */
    public static List<Class<?>> mapValueTypeTypes(MetaProperty<?> prop, Class<?> targetClass) {
        Type type = extractType(targetClass, prop, 2, 1);
        return extractTypeClasses(targetClass, type);
    }

    /**
     * Low-level method to extract generic type information.
     *
     * @param prop  the property to examine, not null
     * @param targetClass  the target type to evaluate against, not null
     * @param size  the number of generic parameters expected
     * @param index  the index of the generic parameter
     * @return the type, null if unable to determine or type has no generic parameters
     */
    public static Class<?> extractTypeClass(MetaProperty<?> prop, Class<?> targetClass, int size, int index) {
        return eraseToClass(extractType(targetClass, prop, size, index));
    }

    private static Type extractType(Class<?> targetClass, MetaProperty<?> prop, int size, int index) {
        Type genType = prop.propertyGenericType();
        if (genType instanceof ParameterizedType) {
            ParameterizedType pt = (ParameterizedType) genType;
            Type[] types = pt.getActualTypeArguments();
            if (types.length == size) {
                Type type = types[index];
                if (type instanceof WildcardType) {
                    WildcardType wtype = (WildcardType) type;
                    if (wtype.getLowerBounds().length == 0 && wtype.getUpperBounds().length > 0) {
                        type = wtype.getUpperBounds()[0];
                    }
                }
                if (type instanceof TypeVariable) {
                    type = resolveGenerics(targetClass, (TypeVariable<?>) type);
                }
                return type;
            }
        }
        return null;
    }

    private static List<Class<?>> extractTypeClasses(Class<?> targetClass, Type type) {
        List<Class<?>> result = new ArrayList<>();
        if (type != null) {
            if (type instanceof ParameterizedType) {
                ParameterizedType pt = (ParameterizedType) type;
                Type[] actualTypes = pt.getActualTypeArguments();
                for (Type actualType : actualTypes) {
                    if (actualType instanceof TypeVariable) {
                        actualType = resolveGenerics(targetClass, (TypeVariable<?>) actualType);
                    }
                    Class<?> cls = eraseToClass(actualType);
                    result.add(cls != null ? cls : Object.class);
                }
            }
        }
        return result;
    }

    private static Type resolveGenerics(Class<?> targetClass, TypeVariable<?> typevar) {
        // looks up meaning of type variables like T
        Map<Type, Type> resolved = new HashMap<>();
        Type type = targetClass;
        while (type != null) {
            if (type instanceof Class) {
                type = ((Class<?>) type).getGenericSuperclass();
            } else if (type instanceof ParameterizedType) {
                // find actual types captured by subclass
                ParameterizedType pt = (ParameterizedType) type;
                Type[] actualTypeArguments = pt.getActualTypeArguments();
                // find type variables declared in source code
                Class<?> rawType = eraseToClass(pt.getRawType());
                if (rawType == null) {
                    return null;
                }
                TypeVariable<?>[] typeParameters = rawType.getTypeParameters();
                for (int i = 0; i < actualTypeArguments.length; i++) {
                    resolved.put(typeParameters[i], actualTypeArguments[i]);
                }
                type = rawType.getGenericSuperclass();
            }
        }
        // resolve type variable to a meaningful type
        Type result = typevar;
        while (resolved.containsKey(result)) {
            result = resolved.get(result);
        }
        return result;
    }

    private static Class<?> eraseToClass(Type type) {
        if (type instanceof Class) {
            return (Class<?>) type;
        } else if (type instanceof ParameterizedType) {
            return eraseToClass(((ParameterizedType) type).getRawType());
        } else if (type instanceof GenericArrayType) {
            Type componentType = ((GenericArrayType) type).getGenericComponentType();
            Class<?> componentClass = eraseToClass(componentType);
            if (componentClass != null) {
                return Array.newInstance(componentClass, 0).getClass();
            }
        } else if (type instanceof TypeVariable) {
            Type[] bounds = ((TypeVariable<?>) type).getBounds();
            if (bounds.length == 0) {
                return Object.class;
            } else {
                return eraseToClass(bounds[0]);
            }
        }
        return null;
    }

    //-------------------------------------------------------------------------
    /**
     * Checks if two beans are equal ignoring one or more properties.
     *

     * This version of {@code equalIgnoring} only checks properties at the top level.
     * For example, if a {@code Person} bean contains an {@code Address} bean then
     * only properties on the {@code Person} bean will be checked against the ignore list.
     *
     * @param bean1  the first bean, not null
     * @param bean2  the second bean, not null
     * @param properties  the properties to ignore, not null
     * @return true if equal
     * @throws IllegalArgumentException if inputs are null
     */
    public static boolean equalIgnoring(Bean bean1, Bean bean2, MetaProperty<?>... properties) {
        JodaBeanUtils.notNull(bean1, "bean1");
        JodaBeanUtils.notNull(bean2, "bean2");
        JodaBeanUtils.notNull(properties, "properties");
        if (bean1 == bean2) {
            return true;
        }
        if (bean1.getClass() != bean2.getClass()) {
            return false;
        }
        switch (properties.length) {
            case 0:
                return bean1.equals(bean2);
            case 1: {
                MetaProperty<?> ignored = properties[0];
                for (MetaProperty<?> mp : bean1.metaBean().metaPropertyIterable()) {
                    if (ignored.equals(mp) == false && JodaBeanUtils.equal(mp.get(bean1), mp.get(bean2)) == false) {
                        return false;
                    }
                }
                return true;
            }
            default:
                Set<MetaProperty<?>> ignored = new HashSet<>(Arrays.asList(properties));
                for (MetaProperty<?> mp : bean1.metaBean().metaPropertyIterable()) {
                    if (ignored.contains(mp) == false
                            && JodaBeanUtils.equal(mp.get(bean1), mp.get(bean2)) == false) {
                        return false;
                    }
                }
                return true;
        }
    }

    //-----------------------------------------------------------------------
    /**
     * Returns an iterator over all the beans contained within the bean.
     *

     * The iterator is a depth-first traversal of the beans within the specified bean.
     * The first returned bean is the specified bean.
     * Beans within collections will be returned.
     *

     * A cycle in the bean structure will cause an infinite loop.
     *
     * @param bean  the bean to iterate over, not null
     * @return the iterator, not null
     */
    public static Iterator<Bean> beanIterator(Bean bean) {
        return new BeanIterator(bean);
    }

    //-------------------------------------------------------------------------
    /**
     * Chains two meta-properties together.
     *

     * The resulting function takes an instance of a bean, queries using the first
     * meta-property, then queries the result using the second meta-property.
     * If the first returns null, the result will be null.
     *
     * @param
  the type of the result of the chain
     * @param mp1  the first meta-property, not null
     * @param mp2  the second meta-property, not null
     * @return the chain function, not null
     */
    public static
 Function<Bean, P> chain(MetaProperty<? extends Bean> mp1, MetaProperty
 mp2) {
        notNull(mp1, "MetaProperty 1");
        notNull(mp1, "MetaProperty 2");
        return b -> {
            Bean first = mp1.get(b);
            return first != null ? mp2.get(first) : null;
        };
    }

    /**
     * Chains a function to a meta-property.
     *

     * The resulting function takes an instance of a bean, queries using the first
     * function, then queries the result using the second meta-property.
     * If the first returns null, the result will be null.
     *
     * @param
  the type of the result of the chain
     * @param fn1  the first meta-property, not null
     * @param mp2  the second meta-property, not null
     * @return the chain function, not null
     */
    public static
 Function<Bean, P> chain(Function<Bean, ? extends Bean> fn1, MetaProperty
 mp2) {
        notNull(fn1, "Function 1");
        notNull(fn1, "MetaProperty 2");
        return b -> {
            Bean first = fn1.apply(b);
            return first != null ? mp2.get(first) : null;
        };
    }

    //-------------------------------------------------------------------------
    /**
     * Obtains a comparator for the specified bean query.
     *

     * The result of the query must be {@link Comparable}.
     *

     * To use this with a meta-property append {@code ::get} to the meta-property,
     * for example {@code Address.meta().street()::get}.
     *
     * @param query  the query to use, not null
     * @param ascending  true for ascending, false for descending
     * @return the comparator, not null
     */
    public static Comparator<Bean> comparator(Function<Bean, ?> query, boolean ascending) {
        return (ascending ? comparatorAscending(query) : comparatorDescending(query));
    }

    /**
     * Obtains an ascending comparator for the specified bean query.
     *

     * The result of the query must be {@link Comparable}.
     *
     * @param query  the query to use, not null
     * @return the comparator, not null
     */
    public static Comparator<Bean> comparatorAscending(Function<Bean, ?> query) {
        if (query == null) {
            throw new NullPointerException("Function must not be null");
        }
        return new Comp(query);
    }

    /**
     * Obtains an descending comparator for the specified bean query.
     *

     * The result of the query must be {@link Comparable}.
     *
     * @param query  the query to use, not null
     * @return the comparator, not null
     */
    public static Comparator<Bean> comparatorDescending(Function<Bean, ?> query) {
        if (query == null) {
            throw new NullPointerException("Function must not be null");
        }
        return Collections.reverseOrder(new Comp(query));
    }

    //-------------------------------------------------------------------------
    /**
     * Comparator.
     */
    private static final class Comp implements Comparator<Bean> {
        private final Function<Bean, ?> query;

        private Comp(Function<Bean, ?> query) {
            this.query = query;
        }

        @Override
        public int compare(Bean bean1, Bean bean2) {
            @SuppressWarnings("unchecked")
            Comparable<Object> value1 = (Comparable<Object>) query.apply(bean1);
            Object value2 = query.apply(bean2);
            return value1.compareTo(value2);
        }
    }

    //-------------------------------------------------------------------------
    /**
     * Clones an object.
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    private static class Cloner {
        public static final Cloner INSTANCE = getInstance();
        private static Cloner getInstance() {
            try {
                Class.forName("org.joda.collect.grid.Grid");
                return new CollectCloner();
            } catch (Exception | LinkageError ex) {
                try {
                    Class.forName("com.google.common.collect.Multimap");
                    return new GuavaCloner();
                } catch (Exception | LinkageError ex2) {
                    return new Cloner();
                }
            }
        }

        Cloner() {
        }

        Object clone(Object value) {
            if (value == null) {
                return value;
            } else if (value instanceof Bean) {
                return cloneAlways((Bean) value);
            } else if (value instanceof SortedSet) {
                SortedSet set = (SortedSet) value;
                return cloneIterable(set, new TreeSet(set.comparator()));
            } else if (value instanceof Set) {
                return cloneIterable((Set) value, new LinkedHashSet());
            } else if (value instanceof Iterable) {
                return cloneIterable((Iterable) value, new ArrayList());
            } else if (value instanceof SortedMap) {
                SortedMap map = (SortedMap) value;
                return cloneMap(map, new TreeMap(map.comparator()));
            } else if (value instanceof Map) {
                return cloneMap((Map) value, new LinkedHashMap());
            } else if (value.getClass().isArray()) {
                return cloneArray(value);
            } else if (value instanceof java.util.Date) {
                return ((java.util.Date) value).clone();
            }
            return value;
        }

        Object cloneIterable(Iterable original, Collection cloned) {
            for (Object item : original) {
                cloned.add(clone(item));
            }
            return cloned;
        }

        Object cloneMap(Map original, Map cloned) {
            for (Object item : original.entrySet()) {
                Entry entry = (Entry) item;
                cloned.put(clone(entry.getKey()), clone(entry.getValue()));
            }
            return cloned;
        }

        Object cloneArray(Object original) {
            int len = Array.getLength(original);
            Class<?> arrayType = original.getClass().getComponentType();
            Object copy = Array.newInstance(arrayType, len);
            for (int i = 0; i < len; i++) {
                Array.set(copy, i, clone(Array.get(original, i)));
            }
            return copy;
        }
    }

    //-------------------------------------------------------------------------
    /**
     * Clones an object.
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    private static class GuavaCloner extends Cloner {
        GuavaCloner() {
        }

        @Override
        Object clone(Object value) {
            if (value == null) {
                return value;
            } else if (value instanceof ImmutableMap ||
                    value instanceof ImmutableCollection ||
                    value instanceof ImmutableMultimap ||
                    value instanceof ImmutableTable) {
                return value;
            } else if (value instanceof SortedMultiset) {
                SortedMultiset set = (SortedMultiset) value;
                return cloneIterable(set, TreeMultiset.create(set.comparator()));
            } else if (value instanceof Multiset) {
                return cloneIterable((Multiset) value, LinkedHashMultiset.create());
            } else if (value instanceof SetMultimap) {
                return cloneMultimap((Multimap) value, LinkedHashMultimap.create());
            } else if (value instanceof ListMultimap || value instanceof Multimap) {
                return cloneMultimap((Multimap) value, ArrayListMultimap.create());
            } else if (value instanceof BiMap) {
                return cloneMap((BiMap) value, HashBiMap.create());
            } else if (value instanceof Table) {
                return cloneTable((Table) value, HashBasedTable.create());
            }
            return super.clone(value);
        }

        Object cloneMultimap(Multimap original, Multimap cloned) {
            for (Object key : original.keySet()) {
                Collection values = original.get(key);
                for (Object value : values) {
                    cloned.put(clone(key), clone(value));
                }
            }
            return cloned;
        }

        Object cloneTable(Table original, Table cloned) {
            for (Object item : original.cellSet()) {
                Table.Cell cell = (Table.Cell) item;
                cloned.put(clone(cell.getRowKey()), clone(cell.getColumnKey()), clone(cell.getValue()));
            }
            return cloned;
        }
    }

    //-------------------------------------------------------------------------
    /**
     * Clones an object.
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    private static class CollectCloner extends GuavaCloner {
        CollectCloner() {
        }

        @Override
        Object clone(Object value) {
            if (value == null) {
                return value;
            } else if (value instanceof ImmutableGrid) {
                return value;
            } else if (value instanceof DenseGrid) {
                Grid grid = (Grid) value;
                return cloneGrid(grid, DenseGrid.create(grid.rowCount(), grid.columnCount()));
            } else if (value instanceof Grid) {
                Grid grid = (Grid) value;
                return cloneGrid(grid, SparseGrid.create(grid.rowCount(), grid.columnCount()));
            }
            return super.clone(value);
        }

        Object cloneGrid(Grid original, Grid cloned) {
            for (Object item : original.cells()) {
                Grid.Cell cell = (Grid.Cell) item;
                cloned.put(cell.getRow(), cell.getColumn(), clone(cell.getValue()));
            }
            return cloned;
        }
    }

}


text:
Q: Finding node voltages of transistor I have the following problem, it consists of BJTs connected in the following way. I am being asked to find the node voltages. Am doing the part were beta=100 and R is connected.

I have done the work on my paper, but the problem is that when am simulating it, the simulation results don't match my hand written work. Below are the simulation schematic results using LTSpice. Unfortunately I cannot provide my hand written work here because I have done a lot of circuit conversions. I was hoping if somebody can help me with the analysis mathematically. I would really appreciated that. Thanks in advance.

redpajama_set_name: RedPajamaStackExchange


text:
CNN Pulls Reports Claiming Women's Vote Tied to Ovulation
"Some elements of the story did not meet the editorial standards of CNN."
Reason Staff | 10.25.2012 1:37 PM
Hey, maybe that's why the Obama campaign uses that big "O" on their logo.
Yesterday, as Julie Moos reports over at Poynter.org's Mediawire, CNN posted a story on its Web site citing unpublished research suggesting that how a woman votes is affected by whether she is ovulating on Election Day.
The network has since removed the post, and replaced it with one explaining "some elements of the story did not meet the editorial standards of CNN."
Voting Women Journalism


Do you have records from Wellabada Public Cemetery?
Get started contributing to Wellabada Public Cemetery. Use the button below to begin a simple step by step process to get started contributing to Wellabada Public Cemetery.
There are no upcoming events scheduled at Wellabada Public Cemetery. Use the button below to schedule one.


text:
FREE Download Of New Alice In Chains Track 'A Looking In View'!
By Nick Cracknell 2009-07-02T13:29:31.182Z Total Guitar
Grunge survivors Alice In Chains are giving away a track from their upcoming album absolutely free!
CLICK HERE for your free version of 'A Looking In View', the first single to be taken from 'Black Gives Way To Blue,' the band's first album in 14 years which is released on September 28th.
A video for the song will be unveiled on the band´s site on 7 July - a 30 second trailer is already available there.
"The song basically speaks to any number of things that keep you balled up inside," says guitarist Jerry Cantrell. "A cell of our own making with an unlocked door that we choose to remain in. Focusing our attention inward instead of reaching out to a much larger world. I think this is common to us all. It´s funny how hard we fight to hang on to a bone we can´t pull through a hole in the fence, or how difficult it is to put down the bag of bricks and move on."


text:
Every Child Deserves To Be A Chatterbox: Chatterbox Pediatric Therapy – Helping Every Child Reach Full Potential
In clinical terms, "Chatterbox Pediatric Therapy LLC is an outpatient pediatric therapy clinic with offices in Pooler and Richmond Hill, Georgia." In a heartfelt, mission-driven sense, Chatterbox is a change-maker focused on every child's greatest possibilities, and making sure those remain within reach.
Amy Bartlett,
Photography by D. Paul Graham / L-R: Courtney Dralle, DPT (Lead Physical Therapist), Sandra Mullis, SLP (Speech Therapist, Clinic Director), Beth Fleming, SLP (Owner/CEO), Brittany Tyler, SLP (Lead Speech Therapist), Maggie (Therapy Dog "In Training" Extraordinaire)
Owner and CEO Beth Fleming, M.S., describes a burgeoning practice of more than 30 therapists and office staff, offering decades of combined learning and expertise. Built on a desire to "provide easily accessible speech, occupational, and physical therapy services to children and families," the success story of Chatterbox could be told by the children themselves — even the ones who previously couldn't speak.
One such victory Fleming recalls was after three years of working with one child who couldn't say a word, suddenly hearing him say "Mom." As monumental as those moments are, they're one step in a long-term journey and relationship. "Fast forward to today, ten years into therapy," Fleming says, "that child can carry on a fluent conversation on just about anything."
It's important, Fleming encourages, to measure not against other children but by your child's own personal progress. If you're not sure where a child should be developmentally and you have questions, Chatterbox can help before you're even a patient (check out their website for resources like a milestones list on their "What Should My Child be Doing" blog).
"It's important to know you're not alone," says Fleming with emphasis. "If I could tell families one thing it would be that you're not alone. Early intervention makes all the difference, and whatever your questions we have the resources for you. We're here to connect every kid with their absolute greatest potential, and we'll be with you every step of the way."
Learn more about the Chatterbox Pediatric Therapy; Pooler, GA • chatterboxpeds.com • 912.988.1526
GoSouth: Jacksonville
The Westin Spa Experience
Looking Back at South's Greatest Nurses & Medical Professionals 2021


Liberty Fastener Company's mission is to be a premier provider of high quality fastener products to original equipment manufacturing markets. We promise on-time delivery and competitive pricing. Liberty is committed to fulfilling all customer requirements as promised and to developing and maintaining long term business relationships through treating its customers with honesty, integrity and respect.