if(!this.JSON){
this.JSON={}}
(function(){
function f(n){
return n<10 ? '0'+n : n}
if(typeof Date.prototype.toJSON !=='function'){
Date.prototype.toJSON=function(key){
return isFinite(this.valueOf())?
this.getUTCFullYear()+'-'+
f(this.getUTCMonth()+1)+'-'+
f(this.getUTCDate())+'T'+
f(this.getUTCHours())+':'+
f(this.getUTCMinutes())+':'+
f(this.getUTCSeconds())+'Z' : null}
String.prototype.toJSON=
Number.prototype.toJSON=
Boolean.prototype.toJSON=function(key){
return this.valueOf()}}
var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
gap,
indent,
meta={
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'"' : '\\"',
'\\': '\\\\'
},
rep
function quote(string){
escapable.lastIndex=0
return escapable.test(string)?
'"'+string.replace(escapable,function(a){
var c=meta[a]
return typeof c==='string' ? c :
'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4)
})+'"' :
'"'+string+'"'}
function str(key,holder){
var i,
k,
v,
length,
mind=gap,
partial,
value=holder[key]
if(value&&typeof value==='object'&&
typeof value.toJSON==='function'){
value=value.toJSON(key)}
if(typeof rep==='function'){
value=rep.call(holder,key,value)}
switch(typeof value){
case 'string':
return quote(value)
case 'number':
return isFinite(value)? String(value): 'null'
case 'boolean':
case 'null':
return String(value)
case 'object':
if(!value){
return 'null'}
gap+=indent
partial=[]
if(Object.prototype.toString.apply(value)==='[object Array]'){
length=value.length
for(i=0;i<length;i+=1){
partial[i]=str(i,value)|| 'null'}
v=partial.length===0 ? '[]' :
gap ? '[\n'+gap+
partial.join(',\n'+gap)+'\n'+
mind+']' :
'['+partial.join(',')+']'
gap=mind
return v}
if(rep&&typeof rep==='object'){
length=rep.length
for(i=0;i<length;i+=1){
k=rep[i]
if(typeof k==='string'){
v=str(k,value)
if(v){
partial.push(quote(k)+(gap ? ': ' : ':')+v)}}}
}else{
for(k in value){
if(Object.hasOwnProperty.call(value,k)){
v=str(k,value)
if(v){
partial.push(quote(k)+(gap ? ': ' : ':')+v)}}}}
v=partial.length===0 ? '{}' :
gap ? '{\n'+gap+partial.join(',\n'+gap)+'\n'+
mind+'}' : '{'+partial.join(',')+'}'
gap=mind
return v}}
if(typeof JSON.stringify !=='function'){
JSON.stringify=function(value,replacer,space){
var i
gap=''
indent=''
if(typeof space==='number'){
for(i=0;i<space;i+=1){
indent+=' '}
}else if(typeof space==='string'){
indent=space}
rep=replacer
if(replacer&&typeof replacer !=='function'&&
(typeof replacer !=='object' ||
typeof replacer.length !=='number')){
throw new Error('JSON.stringify')}
return str('',{'': value})}}
if(typeof JSON.parse !=='function'){
JSON.parse=function(text,reviver){
var j
function walk(holder,key){
var k,v,value=holder[key]
if(value&&typeof value==='object'){
for(k in value){
if(Object.hasOwnProperty.call(value,k)){
v=walk(value,k)
if(v !==undefined){
value[k]=v
}else{
delete value[k]}}}}
return reviver.call(holder,key,value)}
cx.lastIndex=0
if(cx.test(text)){
text=text.replace(cx,function(a){
return '\\u'+
('0000'+a.charCodeAt(0).toString(16)).slice(-4)
})}
if(/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g,''))){
j=eval('('+text+')')
return typeof reviver==='function' ?
walk({'': j},''): j}
throw new SyntaxError('JSON.parse')}}
}())
