text:
I've been letting this go for awhile, until I was pretty sure… But it appears that the cancer is defeated, at least for now. You can never tell with this, but all the tests (blood work and PET scans) show up as cancer-free. The only lingering effect is some "peripheral neuropathy", which basically means dead nerves in my feet and fingers, a common side effect of chemotherapy. It interferes with my typing, because I can't feel the keyboard properly and my fingers slip, but that's a small price to pay.
There will be continued follow-ups… but so far, so good.
Author Mac ThomasonPosted on October 5, 2009 Categories Nonsports, Site News
182 thoughts on "Health Update"
BFedRec says:
YEAH! Go Mac!
I have two of my good friends battling Breast Cancer and my father-in-law recovering from esophageal cancer… so maybe it's a reflection on my circle of acquaintance that "peripheral neuropathy" sounds like it means "crazy around the edges" to me…
Thanks for sharing your good news, Mac. Here's to your making even more progress with your recovery!
'cancer is defeated' better than Braves Win! to your future health Mr. Thomason.
sdp says:
Thrilled to hear, Mac. Nerves grow at about an inch a month so with the chemo removed from your body, I expect you will regain sensation in the coming future.
Wonderful news, Mac. Prayers from the Stuart household will of course continue on your behalf.
Excellent news! Stay well, Mac.
HawkeyeFan says:
Mac, great to hear. Such a tough disease to combat, and it's always good news when someone beats this mofo down.
Thanks for all your work on the Braves this season too — can't say I was too fired up they crapped the bed for the last six games, but the percentages weren't in our favor to begin with.
Seat Painter says:
Best. Braves Journal. News. Evah.
Continued prayers and best wishes for you Mac.
Edit: Oooh, I forgot the Frenchy trade news. Was that better than Mac beats Cancer??? Close, but I think it comes in second to today's announcement.
Great news Mac. All the best in the future as well
Great news, Mac!
Super News!!!
Smitty says:
Good job Mac. I never doubted you. I knew you had it beat when the cancer was forced to send Manny Acosta in to pitch.
Let me know if you need any help writing up stuff (like the write up for the upcoming Lowe for Puljos trade.)
Speaking of Frenchy, Jerry Manuel told reporters that acquiring Jeff Francoeur may be the best thing to happen to the Mets this season. Really? We think so, too, Jerry!
F**k you, cancer. F**k you.
Yay, Mac!
hankonly says:
Mac rules.
Cancer drools.
Great, great news.
Mark Graybill says:
Given the way things ended for the Braves, I'm sure everyone here needed a pick me up, and you provided that in spades!
Congratulations and good luck, Mac.
spike (back in the ATL) says:
Wonderful news, Mac. I am very happy for you.
Incidentally… I found the organ music for the Washington batters at yesterday's game amusing.
Maxwell = Theme from Get Smart
Desmond = can't recall the song, think it was a Desmond Dekkar one.
Pete Orr = Row Row Row your boat
Elijah Dukes = Dukes of Hazzard theme OR Duke of Earl
Morse = SOS in Morse Code
Bard and Gonzalez I couldn't figure out
Jorge Padilla = George of the Jungle
Martin = some Coldplay song
Good news Mac…thanks for your coverage this season under trying circumstances.
I'll just credit your provocation of Ryan Howard this season to mis-typing. Perhaps he will understand and grant us leniency.
Kevin Lee says:
That's one for the good guys, Mac!
Now if only Alabama doesn't break your heart.
With continued prayers, here's hoping for a "Road From Bristol" this winter when all your parts catch up!
csg says:
awesome news, Mac
JonathanF says:
ububba says:
Terrific, Mac. Here's to continued & complete recovery. Best news in a while.
Desmond Dekker & The Aces' "Israelites," the first reggae song most folks outside the islands ever heard.
RobBroad4th says:
Wonderful news, Mac! Here's hoping next year is kinder to the Braves and to your person.
Thanks ububba… I didn't dig through my records when I got home to try and figure it out.
If you haven't seen this…
http://www.mlbtraderumors.com/2009/10/minaya-interested-in-hiring-towers-ricciardi.html#comments
Fantastic news, Mac. Congratulations
Weldon says:
Great news, Mac.
Parish says:
A little common sense from Tony Barnhart.
http://tinyurl.com/ycnyb3t
As one might imagine, I'm still a little sore about it.
I'm still sore about the '05 VU-UF game in Gainesville, so I feel for you, ububba.
Re: 31-ububba
Saturday was my day I announced to my family we were now Bulldog fans. The red and black stuff would work with our Hoosiers stuff, too.
Naturally, as we watch and cheer, I get stuck by one of my own hard-won arguments-no single call from an official should actually determine the outcome of the game.
Not even Denkinger. Influnence, but not determine.
Now I have to hear it from my family about that excessive celebration call cost the Dogs the game. I argued, but not with my heart.
Stu,
That was the worst call in college football history. My brother is a Vandy fan and in his mind he gives the win to the Dores.
clarke says:
Congrats Mac!
Stephen in the UAE says:
Mac–Thanks for update and the news! Best of luck for the future!
I want to also thank you once again for a fine season of insight, wit and commentary. Braves Journal has made a great contribution to Braves' fans throughout the world. By coming to this site many of us are able to follow the team in ways which would not be possible otherwise.
I might add that in some ways the site is even more important during the offseason–when Braves' info is less plentiful. Therefore, I am grateful for your work during the season and look forward to many discussion on this site in the months to come.
P. W. Hjort says:
That's great news, Mac. I'm happy for you.
Tom O. says:
Fantastic, Mac! All the best for a speedy recovery
Now that Cancer is no longer in Mac's long term outlook, do you think Wren could flip it for some middle relief help?
braves14 says:
Happy to hear that Mac. Fantastic news.
Ron E. says:
#39, he already flipped it for Ryan Church….
(Glad to hear you are getting well, Mac.)
Mac Thomason says:
Alex R. informs me that Fredi Gonzalez is apparently about to be fired. Odds on him being named manager-in-waiting sometime soon?
I bet Wren won't commit to something like that.
Hanan says:
Great news Mac!
Mr.Swings@Everything says:
I agree with Mac's other well wishers. Take care of yourself man.
Re: Fredi Gonzalez
I heard the same thing on WFAN today. I also heard that the Marlins (and Indians) may be interested in Bobby Valentine.
WFAN host: Who did you enjoy watch play this year?
Omar Minaya: You have to enjoy watching Francoeur going out there every day, especially with that broken thumb, and playing with that recklessness that he has.
j-rod jones says:
Best news all season.
@47: Like a dream come true. The Mets have an awful season after being anointed the NL East favorite and their GM is talking about enjoying watching Francoeur play right field for HIS team! Heaven!
urlhix says:
Awesome news Mac.
ryan c says:
from peanut:
"In order to retain the financial flexibility to keep the club's rotation strong and also address the needs at first base, outfield and the back end of the bullpen, Wren is expected to explore the possibility of trading Lowe, who is owed $45 million over the final three years of his contract."
he also goes on to say that the braves are going to decide what to do with tim hudson in the next few weeks. frank wren seems like he wants to get the offseason over in quite a hurry.
Frank said on air two weeks ago that the Hudson situation would need to be handled the week after the world series. Frank better put on his best selling pitch to move Lowe. Id take Fredi as Bobby's replacement
Coop says:
Mac, good things do happen to good people. God bless you/
c. shorter says:
Mac, for the win!
Glad to hear it.
Brian J. says:
I'm glad to hear that, Mac. I'd say "may you see the Braves disappoint you for many years to come," but that won't be the case. You should enjoy all the championships the team will win, and we'll be glad to have you running this site, with us along for the ride.
Way to go Mac. It takes a tough S.O.B to beat that
Dix says:
This is great news Mac. Well done.
If Wren can trade Lowe then that would be pretty sweet. Maybe he can trade him to the Mets for JJ Putz's 2010 option, which we could then decline.
Sam Hutcheson says:
Perhaps Wren, unlike some folks, is smart enough not to pitch Lowe as "dude, I just need to move this contract." Maybe he's smart enough to find one of the many teams in the leagues who could benefit from a 200 innings, 4-something ERAish rotational anchor and see what they might have to offer in return.
It's a small sample size to date, but evidence suggests that Wren is better at this than some of the regulars around here.
Many happy returns, Mac.
mraver says:
Better than a playoff birth. :-)
Glad to hear it, Mac.
Rob Cope says:
My computer has been broken for a couple weeks, and I just got it working today. The first website I went to was yours, Mac. Even though I (thankfully) withdrew emotional from all things baseball when college football season started, I still gotta read Braves Journal. Of all the interneting I do and how much I missed having my computer, I think that it shows what Mac means to us. Even though you mentioned over Facebook that things were in the clear, it's so good to hear you're doing well.
How old is the website by the way? I'm trying to figure out how long I've been reading this. I wanna say it's been since 2001.
From reading David O'Brien's comments on his blog it sounds like there's a decent chance the Braves keep KJ. I hope they do.
By the way, Coach, I saw your comments on the latest Chop-N-Change post and I think it's disgraceful you would be so unwilling to visit another side of an issue.
McCann the Man says:
Mac, great to hear. Chemo-induced peripheral neuropathy isn't cured by medications or treatments, but should go away on its own as long as the damage isn't too severe. Medications may manage the pain and symptoms. Here's hoping to a full recovery, side effects included!
The earliest version of the website was April of 1998, but the move to blogging software was in 2002.
I'm kinda a health nut, so I know my vitamins–but keep your diet rich in B-6, B-12, alphalipoic acid, carnitine (supplements, red meat, nuts, seeds, dark green vegetables), and magnesium/calcium and there's a great chance the neuropathy will heal. These nutrients give your body those necessary for nerve regeneration and healing.
desert says:
Great job, Mac. Great job.
Ryan C,
Although I would love to see the scenario presented out in your off season predictions, I can't say that I agree that Smoltz will be back. I think that bridge is burned, and I can't imagine that the Braves will try to bring him back.
My question is, can Kenshin Kawakami close? I understand that he would be a great long relief man in the bullpen, but if he can learn how to work out of a daily relief spot during the off-season, I would feel a lot better about next year.
I also want to analyze the team's needs before we start throwing out trades. What do we need going forward? I don't think that we will (or should) start Heyward in right field next year, so as it stands (if Kawakami can indeed be a serviceable closer), do we need middle relief help, a first baseman, and one solid outfielder?
TomL says:
Fantastic news Mac!
Pierce says:
Good on ya, Mac. I come to you for every post game writeup and I'm glad to know I'll get to keep that habit. :)
#51–Bring it on! If the Braves can move Lowe, then a lot of good things can and should happen….
Adam M says:
Congratulations, Mac!
Linkmeister says:
Jeebus, Mac, you never mentioned this at the TT site, so I just found out about your health "issues." I'm certainly glad it appears to have been successfully treated!
Peripheral neuropathy has myriad forms of manifestation (my mother has it). Some are very painful, others are pain-free. I hope yours is the latter.
We've found info from The Neuropathy Association to be useful.
Jaik Jarrkjens says:
Wow, that's a huge relief, Mac. Very nice.
billy-jay says:
Fantastic news, Mac.
ASG says:
Great news Mac. I'm very happy to hear it.
More weird medical stuff for athletes, this time it's Donovan Tate.
Hmmm?
http://mlb.mlb.com/news/article.jsp?ymd=20090930&content_id=7252502&vkey=affililiate&fext=.jsp&c_id=sd
I'm a fan. His situation was discussed on the MLB Network shows last night. Some points:
1) Ownership may want a new manager in place for the new stadium in two years.I missed that, didn't know a new stadium had been approved.
2)Some owners grumbled about team "not living up to expectations this year." I think they're stoned. That team won 87 games and were a bitch to play.
3) Bobby Valentine (Ugh!) is in play. The network guys don't buy it. Valentine earns in the $4M range and that's more than all but maybe two of the Marlins players.
I hope they do let Fredi go. I think he'll make them sorry down the line.
td says:
I would like to join the chorus of those who are thrilled with the good news Mac!
As far as Gonzalez goes, didn't he used to be 3rd base coach? My recollection is that we have a 3rd base coach who isn't exactly appreciated as one of the best in baseball – let's bring Fredi back if he's let go! If not, can we get someone else to coach 3rd? I know the Diaz play that mathematically eliminated us was probably not Snitker's fault, but I found it ironic that our season ended on a baserunning blunder at 3rd – an all too common occurance.
"I always thought the knuckleball was the easiest pitch to catch. Wait'll it stops rolling, then go to the backstop and pick it up." ― Bob Uecker
just laughed when I read it
Bert says:
oldtimer? says:
Great news Mac.
Thanks again for providing us with this venue to discuss our favorite team.
bwarrend says:
Glad to hear that the prognosis is good. Thanks for the dedication to this site and tolerating all of us for bitching about things that were far less important than what you were going through.
joesteve says:
Mac, I'm late to the party but I just saw this and wanted to rejoice with you. Will be praying that the Lord will uphold and protect you.
Anybody care between Tigers & Twins?
I kinda like both towns, but I think the Tigers (with Verlander) would have a better chance vs. NYY.
I hope the WS is Twins vs Cards and Smoltz gets some revenge for '91
I hope the Cards lose in the first round and that Smoltz is the primary culprit.
I have to admit a mild averse rooting interest in the fate of Smoltz. It wouldn't break my heart to see him get shelled once or twice. WRT to the postseason, I would of course prefer an NL (non-Phillie) win.
A) I don't have the animosity towards Smoltz that some here do.
B) I can't bring myself to want the Dodgers/Phils/Rockies to win… and I'd have a really hard time wanting Boston or the Yankees to win… Angels and Tigers I'd be OK with, Twins I'd be marginally OK with I guess… but I'd rather see somebody beat them in 7 games in the Metrodome (seeing Sid on Sunday may have reminded me how much that loss sucked).
C) To top it off, I'd rather have Pujols get a ring in a season when we don't make it to the playoffs than have him want it even more the next time we're in it and have him beat us.
A) Obviously. He was my all-time favorite baseball player, but he's run his mouth to the point that I want him to fail.
B) Rockies, Angels, Twins/Tigers are the teams I'll be rooting for. Pulling against the Red Sox, as always.
C) I don't think Pujols' level of wanting has much effect on his or his team's postseason successes, and I seriously doubt winning a championship this year would lessen his desire to win another one in a future season. In addition to the Smoltz thing, I can never support Tony LaRussa.
I love Smoltzie (the baseball player) and would like him to get a WS ring. He deserves it.
Smoltzie already has a World Series ring…..
Smoltz has a WS ring, of course, and it's ironic that he, the winningest pitcher in post-season history, didn't win any games in the 1995 post-season.
I'm a little conflicted on Smoltz because he's become annoying & I rarely root for the Cardinals. (Even as a Brave, some of Smoltz's comments bothered me.)
I think I'd like to see the Cards lose in the first or second round & have Smoltz get a win or two along the way, so that he can maintain his all-time post-season wins record (15-4).
Why? This year, there's no telling how many chances Andy Pettitte (14-9) will get to break it.
Exactly what I was thinking – Smoltz gets a couple of post season wins and Pettite does not.
By the way, Angels over the Cards.
Yeah ububba, that record is the other part of it for me too… I want "our guy" to have the winningest post season record and not a Yankee (even if he isn't our guy anymore).
Stu has a point about LaRussa… and Pujols…
The two big reasons are that I want Smoltz to keep his winningest post-season pitcher record AND I (especially 15 year old me from '91, three days before my 16th birthday… I knew I wasn't getting a car for that birthday, but I sure wanted the Braves to bring back a WS win) would love to see him beat the Twins in the WS. It wouldn't be the same without Puckett taking part in the loss… but it would be a great way to shut-up the Metrodome and a hell of a way for Smoltz to be able to hang them up (assuming he does… who knows).
Just read the news. Congrats, Mac! And a big THANK YOU for keeping Braves Journal going through it all.
I have a hard time getting into baseball once he Braves are out of it. I usually get into anyone but the Yankees or Red Sox mode. I want an NL team to win. The team with the best chance IMHO is the Cards. But who knows its a crap shoot from here on out.
Kirk H. says:
Don't post often, but read frequently. Thanks Mac for the site, and best wishes for your continued recovery.
Yankees and Dodgers is my personal prediction, Yankees taking it all.
In fact, Smoltz has a WS ring and a great reputation as a post season pitcher, but he actually got hit hard in the 1995 World Series….
Mark Bradley making the case for why the Braves need to keep Norton around:
http://blogs.ajc.com/mark-bradley-blog/2009/10/06/why-the-braves-must-keep-greg-norton-at-all-costs/
I know he was trying to be funny in there… but I just couldn't be amused by it.
I always root for the NL team in the World Series unless it's the Cardinals. If it's Yankees vs. Cardinals I will find something else to do aside from watching baseball. The DH is an abomination surpassed only by Cardinals baseball.
If I had to root for one of the teams in the playoffs it would be Anaheim or LA. I will never root for a wild card team. I will not root for an NEC team. I'm bailing out Detroit's economy as is, a WS win isn't something I think they need on top of that.
Between LaRussa and Smoltz, I can't fathom sheer level of self-righteous prickishness in STL.
I'd like to see an LA/LA Series, just to annoying Bristol, CT.
I can't root for Anaheim, outright, because that don't play real baseball. I won't root for a Torre based club, but I'd enjoy seeing the steroid nannies freak out if Manny got another ring.
I also usually root for the NL team, but this year I just want to see the Yanks go down in flames. Unfortunately, I think they are the team to beat…..
I know what you mean about Smoltz. But don't we all have a friend that just will not shut up and simply must show his behind in public, but he's still earned the title of "friend"?
If some folks can let Manny be Manny (I'm not one of those), I can let Johnny be Johnny.
DeRosa, Pujols and Smoltz? Yeah, I'm pulling for the Cardinals and hoping that LaRussa makes such an ass of himself that he gets none of the credit.
The cool thing if Detroit wins is how colorfully they celebrate. As in:
"I'm so happy, I think I'll burn this car!"
Man, listening to a Charlie Manuel press conference is hysterical.
FWIW, Jurrjens was named NL pitcher of the month for September. (5 starts, 4-1 w/ 1.25 ERA)
hank,
I do have such friends, and they're often in severe need of lesson-teaching. I am often one of those friends to other people.
I didn't mean to imply that I don't still love John Smoltz. I do. I just want him to get his ass handed to him, and I want it to be a learning experience.
Stu, I think he had his ass handed to him pretty well in Boston… and some of the post Boston statements seemed to indicate that he had grown a bit because of the experience (not saying he's prefect mind you, just seemed to have learned/grown a bit).
Mark Bradley, although I agree with him sometimes, is a douchebag. It ain't Nortons fault Cox kept running him out there. And I never heard much in the way of snark when Norton turned in a great season as a pinch hitter last year. It's a crap job that is very hard to be successful at, and while I too would have advocated a change, there is just no call for that kind of article.
What I think will happen: Yankees over Cardinals
What I would prefer: Rockies over Angels
I don't have a much of a rooting interest in any of this year's playoff teams. I hate the Dodgers, Phillies, Cardinals, and Yankees. I don't hate the Red Sox, but 2 championships is enough in one decade for them. Let them wait a few decades before they get another. I have relatives in Colorado so I sometimes root for their sports teams when a Georgia team isn't involved. I can't root for Detroit because of Leyland. I'm indifferent to the Angels, so let them win the AL.
@108: Right on. Norton didn't put himself on the field–Cox did. Norton was a fine pickup in 2008 but it just didn't happen this year. He wasn't even making a million dollars so the Braves could have inconsequentially cut ties with him a long time before he started damaging our offense on a continual basis. Frank and Bobby might have butted heads over what to do about him, with Bobby advocating his retention.
spike/sdp,
Compared to what I read & hear every day, that "kind of article" is about as rough as daisies & dandelions. Didn't raise a blip on my radar.
And it is Norton's fault that he hit .145.
Well you do work in New York, noted for it's genteel brand of journalism. But so what? Just because hatchet jobs have become de rigeur in your industry doesn't make them any less objectionable. PH is a tough job to do well, and the sample size gods magnify your performance for good or ill. It's Norton's fault he hit .145. He's probably out of baseball as a result too. Fine, call for his release, or whatever, but he's done nothing, either in comportment or play, to warrant some dumbass hyuk-hyuk column from a "journalist" who was starved for something to fill his column that day.
I admire him for having the emotional stamina to make a career after being faced with a situation that would have made a lot of us give up our dreams. A far better, and more interesting piece, would have been to interview him about his future, how he views the time spent in MLB as a journeyman, and how this season has affected him. But that would require both insight and effort, something which journalism in general, and sports journalism in particular, doesn't seem to do too much of these days.
I think Spike nailed it as far as Bradley is concerned.
barrycuda says:
ububba………how was Lucinda? i saw her about 18 months ago at a nice venue here and still get chills thinking about it. what a voice, what a songwriter…………..as far as baseball goes, i think i'll root for the twins and rockies just so we can see Bud tapdance around while he tries to sell that one to the country. especially with those horrible stadiums. lets hope for blizzards in Colorado. ………………the last few years, with no Braves in it, i've kinda skipped the post-season but now my football season has already gone so far south that it's springtime so i'll be wwatching the playoffs closely.
Spike,
Tough titty, that's life in the big city.
Guess Cabrera's not hung over today.
Chip Carey really is an irritating man, isn't he?
Adam..thats what happens when you stop being an irritating boy.
Here's what we've learned so far…
Jim Leyland on Magglio's improvement: "He stopped being tentative, started being aggressive."
Ron Gardenhire on his players: "I got a bunch of baseball players."
Oh agreed. But just so I understand you clearly – are you advocating this style of "sportswriting", or just saying that people engage in it and it's an occupational hazard. If the latter, I am sure Norton's not losing any sleep over it, and neither am I, but the fact that it is common, like Norton's .145, doesn't exempt it from criticism.
What are you, Greg Norton's agent?
That column/blog was just a joke—some found it amusing, some didn't. (FWIW, I liked the anecdote about his daughter.) It was one of those what-are-we-gonna-do-without-him-to-kick-around-anymore columns.
Norton, apparently & sadly, had become a hot topic in AJC forum land, so the column was more about the idea of diminishing page views (with Norton gone) than anything else. Big deal.
And yeah, there's the occupational-hazard element: Don't wanna get kicked when you're down or headed out the door? Don't wanna have columnists' daughters make jokes about you?
Then don't kill the team by hitting .145.
Lucinda Sunday Night
I got lucky. She played a three-night stand at Irving Plaza, this wonderful 2-level venue in Manhattan that fits about 1,100 people, and apparently I got the best show of the lot. (In fact, I'm told that it was the gig of the tour so far.) A coworker saw her Saturday & told me she had one of her little meltdowns. Apparently, there was a little more of that last night. The middle show, my show, was the best Lucinda I've ever seen.
Her voice was in spectacular form & so was her mood. (It was her husband's birthday—that might've had something to do with it.) She did chunks of albums in order: 4 songs from "Sweet Old World"; 7 songs from "Car Wheels on the Gravel Road"; 4 songs from "Essence"; 1 from "West"; 7 from "Little Honey." (Nothing I remember from "World Without Tears.")
Except for the AC/DC cover ("It's a Long Way to the Top If You Wanna Rock-n-Roll") & the regulation blues rockout of "Joy," it didn't get too raucous. The band, Buick 6, went the understatement route & the tunes weren't all the obvious ones. Nonetheless, she was pretty captivating on things like "Blue," "Something About What Happens When We Talk" and, of course, "Essence," which is always spellbinding.
My highlight: Alone with an acoustic guitar, she dedicated a cover of Jimi Hendrix's "Angel" to the recently departed Jim Carroll (of "People Who Died" fame). Her voice was so clear, the accents so right, that it just burned holes in me. I looked around & people were welling up. It was awesome.
Boy is Skip Caray bad. Hyping every f*****g single and even the laziest flyballs.
Good for you Mac….
@122: Blasphemy, Tom! Horrible typo.
On another note, does anyone remember Jason Varitek's "majestic" foul down the right field line last year in Tampa? Haha.
I hate the fucking Twins! Go Tigers!
Is it me, or was the middle infield NOT at double play depth there? The Tigers' defense has been beyond horrible this inning.
Chip Carey just screamed "line drive base hit!" on that inning ending double play. That was awesome.
Also, are the announcers or anyone else gonna deal with the fact that the runner was actually safe?
NickC says:
Haha. Chip is so used to saying "Line drive! Base hit!".
I haven't used mlb.tv in a while. Anyone know how to fix the "you pick the camera and that's the only camera you get to watch" thing they got going on? It's miserable
rehabreject says:
hahaha! I literally ran here to post Chip being an absolute tool but I guess I was beaten!!
hahaha!!
Mike N. says:
What in the hell was he thinking there? He had absolutely no chance to score there.
I didn't feel like screwing up my alternating rows to get rid of Dessens.
Watching from high behind home plate on mlb.tv really shows the ineptitude of Chip Carey.
*Ball hit to shallow center field, Granderson sees it all the way*
Chip Carey: Granderson got a late break, charges in! Makes the catch!
Ron Darling: Granderson got a good break on that.
*Ball hit to straight away center field*
Chip Carey: Gomez, charging in!
*Gomez stands completely still and catches the ball*
I actually think that the "line drive! base hit!" call is so bad that it might get national attention. But really, for me, it's the fact that he keeps having to change his pants every time the ball is hit to the outfield.
I like that TBS is doing games for all these different teams now and that Chip Caray is calling them and this long 1-game playoff.
Maybe now a national audience will finally realize that it isn't Joe Buck or Joe Morgan or Tim McCarver who is the worst announcer in the game.
Twins win the right to lose to the Yankees!
Lets go Twins….and in 2010 save us from Chip Caray….
At least Chip isn't likely to take over for Boog. It'd be nice if we could get Jim Powell to migrate over from radio. Hell, I wouldn't mind if we had Simpson, Sutton and Powell if it meant no Torborg, Rathbun or Chip.
ububba – I didn't know Jim Carroll had died, but there are very few deaths I would find less surprising.
Mac, just read your news, I am so happy for you. Well done!!! Take some good rest during this offseason because we will be awesome in 2010.
Coz says:
That's excellent news, Mac! Wonderful to hear!
Awesome: http://twitpic.com/kjp8k
Thanks Adam M.—sometimes a picture is really worth more than words….
Alex Remington (Another Alex R.) says:
Mac, I'm thrilled to hear that you're doing better, physically and otherwise. Like Stu said, you'll remain in my thoughts.
bandit31312 says:
Mac, your site has made a more enjoyable Braves experience, Thanks for all your hard work. Best wishes on continued good health.
FWIW, Playoff Picks
Pha in 4
StL in 4
NYY in 3
LAA in 5
Fave Playoff Tidbit from NY Times:
"Nothing better epitomizes Alex Rodriguez's October futility than this astounding fact: since Game 4 of the 2004 A.L.C.S., Rodriguez is 0 for 27 with runners on base in the postseason. He has come to bat with 38 runners on base and stranded every one."
He's certainly playing the right team this week.
Player A Postseason, career – .279/.373/.483/.856
Player B Postseason, career – .309/.377/.469/.845
One deified, one vilified.
A. Arod?
B. Big Pappy?
B is Jeter, A is A-Rod.
The vast majority of A-Rod's good numbers come from his time in Seattle. As a Yankee, he's not been good. The 0-for-27 stat should speak volumes.
Additionally, Jeter has done it in way, way more games, which should count for something. Then there's that matter about big hits in big games which resulted in titles.
BTW, super high winds in NYC today, 40 MPH. Gonna be an interesting game in The Bronx.
McCann wants more Lasik
@149,
If McCann goes back under the laser, he better only do it with an expert at a high end university medical complex. "Second Lasiks" are even more likely to cause complications including but not limited to kerataconus.
The 0-for-27 stat should speak volumes
It does. What it says to me is 27 AB's distributed over 4 years is, how you say, noise. But it fits nicely with a meme that is near and dear to a large number of folks, so I am cool with it stranding for the massive FAIL of A-FRAUD.
Call me crazy, but I really like this McCann fellow.
I had a dream last night that we traded Derek Lowe. I was curious who we traded him to, but I was too busy celebrating to ask. Then Derek Lowe walked in the room and heard us celebrating and walked away looking very sad.
I should stop eating before bed.
So, Jeter's 12 post-season results are what? Music?
No matter how you slice it, no matter how dear the notion of sample size warms your heart, that's awful—certainly unacceptable for the cleanup hitter of the New York Yankees, whether his name is Alex Rodriguez or Mel Hall.
When the highest-paid player in baseball can't do better than 0 for 27 with runners on base in 4 consecutive series that his team loses, that's a gag-o-rama. If you're a Yankee fan, that's gag-a-licious. If you hung out with A-Rod, you'd be a gag hag. OK, I'll stop.
It's not a meme, Spike, it's a genuine pattern with real numbers that indict A-Rod.
The efficacy of Lasik is hotly contested anyways. Mac should do his best to adjust and stay away from lasers.
Ha, misunderstood the 0-27 stat. I thought that was the one postseason where they moved him down to the 8th spot, not 4 consecutive series with runners on base. That's a bit harder to justify.
Guys, I'm such a sucker. I had a Hottie McTottie bartender last night. She gave me some attention and was friendly and so I left a $20.
The efficacy of Lasik is hotly contested anyways.
It's definately a case-by-case basis. I had lasik done about 10 years ago, and couldn't be happier. But, messing with the eyes is a pretty scary thing, and I doubt I'd go through it a 2nd time.
I'd skip it too, if I were him.
Since 2007, Jeter is a shocking 1 for his last 11 w RoB. Kill him too.
4 consecutive series with runners on base*
*over four year time span
Count tha ringzzz, Chocker!!1!!!11
I definitely think a cite would've been appropriate there sdp.
I'd give my left nut for 20/20 vision.
@157 don't sweat it. The combination of hormones and alcohol always leaves men with much less money.
Marc Schneider says:
Great news Mac. Best wishes for continued health.
A pinstriped false equivalent.
Jeter has had tons of post-season success (personal & team) with the Yankees. A-Rod has had tons of failure with the Yankees.
And that recent 1/11? That's coming off a series where he hit .500. Jeter has hit .300 or better in 16 of the 25 series he's played.
What's fascinating to me—aside from that fact that someone is out there trying to defend A-Rod's Yankee post-seasons by pointing to Jeter—is that you'd be hard-pressed to find another great player who has coughed it up so hard in the bright lights.
What I find fascinating is that some can take 27 disparate events over the course of literally THOUSANDS of at bats, separated by entire seasons, on aggregate overwhelmingly successful, an find a "pattern" of failure. When it is pointed that this same pattern can exist for examples that are held to be "successful", a tautology is employed wherein the initial statement is shown as proof of itself.
Fact – Alex Rodriguez has enjoyed postseason success.
Fact – Derek Jeter has enjoyed postseason success
Fact – Alex Rodriguez has enjoyed postseason success as a Yankee(2004 ALDS,ALCS)
Fact – Derek Jeter has enjoyed postseason success as a Yankee (numerous)
Fact – Alex Rodriguez has experienced postseason failure as a Yankee(2005,6,7 ALDS)
Fact – Derek Jeter has experienced postseason failure as a Yankee (2004 ALCS, 2007 ALDS)
INESCAPABLE CONCLUSION – A-WAD IS TEH SUXXORS IN OCTOBER!!!
Did she at least give you a few free beers? I can justify tipping well if I got a few free drinks out of it.
And how much was your tab? A $20 tip in NY isn't that crazy unfortunately…
In the spirit of getting no respect from stunning bartendresses:
So this girl comes up to me and says, "Give me a hundred dollars and I'll do anything you want."
I said, "Sold! Now paint my house."
In the absence of another "sansho scores!" string, perhaps this will incite some Rodney love.
@165: No, I had a Yuengling and a strong as hell Long Island Iced Tea. My tab was ~$7 bucks. She was a college student and I'm a generous guy.
so Soriano and Gonzo are type A FA, and Anderson and Laroche are both type B. Seems like we could be in line for a pretty good draft
Comparing the Yankee post-seasons of those 2 players really isn't a good idea. Jeter blows him away in that category.
Those 27 "disparate" events are huge. They're consecutive. They occured in the past 17 post-season games, 13 of which the Yankees have lost. They contributed to his team's failure in those 4 consecutive series.
I'll say it again, one should expect the highest paid player in baseball to be a lot better than that. He's deserved the heat.
Less than $7?! I need to move.
No wait a minute…no, I don't.
They're consecutive.
Events separated by a year of the same event happening 500+ times do not count as "consecutive" to me. I am fine with not liking A-Rod, personally professionally or any other way for that matter. Cherry picking 27 AB's out of his career to "demonstrate" he is a postseason failure is not only intellectually dishonest in context of his career postseason numbers (see above), but even in terms of his Yankee career. He has had two series (and fifty at bats) of superior performance. That doesn't really work conveniently with the A-Rod as postseason failure narrative, so they are conveniently ignored in favor of the 27 that support it.
But by all means, have it your way.
sdp,
Did you get her number? Was the $20 for cab money home the next day?
SHAWIIIING!
Would it be possible to get some conspicous consumption worked into the rebuttal?
Look I'll dial it back – ububba is one of my very favorite people on this site, and I value his opinion on baseball and music, among other things very highly. What cheeses me off so on this topic is that the Yankees of late can't just lose – they have to have a scapegoat. "Someone stabbed us in the back and prevented the Yankees from their rightful prize!" Arod certainly leads with his chin, PR-wise, and doesn't seem to be a particularly astute guy. But I'll be damned if I won't speak up for an inner circle HOF, one of the three or so best guys ever at his position, who has done nothing but hit the crap out of the ball during his tenure in NY, be held out as the reason for their post series failures.
@170: Upstate SC…no, you don't need to move. :)
@172: No number. She didn't seem like my type and I think she was a smoker. I've never rode in a cab.
A guy who gets paid $30 million a year shouldn't be oh-for-anything. That's the reality of it.
I hate the Yankees, but not nearly as much as I hate the Red Sox and their cah-pahk-chowder-bowl-eating fan base.
I think he meant the $20 was cab money for HER. ;)
I think she liked you.
WFAN interview with Yanks GM Brian Cashman: "In the post-season, it's not about 'small-sample size' because one punch can change the whole series."
And now he's 0 for his last 28.
You gotta admit, that ain't too good no matter how you slice it.
csg at 168,
You do realize that you don't get draft picks unless you offer arbitration?
I don't think we need to offer arb to Garret. He might take it and we need him gone.
On Soriano, he would be expensive, too.
LaRoche is a no brainer. If he does a one year at an arb inflated 10 or so, then fine. Freeman can take over next year.
Gonzo also might be o.k. to offer as he probably won't come in over 5.
I didn't realize we could decline Hudson's option and still offer him a smaller contract. Wonder if that'll happen.
drewdat says:
That's great to hear, Mac!
New thread/poll.
Previous Previous post: Nats 2, Braves 1 (15 innings)
Next Next post: Justin Speier vs. Brad Clontz


I want to let you in on a secret….with ZIPLOXX™, EVERY STYLIST can become a Hair Extensionist.
ZIPLOXX™ is designed to suit both experienced extensionists and stylists who are new to hair extensions. Due to its genius smart design, the ZIPLOXX™ mechanism offers a very easy application method, while requiring a stylist's vision and expertise for quantity, placement and color shading. The beauty of ZIPLOXX™, unlike other extension application methods, is that you can never make a mistake that can't be undone or will harm your client's hair - it can always be adjusted. It is truly a risk-free extension application process.
Salon owners today are more successful than ever due to the vast power of social media channels and their users driving traffic to salons in search of something they saw on Instagram or Facebook. This reality is the cause of thousands of bloggers and influencers introducing new products to the market on a daily basis, leading to an oversaturation of repetitive products.
ZIPLOXX™ has created a new category for all the bloggers and vloggers due to the simple fact that the last time there was innovation in the hair extension industry was more than a millennium ago. As a native digital brand with constant influencer, traditional press and consumer outreach, ZIPLOXX™ will drive traffic to salons via our customer engagement with bloggers, vloggers and celebrities due to the much anticipated thirst for new innovation in hair extensions.
The ingenious safe & smart design and ease of use for full head application or adding highlights or color flairs with ZIPLOXX™, sells itself and translates into Instagram gold.
ZIPLOXX™ is not an option when it comes to hair extensions – it's the right choice for your clients and their hair integrity.


As a trained bookseller Béatrice always knew: it's all about the story. She decided to combine her two passions, books and movies, and started writing for film. Béatrice holds a degree in screenwriting from the University of Television and Film Munich (HFF). She has written, directed and produced award winning short films and is currently developing scripts for feature films, web-series and TV-series with various production companies.


Which car is the nation's most popular for first time drivers?
EVERYONE remembers the excitement of buying their first car.
What most of us don't recall, however, are the overwhelming costs involved with actually getting a young person out on the road.
The Vauxhall Corsa proved to be the nation's most popular first car.
On top of the vehicle itself, young drivers have to look after insurance, MOT and often a number of repairs associated with older, more affordable vehicles.
It has been predicted that insurance rates for young drivers could increase by up to £1,000 in the near future, making it even more important that youngsters keep their ongoing vehicle costs down.
A recent survey revealed the UK's most popular car choices for 17 and 18 year old first-time drivers, based on reliability and affordability.
Taking out top spot was the Vauxhall Corsa, the Ford Fiesta and VW Polo came in second and third respectively.
The South-East of the country emerged as the best-value area to insure first time drivers, with the largest number choosing the affordable Peugeot 206 as their first car.
The Peugeot 206 was the cheapest to insure.
Overall, the Peugeot came in as the nation's ninth most popular, while the VW came last in 15th place.


Two weeks ago, Stephanie Dykes, Dakota's mom and our Board's secretary, and I travelled to San Diego for the WORLD Symposium. This was a conference dedicated to Lysosomal Diseases, such as Wolman's Disease and CESD. It was a gathering of medical professionals, scientists and patient advocacy organizations, such as LAL Solace. Stephanie and I were able to meet so many wonderful people who are working to raise awareness and treat these diseases. We listened to speakers discussing the LAL Deficiency clinical trials. We were able to have one-on-one meetings with people who are going to be able to help us make lalsolace.org a much more educational and supportive place. We will soon be joining the National Organization of Rare Diseases and other organizations dedicated to rare diseases. We are going to be exploring the possibility of having our site translated into other languages so that this can be the global organization we need it to be. We will be working with scientists and doctors to be able to provide YOU important information about the disease, testing, clinical trails and lot of other issues. We spoke with doctors from around the world about the stories you, our members, have shared on the site about the frustrations of getting the correct diagnosis. They are listening. We are working very hard for you. Now that we have become an official non-profit organization, we will be able to outreach to more groups, join professional organizations and meet the awesome people like those at the WORLD Symposium so that we can be heard! I thought I would include a picture of our trip.


text:
Low-Pressure In Bay of Bengal Indicates Monsoon Progress
Sign of a low-pressure area developing in the Bay of Bengal is good news for the headway of storm, a senior authority of the India Meteorological Department (IMD) said Thursday.
Thursday night report of the IMD affirmed that the external line of the storm had come to across Kannur in Karnataka and Madurai in Tamil Nadu.
Cyclone Vayu had slowed storm's advancement, the IMD had said before.
"A couple of days back, we were solely dependent on Vayu getting weakened as it had pulled all the required winds and slowed down the southwest monsoon's progress in the country," the official said, requesting anonymity.
"Today, we noticed indication of a low-pressure area getting developed in the Bay of Bengal, which always helps in the advancement of southwest monsoon towards northern part," he told.
"Generally, by this date southwest monsoon is supposed to arrive in Maharashtra, but it is still far away. Earlier observations had indicated that Vayu would take a couple of more days to weaken which will make way for monsoon to move northwards," the official said.
"With signs of low-pressure area getting developed in the Bay of Bengal, whatever develops there is certainly going to benefit the advancement of southwest monsoon over the country and it can bring showers," the IMD official predicted.
"The next two days would give an idea about the strength of cyclonic storm Vayu and how the signs of low-pressure area develops further," he said.
Saving Gujarat in the wake of evolving course, cyclone Vayu Thursday started moving far from Gujarat coast towards Oman.
IMD Says, Cyclone Fani Weakening and Moving North
Cyclone Fani To Cross Odisha Coast By Friday
Cyclone Fani Hovers 880 KM From Tamil Nadu
TN SSLC Result 2019 Declared At tnresults.nic.in
IMD Issues Red Alert In Tamil Nadu as Cyclone Fani to Hit
Filed Under: News Tagged With: Gujarat, karnataka, low-pressure area, madurai, Maharashtra, tamil nadu, West Bengal

redpajama_set_name: RedPajamaCommonCrawl


text:
Grandmother's Vision Struggle Motivates Young Woman to Make a Difference
As a young girl in Afghanistan, Fazila Aseem watched her grandmother struggle, because of vision loss, to independently complete daily tasks. Her grandmother was unable to see well enough to prepare simple meals for herself, and there was nothing Afghan doctors could do to restore her vision.
Many years later a simple cataract surgery significantly improved her grandmother's vision and quality of life. Aseem wondered how many other older adults might be suffering from a curable condition because of treatment and care deficits.
Aseem's curiosity sparked both a thirst for knowledge and a desire to improve treatment and care for older adults. This summer, through a fellowship from the American Federation in Aging Research, Aseem will work with researchers in the UAB Department of Ophthalmology to continue her interest in aging and vision research.
"Ophthalmology provides me with the ability to combine my interest in science with my humanitarian vision to make a positive impact in the lives of disadvantaged people, including older adults," Aseem says. "In the future, I would like to be involved in both clinical practice as well as research so I can not only provide care but also help improve treatment options for vision impairments."
Aseem, a medical student at Wake Forest University, will work with ophthalmology faculty members Christine A. Curcio, PhD, and Cynthia Owsley, PhD, and the Alabama Study on Early Age-Related Macular Degeneration (ALSTAR), funded by the National Institute on Aging of the National Institutes of Health. This study aims to uncover risk factors that make certain older adults more susceptible to age-related macular degeneration (AMD), a disease that causes central vision loss for millions of Americans.
"I want to continue my work with the ALSTAR project because it provides the unique opportunity to study the subcellular basis of clinical autofluorescence imaging and functional assays of transitioning from normal aging to AMD, under the supervision of two brilliant scientists in the field—Drs. Curcio and Owsley," Aseem says. "I am also excited about the prospect of setting a potential diagnostic biomarker for the earliest emergence of AMD, so AMD patients are able to seek early care."
Although treatment for AMD is available, it cannot begin until the later stages of the disease, when vision loss is extensive. Through the ALSTAR study and other lines of research, UAB Ophthalmology is focusing on understanding the earliest stages of AMD, hopeful that this work will lead to the next generation of treatments and, ideally, a way to prevent this devastating disease. "Autofluorescence is a superb way to monitor the retinal cells most affected by AMD. Fazila's project will help us detect the very earliest stages of degeneration in ALSTAR study patients," Curcio says. "Due to their participation in the ALSTAR study, these patients' vision, health, and lifestyle are now well documented. The addition of autofluorescence imaging will lead us to biomarkers for the emergence of AMD."
Produced by UAB Medicine Marketing Communications (learn more about our content).


text:
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 * vim: set ts=4 sw=4 et tw=99:
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "jscntxt.h"
#include "jsdate.h"
#include "jscompartment.h"
#include "jsgc.h"
#include "jsiter.h"
#include "jsmath.h"
#include "jsproxy.h"
#include "jsscope.h"
#include "jswatchpoint.h"
#include "jswrapper.h"

#include "assembler/wtf/Platform.h"
#include "gc/Marking.h"
#include "js/MemoryMetrics.h"
#include "methodjit/MethodJIT.h"
#include "methodjit/PolyIC.h"
#include "methodjit/MonoIC.h"
#include "methodjit/Retcon.h"
#include "vm/Debugger.h"
#include "yarr/BumpPointerAllocator.h"

#include "jsgcinlines.h"
#include "jsobjinlines.h"
#include "jsscopeinlines.h"
#ifdef JS_ION
#include "ion/IonCompartment.h"
#include "ion/Ion.h"
#endif

#if ENABLE_YARR_JIT
#include "assembler/jit/ExecutableAllocator.h"
#endif

using namespace mozilla;
using namespace js;
using namespace js::gc;

JSCompartment::JSCompartment(JSRuntime *rt)
  : rt(rt),
    principals(NULL),
    global_(NULL),
#ifdef JSGC_GENERATIONAL
    gcStoreBuffer(&gcNursery),
#endif
    needsBarrier_(false),
    ionUsingBarriers_(false),
    gcScheduled(false),
    gcState(NoGC),
    gcPreserveCode(false),
    gcBytes(0),
    gcTriggerBytes(0),
    gcHeapGrowthFactor(3.0),
    gcNextCompartment(NULL),
    hold(false),
    isSystemCompartment(false),
    lastCodeRelease(0),
    analysisLifoAlloc(LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
    typeLifoAlloc(LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
    data(NULL),
    active(false),
    lastAnimationTime(0),
    regExps(rt),
    propertyTree(thisForCtor()),
    gcMallocAndFreeBytes(0),
    gcTriggerMallocAndFreeBytes(0),
    gcMallocBytes(0),
    debugModeBits(rt->debugMode ? DebugFromC : 0),
    watchpointMap(NULL),
    scriptCountsMap(NULL),
    debugScriptMap(NULL)
#ifdef JS_ION
    , ionCompartment_(NULL)
#endif
{
    setGCMaxMallocBytes(rt->gcMaxMallocBytes * 0.9);
}

JSCompartment::~JSCompartment()
{
#ifdef JS_ION
    js_delete(ionCompartment_);
#endif

    js_delete(watchpointMap);
    js_delete(scriptCountsMap);
    js_delete(debugScriptMap);
}

bool
JSCompartment::init(JSContext *cx)
{
    /*
     * As a hack, we clear our timezone cache every time we create a new
     * compartment.  This ensures that the cache is always relatively fresh, but
     * shouldn't interfere with benchmarks which create tons of date objects
     * (unless they also create tons of iframes, which seems unlikely).
     */
    js_ClearDateCaches();

    activeAnalysis = activeInference = false;
    types.init(cx);

    if (!crossCompartmentWrappers.init())
        return false;

    if (!regExps.init(cx))
        return false;

#ifdef JSGC_GENERATIONAL
    /*
     * If we are in the middle of post-barrier verification, we need to
     * immediately begin collecting verification data on new compartments.
     */
    if (rt->gcVerifyPostData) {
        if (!gcNursery.enable())
            return false;

        if (!gcStoreBuffer.enable())
            return false;
    } else {
        gcNursery.disable();
        gcStoreBuffer.disable();
    }
#endif

    return debuggees.init();
}

void
JSCompartment::setNeedsBarrier(bool needs, ShouldUpdateIon updateIon)
{
#ifdef JS_METHODJIT
    /* ClearAllFrames calls compileBarriers() and needs the old value. */
    bool old = compileBarriers();
    if (compileBarriers(needs) != old)
        mjit::ClearAllFrames(this);
#endif

#ifdef JS_ION
    if (updateIon == UpdateIon && needs != ionUsingBarriers_) {
        ion::ToggleBarriers(this, needs);
        ionUsingBarriers_ = needs;
    }
#endif

    needsBarrier_ = needs;
}

#ifdef JS_ION
bool
JSCompartment::ensureIonCompartmentExists(JSContext *cx)
{
    using namespace js::ion;
    if (ionCompartment_)
        return true;

    /* Set the compartment early, so linking works. */
    ionCompartment_ = cx->new_<IonCompartment>();

    if (!ionCompartment_ || !ionCompartment_->initialize(cx)) {
        if (ionCompartment_)
            delete ionCompartment_;
        ionCompartment_ = NULL;
        return false;
    }

    return true;
}
#endif

static bool
WrapForSameCompartment(JSContext *cx, HandleObject obj, Value *vp)
{
    JS_ASSERT(cx->compartment == obj->compartment());
    if (!cx->runtime->sameCompartmentWrapObjectCallback) {
        vp->setObject(*obj);
        return true;
    }

    JSObject *wrapped = cx->runtime->sameCompartmentWrapObjectCallback(cx, obj);
    if (!wrapped)
        return false;
    vp->setObject(*wrapped);
    return true;
}

bool
JSCompartment::wrap(JSContext *cx, Value *vp)
{
    JS_ASSERT(cx->compartment == this);

    unsigned flags = 0;

    JS_CHECK_RECURSION(cx, return false);

#ifdef DEBUG
    struct AutoDisableProxyCheck {
        JSRuntime *runtime;
        AutoDisableProxyCheck(JSRuntime *rt) : runtime(rt) {
            runtime->gcDisableStrictProxyCheckingCount++;
        }
        ~AutoDisableProxyCheck() { runtime->gcDisableStrictProxyCheckingCount--; }
    } adpc(rt);
#endif

    /* Only GC things have to be wrapped or copied. */
    if (!vp->isMarkable())
        return true;

    if (vp->isString()) {
        JSString *str = vp->toString();

        /* If the string is already in this compartment, we are done. */
        if (str->compartment() == this)
            return true;

        /* If the string is an atom, we don't have to copy. */
        if (str->isAtom()) {
            JS_ASSERT(str->compartment() == cx->runtime->atomsCompartment);
            return true;
        }
    }

    /*
     * Wrappers should really be parented to the wrapped parent of the wrapped
     * object, but in that case a wrapped global object would have a NULL
     * parent without being a proper global object (JSCLASS_IS_GLOBAL). Instead,
     * we parent all wrappers to the global object in their home compartment.
     * This loses us some transparency, and is generally very cheesy.
     */
    HandleObject global = cx->global();

    /* Unwrap incoming objects. */
    if (vp->isObject()) {
        Rooted<JSObject*> obj(cx, &vp->toObject());

        if (obj->compartment() == this)
            return WrapForSameCompartment(cx, obj, vp);

        /* Translate StopIteration singleton. */
        if (obj->isStopIteration()) {
            RootedValue vvp(cx, *vp);
            bool result = js_FindClassObject(cx, JSProto_StopIteration, &vvp);
            *vp = vvp;
            return result;
        }

        /* Unwrap the object, but don't unwrap outer windows. */
        obj = UnwrapObject(&vp->toObject(), /* stopAtOuter = */ true, &flags);

        if (obj->compartment() == this)
            return WrapForSameCompartment(cx, obj, vp);

        if (cx->runtime->preWrapObjectCallback) {
            obj = cx->runtime->preWrapObjectCallback(cx, global, obj, flags);
            if (!obj)
                return false;
        }

        if (obj->compartment() == this)
            return WrapForSameCompartment(cx, obj, vp);
        vp->setObject(*obj);

#ifdef DEBUG
        {
            JSObject *outer = GetOuterObject(cx, obj);
            JS_ASSERT(outer && outer == obj);
        }
#endif
    }

    RootedValue key(cx, *vp);

    /* If we already have a wrapper for this value, use it. */
    if (WrapperMap::Ptr p = crossCompartmentWrappers.lookup(key)) {
        *vp = p->value;
        if (vp->isObject()) {
            RootedObject obj(cx, &vp->toObject());
            JS_ASSERT(obj->isCrossCompartmentWrapper());
            JS_ASSERT(obj->getParent() == global);
        }
        return true;
    }

    if (vp->isString()) {
        RootedValue orig(cx, *vp);
        JSStableString *str = vp->toString()->ensureStable(cx);
        if (!str)
            return false;
        JSString *wrapped = js_NewStringCopyN(cx, str->chars(), str->length());
        if (!wrapped)
            return false;
        vp->setString(wrapped);
        return crossCompartmentWrappers.put(orig, *vp);
    }

    RootedObject obj(cx, &vp->toObject());

    JSObject *proto = Proxy::LazyProto;

    /*
     * We hand in the original wrapped object into the wrap hook to allow
     * the wrap hook to reason over what wrappers are currently applied
     * to the object.
     */
    RootedObject wrapper(cx, cx->runtime->wrapObjectCallback(cx, obj, proto, global, flags));
    if (!wrapper)
        return false;

    // We maintain the invariant that the key in the cross-compartment wrapper
    // map is always directly wrapped by the value.
    JS_ASSERT(Wrapper::wrappedObject(wrapper) == &key.get().toObject());

    vp->setObject(*wrapper);

    if (!crossCompartmentWrappers.put(key, *vp))
        return false;

    return true;
}

bool
JSCompartment::wrap(JSContext *cx, JSString **strp)
{
    RootedValue value(cx, StringValue(*strp));
    if (!wrap(cx, value.address()))
        return false;
    *strp = value.get().toString();
    return true;
}

bool
JSCompartment::wrap(JSContext *cx, HeapPtrString *strp)
{
    RootedValue value(cx, StringValue(*strp));
    if (!wrap(cx, value.address()))
        return false;
    *strp = value.get().toString();
    return true;
}

bool
JSCompartment::wrap(JSContext *cx, JSObject **objp)
{
    if (!*objp)
        return true;
    RootedValue value(cx, ObjectValue(**objp));
    if (!wrap(cx, value.address()))
        return false;
    *objp = &value.get().toObject();
    return true;
}

bool
JSCompartment::wrapId(JSContext *cx, jsid *idp)
{
    if (JSID_IS_INT(*idp))
        return true;
    RootedValue value(cx, IdToValue(*idp));
    if (!wrap(cx, value.address()))
        return false;
    return ValueToId(cx, value.get(), idp);
}

bool
JSCompartment::wrap(JSContext *cx, PropertyOp *propp)
{
    Value v = CastAsObjectJsval(*propp);
    if (!wrap(cx, &v))
        return false;
    *propp = CastAsPropertyOp(v.toObjectOrNull());
    return true;
}

bool
JSCompartment::wrap(JSContext *cx, StrictPropertyOp *propp)
{
    Value v = CastAsObjectJsval(*propp);
    if (!wrap(cx, &v))
        return false;
    *propp = CastAsStrictPropertyOp(v.toObjectOrNull());
    return true;
}

bool
JSCompartment::wrap(JSContext *cx, PropertyDescriptor *desc)
{
    return wrap(cx, &desc->obj) &&
           (!(desc->attrs & JSPROP_GETTER) || wrap(cx, &desc->getter)) &&
           (!(desc->attrs & JSPROP_SETTER) || wrap(cx, &desc->setter)) &&
           wrap(cx, &desc->value);
}

bool
JSCompartment::wrap(JSContext *cx, AutoIdVector &props)
{
    jsid *vector = props.begin();
    int length = props.length();
    for (size_t n = 0; n < size_t(length); ++n) {
        if (!wrapId(cx, &vector[n]))
            return false;
    }
    return true;
}

/*
 * This method marks pointers that cross compartment boundaries. It should be
 * called only for per-compartment GCs, since full GCs naturally follow pointers
 * across compartments.
 */
void
JSCompartment::markCrossCompartmentWrappers(JSTracer *trc)
{
    JS_ASSERT(!isCollecting());

    for (WrapperMap::Enum e(crossCompartmentWrappers); !e.empty(); e.popFront()) {
        Value v = e.front().value;
        if (e.front().key.kind == CrossCompartmentKey::ObjectWrapper) {
            JSObject *wrapper = &v.toObject();

            /*
             * We have a cross-compartment wrapper. Its private pointer may
             * point into the compartment being collected, so we should mark it.
             */
            Value referent = GetProxyPrivate(wrapper);
            MarkValueRoot(trc, &referent, "cross-compartment wrapper");
            JS_ASSERT(referent == GetProxyPrivate(wrapper));

            if (IsFunctionProxy(wrapper)) {
                Value call = GetProxyCall(wrapper);
                MarkValueRoot(trc, &call, "cross-compartment wrapper");
                JS_ASSERT(call == GetProxyCall(wrapper));
            }
        }
    }
}

void
JSCompartment::mark(JSTracer *trc)
{
#ifdef JS_ION
    if (ionCompartment_)
        ionCompartment_->mark(trc, this);
#endif
}

void
JSCompartment::markTypes(JSTracer *trc)
{
    /*
     * Mark all scripts, type objects and singleton JS objects in the
     * compartment. These can be referred to directly by type sets, which we
     * cannot modify while code which depends on these type sets is active.
     */
    JS_ASSERT(activeAnalysis || isPreservingCode());

    for (CellIterUnderGC i(this, FINALIZE_SCRIPT); !i.done(); i.next()) {
        JSScript *script = i.get<JSScript>();
        MarkScriptRoot(trc, &script, "mark_types_script");
        JS_ASSERT(script == i.get<JSScript>());
    }

    for (size_t thingKind = FINALIZE_OBJECT0; thingKind < FINALIZE_OBJECT_LIMIT; thingKind++) {
        ArenaHeader *aheader = arenas.getFirstArena(static_cast<AllocKind>(thingKind));
        if (aheader)
            rt->gcMarker.pushArenaList(aheader);
    }

    for (CellIterUnderGC i(this, FINALIZE_TYPE_OBJECT); !i.done(); i.next()) {
        types::TypeObject *type = i.get<types::TypeObject>();
        MarkTypeObjectRoot(trc, &type, "mark_types_scan");
        JS_ASSERT(type == i.get<types::TypeObject>());
    }
}

void
JSCompartment::discardJitCode(FreeOp *fop, bool discardConstraints)
{
#ifdef JS_METHODJIT

    /*
     * Kick all frames on the stack into the interpreter, and release all JIT
     * code in the compartment unless code is being preserved, in which case
     * purge all caches in the JIT scripts. Even if we are not releasing all
     * JIT code, we still need to release code for scripts which are in the
     * middle of a native or getter stub call, as these stubs will have been
     * redirected to the interpoline.
     */
    mjit::ClearAllFrames(this);

    if (isPreservingCode()) {
        PurgeJITCaches(this);
    } else {
# ifdef JS_ION
        /* Only mark OSI points if code is being discarded. */
        ion::InvalidateAll(fop, this);
# endif
        for (CellIterUnderGC i(this, FINALIZE_SCRIPT); !i.done(); i.next()) {
            JSScript *script = i.get<JSScript>();
            mjit::ReleaseScriptCode(fop, script);
# ifdef JS_ION
            ion::FinishInvalidation(fop, script);
# endif

            /*
             * Use counts for scripts are reset on GC. After discarding code we
             * need to let it warm back up to get information such as which
             * opcodes are setting array holes or accessing getter properties.
             */
            script->resetUseCount();
        }

        types.sweepCompilerOutputs(fop, discardConstraints);
    }

#endif /* JS_METHODJIT */
}

bool
JSCompartment::isDiscardingJitCode(JSTracer *trc)
{
    if (!IS_GC_MARKING_TRACER(trc))
        return false;

    return !gcPreserveCode;
}

void
JSCompartment::sweep(FreeOp *fop, bool releaseTypes)
{
    {
        gcstats::AutoPhase ap(rt->gcStats, gcstats::PHASE_SWEEP_DISCARD_CODE);
        discardJitCode(fop, !activeAnalysis && !gcPreserveCode);
    }

    /* This function includes itself in PHASE_SWEEP_TABLES. */
    sweepCrossCompartmentWrappers();

    {
        gcstats::AutoPhase ap(rt->gcStats, gcstats::PHASE_SWEEP_TABLES);

        /* Remove dead references held weakly by the compartment. */

        sweepBaseShapeTable();
        sweepInitialShapeTable();
        sweepNewTypeObjectTable(newTypeObjects);
        sweepNewTypeObjectTable(lazyTypeObjects);

        sweepBreakpoints(fop);

        if (global_ && !IsObjectMarked(&global_))
            global_ = NULL;

#ifdef JS_ION
        if (ionCompartment_)
            ionCompartment_->sweep(fop);
#endif

        /* JIT code can hold references on RegExpShared, so sweep regexps after clearing code. */
        regExps.sweep(rt);
    }

    if (!activeAnalysis && !gcPreserveCode) {
        JS_ASSERT(!types.constrainedOutputs);
        gcstats::AutoPhase ap(rt->gcStats, gcstats::PHASE_DISCARD_ANALYSIS);

        /*
         * Clear the analysis pool, but don't release its data yet. While
         * sweeping types any live data will be allocated into the pool.
         */
        LifoAlloc oldAlloc(typeLifoAlloc.defaultChunkSize());
        oldAlloc.steal(&typeLifoAlloc);

        /*
         * Periodically release observed types for all scripts. This is safe to
         * do when there are no frames for the compartment on the stack.
         */
        if (active)
            releaseTypes = false;

        /*
         * Sweep analysis information and everything depending on it from the
         * compartment, including all remaining mjit code if inference is
         * enabled in the compartment.
         */
        if (types.inferenceEnabled) {
            gcstats::AutoPhase ap2(rt->gcStats, gcstats::PHASE_DISCARD_TI);

            for (CellIterUnderGC i(this, FINALIZE_SCRIPT); !i.done(); i.next()) {
                RawScript script = i.get<JSScript>();
                if (script->types) {
                    types::TypeScript::Sweep(fop, script);

                    if (releaseTypes) {
                        script->types->destroy();
                        script->types = NULL;
                    }
                }
            }
        }

        {
            gcstats::AutoPhase ap2(rt->gcStats, gcstats::PHASE_SWEEP_TYPES);
            types.sweep(fop);
        }

        {
            gcstats::AutoPhase ap2(rt->gcStats, gcstats::PHASE_CLEAR_SCRIPT_ANALYSIS);
            for (CellIterUnderGC i(this, FINALIZE_SCRIPT); !i.done(); i.next()) {
                JSScript *script = i.get<JSScript>();
                script->clearAnalysis();
                script->clearPropertyReadTypes();
            }
        }

        {
            gcstats::AutoPhase ap2(rt->gcStats, gcstats::PHASE_FREE_TI_ARENA);
            rt->freeLifoAlloc.transferFrom(&analysisLifoAlloc);
            rt->freeLifoAlloc.transferFrom(&oldAlloc);
        }
    }

    active = false;
}

/*
 * Remove dead wrappers from the table. We must sweep all compartments, since
 * string entries in the crossCompartmentWrappers table are not marked during
 * markCrossCompartmentWrappers.
 */
void
JSCompartment::sweepCrossCompartmentWrappers()
{
    gcstats::AutoPhase ap(rt->gcStats, gcstats::PHASE_SWEEP_TABLES);

    /* Remove dead wrappers from the table. */
    for (WrapperMap::Enum e(crossCompartmentWrappers); !e.empty(); e.popFront()) {
        CrossCompartmentKey key = e.front().key;
        bool keyMarked = IsCellMarked(&key.wrapped);
        bool valMarked = IsValueMarked(e.front().value.unsafeGet());
        bool dbgMarked = !key.debugger || IsObjectMarked(&key.debugger);
        JS_ASSERT_IF(!keyMarked && valMarked, key.kind == CrossCompartmentKey::StringWrapper);
        if (!keyMarked || !valMarked || !dbgMarked)
            e.removeFront();
        else if (key.wrapped != e.front().key.wrapped || key.debugger != e.front().key.debugger)
            e.rekeyFront(key);
    }
}

void
JSCompartment::purge()
{
    dtoaCache.purge();
}

void
JSCompartment::resetGCMallocBytes()
{
    gcMallocBytes = ptrdiff_t(gcMaxMallocBytes);
}

void
JSCompartment::setGCMaxMallocBytes(size_t value)
{
    /*
     * For compatibility treat any value that exceeds PTRDIFF_T_MAX to
     * mean that value.
     */
    gcMaxMallocBytes = (ptrdiff_t(value) >= 0) ? value : size_t(-1) >> 1;
    resetGCMallocBytes();
}

void
JSCompartment::onTooMuchMalloc()
{
    TriggerCompartmentGC(this, gcreason::TOO_MUCH_MALLOC);
}

bool
JSCompartment::hasScriptsOnStack()
{
    for (AllFramesIter i(rt->stackSpace); !i.done(); ++i) {
        if (i.fp()->script()->compartment() == this)
            return true;
    }
    return false;
}

bool
JSCompartment::setDebugModeFromC(JSContext *cx, bool b, AutoDebugModeGC &dmgc)
{
    bool enabledBefore = debugMode();
    bool enabledAfter = (debugModeBits & ~unsigned(DebugFromC)) || b;

    // Debug mode can be enabled only when no scripts from the target
    // compartment are on the stack. It would even be incorrect to discard just
    // the non-live scripts' JITScripts because they might share ICs with live
    // scripts (bug 632343).
    //
    // We do allow disabling debug mode while scripts are on the stack.  In
    // that case the debug-mode code for those scripts remains, so subsequently
    // hooks may be called erroneously, even though debug mode is supposedly
    // off, and we have to live with it.
    //
    bool onStack = false;
    if (enabledBefore != enabledAfter) {
        onStack = hasScriptsOnStack();
        if (b && onStack) {
            JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_DEBUG_NOT_IDLE);
            return false;
        }
    }

    debugModeBits = (debugModeBits & ~unsigned(DebugFromC)) | (b ? DebugFromC : 0);
    JS_ASSERT(debugMode() == enabledAfter);
    if (enabledBefore != enabledAfter) {
        updateForDebugMode(cx->runtime->defaultFreeOp(), dmgc);
        if (!enabledAfter)
            cx->runtime->debugScopes->onCompartmentLeaveDebugMode(this);
    }
    return true;
}

void
JSCompartment::updateForDebugMode(FreeOp *fop, AutoDebugModeGC &dmgc)
{
    for (ContextIter acx(rt); !acx.done(); acx.next()) {
        if (acx->compartment == this)
            acx->updateJITEnabled();
    }

#ifdef JS_METHODJIT
    bool enabled = debugMode();

    JS_ASSERT_IF(enabled, !hasScriptsOnStack());

    for (gc::CellIter i(this, gc::FINALIZE_SCRIPT); !i.done(); i.next()) {
        JSScript *script = i.get<JSScript>();
        script->debugMode = enabled;
    }

    // When we change a compartment's debug mode, whether we're turning it
    // on or off, we must always throw away all analyses: debug mode
    // affects various aspects of the analysis, which then get baked into
    // SSA results, which affects code generation in complicated ways. We
    // must also throw away all JIT code, as its soundness depends on the
    // analyses.
    //
    // It suffices to do a garbage collection cycle or to finish the
    // ongoing GC cycle. The necessary cleanup happens in
    // JSCompartment::sweep.
    //
    // dmgc makes sure we can't forget to GC, but it is also important not
    // to run any scripts in this compartment until the dmgc is destroyed.
    // That is the caller's responsibility.
    if (!rt->isHeapBusy())
        dmgc.scheduleGC(this);
#endif
}

bool
JSCompartment::addDebuggee(JSContext *cx, js::GlobalObject *global)
{
    bool wasEnabled = debugMode();
    if (!debuggees.put(global)) {
        js_ReportOutOfMemory(cx);
        return false;
    }
    debugModeBits |= DebugFromJS;
    if (!wasEnabled) {
        AutoDebugModeGC dmgc(cx->runtime);
        updateForDebugMode(cx->runtime->defaultFreeOp(), dmgc);
    }
    return true;
}

void
JSCompartment::removeDebuggee(FreeOp *fop,
                              js::GlobalObject *global,
                              js::GlobalObjectSet::Enum *debuggeesEnum)
{
    bool wasEnabled = debugMode();
    JS_ASSERT(debuggees.has(global));
    if (debuggeesEnum)
        debuggeesEnum->removeFront();
    else
        debuggees.remove(global);

    if (debuggees.empty()) {
        debugModeBits &= ~DebugFromJS;
        if (wasEnabled && !debugMode()) {
            AutoDebugModeGC dmgc(rt);
            fop->runtime()->debugScopes->onCompartmentLeaveDebugMode(this);
            updateForDebugMode(fop, dmgc);
        }
    }
}

void
JSCompartment::clearBreakpointsIn(FreeOp *fop, js::Debugger *dbg, JSObject *handler)
{
    for (gc::CellIter i(this, gc::FINALIZE_SCRIPT); !i.done(); i.next()) {
        JSScript *script = i.get<JSScript>();
        if (script->hasAnyBreakpointsOrStepMode())
            script->clearBreakpointsIn(fop, dbg, handler);
    }
}

void
JSCompartment::clearTraps(FreeOp *fop)
{
    for (gc::CellIter i(this, gc::FINALIZE_SCRIPT); !i.done(); i.next()) {
        JSScript *script = i.get<JSScript>();
        if (script->hasAnyBreakpointsOrStepMode())
            script->clearTraps(fop);
    }
}

void
JSCompartment::sweepBreakpoints(FreeOp *fop)
{
    if (JS_CLIST_IS_EMPTY(&rt->debuggerList))
        return;

    for (CellIterUnderGC i(this, FINALIZE_SCRIPT); !i.done(); i.next()) {
        JSScript *script = i.get<JSScript>();
        if (!script->hasAnyBreakpointsOrStepMode())
            continue;
        bool scriptGone = !IsScriptMarked(&script);
        JS_ASSERT(script == i.get<JSScript>());
        for (unsigned i = 0; i < script->length; i++) {
            BreakpointSite *site = script->getBreakpointSite(script->code + i);
            if (!site)
                continue;
            // nextbp is necessary here to avoid possibly reading *bp after
            // destroying it.
            Breakpoint *nextbp;
            for (Breakpoint *bp = site->firstBreakpoint(); bp; bp = nextbp) {
                nextbp = bp->nextInSite();
                if (scriptGone || !IsObjectMarked(&bp->debugger->toJSObjectRef()))
                    bp->destroy(fop);
            }
        }
    }
}

void
JSCompartment::sizeOfIncludingThis(JSMallocSizeOfFun mallocSizeOf, size_t *compartmentObject,
                                   TypeInferenceSizes *tiSizes, size_t *shapesCompartmentTables,
                                   size_t *crossCompartmentWrappersArg, size_t *regexpCompartment,
                                   size_t *debuggeesSet)
{
    *compartmentObject = mallocSizeOf(this);
    sizeOfTypeInferenceData(tiSizes, mallocSizeOf);
    *shapesCompartmentTables = baseShapes.sizeOfExcludingThis(mallocSizeOf)
                             + initialShapes.sizeOfExcludingThis(mallocSizeOf)
                             + newTypeObjects.sizeOfExcludingThis(mallocSizeOf)
                             + lazyTypeObjects.sizeOfExcludingThis(mallocSizeOf);
    *crossCompartmentWrappersArg = crossCompartmentWrappers.sizeOfExcludingThis(mallocSizeOf);
    *regexpCompartment = regExps.sizeOfExcludingThis(mallocSizeOf);
    *debuggeesSet = debuggees.sizeOfExcludingThis(mallocSizeOf);
}

redpajama_set_name: RedPajamaGithub


text:
=head1 LICENSE

Copyright [1999-2015] Wellcome Trust Sanger Institute and the EMBL-European Bioinformatics Institute
Copyright [2016-2022] EMBL-European Bioinformatics Institute

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

=cut

=head1 CONTACT

 Please email comments or questions to the public Ensembl
 developers list at <http://lists.ensembl.org/mailman/listinfo/dev>.

 Questions may also be sent to the Ensembl help desk at
 <http://www.ensembl.org/Help/Contact>.

=cut

# Ensembl module for Bio::EnsEMBL::Variation::Genotype
#
#

=head1 NAME

Bio::EnsEMBL::Variation::Genotype - Abstract base class representing a genotype

=head1 SYNOPSIS

    print $genotype->variation()->name(), "\n";
    print $genotype->allele1(), '/', $genotype->allele2(), "\n";

=head1 DESCRIPTION

This is an abstract base class representing a genotype.  Specific types of
genotype are represented by subclasses such as IndividualGenotype and
PopulationGenotype.

=head1 METHODS

=cut

use strict;
use warnings;

package Bio::EnsEMBL::Variation::Genotype;

use Bio::EnsEMBL::Storable;
use Bio::EnsEMBL::Utils::Scalar qw(assert_ref);
use Bio::EnsEMBL::Variation::Utils::Sequence qw(strain_ambiguity_code);

use vars qw(@ISA $AUTOLOAD);

@ISA = qw(Bio::EnsEMBL::Storable);

sub new_fast {
  my $class = shift;
  my $hashref = shift;
  return bless $hashref, $class;
}

=head2 allele
  Args       : int $index
               string $new_allele (optional)
  Examples   : $allele1 = $genotype->allele(1);
               $allele2 = $genotype->allele2();
  Description: Getter/Setter for one of the alleles that compose this genotype.
               Can be called as $genotype->allele(1), or via AUTOLOAD as
               $genotype->allele1()
  Returntype : string
  Exceptions : none
  Caller     : general
  Status     : Stable

=cut

sub allele {
  my $self = shift;
  my $index = shift;
  my $allele = shift;
  $index = 1 unless defined($index) && $index >= 1;

  $index--;

  $self->{genotype}->[$index] = $allele if defined($allele);

  return defined($self->{genotype}->[$index]) ?  $self->{genotype}->[$index] : undef;
}

=head2 genotype
  Examples   : @alleles = @{$genotype->genotype};
  Description: Getter for the genotype as an arrayref of alleles
  Returntype : arrayref of strings
  Exceptions : none
  Caller     : general
  Status     : Stable

=cut

sub genotype {
  return $_[0]->{genotype}
}

=head2 genotype_string

  Arg [1]    : (optional) bool $sort
  Examples   : $genotype_string = $genotype->genotype_string;
  Description: Gets the genotype as a '|'-separated string. Pass "1" as first
               argument to alphabetically sort genotype.
  Returntype : string
  Exceptions : none
  Caller     : general
  Status     : Stable

=cut

sub genotype_string {
  my $self = shift;
  my $sort = shift;

  my @gt = @{$self->genotype || []};
  @gt = sort @gt if defined($sort);

  return join '|', @gt;
}

=head2 variation

  Arg [1]    : (optional) Bio::EnsEMBL::Variation::Variation $var
  Example    : $var = $genotype->variation();
  Description: Getter/Setter for the Variation as
  Returntype : Bio::EnsEMBL::Variation::Variation
  Exceptions : throw on bad argument
  Caller     : general
  Status     : Stable

=cut

sub variation {
  my $self = shift;

  if(@_) {
    my $v = shift;
    if(defined($v) && (!ref($v) || !$v->isa('Bio::EnsEMBL::Variation::Variation'))) {
      throw('Bio::EnsEMBL::Variation::Variation argument expected');
    }
    return $self->{variation} = $v;
  }

  if(!defined($self->{variation}) && defined($self->{_variation_id})) {
    my $va = $self->adaptor->db->get_VariationAdaptor;

    if(defined($va)) {
      my $v = $va->fetch_by_dbID($self->{_variation_id});

      if(defined($v)) {
        $self->{variation} = $v;
      }
    }
  }

  return $self->{'variation'};
}

=head2 subsnp

  Arg [1]    : string $newval (optional)
               The new value to set the subsnp attribute to
  Example    : print $genotype->subsnp();
  Description: Getter/Setter for the subsnp attribute.
  Returntype : string
  Exceptions : none
  Caller     : general
  Status     : Stable

=cut

sub subsnp {
  my $self = shift;
  if (@_) {
    $self->{'subsnp'} = shift;
  }

  my $ssid = $self->{'subsnp'};
  if (defined($ssid)) {
	  $ssid = 'ss'. $ssid unless $ssid =~ /^ss/;
  }

  return $ssid;
}

=head2 subsnp_handle

  Arg [1]    : string $newval (optional)
               The new value to set the subsnp_handle attribute to
  Example    : print $genotype->subsnp_handle();
  Description: Getter/Setter for the subsnp_handle attribute.
  Returntype : string
  Exceptions : none
  Caller     : general
  Status     : Stable

=cut

sub subsnp_handle {
  my $self = shift;
  my $handle = shift;

  # if changing handle
  if (defined($handle)) {
    $self->{'subsnp_handle'} = $handle;
  }
  elsif (!defined($self->{'subsnp_handle'})) {
    # Check that this allele has an adaptor attached
    assert_ref($self->adaptor(), 'Bio::EnsEMBL::Variation::DBSQL::BaseGenotypeAdaptor');
    $self->{'subsnp_handle'} = $self->adaptor->get_subsnp_handle($self);
  }

  return $self->{'subsnp_handle'};
}

=head2 ambiguity_code

  Example    : print $genotype->ambiguity_code();
  Description: Get the ambiguity code for this genotype
  Returntype : string
  Exceptions : none
  Caller     : general
  Status     : Stable

=cut

sub ambiguity_code {
  return strain_ambiguity_code($_[0]->genotype_string);
}

=head2 phased

  Example    : $p = $genotype->phased()
  Description: Getter for the phased status of this genotype.
  Returntype : int
  Exceptions : none
  Caller     : general
  Status     : Stable

=cut

sub phased {
  return $_[0]->{phased};
}

sub AUTOLOAD {
  my $self = shift;

  my $method = $AUTOLOAD;
  $method =~ s/.*:://;

  if ($method =~ /(allele)\_?(\d+)/) {
    $method = $1;
    unshift @_, $2;
  }
  else {
    return;
  }

  return $self->$method(@_);
}

1;


text:
Clumbers in Australia and New Zealand – A Brief Review 2001
by Jan Irving | 1 Apr 2001 | History
written for the Swedish Clumber Club
Clumbers arrived in Australia in 1883; the first pair imported came directly from the ancestral home of Clumber Park.
Since then, fortunes have been mixed over the decades; but again into this new century, the breed looks to be well established. And there have certainly been a lot more enquiries about Clumbers in the last few months, the latest, at 10pm last night!
Found across Australia, there is a small population of retired show dogs in Queensland and one at least who has begun training for tracking and obedience. In New South Wales, for the first time ever I suspect, there is a strong contingent with the three of the latest DaleEnd litter and two bred by Erinveine being regularly shown, and with many Gundog and higher awards to their credit too. In Victoria, the task has again fallen to Erinveine to ensure the breed is represented at shows throughout the year, and the last three years have been our most succesful yet with a huge hoard of the broad sashes for Gundog and higher wins. In Tasmania, the population is fast aging with none exhibited for two or three years now. In South Australia there are some twenty or so resident, with just one or two making the occasional show ring appearance. In Western Australia there are now four Clumbers in the show ring, although three tend to be part-timers. And now for the first time I know of, we have a Clumber in the Northern Terriority, whose aim is to take over the running of her new household. So we have Clumbers resident in all states, and most states frequently have Clumbers in the show rings.
Across in New Zealand, my information is sketchy, but we have occasional appearances in the show ring of two local champion Erinveines with the promise of two ladies joining their ranks soon, up in the North Island. Down in the South Island it seems there haven't been any shown for five or more years now.
New Zealand has not registered a litter for many years, while in Australia three to four are generally whelped each year. The main breeder is Erinveine, who have actually claimed the Top Australian & New Zealand breeder award (and also the Top Scoring Clumber in Australia and New Zealand) since 1989. In 2000, Australia had thirty one Clumbers who competed regularly.
Amongst Australasia's most successful Clumbers in the last couple of years are Western Australia's Ch Bowhouse Storyteller (Top Australasian Male 1999), Victoria's Ch Erinveine Jury (Top Australasian Clumber 1999 and 2000), Victoria's Ch Erinveine Judge (Top Interbreed Clumber 1999) with three Best in Show (all breeds) awards to his credit in 2001 to May this year, New South Wales' Ch Erinveine Nottingham Lad (Top Interbreed Clumber 2000) with many more interbreed awards to his credit already in 2001, New South Wales' Ch Daleend Highland Laddie who has claimed several Best in Group awards too, New Zealand's Ch Erinveine Fellow the first Clumber to take a show award at their premier event: Best Puppy in Show NZ National. =


Baker McKenzie acted on the issue of A$750 million Floating Rate Subordinated Notes due 2028 by DBS Group Holdings under DBS's USD$30 billion Global Medium Term Note Programme.
Baker McKenzie partner on the transaction, Duncan McGrath stated: "This was DBS's first issue of regulatory capital notes into the Australian market. We were delighted to act for the Joint Lead Managers on such a unique transaction."
Application will be made to the Singapore Exchange Securities Trading Limited for the listing of the Notes on the Singapore Exchange.
DBS is a leading financial services group in Asia. Headquartered in Singapore, the Group has a growing presence in Greater China, Southeast Asia and South Asia.
Duncan was assisted by Andrew Slucky, Emily Hunter and Daniella Lambert.


As aromatherapy makes its way more and more into mainstream living several fields of certification have presented themselves. Massage therapists, chiropractors, therapists or all sorts, are now turning to the additional benefits that aromatherapy provides. Obtaining aromatherapy certification to augment an already substantial knowledge base is just good practice when dealing with the health and well being of others. Getting aromatherapy certification is usually a simple add-on course that does not take a lot of time and is generally quite inexpensive. The ability to impart this knowledge to those in need, however, is an invaluable skill that can be quite readily accomplished.
Who Would Want to Have Aromatherapy Certification?
Many medical professionals may be interested in getting aromatherapy certification to help augment their current certification. This because of the continuing influence that aromatherapy is having on those related fields and the impact it is making in the health field as a whole. Some, on the other hand, choose to take aromatherapy certification as a whole on its own and use it to further their home business or their own interest in the topic. This happens a lot with people that are interested in starting their own business and wish to offer aromatherapy as a part of it. Many massage therapists and other body structure healing therapists use aromatherapy as a part of their healing process and would be interested in some sort of certification for it as an addition to the training they already have in their specific field.
Regardless of why you choose to take aromatherapy training, it is a tremendous addition to a body of knowledge that will create a great base knowledge for a lot of what the field has to offer. Most courses only cover the basics behind aromatherapy and require more training to encounter specifics as to what it can do to specific bodies and the like. This relates to the field of aromachology and relates to brain chemistry, as well. This may require advanced schooling or a greater train of knowledge than the traditional aromatherapy certification course may offer.
There are several schools that offer some form of aromatherapy certification. Often, community colleges or smaller educational institutes will offer some form of aromatherapy training. This is often presented in weekend courses or smaller doses so as to suit the occupational scheduling demands of most of the students. As many use aromatherapy certification as an appendix to their existent portfolio, finding the time to complete the course becomes an issue as well. For this reason, many aromatherapy courses function at the convenience of the student.
Finding a school in your area is often just a matter of looking into a community events catalogue. Aromatherapy certification is often listed as an option for the general community to participate in and tends to be quite inexpensive and popular with people of all ages.


Inputting your vendors into Focus will enable you to run Inventory reports against specific vendors. This will allow you to place your orders easier and allow you to input your received product easier.
Input the inventory groups that you would like to use.
An inventory group is typically a large container of sub-groups. Typical inventory groups are the type of product sold (FOOD, BAR), some users will set it as the location of product (PANTRY, WALK-IN, FREEZER).
In addition to being able to run reports against these groups, defining them will allow you to organize your inventory for ease of count.
Input the names and corresponding groups that you are going to use.
When you order Bud Light, you order by the case. So CASE will be a unit. When you count the Bud Light, you may count by six-pack. So 6PK will be a unit. Lastly when you sell Bud Light, you will likely sell it by the bottle. So BTL will be a unit.
Input the units of measurement that you will be using in your recipes, stock units and purchase units.
You will use these units of measurement to define how you sell product, how you stock (and count) product and how you order product.
It is recommended that you define as many of your measurement units now to ease the inputting of Inventory Items in step 6.
Ingredients are the basis for your FOCUS Inventory system. You can choose to track as many or as few of your ingredients as you'd like. Our recommendation is to only track higher value, important ingredients. Tracking inconsequential ingredients (such as bay leaves, pepper or similar items) will take a lot of time, and probably not produce profitable results.
If you intend to follow along with the rest of this guide, let's input some of the items that we are going to reference in step 7.
The inventory items screen is one of the major components of Focus Inventory. Here, you will input the items that will allow you will be tracking. This is also the screen where you will input the items that will eventually define your recipes.
This window will show all of your inventory items.
This in your unique ID for the inventory items.
The Name and ID do not have to be different.
Here you can specify your vendor's item number.
This is useful for your reorder report.
This is how you sell an item.
This is how you count an item during your weekly or monthly inventory.
A Par Level is the minimum number of units that you want to have on hand.
You specify Par level by stock unit.
The data in this field is used for the Par Report and the Ordering Report.
The Min. Purchase field allows you to specify what the minimum number of purchase units you need to place with your vendor.
This is used for the Ordering Report.
In this field, you will specify your most recent purchase cost.
You will specify this number by cost of a purchase unit. Focus will do the math to bring you down to the sale unit.
This number is updated automatically when you receive your Invoices into Focus using the Invoice function.
Menu Items are what your employees ring up in FOCUS. Now that you've created your Ingredients, it's time to attach those Ingredients to the Menu Items via the Recipes tab.
First we are going to check Cost from Recipe this will allow Focus to populate the PB&J's food cost based upon the recipe we enter.
Next we are going to select the recipe ingredients.
As you can see, Focus will display the sale unit of OZ along with the corresponding cost.
In this case, we are going to specify Peanut Butter with quantity of 2.
Now specify Grape Jelly with a quantity of 1 OZ.
Note: if your recipes require more than 10 ingredients, you can build sub-recipes as inventory items. Just go back to your inventory items and press the recipes button at the bottom to build a sub-recipe.
Example, your Turkey & Ham Panini consists of 2 slices of turkey, 2 slices of ham, 1 slice of cheese, 2 slices of tomato, 2 slices of bread, one leaf of romaine lettuce and 2 OZ of garlic aioli. The garlic aioli consists of 5 ingredients. You would build the garlic aioli as an inventory item with a recipe attached to it.
This is perhaps the most important part of the inventory setup. Accuracy at this stage is the key to a successful inventory deployment.
Once you have entered the ingredients of the PB&J, you'll see that the total shows your food cost and corresponding cost vs. sale percentage.
Now go ahead and build each of your recipes for the items that you want to track.
In order to enter your weekly and monthly inventories, you will need to have an inventory worksheet. You can create multiple Inventory Worksheets, based on Vendor, Item or Inventory Subgroup. Use several worksheets to make your data entry easier.
An inventory worksheet is a report that provides you with a physical worksheet for conducting your inventory.
Checking this box will allow Focus to insert a page break after each vendor or subgroup.
Depending on your selection under Sort, you'll either see your vendors listed here or your subgroups. Select which vendors/subgroups you would like displayed on this worksheet.
Under Inventory Report Options you can specify how you want the report to return data.
Set the report to Display On Screen and set the report to a security code which you are permitted to see.
When finished, you may create additional Inventory Worksheet Reports.
Now that you have built the backbone of your inventory system, you'll need to enter your beginning inventory into Focus.
From your FOCUS Setup Dashboard press the Inventories button.
Press New to start a new inventory count.
Once you have verified your information is correct press Post.
You now understand how to enter your starting inventory; the next step will be inputting your daily or weekly incoming product.
From your Back Office Dashboard press the Invoices button.
Select the Inventory Worksheet that corresponds to the items that you have received.
Note in the example above, the "Sysco Foods" worksheet has been selected. In the resulting Invoice entry screen, only items where "Sysco Foods" is the vendor are shown.
You will now see the Invoice entry screen.
Now, enter the quantity received.
You can also adjust the product price, if it has changed.
If you update the price, the price change will carry all the way through Focus and modify your food cost appropriately.
Once you have entered all of your received items, you'll now press Save.
Once you've verified that your data is correct, press Post to store your data.
You have now gone through the process of building your inventory backbone. You've also learned how to enter weekly inventories and how to enter invoices for product that you have received. The next step is running your inventory reports.
You're predominately going to run 5 reports using your Focus Inventory data.
This report will show you what you started with, what you have sold, what you have received and what you should have on hand. Under ideal circumstances, your projected ending inventory will match your actual on-hand inventory. However, that seldom happens. Instead, you'll have a variance.
This is the principal report that you will use for counting your stock.
This report will show you what you should expect to have on hand. It will take your beginning inventory, plus any purchases and subtract your quantity sold to give you an expected on-hand quantity.
This report is designed to be run for a time frame, giving you an idea of what items you need to have prepared. This report will breakdown the specified ingredient by interval (minutes in the day) and show you the previous dates along with an average.
This report will allow you to see exactly what you need to order from a particular vendor, based upon your par levels.
Note: these are sample reports and may not reflect your specific data.