Hopefully multiphase macro.


Photosynthesis protocol which includes ECS, Phi2, and other similar protocols.
// CALCULATIONS FOR PROTON MOTIVE FORCE VIA ECS PORTION OF THE TRACE
//----------------------------

var output = {};
var spad;
var data = json.data_raw;
var vhplus;
var tau;
var ECSt;
var quality_flag = 0;
var i = 0;
var j = 0;
var h = 0;
var k = 0;
var smooth1 = data.slice(300,600);
var smooth0 = data.slice(300,600);

///*

var pulsedistance = 1; // pulse distance for the ECS portion of the trace in seconds
var ecsPulses = 300; // pulses during each light cycle duing ECS portion of trace (300 light on, 300 light off, 300 light on)
var fit_cutoff = .01; // valueless number indicating what portion of the decay curve to pass to the decay fitting subroutine
var hit_cutoff_times = 1;  // this is a counter to ensure we don't just hit a weird portion of the curve and cutoff too soon.   

// we need an array representing the time (in us) and data for each pulse in the ECS trace.  Subtract first and less point so it's 898 points total

var timeArray = [];
for (var i = 1; i < ecsPulses*3+1; i++) {
  timeArray[i-1] = pulsedistance*i;
}
var ecsArray = data.slice(0,ecsPulses*3);

// the very first pulse is often low.  Just set it to the 2nd pulse by default
ecsArray[0] = ecsArray[1];
// now check for big spikes
for (var i = 1; i < ecsArray.length; i++) {
// this line should be flat, or slightly sloped.  So if there are any big spikes (> 10% of the previous value) then set it equal to the previous value
  if (ecsArray[i] > 1.10*ecsArray[i-1]) {
    ecsArray[i] = ecsArray[i-1];
  }
}

//output["ecsArray raw"] = data.slice(0,ecsPulses*3);
// sanity check - do the arrays look as we expect?
//output["all_ecs length"] = ecsArray.length;
//output["all_time length"] = timeArray.length;
//output["ecsArray cleaned"] = ecsArray;

// first lets make the ECS trace flat, in case for some reason it's tilted up or down. Skip first and last point in case there were blips

var flattenData = ecsArray.slice(0,ecsPulses);
var flattenTime = timeArray.slice(0,ecsPulses);

// make some error catching things - standard deviation of the first portion of the trace... etc.
var flattenData_std = MathSTDEV(flattenData);
var endOfTrace_std =  MathSTDEV(ecsArray.slice(ecsPulses*2,ecsPulses*3));
//output["flattenData_std"] = flattenData_std;
//output["endOfTrace_std"] = endOfTrace_std;

// if the standard deviation is too high, then let's not output ECS values

// now let's run a regression to determine the slope
  
var flattenReg = MathLINREG(flattenTime,flattenData);

//output["flatten slope"] = MathROUND(flattenReg.m,4);
//output["flatten y-int"] = flattenReg.b;
// sanity check - what does the slope look like before by checking the first and last value in the initial light period?  Compare with after the flattening adjustment
//output["ecsArray pre 0"] = ecsArray[0];
//output["ecsArray pre 300"] = ecsArray[300];
//output["ecsArray"] = ecsArray;


// now we assume this slope applies to the whole ECS trace, and subtract off the slope at each point

var ecsArray_flat = ecsArray.slice(0,ecsPulses*3);
for (var i = 0; i < timeArray.length; i++) {
  var adjustment = flattenReg.m*timeArray[i]; 
  ecsArray_flat[i] = ecsArray_flat[i]-adjustment;
}
// now we can calculate the initial and max ecs values to calculate ECSt
// calculated as the median value within 25 pulses of the light-on phase (minimum) and within 50 pulses of the light off phase (maximum)
ecs_initial = MathROUND(MathMEDIAN(ecsArray_flat.slice(ecsPulses-25,ecsPulses)),2);
ecs_max = MathROUND(MathMEDIAN(ecsArray_flat.slice(ecsPulses*2-100,ecsPulses*2)),2);
ecst_estimate = ecs_max - ecs_initial;
/*
output["ecs_initial"] = MathROUND(MathMEDIAN(ecsArray_flat.slice(ecsPulses-25,ecsPulses)),2);
output["ecs_max"] = MathROUND(MathMEDIAN(ecsArray_flat.slice(ecsPulses*2-100,ecsPulses*2)),2);
*/
//output["ecsArray flattened"] = ecsArray_flat;
// sanity check - ok these two numbers should be much closer to each other (slope has moved towards 0), and make sure our flattening worked
//output["ecsArray post 0"] = ecsArray_flat[0];
//output["ecsArray post 300"] = ecsArray_flat[300];

// Then convert these values into absorbance in the form abs = -log(Io/I), where we set Io to ecs_initial.  
// For the decay fitting subroutine, we also try to set the estimated asymptote (ecs_max) to zero - this helps the fitting subroutine reduce iterations to converge to the correct value
ecsArray_flat_log = [];
for (var i = 0; i < timeArray.length; i++) {
  var abs = MathLOG(ecs_initial/(ecsArray_flat[i])); 
  ecsArray_flat_log[i] = abs - MathLOG(ecs_initial/ecs_max);
}

//output["ECS full"] = ecsArray_flat_log;
/*
  output["ecs_r_squared"] = flattenReg.r;

if (ecs_initial <= 8000) {
  danger("There was a technical error with your measurement, please retake the measurement", output);
}

else if (ecs_initial >= 58000) {
  danger("There was a technical error with your measurement, please retake the measurement", output);
}
if (ecst_estimate < 2 || json.light_intensity < 50) {
  output["ECSt"] = 0;
  output["vH+"] = 0;
  output["gH+"] = 0;
  warning("proton motive force signal too low.  May be due to low ambient light, or normal biological variation.  ECSt, vH+, and gH+ have been set to zero", output);
}
if (flattenData_std > 25 || endOfTrace_std > 25) {
  output["ECSt"] = "NA";
  output["vH+"] = "NA";
  output["gH+"] = "NA";
  warning("Proton Motive Force too noisy", output);
}
if (!(flattenData_std > 25 || endOfTrace_std > 25 || ecst_estimate < 2 || json.light_intensity < 50)) {
  // Now we fit a best fit line to the curve.  We need to put our data in the format [[x,y],[x,y]...] first though
  var expData = ecsArray_flat_log.slice(ecsPulses,ecsPulses+100);
  var expTime = [];
  // normalize time to zero for the fit
  for (var i = 0; i < timeArray.slice(ecsPulses, ecsPulses*2).length; i++) {
    expTime.push(i);
  }
  //output["time array"] = expTime;
//  output["ECS decay"] = expData;

  var expFitArray = [];
  for (var i = 0; i < 100; i++) {
    expFitArray[i] = [expTime[i], expData[i]];
  }
  
  expReg = MathEXPINVREG(expFitArray);

  // questions for kevin - ECSt would be y int + outputted asymptote, correct?

  //output["asymptote"] = expReg.asymptote;
  output["ECSt"] = MathROUND(expReg.results[0],4);
  //output["expFit slope"] = expReg.slope;
  output["vH+"] = MathROUND(expReg.slope,8);
  //output["expFit lifetime"] = expReg.lifetime;
  output["gH+"] = MathROUND(expReg.lifetime,4);
}

// Check to make sure that the detector2 setting which determines the intensity of the green LED is not zero or maxed
if (json.detector_read2 == 65535 || json.detector_read2 < 1) {
  danger("Something is wrong with the auto-intensity calibration detector_read2.  Make sure device is stable and completely clamped on measurement.  Measure again.", output);
}

//  
//  

// CALCULATIONS FOR ABSORBANCE / SPAD PORTION OF THE TRACE
//----------------------------




// so the raw value needs to be >~2000, while the 940 needs to be greater than ~5000, otherwise it's out of range
// the acceptable range is different for each blank (1,2,3) thus a separate if statement for each blank.
// once you hit an intensity which is within the acceptable range, then keep that value and skip the rest


/*
    if (minolta_spad <= 2) {
      info("Chlorophyll Content SPAD is very low.  If leaf is visibly green, ensure leaf completely covers the light guide and retry.  If still too low, consider recalibrating device.", output);
    }
    else if (minolta_spad1 >= 100) {
      info("Chlorophyll Content SPAD is very high.  If this value is associated with a typical leaf, consider recalibrating device.", output);
    }
*/

// calculate chlorophyll content SPAD values with Minolta SPAD calibration -->

/*
if (choose == 0) {
    output ["SPAD"]  = 0;
    output ["SPAD intensity"]  = 0;
  	
	danger("Chlorophyll content SPAD is outside the acceptable range.  The leaf may be too thick, too thin, or have holes in it.", output);
}
else if (choose == 1) {
    output ["SPAD"]  = MathROUND(minolta_spad1,2);
    output ["SPAD intensity"]  = 1;
    if (minolta_spad1 <= 2) {
      info("Chlorophyll Content SPAD is very low.  If leaf is visibly green, ensure leaf completely covers the light guide and retry.  If still too low, consider recalibrating device.", output);
    }
    else if (minolta_spad1 >= 100) {
      info("Chlorophyll Content SPAD is very high.  If this value is associated with a typical leaf, consider recalibrating device.", output);
    }
}
else if (choose == 2) {
    output ["SPAD"]  = MathROUND(minolta_spad2,2);
    output ["SPAD intensity"]  = 2;
	if (minolta_spad2 <= 2) {
      info("Chlorophyll Content SPAD is very low.  If leaf is visibly green, ensure leaf completely covers the light guide and retry.  If still too low, consider recalibrating device.", output);
    }
    else if (minolta_spad2 >= 100) {
      info("Chlorophyll Content SPAD is very high.  If this value is associated with a typical leaf, consider recalibrating device.", output);
    }
}
else if (choose == 3) {
    output ["SPAD"]  = MathROUND(minolta_spad3,2);
    output ["SPAD intensity"]  = 3;
	if (minolta_spad3 <= 2) {
      info("Chlorophyll Content SPAD is very low.  If leaf is visibly green, ensure leaf completely covers the light guide and retry.  If still too low, consider recalibrating device.", output);
    }
    else if (minolta_spad3 >= 100) {
      info("Chlorophyll Content SPAD is very high.  If this value is associated with a typical leaf, consider recalibrating device.", output);
    }
}
*/

// consider adding some warnings here... could be noisy, but also if the signal is > blank (suggest to recalibate?)



// consider adding some warnings here... could be noisy, but also if the signal is > blank (suggest to recalibate?)


// CALCULATIONS FOR PHI2 PORTION OF THE TRACE
//----------------------------

// calculate the ir baseline for LED 3 which is used as the measuring light.  This subtract IR generated by the LED from the IR generated by the plant
//----------------------------
var sample_cal = json.detector_read1;

var shinyness = (sample_cal-json.recall["ir_baseline_yint[5]"])/json.recall["ir_baseline_slope[5]"]; // where 0 is dull black electrical tape, and 1 is shiny aluminum
var baseline = json.recall["ir_baseline_slope[3]"]*shinyness+json.recall["ir_baseline_yint[3]"];

if (!baseline || !json.recall["ir_baseline_yint[5]"] || sample_cal == 65535) {						// if it hasn't been calibrated or there's an error or it's maxed, set baseline == 0
  baseline = 0;
}

/*
output["shinyness"] = shinyness;
output["baseline"] = baseline;
output["recall led slope"] = json.recall["ir_baseline_slope[3]"];
output["recall led yint"] = json.recall["ir_baseline_yint[3]"];
output["recall cal slope"] = json.recall["ir_baseline_slope[5]"];
output["recall cal yint"] = json.recall["ir_baseline_yint[5]"];
output["sample led"] = json.detector_read1;
*/

//var sample_cal = MathMEAN(data.slice(2,18));

var inverse_intensity = [1/4500,1/4050,1/3600,1/3150];
var ps2_starts = 900; // when does the Phi2 measurement start

// Set our Apparent FmPrime, 3 FmPrime steps, and Fs to calculate both traditional fv/fm and new Multi-phase flash fv/fm
//----------------------------
var Fs = MathMEAN(data.slice(ps2_starts + 1,ps2_starts + 4)) - baseline; // take only the first 4 values in the Fs range, excluding the very first
var Fs_std = MathSTDEV(data.slice(ps2_starts + 1,ps2_starts + 4)); // create standard deviation for this value for error checking

var sat_vals = data.slice(ps2_starts + 25,ps2_starts + 48).sort();  // sort the saturating light values from low to high
var AFmP = MathMEAN(sat_vals.slice(2,20)) - baseline; // take the 18 largest values and average them
var AFmP_std = MathSTDEV(sat_vals); // create standard deviation for this value for error checkingjson.data_raw.slice(953,955)

sat_vals = data.slice(ps2_starts + 84,ps2_starts + 110).sort();  // sort the saturating light values from low to high
var FmP_end = MathMEAN(sat_vals.slice(2,23)) - baseline; // take the 21 largest values and average them
var FmP_end_std = MathSTDEV(sat_vals); // create standard deviation for this value for error checking

sat_vals = data.slice(ps2_starts + 52,ps2_starts + 60).sort();  // sort the saturating light values from low to high
var FmP_step1 = MathMEAN(sat_vals.slice(2,6)) - baseline; // take the 4 largest values and average them
var FmP_step1_std = MathSTDEV(sat_vals); // create standard deviation for this value for error checking

sat_vals = data.slice(ps2_starts + 62,ps2_starts + 70).sort();  // sort the saturating light values from low to high
var FmP_step2 = MathMEAN(sat_vals.slice(2,6)) - baseline; // take the 4 largest values and average them
var FmP_step2_std = MathSTDEV(sat_vals); // create standard deviation for this value for error checking

sat_vals = data.slice(ps2_starts + 72,ps2_starts + 80).sort();  // sort the saturating light values from low to high
var FmP_step3 = MathMEAN(sat_vals.slice(2,6)) - baseline; // take the 4 largest values and average them
var FmP_step3_std = MathSTDEV(sat_vals); // create standard deviation for this value for error checking

// Calculations for F0'
// ----------------------------
var FoPrime_values = json.data_raw.slice(ps2_starts + 160,ps2_starts + 270).sort();
var FoPrime = MathMEAN(FoPrime_values.slice(5,10)) - baseline;
var FoPrime_std = MathSTDEV(FoPrime_values); // create standard deviation for this value for error checking

// Calculations for corrected FmPrime using multi-phase flash
// ----------------------------
var reg = MathLINREG(inverse_intensity, [AFmP,FmP_step1,FmP_step2,FmP_step3]);

// Calculate Phi2 w/ and w/out multi-phase flash
// ----------------------------
var fvfm_noMPF = (AFmP-Fs)/AFmP;
var fvfm_MPF = (reg.b-Fs)/reg.b;


// Calculate NPQt, PhiNPQ, PhiNO, qL w/ and w/out multi-phase flash
// ----------------------------
var npqt_MPF = (4.88 / ((reg.b / FoPrime) -1) )-1;
//var npqt_noMPF = (4.88 / ((AFmP / FoPrime) -1) )-1;
var qL_MPF = ((reg.b - Fs)*FoPrime)/((reg.b-FoPrime)*Fs);
//var qL_noMPF = ((AFmP - Fs)*FoPrime)/((AFmP-FoPrime)*Fs);
//var PhiNO_MPF = 1/(npqt_MPF + 1 + qL_MPF*4.88); //based on equation 52 in Kramer et al., 2004 PRES
//var PhiNO_noMPF = 1/(npqt_noMPF + 1 + qL_noMPF*4.88); //based on equation 52 in Kramer et al., 2004 PRES
//var PhiNPQ_MPF = 1-fvfm_MPF-PhiNO_MPF; //based on equation 53 in Kramer et al., 2004 PRES 
//var PhiNPQ_noMPF = 1-fvfm_noMPF-PhiNO_noMPF; //based on equation 53 in Kramer et al., 2004 PRES 

var qP_MPF = (reg.b - Fs)/(reg.b - FoPrime);
var qP_noMPF = (FmPrime - Fs)/(FmPrime - FoPrime);
var FvP_FmP_MPF = (reg.b-FoPrime)/reg.b;
var FvP_FmP_noMPF = (AFmP-FoPrime)/AFmP;

// Create the variables to be printed (assume to use the MPF values unless there is a good reason not to)
// ----------------------------
var fvfm = fvfm_MPF;
var npqt = npqt_MPF;json.data_raw.slice(313,1183);
var qL = qL_MPF;
var FmPrime = reg.b;
var qP = qP_MPF;
var FvP_FmP = FvP_FmP_MPF;
var b = json.b;
var r = json.r;
var g = json.g;


/****************OUTPUT VALUES FROM MACRO *******************/

// If multi-phase flash steps are flat or positive slope, then just use the normal Phi2, NPQt, PhiNPQ, PhiNO... etc.
// If Phi2 or NPQt is less than zero, make zero and give user warning.  If Phi2 is higher than .85, give user danger flag.
// ----------------------------
if (reg.m > 0) {
  fvfm = fvfm_noMPF;
  //npqt = npqt_noMPF;
  //PhiNO = PhiNO_noMPF;
  //qL = qL_noMPF;
  //qP = qP_noMPF;
  FvP_FmP = FvP_FmP_noMPF;
  
  if (fvfm <= 0) {
    output["Phi2"] 			= 0;
	warning('Phi2 is negative (should be positive).  This may be due to a sample that is not doing photosynthesis, or you may have missed the leaf.  It has been set to zero, but check raw trace and consider excluding this point.  To see original negative value, see Phi2_noMPF variable',output);
	output["Phi2_noMPF"] 	= MathROUND(npqt,3);
  }
  if (fvfm >=.85) {
    output["Phi2"] 			= -1;
	danger("Phi2 above the normal range (0 - 0.85).  Please check the raw trace and seriously consider excluding this point.", output);

  }
  else {
	  output["Phi2"] 		= MathROUND(fvfm,3);
  }
} 

// Otherwise, use the multi-phase flash calculation for Phi2, NPQt, PhiNPQ, PhiNO... etc.
// If Phi2 or NPQt is less than zero, make zero and give user warning.  If Phi2 is higher than .85, give user danger flag.
// ----------------------------


// only display LEF if there is a light intensity measurement > 0 
// ----------------------------
if (typeof json.light_intensity != "undefined" && json.light_intensity > 0) {
	output["LEF"] 		= MathROUND((fvfm  * 0.45 * json.light_intensity),3);
}

if (Fs_std > 100) {
	danger("noisy Fs", output);
}
/*
if (AFmP_std > 300) {
	danger("noisy FmPrime", output);
}
*/
if (FmP_step1_std > 120 | FmP_step2_std > 120 | FmP_step3_std > 120 | FmP_end_std > 300) {
	danger("noisy  multi-phase flash steps",output);
}

if (FoPrime_std > 150) {
	danger("noisy FoPrime", output);
}
/*
if (reg.m > 0) {
	info("Used Phi2 and not Phi2 MPF - ambient light level was too low to apply MPF calculation", output);
}
if (FmP_end/AFmP - AFmP/AFmP > .1) {	
	info("FmPrime slopes down.  This may mean that saturating flash is not bright enough... consider using a protocol with lower saturating light on these samples", output);
}
if (FmP_end/AFmP - AFmP/AFmP < -.1) {
	info("FmPrime slopes up.  This may mean that saturating flash is too bright... consider using a protocol with higher saturating light on these samples",output);
}
*/

//output["Phi2_MPF"] 	= MathROUND(npqt,3);
output["Phi2"]			= MathROUND(fvfm,3);
//	output["PhiNO"]		= MathROUND(PhiNO,3);
//output["qL"]			= MathROUND(qL,3);
//output['FvP/FmP']		= MathROUND(FvP_FmP,3);
//output['qP']			= MathROUND(qP,3);
output["FmPrime"] 		= MathROUND(FmPrime,3);
output["Fs"]			= MathROUND(Fs,1);
output["FoPrime"]		= MathROUND(FoPrime,0);
output["RFd"]           = Number(MathROUND(((FmPrime/Fs)-1),3));
output["ratio MPF/noMPF, Phi2"] = MathROUND(fvfm_MPF / fvfm_noMPF,5);
output["MPF_slope"] 	= MathROUND(reg.m,3);
output["MPF_rsquared"] 	= MathROUND(reg.r,3);


//output["FmP_step1"] = MathROUND(FmP_step1,3);
//output["FmP_step2"] = MathROUND(FmP_step2,3);
//output["FmP_step3"] = MathROUND(FmP_step3,3);
//output["intensity inverse"] = inverse_intensity;
//output["steps"] = [AFmP,FmP_step1,FmP_step2,FmP_step3];
//output["slopey"] = FmP_end/AFmP - AFmP/AFmP ;

  output["baseline"] 	= baseline;

// Check for data quality issues and add warning or danger flags
//----------------------------

// Finally, use the "order" object to define the order of the outputs (focus on the top 6 most important for the user to see)
//----------------------------
output["Light Intensity (PAR)"] = json.light_intensity;
output["Leaf Temp Differential"] = json.contactless_temp - json.temperature;  	
output["Ambient Temperature"] = json.temperature;
output["Ambient Humidity"] = json.humidity;
output["Leaf Angle"] = json.angle;


maxvalue = MathMAX([json.r,json.g,json.b]);
output["R"] = Number(json.r);
output["G"] = Number(json.g);
output["B"] = Number(json.b);
//output["rval"] = json.r*(255/maxvalue);
//output["gval"] = json.g*(255/maxvalue);
//output["bval"] = json.b*(255/maxvalue);

//output["Color"] = [MathROUND(json.r*(255/maxvalue),2),MathROUND(json.g*(255/maxvalue),2),MathROUND(json.b*(255/maxvalue),2)];

return output;
{
  "time_offset": 300,
  "time": 1510933046330,
  "device_name": "MultispeQ",
  "device_version": "1",
  "device_id": "01:12:35:51",
  "device_battery": 99,
  "device_firmware": 1.2,
  "sample": [
    {
      "time": 1510933046345,
      "protocol_id": 1,
      "label": "",
      "detector_read1": 35332,
      "detector_read2": 16440,
      "light_intensity": 17.752,
      "r": 16,
      "g": 7,
      "b": 5,
      "light_intensity_raw": 26,
      "temperature": 26.26,
      "humidity": 26.546,
      "pressure": 990.396,
      "temperature2": 26.29,
      "humidity2": 26.811,
      "pressure2": 990.608,
      "contactless_temp": 22.15,
      "thickness": 0.38,
      "compass_direction": "E",
      "compass": 90,
      "angle": 32.56,
      "angle_direction": "S",
      "pitch": 31.57,
      "roll": 8.4,
      "recall": {
        "time": 1510933061205,
        "colorcal_blank1[1]": 19307.5,
        "colorcal_blank1[2]": 25404.5,
        "colorcal_blank1[3]": 36655,
        "colorcal_blank1[4]": 33291,
        "colorcal_blank1[6]": 37420.5,
        "colorcal_blank1[8]": 38198.5,
        "colorcal_blank1[9]": 32627.5,
        "colorcal_blank1[10]": 36417.5,
        "colorcal_blank2[1]": 20224,
        "colorcal_blank2[2]": 18405,
        "colorcal_blank2[3]": 25152.5,
        "colorcal_blank2[4]": 17618.5,
        "colorcal_blank2[6]": 17408.5,
        "colorcal_blank2[8]": 18925,
        "colorcal_blank2[9]": 18593,
        "colorcal_blank2[10]": 16625,
        "colorcal_blank3[1]": 17201,
        "colorcal_blank3[2]": 9639.5,
        "colorcal_blank3[3]": 21493,
        "colorcal_blank3[4]": 11991,
        "colorcal_blank3[6]": 6133,
        "colorcal_blank3[8]": 6884.5,
        "colorcal_blank3[9]": 5478,
        "colorcal_blank3[10]": 5989,
        "colorcal_intensity1_slope[2]": 2.615,
        "colorcal_intensity1_yint[2]": 2.5,
        "colorcal_intensity2_slope[2]": 2.561,
        "colorcal_intensity2_yint[2]": -1,
        "colorcal_intensity3_slope[2]": 2.685,
        "colorcal_intensity3_yint[2]": -19.4,
        "ir_baseline_slope[5]": 12973,
        "ir_baseline_yint[5]": 20084.5,
        "ir_baseline_slope[3]": 725,
        "ir_baseline_yint[3]": 936
      },
      "data_raw": [
        42476,
        42394,
        42385,
        42386,
        42385,
        42382,
        42399,
        42400,
        42390,
        42382,
        42401,
        42387,
        42393,
        42394,
        42388,
        42382,
        42376,
        42374,
        42382,
        42376,
        42374,
        42379,
        42389,
        42383,
        42391,
        42389,
        42390,
        42384,
        42380,
        42375,
        42391,
        42377,
        42381,
        42383,
        42397,
        42377,
        42399,
        42383,
        42381,
        42399,
        42400,
        42387,
        42385,
        42376,
        42379,
        42378,
        42383,
        42387,
        42388,
        42393,
        42392,
        42393,
        42394,
        42394,
        42381,
        42401,
        42389,
        42392,
        42394,
        42399,
        42391,
        42389,
        42393,
        42376,
        42371,
        42385,
        42379,
        42392,
        42396,
        42407,
        42403,
        42407,
        42408,
        42405,
        42404,
        42402,
        42398,
        42394,
        42405,
        42395,
        42401,
        42384,
        42402,
        42406,
        42394,
        42400,
        42396,
        42401,
        42402,
        42395,
        42397,
        42411,
        42402,
        42403,
        42413,
        42394,
        42403,
        42408,
        42401,
        42389,
        42395,
        42402,
        42412,
        42400,
        42405,
        42397,
        42389,
        42391,
        42394,
        42393,
        42383,
        42394,
        42399,
        42407,
        42403,
        42398,
        42407,
        42415,
        42426,
        42415,
        42412,
        42409,
        42406,
        42403,
        42400,
        42406,
        42403,
        42418,
        42416,
        42418,
        42421,
        42408,
        42398,
        42407,
        42398,
        42397,
        42399,
        42395,
        42408,
        42405,
        42403,
        42403,
        42411,
        42409,
        42402,
        42400,
        42404,
        42413,
        42403,
        42399,
        42411,
        42391,
        42391,
        42402,
        42401,
        42403,
        42411,
        42404,
        42407,
        42408,
        42405,
        42406,
        42410,
        42409,
        42407,
        42414,
        42417,
        42415,
        42405,
        42413,
        42411,
        42413,
        42419,
        42419,
        42417,
        42431,
        42408,
        42427,
        42423,
        42429,
        42426,
        42419,
        42422,
        42413,
        42404,
        42409,
        42414,
        42421,
        42414,
        42407,
        42421,
        42442,
        42433,
        42427,
        42434,
        42426,
        42429,
        42435,
        42433,
        42426,
        42424,
        42418,
        42415,
        42407,
        42420,
        42417,
        42414,
        42419,
        42401,
        42421,
        42428,
        42426,
        42422,
        42435,
        42432,
        42435,
        42429,
        42433,
        42432,
        42413,
        42425,
        42414,
        42432,
        42436,
        42432,
        42419,
        42444,
        42441,
        42438,
        42431,
        42424,
        42424,
        42414,
        42402,
        42402,
        42402,
        42413,
        42421,
        42427,
        42428,
        42424,
        42429,
        42436,
        42436,
        42435,
        42424,
        42440,
        42431,
        42439,
        42438,
        42429,
        42435,
        42432,
        42419,
        42429,
        42417,
        42425,
        42418,
        42431,
        42427,
        42418,
        42422,
        42429,
        42415,
        42424,
        42431,
        42412,
        42428,
        42419,
        42430,
        42435,
        42427,
        42437,
        42431,
        42433,
        42437,
        42439,
        42430,
        42422,
        42437,
        42435,
        42431,
        42431,
        42438,
        42431,
        42439,
        42442,
        42438,
        42430,
        42439,
        42437,
        42431,
        42434,
        42440,
        42441,
        42426,
        42432,
        42424,
        42430,
        42424,
        42513,
        42430,
        42434,
        42446,
        42441,
        42455,
        42461,
        42451,
        42457,
        42462,
        42448,
        42447,
        42458,
        42454,
        42458,
        42458,
        42465,
        42470,
        42473,
        42477,
        42475,
        42464,
        42478,
        42489,
        42484,
        42490,
        42485,
        42477,
        42481,
        42483,
        42477,
        42481,
        42473,
        42487,
        42488,
        42501,
        42496,
        42497,
        42501,
        42494,
        42497,
        42485,
        42494,
        42495,
        42482,
        42496,
        42505,
        42510,
        42488,
        42495,
        42506,
        42512,
        42519,
        42518,
        42520,
        42508,
        42513,
        42509,
        42503,
        42493,
        42477,
        42496,
        42494,
        42496,
        42512,
        42511,
        42524,
        42524,
        42513,
        42526,
        42507,
        42509,
        42528,
        42528,
        42521,
        42510,
        42503,
        42504,
        42510,
        42491,
        42499,
        42514,
        42514,
        42500,
        42493,
        42503,
        42511,
        42514,
        42527,
        42509,
        42507,
        42511,
        42523,
        42517,
        42508,
        42516,
        42524,
        42523,
        42517,
        42516,
        42530,
        42529,
        42535,
        42542,
        42552,
        42528,
        42513,
        42529,
        42516,
        42515,
        42523,
        42523,
        42534,
        42531,
        42536,
        42542,
        42547,
        42531,
        42527,
        42520,
        42533,
        42531,
        42529,
        42528,
        42527,
        42521,
        42503,
        42511,
        42520,
        42523,
        42529,
        42525,
        42533,
        42529,
        42530,
        42534,
        42523,
        42522,
        42520,
        42515,
        42515,
        42515,
        42514,
        42519,
        42526,
        42519,
        42527,
        42521,
        42521,
        42521,
        42532,
        42530,
        42527,
        42534,
        42533,
        42528,
        42529,
        42525,
        42531,
        42538,
        42541,
        42543,
        42533,
        42535,
        42532,
        42537,
        42540,
        42547,
        42526,
        42518,
        42528,
        42529,
        42523,
        42537,
        42529,
        42530,
        42528,
        42533,
        42524,
        42528,
        42527,
        42535,
        42532,
        42532,
        42531,
        42519,
        42515,
        42503,
        42510,
        42525,
        42527,
        42525,
        42535,
        42530,
        42538,
        42537,
        42542,
        42545,
        42545,
        42545,
        42535,
        42524,
        42539,
        42530,
        42527,
        42519,
        42515,
        42519,
        42530,
        42527,
        42519,
        42521,
        42526,
        42541,
        42533,
        42530,
        42534,
        42527,
        42527,
        42533,
        42506,
        42523,
        42522,
        42535,
        42542,
        42551,
        42534,
        42546,
        42559,
        42539,
        42552,
        42539,
        42545,
        42535,
        42539,
        42542,
        42538,
        42557,
        42538,
        42539,
        42542,
        42551,
        42551,
        42546,
        42534,
        42538,
        42545,
        42533,
        42520,
        42527,
        42520,
        42521,
        42521,
        42508,
        42522,
        42523,
        42526,
        42536,
        42535,
        42545,
        42539,
        42531,
        42534,
        42523,
        42530,
        42508,
        42534,
        42525,
        42528,
        42533,
        42526,
        42524,
        42534,
        42535,
        42531,
        42546,
        42536,
        42529,
        42520,
        42512,
        42517,
        42517,
        42522,
        42510,
        42517,
        42513,
        42514,
        42530,
        42531,
        42527,
        42525,
        42518,
        42510,
        42533,
        42523,
        42519,
        42527,
        42527,
        42530,
        42522,
        42614,
        42510,
        42495,
        42515,
        42519,
        42516,
        42511,
        42525,
        42510,
        42521,
        42491,
        42474,
        42491,
        42496,
        42486,
        42491,
        42486,
        42500,
        42507,
        42497,
        42501,
        42505,
        42503,
        42495,
        42495,
        42499,
        42503,
        42510,
        42479,
        42481,
        42491,
        42474,
        42473,
        42478,
        42488,
        42483,
        42484,
        42495,
        42485,
        42503,
        42493,
        42487,
        42480,
        42478,
        42483,
        42481,
        42480,
        42475,
        42487,
        42472,
        42497,
        42486,
        42452,
        42463,
        42455,
        42455,
        42470,
        42469,
        42460,
        42471,
        42457,
        42461,
        42450,
        42455,
        42444,
        42451,
        42447,
        42451,
        42444,
        42451,
        42455,
        42451,
        42459,
        42446,
        42455,
        42447,
        42437,
        42441,
        42439,
        42433,
        42440,
        42443,
        42446,
        42436,
        42451,
        42438,
        42445,
        42439,
        42433,
        42429,
        42425,
        42437,
        42420,
        42426,
        42417,
        42430,
        42431,
        42425,
        42445,
        42445,
        42432,
        42433,
        42440,
        42437,
        42438,
        42438,
        42435,
        42425,
        42423,
        42435,
        42424,
        42423,
        42412,
        42423,
        42428,
        42435,
        42416,
        42432,
        42427,
        42431,
        42426,
        42427,
        42423,
        42419,
        42416,
        42408,
        42404,
        42406,
        42405,
        42417,
        42417,
        42422,
        42427,
        42429,
        42422,
        42423,
        42434,
        42422,
        42418,
        42419,
        42414,
        42396,
        42412,
        42414,
        42402,
        42406,
        42407,
        42419,
        42419,
        42419,
        42416,
        42406,
        42429,
        42419,
        42409,
        42397,
        42390,
        42399,
        42399,
        42408,
        42402,
        42411,
        42407,
        42415,
        42409,
        42412,
        42412,
        42411,
        42427,
        42433,
        42419,
        42420,
        42416,
        42420,
        42397,
        42406,
        42402,
        42412,
        42418,
        42419,
        42421,
        42409,
        42418,
        42411,
        42416,
        42418,
        42407,
        42400,
        42406,
        42402,
        42409,
        42405,
        42404,
        42401,
        42408,
        42415,
        42405,
        42409,
        42412,
        42417,
        42405,
        42416,
        42402,
        42408,
        42404,
        42399,
        42399,
        42406,
        42388,
        42399,
        42407,
        42417,
        42414,
        42413,
        42426,
        42406,
        42410,
        42411,
        42414,
        42405,
        42401,
        42415,
        42407,
        42405,
        42406,
        42407,
        42411,
        42422,
        42428,
        42424,
        42418,
        42417,
        42417,
        42413,
        42403,
        42399,
        42400,
        42399,
        42391,
        42382,
        42392,
        42386,
        42403,
        42394,
        42393,
        42387,
        42373,
        42381,
        42379,
        42378,
        42380,
        42378,
        42386,
        42374,
        42379,
        42383,
        42388,
        42385,
        42392,
        42387,
        42375,
        42381,
        42367,
        42371,
        42375,
        42377,
        42367,
        42376,
        42367,
        42374,
        42389,
        42375,
        42371,
        42361,
        42367,
        42370,
        42365,
        42365,
        42367,
        42374,
        42365,
        42375,
        42356,
        42361,
        42363,
        42375,
        42361,
        42354,
        42359,
        42359,
        42351,
        42355,
        42366,
        42374,
        42372,
        42363,
        42374,
        42370,
        42348,
        42346,
        6366,
        6438,
        6484,
        6521,
        6543,
        6572,
        6583,
        6603,
        6607,
        6620,
        6618,
        6632,
        6632,
        6637,
        6640,
        6642,
        6645,
        6643,
        6649,
        6640,
        16065,
        17699,
        18301,
        18488,
        18549,
        18591,
        18626,
        18647,
        18665,
        18692,
        18713,
        18723,
        18735,
        18759,
        18775,
        18798,
        18798,
        18822,
        18838,
        18853,
        18857,
        18873,
        18890,
        18897,
        18914,
        18911,
        18919,
        18936,
        18943,
        18950,
        18953,
        18966,
        18975,
        18981,
        18979,
        18980,
        18992,
        18995,
        18990,
        18991,
        18999,
        18992,
        19000,
        18994,
        18997,
        19007,
        19008,
        19000,
        19007,
        19009,
        18997,
        18991,
        18999,
        18997,
        19001,
        18993,
        18998,
        19003,
        18994,
        18993,
        19001,
        18997,
        18989,
        18983,
        18986,
        18984,
        18976,
        18966,
        18969,
        18967,
        18959,
        18947,
        18945,
        18947,
        18939,
        18933,
        18925,
        18918,
        18925,
        18921,
        18917,
        18909,
        18900,
        18899,
        18894,
        18885,
        18872,
        18869,
        18867,
        18863,
        15935,
        14429,
        13491,
        12859,
        12402,
        12067,
        11797,
        11562,
        11384,
        11213,
        11079,
        10951,
        10844,
        10744,
        10647,
        10573,
        10493,
        10431,
        10370,
        10318,
        55089,
        55091,
        55095,
        55090,
        55104,
        55095,
        55105,
        55113,
        55115,
        55078
      ]
    }
  ],
  "app_os": "win",
  "app_name": "PhotosynQ",
  "app_version": "0.3.9",
  "app_device": "x86-64",
  "location": [
    "42.7229288",
    "-84.4748884"
  ],
  "notes": "its shit\n"
}
Default avatar
Created by

Alan McClain


Protocol connections:
0
Latest Update:
Nov 2017