<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">// Polyfills
( function () {
	// CustomEvent for IE11 and Edge.
	if ( typeof window.CustomEvent !== "function" ) {
		function CustomEvent( event, params ) {
			params = params || {};
			var evt = document.createEvent( 'CustomEvent' );
			evt.initCustomEvent( event, params.bubbles || false, params.cancelable || false, params.detail || undefined );
			return evt;
		}
		CustomEvent.prototype = window.Event.prototype;
		window.CustomEvent = CustomEvent;
	}

	// Static function detection method, lifted from jQuery.
	if ( !Function.isFunction ) {
		Function.isFunction = function ( arg ) {
			return Object.prototype.toString.call( arg ) === '[object Function]';
		};
	}

	// Static object detection method, lifted from jQuery
	if ( !Object.isPlainObject ) {
		( function () {
			var getProto = Object.getPrototypeOf;
			var class2type = {};
			var toString = class2type.toString;
			var hasOwn = class2type.hasOwnProperty;
			var fnToString = hasOwn.toString;
			var ObjectFunctionString = fnToString.call( Object );

			Object.isPlainObject = function ( obj ) {
				var proto, Ctor;

				// Detect obvious negatives
				// Use toString instead of jQuery.type to catch host objects
				if ( !obj || toString.call( obj ) !== "[object Object]" ) {
					return false;
				}

				proto = getProto( obj );

				// Objects with no prototype (e.g., `Object.create( null )`) are plain
				if ( !proto ) {
					return true;
				}

				// Objects with prototype are plain iff they were constructed by a global Object function
				Ctor = hasOwn.call( proto, "constructor" ) &amp;&amp; proto.constructor;
				return typeof Ctor === "function" &amp;&amp; fnToString.call( Ctor ) === ObjectFunctionString;
			};
		} )();
	}
	// Static empty object detection method.
	if ( !Object.isEmptyObject ) {
		Object.isEmptyObject = function ( obj ) {
			if ( !Object.isPlainObject( obj ) ) {
				// Not a plain object, so it cannot be an empty one.
				return false;
			}
			// Look for any properties belonging to the object.
			for ( var p in obj ) {
				if ( !obj.hasOwnProperty( p ) ) {
					// Skip over inherited ones.
					continue;
				} else {
					// Has a property, therefore it isn't empty.
					return false;
				}
			}
			// All good.
			return true;
		};
	}
	if ( !Object.extend ) {
		// Create a new instance of a value.
		function value( v ) {
			var arr;
			if ( v === undefined || v === null ) {
				return v;
			}
			switch ( typeof v ) {
				case 'boolean':
				case 'number':
				case 'string':
					// By value.
					return v;
			}
			if ( v.constructor === Date ) {
				// Clone the date.
				return new Date( v.getTime() );
			} else if ( Array.isArray( v ) ) {
				// Clone the array.
				arr = new Array( v.length );
				for ( var i = 0; i &lt; v.length; i++ ) {
					arr[i] = value( v[i], true );
				}
				return arr;
			} else if ( Object.isPlainObject( v ) ) {
				// Clone the object and return it.
				return Object.extend( {}, v );
			} else {
				// Return the value as a reference, unchanged.
				return v;
			}
		}

		/**
		 * Combine objects together.
		 * If the first object is null or undefined a new object will be initialized.
		 */
		Object.extend = function () {
			var start, next, v,
				args = Array.from( arguments );
			start = args.shift() || {};
			// Get all of the passed in parameters minus the first one.
			var inputLength = args.length;
			// Loop through each of the rest of the parameters.
			for ( var i = 0; i &lt; inputLength; i++ ) {
				next = args[i];
				if ( !Object.isPlainObject( next ) ) {
					// Only extend plain objects.
					continue;
				}
				for ( var p in next ) {
					if ( !next.hasOwnProperty( p ) ) {
						// Skip inherited properties.
						continue;
					}
					v = value( next[p] );
					if ( v !== undefined ) {
						// Assign any non-undefind values.
						start[p] = v;
					}
				}
			}
			return start;
		};

		/**
		 * Combine objects together, merging deep object properties individually.
		 */
		Object.merge = function () {
			var start, next, v,
				args = Array.from( arguments );
			start = args.shift() || {};
			// Get all of the passed in parameters minus the first one.
			var inputLength = args.length;
			// Loop through each of the rest of the parameters.
			for ( var i = 0; i &lt; inputLength; i++ ) {
				next = args[i];
				if ( !Object.isPlainObject( next ) ) {
					// Only extend plain objects.
					continue;
				}
				for ( var p in next ) {
					if ( !next.hasOwnProperty( p ) ) {
						// Skip inherited properties.
						continue;
					}
					if ( Object.isPlainObject( next[p] ) ) {
						// Recursively merge child object properties.
						v = Object.merge( {}, start[p], next[p] )
					} else {
						v = value( next[p] );
					}
					if ( v !== undefined ) {
						// Assign any non-undefind values.
						start[p] = v;
					}
				}
			}
			return start;
		};

		/**
		 * Create a shallow clone of an object or array.
		 * @param {any} o
		 */
		Object.clone = function ( o ) {
			return value( o );
		};
	}

	if ( typeof Object.assign !== 'function' ) {
		// Must be writable: true, enumerable: false, configurable: true
		Object.defineProperty( Object, "assign", {
			value: function assign( target, varArgs ) { // .length of function is 2
				'use strict';
				if ( target === null || target === undefined ) {
					throw new TypeError( 'Cannot convert undefined or null to object' );
				}

				var to = Object( target );

				for ( var index = 1; index &lt; arguments.length; index++ ) {
					var nextSource = arguments[index];

					if ( nextSource !== null &amp;&amp; nextSource !== undefined ) {
						for ( var nextKey in nextSource ) {
							// Avoid bugs when hasOwnProperty is shadowed
							if ( Object.prototype.hasOwnProperty.call( nextSource, nextKey ) ) {
								to[nextKey] = nextSource[nextKey];
							}
						}
					}
				}
				return to;
			},
			writable: true,
			configurable: true
		} );
	}
	if ( !Array.isArray ) {
		Array.isArray = function ( arg ) {
			return Object.prototype.toString.call( arg ) === '[object Array]';
		};
	}
	// MDN polyfill
	if ( !Array.from ) {
		Array.from = ( function () {
			var toStr = Object.prototype.toString;
			var isCallable = function ( fn ) {
				return typeof fn === 'function' || toStr.call( fn ) === '[object Function]';
			};
			var toInteger = function ( value ) {
				var number = Number( value );
				if ( isNaN( number ) ) { return 0; }
				if ( number === 0 || !isFinite( number ) ) { return number; }
				return ( number &gt; 0 ? 1 : -1 ) * Math.floor( Math.abs( number ) );
			};
			var maxSafeInteger = Math.pow( 2, 53 ) - 1;
			var toLength = function ( value ) {
				var len = toInteger( value );
				return Math.min( Math.max( len, 0 ), maxSafeInteger );
			};

			// The length property of the from method is 1.
			return function from( arrayLike/*, mapFn, thisArg */ ) {
				// 1. Let C be the this value.
				var C = this;

				// 2. Let items be ToObject(arrayLike).
				var items = Object( arrayLike );

				// 3. ReturnIfAbrupt(items).
				if ( arrayLike == null ) {
					throw new TypeError( 'Array.from requires an array-like object - not null or undefined' );
				}

				// 4. If mapfn is undefined, then let mapping be false.
				var mapFn = arguments.length &gt; 1 ? arguments[1] : void undefined;
				var T;
				if ( typeof mapFn !== 'undefined' ) {
					// 5. else
					// 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
					if ( !isCallable( mapFn ) ) {
						throw new TypeError( 'Array.from: when provided, the second argument must be a function' );
					}

					// 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
					if ( arguments.length &gt; 2 ) {
						T = arguments[2];
					}
				}

				// 10. Let lenValue be Get(items, "length").
				// 11. Let len be ToLength(lenValue).
				var len = toLength( items.length );

				// 13. If IsConstructor(C) is true, then
				// 13. a. Let A be the result of calling the [[Construct]] internal method 
				// of C with an argument list containing the single item len.
				// 14. a. Else, Let A be ArrayCreate(len).
				var A = isCallable( C ) ? Object( new C( len ) ) : new Array( len );

				// 16. Let k be 0.
				var k = 0;
				// 17. Repeat, while k &lt; len… (also steps a - h)
				var kValue;
				while ( k &lt; len ) {
					kValue = items[k];
					if ( mapFn ) {
						A[k] = typeof T === 'undefined' ? mapFn( kValue, k ) : mapFn.call( T, kValue, k );
					} else {
						A[k] = kValue;
					}
					k += 1;
				}
				// 18. Let putStatus be Put(A, "length", len, true).
				A.length = len;
				// 20. Return A.
				return A;
			};
		}() );
	}
	// https://tc39.github.io/ecma262/#sec-array.prototype.find
	if ( !Array.prototype.find ) {
		Object.defineProperty( Array.prototype, 'find', {
			value: function ( predicate ) {
				// 1. Let O be ? ToObject(this value).
				if ( this == null ) {
					throw TypeError( '"this" is null or not defined' );
				}

				var o = Object( this );

				// 2. Let len be ? ToLength(? Get(O, "length")).
				var len = o.length &gt;&gt;&gt; 0;

				// 3. If IsCallable(predicate) is false, throw a TypeError exception.
				if ( typeof predicate !== 'function' ) {
					throw TypeError( 'predicate must be a function' );
				}

				// 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
				var thisArg = arguments[1];

				// 5. Let k be 0.
				var k = 0;

				// 6. Repeat, while k &lt; len
				while ( k &lt; len ) {
					// a. Let Pk be ! ToString(k).
					// b. Let kValue be ? Get(O, Pk).
					// c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
					// d. If testResult is true, return kValue.
					var kValue = o[k];
					if ( predicate.call( thisArg, kValue, k, o ) ) {
						return kValue;
					}
					// e. Increase k by 1.
					k++;
				}

				// 7. Return undefined.
				return undefined;
			},
			configurable: true,
			writable: true
		} );
	}
	// Create an array quick sort function.
	if ( !Array.quickSort ) {
		var utils = {
			// Swap two positions of an array.
			swap: function ( array, a, b ) {
				var tmp = array[a];
				array[a] = array[b];
				array[b] = tmp;
			},
			// Separate part of an array into high/low.
			partition: function ( array, begin, end, pivot, fn ) {
				// Get the pivit point.
				var piv = array[pivot];
				utils.swap( array, pivot, end - 1 );

				// Move all items in front of or after the pivot point.
				var store = begin;
				var ix;
				for ( ix = begin; ix &lt; end - 1; ++ix ) {
					if ( fn ? fn( array[ix], piv ) &lt;= 0 : array[ix] &lt;= piv ) {
						utils.swap( array, store, ix );
						++store;
					}
				}
				utils.swap( array, end - 1, store );

				return store;
			},
			// Perform a quicksort on a part of an array.
			quick: function ( array, begin, end, fn ) {
				if ( end - 1 &gt; begin ) {
					// Get a pivot point.
					var pivot = begin + Math.floor( Math.random() * ( end - begin ) );

					// Partition the array in to pre-sorted halves.
					pivot = utils.partition( array, begin, end, pivot, fn );

					// Recursivly sort each half.
					utils.quick( array, begin, pivot, fn );
					utils.quick( array, pivot + 1, end, fn );
				}
			}
		};
		// Run a partition-exchange sort.
		Array.quickSort = function ( array, fn ) {
			utils.quick( array, 0, array.length, fn );
		};
	}

	// https://github.com/behnammodi/polyfill/blob/master/string.polyfill.js
	if ( !String.prototype.padStart ) {
		Object.defineProperty( String.prototype, 'padStart', {
			configurable: true,
			writable: true,
			value: function ( targetLength, padString ) {
				targetLength = targetLength &gt;&gt; 0; //floor if number or convert non-number to 0;
				padString = String( typeof padString !== 'undefined' ? padString : ' ' );
				if ( this.length &gt; targetLength ) {
					return String( this );
				} else {
					targetLength = targetLength - this.length;
					if ( targetLength &gt; padString.length ) {
						padString += padString.repeat( targetLength / padString.length ); //append to original to ensure we are longer than needed
					}
					return padString.slice( 0, targetLength ) + String( this );
				}
			},
		} );
	}

	var regxDate = [
		/^\d{4}\-\d{2}\-\d{2}T\d\d\:\d\d/,
		/^(\d{4})\-(\d{2})\-(\d{2})(?:\s+|$)/,
		/(^.+ |^\s*)(\d+):(\d+)(:\d+)? ?(?:(am)|(pm))\s*$/i,
		/(^.+ |^\s*)(\d+):(\d+)(?:(\d+)(\.\d+)?)?\s*$/
	];

	if ( !Date.parse2 ) {
		/**
		 * Parse a date with more options.
		 * 
		 * @param {any} val
		 */
		Date.parse2 = function ( val ) {
			if ( !val ) {
				return null;
			} else if ( val instanceof Date ) {
				return val;
			}

			var d;
			if ( typeof val !== 'string' ) {
				d = new Date( val );
			} else {
				for ( var i = 0; i &lt; regxDate.length; i++ ) {
					var m = regxDate[i].exec( val );
					if ( !m ) {
						continue;
					} else if ( i === 0 ) {
						// ISO 8601, use the standard parser.
						break;
					} else if ( i === 1 ) {
						// Extract the date portion.
						d = new Date( +( m[1] ), +( m[2] ) - 1, +( m[3] ) );
					} else if ( i === 2 ) {
						// Extract the date portion.
						d = new Date( m[1] || new Date() );
						if ( isNaN( d ) ) {
							return null;
						}
						// AM:PM time.
						var h = +( m[2] );
						if ( m[5] &amp;&amp; h === 12 ) {
							// 12:00 AM
							d.setHours( 0 );
						} else if ( m[6] &amp;&amp; h &lt; 12 ) {
							// &lt; 12:00 PM
							d.setHours( h + 12 );
						} else {
							// Everything else.
							d.setHours( h );
						}
						d.setMinutes( +( m[3] ) );
						if ( m[4] ) {
							d.setSeconds( +( m[4].substr( 1 ) ) );
						} else {
							d.setSeconds( 0 );
						}
						d.setMilliseconds( 0 );
					} else if ( i === 3 ) {
						// Extract the date portion.
						d = new Date( m[1] || new Date() );
						if ( isNaN( d ) ) {
							return null;
						}
						// 24 hour time.
						d.setHours( +( m[2] ) );
						d.setMinutes( +( m[3] ) );
						d.setSeconds( +( m[4] ) || 0 );
						d.setMilliseconds( ( +( m[5] ) || 0 ) * 1000 );
					}
				}
				if ( !d ) {
					// Default parser.
					d = new Date( Date.parse( val ) );
				}
			}
			return d &amp;&amp; !isNaN( d ) ? d : null;
		};
	}

	var dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
	var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];

	// Format the date, readble.
	Date.prototype.formatted = function ( pattern ) {
		var local = new Date( this );
		local.setMinutes( local.getMinutes() - local.getTimezoneOffset() );

		var a, upper,
			text = local.toJSON(),
			y = text.slice( 0, 4 ),
			M = text.slice( 5, 7 ),
			d = text.slice( 8, 10 ),
			H = text.slice( 11, 13 ),
			h = +( H ),
			m = text.slice( 14, 16 ),
			s = text.slice( 17, 19 ),
			f = text.slice( 20, 23 ),
			day = this.getDay();

		return ( pattern || "M/d/yyyy" ).replace( /\\.|y{2,4}|M{1,4}|d{1,4}|H{1,2}|h{1,2}|m{1,2}|s{1,2}|t{1,2}|T{1,2}|f{1,3}|rr|RR|ZZZ/g, function ( match ) {
			switch ( match ) {
				case 'yy':
					return y.slice( 2, 4 );
				case 'yyyy':
					return y;
				case 'M':
					return +( M );
				case 'MM':
					return M;
				case 'MMM':
					return monthNames[+( M ) - 1].slice( 0, 3 );
				case 'MMMM':
					return monthNames[+( M ) - 1];
				case 'd':
					return +( d );
				case 'dd':
					return d;
				case 'ddd':
					return dayNames[day].slice( 0, 3 );
				case 'dddd':
					return dayNames[day];
				case 'H':
					return +( H );
				case 'HH':
					return H;
				case 'h':
					if ( h === 0 ) {
						return 12;
					} else if ( h &gt; 12 ) {
						return h - 12;
					} else {
						return h;
					}
				case 'hh':
					if ( h &lt; 10 ) {
						return '0' + h;
					} else {
						return h;
					}
				case 'm':
					return +( m );
				case 'mm':
					return m;
				case 's':
					return +( s );
				case 'ss':
					return s;
				case 't':
					return H &gt; 11 ? 'p' : 'a';
				case 'tt':
					return H &gt; 11 ? 'pm' : 'am';
				case 'T':
					return H &gt; 11 ? 'P' : 'A';
				case 'TT':
					return H &gt; 11 ? 'PM' : 'AM';
				case 'f':
					return f.slice( 0, 1 );
				case 'ff':
					return f.slice( 0, 2 );
				case 'fff':
					return f;
				case 'rr':
				case 'RR':
					upper = match === 'RR';
					switch ( d ) {
						case 1:
						case 21:
						case 31:
							return upper ? "ST" : "st";
						case 2:
						case 22:
							return upper ? "ND" : "nd";
						case 3:
						case 23:
							return upper ? "RD" : "rd";
						default:
							return upper ? "TH" : "th";
					}
					break;
				case 'ZZZ':
					if ( Date.timeZoneAbbreviation ) {
						return Date.timeZoneAbbreviation( local );
					} else {
						return "";
					}
				default:
					return match[0] === '\\' ? match[1] : match;
			}
		} );
	};

	Date.timeZoneAbbreviation = function ( date ) {
		var dst = jstz.date_is_dst( date ),
			suffix = dst ? "DT" : "ST",
			m = /_tz=([^;]+);/.exec( String( document.cookie ) ),
			tz = m &amp;&amp; decodeURIComponent( m[1] ),
			friendly = tz &amp;&amp; jstz.olson.friendly[tz];

		// Return the abbreviation based on the current user's time zone.
		switch ( friendly ) {
			case "Hawaiian Standard Time":
				return "H" + suffix;
			case "Alaskan Standard Time":
				return "A" + suffix;
			case "Pacific Standard Time":
				return "P" + suffix;
			case "Mountain Standard Time":
				return "M" + suffix;
			case "Central Standard Time":
				return "C" + suffix;
			case "Eastern Standard Time":
				return "E" + suffix;
			case "W. Australia Standard Time":
				return "AW" + suffix;
			case "Cen. Australia Standard Time":
			case "AUS Central Standard Time":
				return "AC" + suffix;
			case "AUS Eastern Standard Time":
			case "E. Australia Standard Time":
				return "AE" + suffix;
			case "Central Pacific Standard Time":
				return "CP" + suffix;
			case "New Zealand Standard Time":
				return "NZ" + suffix;
			case "GMT Standard Time":
				return "GMT";
			case "Central Europe Standard Time":
				return suffix == "DT" ? "CEST" : "CET";
			default:
				// Not defined yet.
				return "";
		}
	};

	// MDN polyfill.
	if ( window.NodeList &amp;&amp; !NodeList.prototype.forEach ) {
		NodeList.prototype.forEach = function ( callback, thisArg ) {
			thisArg = thisArg || window;
			for ( var i = 0; i &lt; this.length; i++ ) {
				callback.call( thisArg, this[i], i, this );
			}
		};
	}
	if ( window.HTMLCollection &amp;&amp; !HTMLCollection.prototype.forEach ) {
		HTMLCollection.prototype.forEach = function ( callback, thisArg ) {
			thisArg = thisArg || window;
			for ( var i = 0; i &lt; this.length; i++ ) {
				callback.call( thisArg, this[i], i, this );
			}
		};
	}
	if ( window.NodeList &amp;&amp; !NodeList.prototype.contains ) {
		NodeList.prototype.contains = function ( item ) {
			return Array.prototype.indexOf.call( this, item ) &gt;= 0;
		};
	}
	if ( window.HTMLCollection &amp;&amp; !HTMLCollection.prototype.contains ) {
		HTMLCollection.prototype.contains = function ( item ) {
			return Array.prototype.indexOf.call( this, item ) &gt;= 0;
		};
	}
	( function ( arr ) {
		arr.forEach( function ( item ) {
			if ( item.hasOwnProperty( 'remove' ) ) {
				return;
			}
			Object.defineProperty( item, 'remove', {
				configurable: true,
				enumerable: true,
				writable: true,
				value: function remove() {
					if ( this.parentNode !== null )
						this.parentNode.removeChild( this );
				}
			} );
		} );
	} )( [Element.prototype, CharacterData.prototype, DocumentType.prototype] );

	if ( !Element.prototype.trigger ) {
		Element.prototype.trigger = function ( type, detail ) {
			var evt = { bubbles: true, cancelable: true };
			if ( detail ) {
				evt.detail = detail;
			}
			return this.dispatchEvent( new window.CustomEvent( type, evt ) );
		};
	}
	if ( !Window.prototype.trigger ) {
		Window.prototype.trigger = function ( type, detail ) {
			var evt = {};
			if ( detail ) {
				evt.detail = detail;
			}
			return this.dispatchEvent( new window.CustomEvent( type, evt ) );
		};
	}

	if ( !Element.prototype.closest ) {
		Element.prototype.closest = function ( s ) {
			var el = this,
				doc = el.ownerDocument || document;
			if ( !doc.documentElement.contains( el ) ) return null;
			do {
				if ( !el.matches ) { return null; }
				else if ( el.matches( s ) ) { return el; }
				el = el.parentElement || el.parentNode;
			} while ( el );
			return null;
		};
	}

	if ( !Element.prototype.nextUntil ) {
		Element.prototype.nextUntil = function ( s ) {
			var el = this,
				doc = el.ownerDocument || document,
				siblings = [];
			// Get the next sibling element
			if ( !doc.documentElement.contains( el ) ) return null;
			el = el.nextElementSibling;
			do {
				if ( !el.matches ) { return null; }
				else if ( el.matches( s ) ) { break; }
				siblings.push( el );
				el = el.nextElementSibling;
			} while ( el );
			return siblings;
		};
	}

	if ( !Element.prototype.index ) {
		Element.prototype.index = function () {
			var el = this,
				doc = el.ownerDocument || document;
			// Get the next sibling element
			if ( !doc.documentElement.contains( el ) ) return null;
			return Array.from( el.parentElement.children ).indexOf( el );
		};
	}

	// JSON parser that handles date strings.
	if ( !window.JSON2 ) {
		// ISO8601
		const _date = /^\d{4}\-\d{2}\-\d{2}T\d\d\:\d\d/;
		// Keep a reference to the original standard parse function.
		const _parse = window.JSON.parse;
		// Custom reviver checking for date values.
		function _dateReviver( key, value ) {
			if ( _date.test( value ) ) {
				const d = new Date( value );
				if ( isNaN( d ) ) {
					return value;
				} else {
					return d;
				}
			} else {
				return value;
			}
		}
		// Create a new JSON2 object in the global namespace.
		window.JSON2 = {
			parse: function ( text, reviver ) {
				return _parse( text, reviver || _dateReviver );
			},
			tryparse: function ( text, reviver ) {
				try {
					return _parse( text, reviver || _dateReviver );
				} catch ( ex ) {
					return null;
				}
			}
		};
	}
	if ( !JSON2.parse ) { JSON2.parse = JSON.parse; }
	if ( !JSON2.tryparse ) {
		JSON2.tryparse = function ( json ) {
			try {
				return JSON2.parse( json );
			} catch ( ex ) {
				return null;
			}
		}
	}
	if ( !HTMLElement.prototype.matches &amp;&amp; HTMLElement.prototype.msMatchesSelector ) {
		HTMLElement.prototype.matches = HTMLElement.prototype.msMatchesSelector;
	}

	// Date polyfills
	if ( Date ) {
		if ( !Date.prototype.addMinutes ) {
			Date.prototype.addMinutes = function ( minutes ) {
				if ( !minutes || isNaN( minutes = +( minutes ) ) ) {
					return this;
				}
				return new Date( +( this ) + ( 60000 * minutes ) );
			}
		}

		if ( !Date.prototype.roundTime ) {
			Date.prototype.roundTime = function ( minutes ) {
				if ( !minutes || isNaN( minutes = +( minutes ) ) ) {
					return this;
				}
				let h = this.getHours();
				let m = this.getMinutes();

				// Convert hours and minutes to time in minutes
				let time = ( h * 60 ) + m;
				let rounded = Math.floor( time / minutes ) * minutes;

				this.setHours( Math.floor( rounded / 60 ) );
				this.setMinutes( rounded % 60 );
				this.setSeconds( 0 );
				return this;
			}
		}
	}

	if ( window.register ) {
		window.register( "usc/p/poly" );
	}
} )();</pre></body></html>