timegiver
Version:
TimeGiver is a highly-customizable circadian lighting rhythm generator that empowers connected lighting systems to support a healthy cycle of sleep and wakefulness by taking arguments such as wake time and sunset length and returning an appropriate set of
1,268 lines (1,234 loc) • 953 kB
JavaScript
//These functions enable the conversion from degrees to radians and back, which is not built into javascript
function radianstodegrees(radians)
{
var pi = Math.PI;
return (radians * (180/pi));
}
function degreestoradians(degrees)
{
var pi = Math.PI;
return (degrees * (pi/180));
}
//TimeGiver is the main function of the script that takes arguments about rhythm parameters using key-value syntax with defaults as shown below and returns a list of 8 items describing how the lights should look at that moment according to that schedule.
exports.TimeGiver = function () //The meaning and use of these arguments is explained at length in the TimeGiver documentation.
{
time = typeof time !== 'undefined' ? time : null;
wake_time = typeof wake_time !== 'undefined' ? wake_time : 420;
bed_time = typeof bed_time !== 'undefined' ? bed_time : 1320;
wake_offset = typeof wake_offset !== 'undefined' ? wake_offset : 0;
bed_offset = typeof bed_offset !== 'undefined' ? bed_offset : 0;
max_bright = typeof max_bright !== 'undefined' ? max_bright : 1;
min_bright = typeof min_bright !== 'undefined' ? min_bright : 0.05;
max_CCT = typeof max_CCT !== 'undefined' ? max_CCT : 6500;
min_CCT = typeof min_CCT !== 'undefined' ? min_CCT : 2700;
rise_length_bright = typeof rise_length_bright !== 'undefined' ? rise_length_bright : 45;
set_length_bright = typeof set_length_bright !== 'undefined' ? set_length_bright : 180;
rise_length_CCT = typeof rise_length_CCT !== 'undefined' ? rise_length_CCT : null;
set_length_CCT = typeof set_length_CCT !== 'undefined' ? set_length_CCT : null;
rise_slope_bright = typeof rise_slope_bright !== 'undefined' ? rise_slope_bright : 0;
set_slope_bright = typeof set_slope_bright !== 'undefined' ? set_slope_bright : 0;
rise_slope_CCT = typeof rise_slope_CCT !== 'undefined' ? rise_slope_CCT : 0;
set_slope_CCT = typeof set_slope_CCT !== 'undefined' ? set_slope_CCT : 0;
max_scatdist = typeof max_scatdist !== 'undefined' ? max_scatdist : 3000;
min_scatdist = typeof min_scatdist !== 'undefined' ? min_scatdist : 2000;
max_scatangshift = typeof max_scatangshift !== 'undefined' ? max_scatangshift : 15;
min_scatangshift = typeof min_scatangshift !== 'undefined' ? min_scatangshift : 0;
max_bright_yellow = typeof max_bright_yellow !== 'undefined' ? max_bright_yellow : 1;
min_bright_yellow = typeof min_bright_yellow !== 'undefined' ? min_bright_yellow : 0.05;
max_bright_blue = typeof max_bright_blue !== 'undefined' ? max_bright_blue : 1;
min_bright_blue = typeof min_bright_blue !== 'undefined' ? min_bright_blue : 0.05;
rise_length_scatdist = typeof rise_length_scatdist !== 'undefined' ? rise_length_scatdist : null;
set_length_scatdist = typeof set_length_scatdist !== 'undefined' ? set_length_scatdist : null;
rise_length_scatangshift = typeof rise_length_scatangshift !== 'undefined' ? rise_length_scatangshift : 240;
set_length_scatangshift = typeof set_length_scatangshift !== 'undefined' ? set_length_scatangshift : 240;
rise_length_bright_yellow = typeof rise_length_bright_yellow !== 'undefined' ? rise_length_bright_yellow : 30;
set_length_bright_yellow = typeof set_length_bright_yellow !== 'undefined' ? set_length_bright_yellow : 90;
rise_length_bright_blue = typeof rise_length_bright_blue !== 'undefined' ? rise_length_bright_blue : 60;
set_length_bright_blue = typeof set_length_bright_blue !== 'undefined' ? set_length_bright_blue : 180;
rise_slope_scatdist = typeof rise_slope_scatdist !== 'undefined' ? rise_slope_scatdist : 0;
set_slope_scatdist = typeof set_slope_scatdist !== 'undefined' ? set_slope_scatdist : 0;
rise_slope_scatangshift = typeof rise_slope_scatangshift !== 'undefined' ? rise_slope_scatangshift : 0;
set_slope_scatangshift = typeof set_slope_scatangshift !== 'undefined' ? set_slope_scatangshift : 0;
rise_slope_bright_yellow = typeof rise_slope_bright_yellow !== 'undefined' ? rise_slope_bright_yellow : 0;
set_slope_bright_yellow = typeof set_slope_bright_yellow !== 'undefined' ? set_slope_bright_yellow : 0;
rise_slope_bright_blue = typeof rise_slope_bright_blue !== 'undefined' ? rise_slope_bright_blue : 0;
set_slope_bright_blue = typeof set_slope_bright_blue !== 'undefined' ? set_slope_bright_blue : 0;
if (time !== null) {var hm = time} else { //This conditional statement allows users to pass a simulated time variable that will override the real current time for all times greater than or equal to 1
var now = new Date(); //sets the variable now equal to the current date and time
var hh = now.getHours(); //sets the variable hh equal to the number of hours that have passed since the day started.
var hh_sixty = hh * 60; //sets the variable hh_sixty equal to the number of minutes in the day at the time of the last hour change.
var mm = now.getMinutes(); //sets the variable mm equal to the number of minutes since the last hour
var hm = hh_sixty + mm;}; //sets the variable hm equal to the total number of minutes that have passed since the day began.
if (wake_time - wake_offset - bed_time + bed_offset > 0 && wake_time - wake_offset - hm > 0) { //This conditional statement allows for proper handling of the edge case in which wake_time is greater than bed_time, i.e. when the user is going to bed after midnight.
var hm = (hm + 1440);
var bed_time = (bed_time + 1440);
var retret = "Wake time is greater than bed time";
} else if (wake_time - wake_offset - bed_time + bed_offset > 0) {var bed_time = (bed_time + 1440)};
var day_length = ((bed_time - bed_offset) - (wake_time - wake_offset)); //time between wake time and bed time in minutes
var half_day_length = day_length/2; //half of time between wake time and bed time in minutes
//This next set of conditional statements allows these variables to default to half of day length when it is appropriate or to be set to half of day length when null is passed.
if (rise_length_bright === null) {var rise_length_bright = half_day_length} else if ((typeof (rise_length_bright)) === "string") {var rise_length_bright_fact = rise_length_bright.slice(0, -1); var rise_length_bright = (half_day_length * rise_length_bright_fact);} else {var rise_length_bright = rise_length_bright};
if (set_length_bright === null) {var set_length_bright = half_day_length} else if ((typeof (set_length_bright)) === "string") {var set_length_bright_fact = set_length_bright.slice(0, -1); var set_length_bright = (half_day_length * set_length_bright_fact);} else {var set_length_bright = set_length_bright};
if (rise_length_CCT === null) {var rise_length_CCT = half_day_length} else if ((typeof (rise_length_CCT)) === "string") {var rise_length_CCT_fact = rise_length_CCT.slice(0, -1); var rise_length_CCT = (half_day_length * rise_length_CCT_fact);} else {var rise_length_CCT = rise_length_CCT};
if (set_length_CCT === null) {var set_length_CCT = half_day_length} else if ((typeof (set_length_CCT)) === "string") {var set_length_CCT_fact = set_length_CCT.slice(0, -1); var set_length_CCT = (half_day_length * set_length_CCT_fact);} else {var set_length_CCT = set_length_CCT};
if (rise_length_scatdist === null) {var rise_length_scatdist = half_day_length} else if ((typeof (rise_length_scatdist)) === "string") {var rise_length_scatdist_fact = rise_length_scatdist.slice(0, -1); var rise_length_scatdist = (half_day_length * rise_length_scatdist_fact);} else {var rise_length_scatdist = rise_length_scatdist};
if (set_length_scatdist === null) {var set_length_scatdist = half_day_length} else if ((typeof (set_length_scatdist)) === "string") {var set_length_scatdist_fact = set_length_scatdist.slice(0, -1); var set_length_scatdist = (half_day_length * set_length_scatdist_fact);} else {var set_length_scatdist = set_length_scatdist};
//if (rise_length_scatdist === null) {var rise_length_scatdist = half_day_length} else if ((typeof (rise_length_scatdist)) === "string") {var rise_length_scatdist_fact = rise_length_scatdist.slice(0, -1); var rise_length_scatdist = (half_day_length * rise_length_scatdist_fact);} else {var rise_length_scatdist = rise_length_scatdist};
//if (set_length_scatdist === null) {var set_length_scatdist = half_day_length} else if ((typeof (rise_length_scatdist)) === "string") {var set_length_scatdist_fact = set_length_scatdist.slice(0, -1); var set_length_scatdist = (half_day_length * set_length_scatdist_fact);} else {var set_length_scatdist = set_length_scatdist};
if (rise_length_scatangshift === null) {var rise_length_scatangshift = half_day_length} else if ((typeof (rise_length_scatangshift)) === "string") {var rise_length_scatangshift_fact = rise_length_scatangshift.slice(0, -1); var rise_length_scatangshift = (half_day_length * rise_length_scatangshift_fact);} else {var rise_length_scatangshift = rise_length_scatangshift};
if (set_length_scatangshift === null) {var set_length_scatangshift = half_day_length} else if ((typeof (set_length_scatangshift)) === "string") {var set_length_scatangshift_fact = set_length_scatangshift.slice(0, -1); var set_length_scatangshift = (half_day_length * set_length_scatangshift_fact);} else {var set_length_scatangshift = set_length_scatangshift};
if (rise_length_bright_yellow === null) {var rise_length_bright_yellow = half_day_length} else if ((typeof (rise_length_bright_yellow)) === "string") {var rise_length_bright_yellow_fact = rise_length_bright_yellow.slice(0, -1); var rise_length_bright_yellow = (half_day_length * rise_length_bright_yellow_fact);} else {var rise_length_bright_yellow = rise_length_bright_yellow};
if (set_length_bright_yellow === null) {var set_length_bright_yellow = half_day_length} else if ((typeof (set_length_bright_yellow)) === "string") {var set_length_bright_yellow_fact = set_length_bright_yellow.slice(0, -1); var set_length_bright_yellow = (half_day_length * set_length_bright_yellow_fact);} else {var set_length_bright_yellow = set_length_bright_yellow};
if (rise_length_bright_blue === null) {var rise_length_bright_blue = half_day_length} else if ((typeof (rise_length_bright_blue)) === "string") {var rise_length_bright_blue_fact = rise_length_bright_blue.slice(0, -1); var rise_length_bright_blue = (half_day_length * rise_length_bright_blue_fact);} else {var rise_length_bright_blue = rise_length_bright_blue};
if (set_length_bright_blue === null) {var set_length_bright_blue = half_day_length} else if ((typeof (set_length_bright_blue)) === "string") {var set_length_bright_blue_fact = set_length_bright_blue.slice(0, -1); var set_length_bright_blue = (half_day_length * set_length_bright_blue_fact);} else {var set_length_bright_blue = set_length_bright_blue};
//This part consists of intermediate variables that are only defined to make the final math formulas easier to read and change if needed
var rise_slope_bright_exp1 = rise_slope_bright - 100;
var rise_slope_bright_exp2 = rise_slope_bright_exp1/-100;
var rise_slope_CCT_exp1 = rise_slope_CCT - 100;
var rise_slope_CCT_exp2 = rise_slope_CCT_exp1/-100;
var rise_slope_scatdist_exp1 = rise_slope_scatdist - 100;
var rise_slope_scatdist_exp2 = rise_slope_scatdist_exp1/-100;
var rise_slope_scatangshift_exp1 = rise_slope_scatangshift - 100;
var rise_slope_scatangshift_exp2 = rise_slope_scatangshift_exp1/-100;
var rise_slope_bright_yellow_exp1 = rise_slope_bright_yellow - 100;
var rise_slope_bright_yellow_exp2 = rise_slope_bright_yellow_exp1/-100;
var rise_slope_bright_blue_exp1 = rise_slope_bright_blue - 100;
var rise_slope_bright_blue_exp2 = rise_slope_bright_blue_exp1/-100;
var set_slope_bright_exp1 = set_slope_bright - 100;
var set_slope_bright_exp2 = set_slope_bright_exp1/-100;
var set_slope_CCT_exp1 = set_slope_CCT - 100;
var set_slope_CCT_exp2 = set_slope_CCT_exp1/-100;
var set_slope_scatdist_exp1 = set_slope_scatdist - 100;
var set_slope_scatdist_exp2 = set_slope_scatdist_exp1/-100;
var set_slope_scatangshift_exp1 = set_slope_scatangshift - 100;
var set_slope_scatangshift_exp2 = set_slope_scatangshift_exp1/-100;
var set_slope_bright_yellow_exp1 = set_slope_bright_yellow - 100;
var set_slope_bright_yellow_exp2 = set_slope_bright_yellow_exp1/-100;
var set_slope_bright_blue_exp1 = set_slope_bright_blue - 100;
var set_slope_bright_blue_exp2 = set_slope_bright_blue_exp1/-100;
//These are the final formulas that define the lighting parameters during periods of change
var rise_bright = ((((hm - wake_time + wake_offset)/rise_length_bright) ** (rise_slope_bright_exp2)) * (max_bright - min_bright) + min_bright);
var rise_CCT = ((((hm - wake_time + wake_offset)/rise_length_CCT) ** (rise_slope_CCT_exp2)) * (max_CCT - min_CCT) + min_CCT);
var set_bright = ((((bed_time - bed_offset - hm)/set_length_bright) ** (set_slope_bright_exp2)) * (max_bright - min_bright) + min_bright);
var set_CCT = ((((bed_time - bed_offset - hm)/set_length_CCT) ** (set_slope_CCT_exp2)) * (max_CCT - min_CCT) + min_CCT);
var rise_scatdist = ((((hm - wake_time + wake_offset)/rise_length_scatdist) ** (rise_slope_scatdist_exp2)) * (max_scatdist - min_scatdist) + min_scatdist);
var set_scatdist = ((((bed_time - bed_offset - hm)/set_length_scatdist) ** (set_slope_scatdist_exp2)) * (max_scatdist - min_scatdist) + min_scatdist);
var rise_scatangshift = ((-1 * ((((hm - wake_time + wake_offset)/rise_length_scatangshift) ** (rise_slope_scatangshift_exp2)) * (max_scatangshift - min_scatangshift) + min_scatangshift)) + max_scatangshift + min_scatangshift);
var set_scatangshift = ((-1 * ((((bed_time - bed_offset - hm)/set_length_scatangshift) ** (set_slope_scatangshift_exp2)) * (max_scatangshift - min_scatangshift) + min_scatangshift)) + max_scatangshift + min_scatangshift);
var rise_bright_yellow = ((((hm - wake_time + wake_offset)/rise_length_bright_yellow) ** (rise_slope_bright_yellow_exp2)) * (max_bright_yellow - min_bright_yellow) + min_bright_yellow);
var set_bright_yellow = ((((bed_time - bed_offset - hm)/set_length_bright_yellow) ** (set_slope_bright_yellow_exp2)) * (max_bright_yellow - min_bright_yellow) + min_bright_yellow);
var rise_bright_blue = ((((hm - wake_time + wake_offset)/rise_length_bright_blue) ** (rise_slope_bright_blue_exp2)) * (max_bright_blue - min_bright_blue) + min_bright_blue);
var set_bright_blue = ((((bed_time - bed_offset - hm)/set_length_bright_blue) ** (set_slope_bright_blue_exp2)) * (max_bright_blue - min_bright_blue) + min_bright_blue);
//This section takes the outputs from the formulas above and the arguments and converts it into the form and data type needed for the final output
var max_bright_int = Math.round(max_bright * 254); //Brightness values in decimal are multiplied by 254 for use in control systems that specify brightness values using 1 byte of data, a widely used industry standard.
var rise_bright_int = Math.round(rise_bright * 254);
var set_bright_int = Math.round(set_bright * 254);
var min_bright_int = Math.round(min_bright * 254);
var max_CCT_int = Math.round(max_CCT);
var rise_CCT_int = Math.round(rise_CCT);
var set_CCT_int = Math.round(set_CCT);
var min_CCT_int = Math.round(min_CCT);
var max_scatdist_int = Math.round(max_scatdist);
var rise_scatdist_int = Math.round(rise_scatdist);
var set_scatdist_int = Math.round(set_scatdist);
var min_scatdist_int = Math.round(min_scatdist);
var max_bright_yellow_int = Math.round(max_bright_yellow * 254);
var rise_bright_yellow_int = Math.round(rise_bright_yellow * 254);
var set_bright_yellow_int = Math.round(set_bright_yellow * 254);
var min_bright_yellow_int = Math.round(min_bright_yellow * 254);
var max_bright_blue_int = Math.round(max_bright_blue * 254);
var rise_bright_blue_int = Math.round(rise_bright_blue * 254);
var set_bright_blue_int = Math.round(set_bright_blue * 254);
var min_bright_blue_int = Math.round(min_bright_blue *254);
//This next part consists of most of the logic that determines whether to output the maximum, current setting value, minimum, or current rising value for each final output based on the time of day.
//Setting bright_int to appropriate value based on day segment
if (hm - wake_time + wake_offset <= 0) {bright_int = min_bright_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright <= 0) {bright_int = rise_bright_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright > 0 && hm - bed_time + bed_offset + set_length_bright <= 0) {bright_int = max_bright_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright > 0 && hm - bed_time + bed_offset + set_length_bright > 0 && hm - bed_time + bed_offset <= 0) {bright_int = set_bright_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright > 0 && hm - bed_time + bed_offset + set_length_bright > 0 && hm - bed_time + bed_offset > 0) {bright_int = min_bright_int}
//Setting CCT_int to appropriate value based on day segment
if (hm - wake_time + wake_offset <= 0) {CCT_int = min_CCT_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_CCT <= 0) {CCT_int = rise_CCT_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_CCT > 0 && hm - bed_time + bed_offset + set_length_CCT <= 0) {CCT_int = max_CCT_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_CCT > 0 && hm - bed_time + bed_offset + set_length_CCT > 0 && hm - bed_time + bed_offset <= 0) {CCT_int = set_CCT_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_CCT > 0 && hm - bed_time + bed_offset + set_length_CCT > 0 && hm - bed_time + bed_offset > 0) {CCT_int = min_CCT_int}
//Setting scatdist_int to appropriate value based on day segment
if (hm - wake_time + wake_offset <= 0) {scatdist_int = min_scatdist_int;
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_scatdist <= 0) {scatdist_int = rise_scatdist_int;
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_scatdist > 0 && hm - bed_time + bed_offset + set_length_scatdist <= 0) {scatdist_int = max_scatdist_int;
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_scatdist > 0 && hm - bed_time + bed_offset + set_length_scatdist > 0 && hm - bed_time + bed_offset <= 0) {scatdist_int = set_scatdist_int;
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_scatdist > 0 && hm - bed_time + bed_offset + set_length_scatdist > 0 && hm - bed_time + bed_offset > 0) {scatdist_int = min_scatdist_int;}
//Setting scatangshift_flt to appropriate value based on day segment
if (hm - wake_time + wake_offset <= 0) {scatangshift = max_scatangshift
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_scatangshift <= 0) {scatangshift = rise_scatangshift
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_scatangshift > 0 && hm - bed_time + bed_offset + set_length_scatangshift <= 0) {scatangshift = min_scatangshift
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_scatangshift > 0 && hm - bed_time + bed_offset + set_length_scatangshift > 0 && hm - bed_time + bed_offset <= 0) {scatangshift = set_scatangshift
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_scatangshift > 0 && hm - bed_time + bed_offset + set_length_scatangshift > 0 && hm - bed_time + bed_offset > 0) {scatangshift = max_scatangshift}
//This next bit takes the color temperature supplied above and figures out the appropriate blue and yellow values for use in the sunlight simulator
//In a nutshell, this part finds the xy values for the main white color temperature and a somewhat warmer color temperature and then finds a blue point exactly opposite on the other side of the central white point from the warmer white point.
//Lastly, the warm white point is shifted up to make it more yellow and the blue point shifted down to make it more blue by an angle that increases at sunrise and sunset
var white_CCT = CCT_int
var yellow_CCT = (CCT_int - scatdist_int)
//These conditional statements ensure that the value for the lowest possible number is given rather than an error if the color temperature is too low, since the conversion module only defines color temperatures down to 1000K (pretty much the lowest temperature that produces any visible light)
if (white_CCT > 1000) {var white_x = x_transform (white_CCT); var white_y = y_transform (white_CCT);
} else {var white_x = x_transform (1001); var white_y = y_transform (1001)}
if (yellow_CCT > 1000) {var yellow_x = x_transform (yellow_CCT); var yellow_y = y_transform (yellow_CCT);
} else {var yellow_x = x_transform (1001); var yellow_y = y_transform (1001)}
var blue_x = (white_x - (yellow_x - white_x))
var blue_y = (white_y - (yellow_y - white_y))
var scatdist_x = (yellow_x - white_x)
var scatdist_y = (yellow_y - white_y)
var origang_deg = radianstodegrees(Math.atan(scatdist_y/scatdist_x))
var yellow_x_shifted = ((Math.sqrt((scatdist_x ** 2) + (scatdist_y ** 2))) * (Math.cos(degreestoradians(origang_deg + scatangshift)))) + (white_x)
var yellow_y_shifted = ((Math.sqrt((scatdist_x ** 2) + (scatdist_y ** 2))) * (Math.sin(degreestoradians(origang_deg + scatangshift)))) + (white_y)
var blue_x_shifted = (white_x - (yellow_x_shifted - white_x))
var blue_y_shifted = (white_y - (yellow_y_shifted - white_y))
var CCT_mired_int = Math.round((1000000*(1/CCT_int)))
//This next part consists of more of the logic that determines whether to output the maximum, current setting value, minimum, or current rising value for each final output based on the time of day.
//Setting bright_yellow_int to appropriate value based on day segment
if (hm - wake_time + wake_offset <= 0) {bright_yellow_int = min_bright_yellow_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright_yellow <= 0) {bright_yellow_int = rise_bright_yellow_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright_yellow > 0 && hm - bed_time + bed_offset + set_length_bright_yellow <= 0) {bright_yellow_int = max_bright_yellow_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright_yellow > 0 && hm - bed_time + bed_offset + set_length_bright_yellow > 0 && hm - bed_time + bed_offset <= 0) {bright_yellow_int = set_bright_yellow_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright_yellow > 0 && hm - bed_time + bed_offset + set_length_bright_yellow > 0 && hm - bed_time + bed_offset > 0) {bright_yellow_int = min_bright_yellow_int}
//Setting bright_blue_int to appropriate value based on day segment
if (hm - wake_time + wake_offset <= 0) {bright_blue_int = min_bright_blue_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright_blue <= 0) {bright_blue_int = rise_bright_blue_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright_blue > 0 && hm - bed_time + bed_offset + set_length_bright_blue <= 0) {bright_blue_int = max_bright_blue_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright_blue > 0 && hm - bed_time + bed_offset + set_length_bright_blue > 0 && hm - bed_time + bed_offset <= 0) {bright_blue_int = set_bright_blue_int
} else if (hm - wake_time + wake_offset > 0 && hm - wake_time + wake_offset - rise_length_bright_blue > 0 && hm - bed_time + bed_offset + set_length_bright_blue > 0 && hm - bed_time + bed_offset > 0) {bright_blue_int = min_bright_blue_int}
//Here is the final return command for the function that returns a object with the lighting parameters named as follows
return {bright_int_ret: bright_int, CCT_mired_int_ret: CCT_mired_int, bright_yellow_int_ret: bright_yellow_int, bright_blue_int_ret: bright_blue_int, white_x_ret: white_x, white_y_ret: white_y, yellow_x_shifted_ret: yellow_x_shifted, yellow_y_shifted_ret: yellow_y_shifted, blue_x_shifted_ret: blue_x_shifted, blue_y_shifted_ret: blue_y_shifted}}
//CCT to XY Transformer - Converts CCT values stored as integers in kelvin into CIE 1931 Color Diagram X and Y coordinates specifying the location of that color temperature in that master color space.
function x_transform(CCT_int) {
var x_transform_object = {1000: 0.6528,
1001: 0.6526,
1002: 0.6525,
1003: 0.6523,
1004: 0.6522,
1005: 0.652,
1006: 0.6519,
1007: 0.6518,
1008: 0.6516,
1009: 0.6515,
1010: 0.6513,
1011: 0.6512,
1012: 0.6511,
1013: 0.6509,
1014: 0.6508,
1015: 0.6506,
1016: 0.6505,
1017: 0.6504,
1018: 0.6502,
1019: 0.6501,
1020: 0.6499,
1021: 0.6498,
1022: 0.6496,
1023: 0.6495,
1024: 0.6494,
1025: 0.6492,
1026: 0.6491,
1027: 0.6489,
1028: 0.6488,
1029: 0.6487,
1030: 0.6485,
1031: 0.6484,
1032: 0.6482,
1033: 0.6481,
1034: 0.648,
1035: 0.6478,
1036: 0.6477,
1037: 0.6475,
1038: 0.6474,
1039: 0.6473,
1040: 0.6471,
1041: 0.647,
1042: 0.6468,
1043: 0.6467,
1044: 0.6466,
1045: 0.6464,
1046: 0.6463,
1047: 0.6461,
1048: 0.646,
1049: 0.6459,
1050: 0.6457,
1051: 0.6456,
1052: 0.6454,
1053: 0.6453,
1054: 0.6452,
1055: 0.645,
1056: 0.6449,
1057: 0.6447,
1058: 0.6446,
1059: 0.6445,
1060: 0.6443,
1061: 0.6442,
1062: 0.644,
1063: 0.6439,
1064: 0.6438,
1065: 0.6436,
1066: 0.6435,
1067: 0.6433,
1068: 0.6432,
1069: 0.6431,
1070: 0.6429,
1071: 0.6428,
1072: 0.6426,
1073: 0.6425,
1074: 0.6424,
1075: 0.6422,
1076: 0.6421,
1077: 0.642,
1078: 0.6418,
1079: 0.6417,
1080: 0.6415,
1081: 0.6414,
1082: 0.6413,
1083: 0.6411,
1084: 0.641,
1085: 0.6408,
1086: 0.6407,
1087: 0.6406,
1088: 0.6404,
1089: 0.6403,
1090: 0.6401,
1091: 0.64,
1092: 0.6399,
1093: 0.6397,
1094: 0.6396,
1095: 0.6394,
1096: 0.6393,
1097: 0.6392,
1098: 0.639,
1099: 0.6389,
1100: 0.6388,
1101: 0.6386,
1102: 0.6385,
1103: 0.6383,
1104: 0.6382,
1105: 0.6381,
1106: 0.6379,
1107: 0.6378,
1108: 0.6376,
1109: 0.6375,
1110: 0.6374,
1111: 0.6372,
1112: 0.6371,
1113: 0.637,
1114: 0.6368,
1115: 0.6367,
1116: 0.6365,
1117: 0.6364,
1118: 0.6363,
1119: 0.6361,
1120: 0.636,
1121: 0.6359,
1122: 0.6357,
1123: 0.6356,
1124: 0.6354,
1125: 0.6353,
1126: 0.6352,
1127: 0.635,
1128: 0.6349,
1129: 0.6347,
1130: 0.6346,
1131: 0.6345,
1132: 0.6343,
1133: 0.6342,
1134: 0.6341,
1135: 0.6339,
1136: 0.6338,
1137: 0.6336,
1138: 0.6335,
1139: 0.6334,
1140: 0.6332,
1141: 0.6331,
1142: 0.633,
1143: 0.6328,
1144: 0.6327,
1145: 0.6325,
1146: 0.6324,
1147: 0.6323,
1148: 0.6321,
1149: 0.632,
1150: 0.6319,
1151: 0.6317,
1152: 0.6316,
1153: 0.6315,
1154: 0.6313,
1155: 0.6312,
1156: 0.631,
1157: 0.6309,
1158: 0.6308,
1159: 0.6306,
1160: 0.6305,
1161: 0.6304,
1162: 0.6302,
1163: 0.6301,
1164: 0.6299,
1165: 0.6298,
1166: 0.6297,
1167: 0.6295,
1168: 0.6294,
1169: 0.6293,
1170: 0.6291,
1171: 0.629,
1172: 0.6289,
1173: 0.6287,
1174: 0.6286,
1175: 0.6284,
1176: 0.6283,
1177: 0.6282,
1178: 0.628,
1179: 0.6279,
1180: 0.6278,
1181: 0.6276,
1182: 0.6275,
1183: 0.6274,
1184: 0.6272,
1185: 0.6271,
1186: 0.6269,
1187: 0.6268,
1188: 0.6267,
1189: 0.6265,
1190: 0.6264,
1191: 0.6263,
1192: 0.6261,
1193: 0.626,
1194: 0.6259,
1195: 0.6257,
1196: 0.6256,
1197: 0.6255,
1198: 0.6253,
1199: 0.6252,
1200: 0.625,
1201: 0.6249,
1202: 0.6248,
1203: 0.6246,
1204: 0.6245,
1205: 0.6244,
1206: 0.6242,
1207: 0.6241,
1208: 0.624,
1209: 0.6238,
1210: 0.6237,
1211: 0.6236,
1212: 0.6234,
1213: 0.6233,
1214: 0.6231,
1215: 0.623,
1216: 0.6229,
1217: 0.6227,
1218: 0.6226,
1219: 0.6225,
1220: 0.6223,
1221: 0.6222,
1222: 0.6221,
1223: 0.6219,
1224: 0.6218,
1225: 0.6217,
1226: 0.6215,
1227: 0.6214,
1228: 0.6213,
1229: 0.6211,
1230: 0.621,
1231: 0.6209,
1232: 0.6207,
1233: 0.6206,
1234: 0.6204,
1235: 0.6203,
1236: 0.6202,
1237: 0.62,
1238: 0.6199,
1239: 0.6198,
1240: 0.6196,
1241: 0.6195,
1242: 0.6194,
1243: 0.6192,
1244: 0.6191,
1245: 0.619,
1246: 0.6188,
1247: 0.6187,
1248: 0.6186,
1249: 0.6184,
1250: 0.6183,
1251: 0.6182,
1252: 0.618,
1253: 0.6179,
1254: 0.6178,
1255: 0.6176,
1256: 0.6175,
1257: 0.6174,
1258: 0.6172,
1259: 0.6171,
1260: 0.617,
1261: 0.6168,
1262: 0.6167,
1263: 0.6166,
1264: 0.6164,
1265: 0.6163,
1266: 0.6162,
1267: 0.616,
1268: 0.6159,
1269: 0.6158,
1270: 0.6156,
1271: 0.6155,
1272: 0.6154,
1273: 0.6152,
1274: 0.6151,
1275: 0.615,
1276: 0.6148,
1277: 0.6147,
1278: 0.6146,
1279: 0.6144,
1280: 0.6143,
1281: 0.6142,
1282: 0.614,
1283: 0.6139,
1284: 0.6138,
1285: 0.6136,
1286: 0.6135,
1287: 0.6134,
1288: 0.6132,
1289: 0.6131,
1290: 0.613,
1291: 0.6128,
1292: 0.6127,
1293: 0.6126,
1294: 0.6124,
1295: 0.6123,
1296: 0.6122,
1297: 0.612,
1298: 0.6119,
1299: 0.6118,
1300: 0.6116,
1301: 0.6115,
1302: 0.6114,
1303: 0.6112,
1304: 0.6111,
1305: 0.611,
1306: 0.6108,
1307: 0.6107,
1308: 0.6106,
1309: 0.6104,
1310: 0.6103,
1311: 0.6102,
1312: 0.61,
1313: 0.6099,
1314: 0.6098,
1315: 0.6096,
1316: 0.6095,
1317: 0.6094,
1318: 0.6092,
1319: 0.6091,
1320: 0.609,
1321: 0.6089,
1322: 0.6087,
1323: 0.6086,
1324: 0.6085,
1325: 0.6083,
1326: 0.6082,
1327: 0.6081,
1328: 0.6079,
1329: 0.6078,
1330: 0.6077,
1331: 0.6075,
1332: 0.6074,
1333: 0.6073,
1334: 0.6071,
1335: 0.607,
1336: 0.6069,
1337: 0.6067,
1338: 0.6066,
1339: 0.6065,
1340: 0.6063,
1341: 0.6062,
1342: 0.6061,
1343: 0.606,
1344: 0.6058,
1345: 0.6057,
1346: 0.6056,
1347: 0.6054,
1348: 0.6053,
1349: 0.6052,
1350: 0.605,
1351: 0.6049,
1352: 0.6048,
1353: 0.6046,
1354: 0.6045,
1355: 0.6044,
1356: 0.6043,
1357: 0.6041,
1358: 0.604,
1359: 0.6039,
1360: 0.6037,
1361: 0.6036,
1362: 0.6035,
1363: 0.6033,
1364: 0.6032,
1365: 0.6031,
1366: 0.6029,
1367: 0.6028,
1368: 0.6027,
1369: 0.6026,
1370: 0.6024,
1371: 0.6023,
1372: 0.6022,
1373: 0.602,
1374: 0.6019,
1375: 0.6018,
1376: 0.6016,
1377: 0.6015,
1378: 0.6014,
1379: 0.6012,
1380: 0.6011,
1381: 0.601,
1382: 0.6009,
1383: 0.6007,
1384: 0.6006,
1385: 0.6005,
1386: 0.6003,
1387: 0.6002,
1388: 0.6001,
1389: 0.5999,
1390: 0.5998,
1391: 0.5997,
1392: 0.5996,
1393: 0.5994,
1394: 0.5993,
1395: 0.5992,
1396: 0.599,
1397: 0.5989,
1398: 0.5988,
1399: 0.5986,
1400: 0.5985,
1401: 0.5984,
1402: 0.5983,
1403: 0.5981,
1404: 0.598,
1405: 0.5979,
1406: 0.5977,
1407: 0.5976,
1408: 0.5975,
1409: 0.5974,
1410: 0.5972,
1411: 0.5971,
1412: 0.597,
1413: 0.5968,
1414: 0.5967,
1415: 0.5966,
1416: 0.5965,
1417: 0.5963,
1418: 0.5962,
1419: 0.5961,
1420: 0.5959,
1421: 0.5958,
1422: 0.5957,
1423: 0.5955,
1424: 0.5954,
1425: 0.5953,
1426: 0.5952,
1427: 0.595,
1428: 0.5949,
1429: 0.5948,
1430: 0.5946,
1431: 0.5945,
1432: 0.5944,
1433: 0.5943,
1434: 0.5941,
1435: 0.594,
1436: 0.5939,
1437: 0.5937,
1438: 0.5936,
1439: 0.5935,
1440: 0.5934,
1441: 0.5932,
1442: 0.5931,
1443: 0.593,
1444: 0.5928,
1445: 0.5927,
1446: 0.5926,
1447: 0.5925,
1448: 0.5923,
1449: 0.5922,
1450: 0.5921,
1451: 0.592,
1452: 0.5918,
1453: 0.5917,
1454: 0.5916,
1455: 0.5914,
1456: 0.5913,
1457: 0.5912,
1458: 0.5911,
1459: 0.5909,
1460: 0.5908,
1461: 0.5907,
1462: 0.5905,
1463: 0.5904,
1464: 0.5903,
1465: 0.5902,
1466: 0.59,
1467: 0.5899,
1468: 0.5898,
1469: 0.5897,
1470: 0.5895,
1471: 0.5894,
1472: 0.5893,
1473: 0.5891,
1474: 0.589,
1475: 0.5889,
1476: 0.5888,
1477: 0.5886,
1478: 0.5885,
1479: 0.5884,
1480: 0.5883,
1481: 0.5881,
1482: 0.588,
1483: 0.5879,
1484: 0.5877,
1485: 0.5876,
1486: 0.5875,
1487: 0.5874,
1488: 0.5872,
1489: 0.5871,
1490: 0.587,
1491: 0.5869,
1492: 0.5867,
1493: 0.5866,
1494: 0.5865,
1495: 0.5863,
1496: 0.5862,
1497: 0.5861,
1498: 0.586,
1499: 0.5858,
1500: 0.5857,
1501: 0.5856,
1502: 0.5855,
1503: 0.5853,
1504: 0.5852,
1505: 0.5851,
1506: 0.585,
1507: 0.5848,
1508: 0.5847,
1509: 0.5846,
1510: 0.5845,
1511: 0.5843,
1512: 0.5842,
1513: 0.5841,
1514: 0.5839,
1515: 0.5838,
1516: 0.5837,
1517: 0.5836,
1518: 0.5834,
1519: 0.5833,
1520: 0.5832,
1521: 0.5831,
1522: 0.5829,
1523: 0.5828,
1524: 0.5827,
1525: 0.5826,
1526: 0.5824,
1527: 0.5823,
1528: 0.5822,
1529: 0.5821,
1530: 0.5819,
1531: 0.5818,
1532: 0.5817,
1533: 0.5816,
1534: 0.5814,
1535: 0.5813,
1536: 0.5812,
1537: 0.5811,
1538: 0.5809,
1539: 0.5808,
1540: 0.5807,
1541: 0.5806,
1542: 0.5804,
1543: 0.5803,
1544: 0.5802,
1545: 0.5801,
1546: 0.5799,
1547: 0.5798,
1548: 0.5797,
1549: 0.5796,
1550: 0.5794,
1551: 0.5793,
1552: 0.5792,
1553: 0.5791,
1554: 0.5789,
1555: 0.5788,
1556: 0.5787,
1557: 0.5786,
1558: 0.5784,
1559: 0.5783,
1560: 0.5782,
1561: 0.5781,
1562: 0.5779,
1563: 0.5778,
1564: 0.5777,
1565: 0.5776,
1566: 0.5774,
1567: 0.5773,
1568: 0.5772,
1569: 0.5771,
1570: 0.5769,
1571: 0.5768,
1572: 0.5767,
1573: 0.5766,
1574: 0.5764,
1575: 0.5763,
1576: 0.5762,
1577: 0.5761,
1578: 0.5759,
1579: 0.5758,
1580: 0.5757,
1581: 0.5756,
1582: 0.5755,
1583: 0.5753,
1584: 0.5752,
1585: 0.5751,
1586: 0.575,
1587: 0.5748,
1588: 0.5747,
1589: 0.5746,
1590: 0.5745,
1591: 0.5743,
1592: 0.5742,
1593: 0.5741,
1594: 0.574,
1595: 0.5738,
1596: 0.5737,
1597: 0.5736,
1598: 0.5735,
1599: 0.5734,
1600: 0.5732,
1601: 0.5731,
1602: 0.573,
1603: 0.5729,
1604: 0.5727,
1605: 0.5726,
1606: 0.5725,
1607: 0.5724,
1608: 0.5722,
1609: 0.5721,
1610: 0.572,
1611: 0.5719,
1612: 0.5718,
1613: 0.5716,
1614: 0.5715,
1615: 0.5714,
1616: 0.5713,
1617: 0.5711,
1618: 0.571,
1619: 0.5709,
1620: 0.5708,
1621: 0.5706,
1622: 0.5705,
1623: 0.5704,
1624: 0.5703,
1625: 0.5702,
1626: 0.57,
1627: 0.5699,
1628: 0.5698,
1629: 0.5697,
1630: 0.5695,
1631: 0.5694,
1632: 0.5693,
1633: 0.5692,
1634: 0.5691,
1635: 0.5689,
1636: 0.5688,
1637: 0.5687,
1638: 0.5686,
1639: 0.5684,
1640: 0.5683,
1641: 0.5682,
1642: 0.5681,
1643: 0.568,
1644: 0.5678,
1645: 0.5677,
1646: 0.5676,
1647: 0.5675,
1648: 0.5673,
1649: 0.5672,
1650: 0.5671,
1651: 0.567,
1652: 0.5669,
1653: 0.5667,
1654: 0.5666,
1655: 0.5665,
1656: 0.5664,
1657: 0.5663,
1658: 0.5661,
1659: 0.566,
1660: 0.5659,
1661: 0.5658,
1662: 0.5656,
1663: 0.5655,
1664: 0.5654,
1665: 0.5653,
1666: 0.5652,
1667: 0.565,
1668: 0.5649,
1669: 0.5648,
1670: 0.5647,
1671: 0.5646,
1672: 0.5644,
1673: 0.5643,
1674: 0.5642,
1675: 0.5641,
1676: 0.564,
1677: 0.5638,
1678: 0.5637,
1679: 0.5636,
1680: 0.5635,
1681: 0.5634,
1682: 0.5632,
1683: 0.5631,
1684: 0.563,
1685: 0.5629,
1686: 0.5627,
1687: 0.5626,
1688: 0.5625,
1689: 0.5624,
1690: 0.5623,
1691: 0.5621,
1692: 0.562,
1693: 0.5619,
1694: 0.5618,
1695: 0.5617,
1696: 0.5615,
1697: 0.5614,
1698: 0.5613,
1699: 0.5612,
1700: 0.5611,
1701: 0.5609,
1702: 0.5608,
1703: 0.5607,
1704: 0.5606,
1705: 0.5605,
1706: 0.5603,
1707: 0.5602,
1708: 0.5601,
1709: 0.56,
1710: 0.5599,
1711: 0.5597,
1712: 0.5596,
1713: 0.5595,
1714: 0.5594,
1715: 0.5593,
1716: 0.5592,
1717: 0.559,
1718: 0.5589,
1719: 0.5588,
1720: 0.5587,
1721: 0.5586,
1722: 0.5584,
1723: 0.5583,
1724: 0.5582,
1725: 0.5581,
1726: 0.558,
1727: 0.5578,
1728: 0.5577,
1729: 0.5576,
1730: 0.5575,
1731: 0.5574,
1732: 0.5572,
1733: 0.5571,
1734: 0.557,
1735: 0.5569,
1736: 0.5568,
1737: 0.5567,
1738: 0.5565,
1739: 0.5564,
1740: 0.5563,
1741: 0.5562,
1742: 0.5561,
1743: 0.5559,
1744: 0.5558,
1745: 0.5557,
1746: 0.5556,
1747: 0.5555,
1748: 0.5553,
1749: 0.5552,
1750: 0.5551,
1751: 0.555,
1752: 0.5549,
1753: 0.5548,
1754: 0.5546,
1755: 0.5545,
1756: 0.5544,
1757: 0.5543,
1758: 0.5542,
1759: 0.554,
1760: 0.5539,
1761: 0.5538,
1762: 0.5537,
1763: 0.5536,
1764: 0.5535,
1765: 0.5533,
1766: 0.5532,
1767: 0.5531,
1768: 0.553,
1769: 0.5529,
1770: 0.5528,
1771: 0.5526,
1772: 0.5525,
1773: 0.5524,
1774: 0.5523,
1775: 0.5522,
1776: 0.552,
1777: 0.5519,
1778: 0.5518,
1779: 0.5517,
1780: 0.5516,
1781: 0.5515,
1782: 0.5513,
1783: 0.5512,
1784: 0.5511,
1785: 0.551,
1786: 0.5509,
1787: 0.5508,
1788: 0.5506,
1789: 0.5505,
1790: 0.5504,
1791: 0.5503,
1792: 0.5502,
1793: 0.5501,
1794: 0.5499,
1795: 0.5498,
1796: 0.5497,
1797: 0.5496,
1798: 0.5495,
1799: 0.5494,
1800: 0.5492,
1801: 0.5491,
1802: 0.549,
1803: 0.5489,
1804: 0.5488,
1805: 0.5487,
1806: 0.5485,
1807: 0.5484,
1808: 0.5483,
1809: 0.5482,
1810: 0.5481,
1811: 0.548,
1812: 0.5478,
1813: 0.5477,
1814: 0.5476,
1815: 0.5475,
1816: 0.5474,
1817: 0.5473,
1818: 0.5472,
1819: 0.547,
1820: 0.5469,
1821: 0.5468,
1822: 0.5467,
1823: 0.5466,
1824: 0.5465,
1825: 0.5463,
1826: 0.5462,
1827: 0.5461,
1828: 0.546,
1829: 0.5459,
1830: 0.5458,
1831: 0.5457,
1832: 0.5455,
1833: 0.5454,
1834: 0.5453,
1835: 0.5452,
1836: 0.5451,
1837: 0.545,
1838: 0.5448,
1839: 0.5447,
1840: 0.5446,
1841: 0.5445,
1842: 0.5444,
1843: 0.5443,
1844: 0.5442,
1845: 0.544,
1846: 0.5439,
1847: 0.5438,
1848: 0.5437,
1849: 0.5436,
1850: 0.5435,
1851: 0.5434,
1852: 0.5432,
1853: 0.5431,
1854: 0.543,
1855: 0.5429,
1856: 0.5428,
1857: 0.5427,
1858: 0.5425,
1859: 0.5424,
1860: 0.5423,
1861: 0.5422,
1862: 0.5421,
1863: 0.542,
1864: 0.5419,
1865: 0.5417,
1866: 0.5416,
1867: 0.5415,
1868: 0.5414,
1869: 0.5413,
1870: 0.5412,
1871: 0.5411,
1872: 0.541,
1873: 0.5408,
1874: 0.5407,
1875: 0.5406,
1876: 0.5405,
1877: 0.5404,
1878: 0.5403,
1879: 0.5402,
1880: 0.54,
1881: 0.5399,
1882: 0.5398,
1883: 0.5397,
1884: 0.5396,
1885: 0.5395,
1886: 0.5394,
1887: 0.5392,
1888: 0.5391,
1889: 0.539,
1890: 0.5389,
1891: 0.5388,
1892: 0.5387,
1893: 0.5386,
1894: 0.5385,
1895: 0.5383,
1896: 0.5382,
1897: 0.5381,
1898: 0.538,
1899: 0.5379,
1900: 0.5378,
1901: 0.5377,
1902: 0.5376,
1903: 0.5374,
1904: 0.5373,
1905: 0.5372,
1906: 0.5371,
1907: 0.537,
1908: 0.5369,
1909: 0.5368,
1910: 0.5366,
1911: 0.5365,
1912: 0.5364,
1913: 0.5363,
1914: 0.5362,
1915: 0.5361,
1916: 0.536,
1917: 0.5359,
1918: 0.5358,
1919: 0.5356,
1920: 0.5355,
1921: 0.5354,
1922: 0.5353,
1923: 0.5352,
1924: 0.5351,
1925: 0.535,
1926: 0.5349,
1927: 0.5347,
1928: 0.5346,
1929: 0.5345,
1930: 0.5344,
1931: 0.5343,
1932: 0.5342,
1933: 0.5341,
1934: 0.534,
1935: 0.5338,
1936: 0.5337,
1937: 0.5336,
1938: 0.5335,
1939: 0.5334,
1940: 0.5333,
1941: 0.5332,
1942: 0.5331,
1943: 0.533,
1944: 0.5328,
1945: 0.5327,
1946: 0.5326,
1947: 0.5325,
1948: 0.5324,
1949: 0.5323,
1950: 0.5322,
1951: 0.5321,
1952: 0.532,
1953: 0.5318,
1954: 0.5317,
1955: 0.5316,
1956: 0.5315,
1957: 0.5314,
1958: 0.5313,
1959: 0.5312,
1960: 0.5311,
1961: 0.531,
1962: 0.5309,
1963: 0.5307,
1964: 0.5306,
1965: 0.5305,
1966: 0.5304,
1967: 0.5303,
1968: 0.5302,
1969: 0.5301,
1970: 0.53,
1971: 0.5299,
1972: 0.5297,
1973: 0.5296,
1974: 0.5295,
1975: 0.5294,
1976: 0.5293,
1977: 0.5292,
1978: 0.5291,
1979: 0.529,
1980: 0.5289,
1981: 0.5288,
1982: 0.5286,
1983: 0.5285,
1984: 0.5284,
1985: 0.5283,
1986: 0.5282,
1987: 0.5281,
1988: 0.528,
1989: 0.5279,
1990: 0.5278,
1991: 0.5277,
1992: 0.5276,
1993: 0.5274,
1994: 0.5273,
1995: 0.5272,
1996: 0.5271,
1997: 0.527,
1998: 0.5269,
1999: 0.5268,
2000: 0.5267,
2001: 0.5266,
2002: 0.5265,
2003: 0.5263,
2004: 0.5262,
2005: 0.5261,
2006: 0.526,
2007: 0.5259,
2008: 0.5258,
2009: 0.5257,
2010: 0.5256,
2011: 0.5255,
2012: 0.5254,
2013: 0.5253,
2014: 0.5252,
2015: 0.525,
2016: 0.5249,
2017: 0.5248,
2018: 0.5247,
2019: 0.5246,
2020: 0.5245,
2021: 0.5244,
2022: 0.5243,
2023: 0.5242,
2024: 0.5241,
2025: 0.524,
2026: 0.5239,
2027: 0.5237,
2028: 0.5236,
2029: 0.5235,