You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					697 lines
				
				16 KiB
			
		
		
			
		
	
	
					697 lines
				
				16 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								//! moment-timezone.js
							 | 
						||
| 
								 | 
							
								//! version : 0.5.43
							 | 
						||
| 
								 | 
							
								//! Copyright (c) JS Foundation and other contributors
							 | 
						||
| 
								 | 
							
								//! license : MIT
							 | 
						||
| 
								 | 
							
								//! github.com/moment/moment-timezone
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(function (root, factory) {
							 | 
						||
| 
								 | 
							
									"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/*global define*/
							 | 
						||
| 
								 | 
							
									if (typeof module === 'object' && module.exports) {
							 | 
						||
| 
								 | 
							
										module.exports = factory(require('moment')); // Node
							 | 
						||
| 
								 | 
							
									} else if (typeof define === 'function' && define.amd) {
							 | 
						||
| 
								 | 
							
										define(['moment'], factory);                 // AMD
							 | 
						||
| 
								 | 
							
									} else {
							 | 
						||
| 
								 | 
							
										factory(root.moment);                        // Browser
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}(this, function (moment) {
							 | 
						||
| 
								 | 
							
									"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Resolves es6 module loading issue
							 | 
						||
| 
								 | 
							
									if (moment.version === undefined && moment.default) {
							 | 
						||
| 
								 | 
							
										moment = moment.default;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Do not load moment-timezone a second time.
							 | 
						||
| 
								 | 
							
									// if (moment.tz !== undefined) {
							 | 
						||
| 
								 | 
							
									// 	logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
							 | 
						||
| 
								 | 
							
									// 	return moment;
							 | 
						||
| 
								 | 
							
									// }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var VERSION = "0.5.43",
							 | 
						||
| 
								 | 
							
										zones = {},
							 | 
						||
| 
								 | 
							
										links = {},
							 | 
						||
| 
								 | 
							
										countries = {},
							 | 
						||
| 
								 | 
							
										names = {},
							 | 
						||
| 
								 | 
							
										guesses = {},
							 | 
						||
| 
								 | 
							
										cachedGuess;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (!moment || typeof moment.version !== 'string') {
							 | 
						||
| 
								 | 
							
										logError('Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var momentVersion = moment.version.split('.'),
							 | 
						||
| 
								 | 
							
										major = +momentVersion[0],
							 | 
						||
| 
								 | 
							
										minor = +momentVersion[1];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Moment.js version check
							 | 
						||
| 
								 | 
							
									if (major < 2 || (major === 2 && minor < 6)) {
							 | 
						||
| 
								 | 
							
										logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/************************************
							 | 
						||
| 
								 | 
							
										Unpacking
							 | 
						||
| 
								 | 
							
									************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function charCodeToInt(charCode) {
							 | 
						||
| 
								 | 
							
										if (charCode > 96) {
							 | 
						||
| 
								 | 
							
											return charCode - 87;
							 | 
						||
| 
								 | 
							
										} else if (charCode > 64) {
							 | 
						||
| 
								 | 
							
											return charCode - 29;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return charCode - 48;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function unpackBase60(string) {
							 | 
						||
| 
								 | 
							
										var i = 0,
							 | 
						||
| 
								 | 
							
											parts = string.split('.'),
							 | 
						||
| 
								 | 
							
											whole = parts[0],
							 | 
						||
| 
								 | 
							
											fractional = parts[1] || '',
							 | 
						||
| 
								 | 
							
											multiplier = 1,
							 | 
						||
| 
								 | 
							
											num,
							 | 
						||
| 
								 | 
							
											out = 0,
							 | 
						||
| 
								 | 
							
											sign = 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// handle negative numbers
							 | 
						||
| 
								 | 
							
										if (string.charCodeAt(0) === 45) {
							 | 
						||
| 
								 | 
							
											i = 1;
							 | 
						||
| 
								 | 
							
											sign = -1;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// handle digits before the decimal
							 | 
						||
| 
								 | 
							
										for (i; i < whole.length; i++) {
							 | 
						||
| 
								 | 
							
											num = charCodeToInt(whole.charCodeAt(i));
							 | 
						||
| 
								 | 
							
											out = 60 * out + num;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// handle digits after the decimal
							 | 
						||
| 
								 | 
							
										for (i = 0; i < fractional.length; i++) {
							 | 
						||
| 
								 | 
							
											multiplier = multiplier / 60;
							 | 
						||
| 
								 | 
							
											num = charCodeToInt(fractional.charCodeAt(i));
							 | 
						||
| 
								 | 
							
											out += num * multiplier;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return out * sign;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function arrayToInt (array) {
							 | 
						||
| 
								 | 
							
										for (var i = 0; i < array.length; i++) {
							 | 
						||
| 
								 | 
							
											array[i] = unpackBase60(array[i]);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function intToUntil (array, length) {
							 | 
						||
| 
								 | 
							
										for (var i = 0; i < length; i++) {
							 | 
						||
| 
								 | 
							
											array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										array[length - 1] = Infinity;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function mapIndices (source, indices) {
							 | 
						||
| 
								 | 
							
										var out = [], i;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (i = 0; i < indices.length; i++) {
							 | 
						||
| 
								 | 
							
											out[i] = source[indices[i]];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return out;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function unpack (string) {
							 | 
						||
| 
								 | 
							
										var data = string.split('|'),
							 | 
						||
| 
								 | 
							
											offsets = data[2].split(' '),
							 | 
						||
| 
								 | 
							
											indices = data[3].split(''),
							 | 
						||
| 
								 | 
							
											untils  = data[4].split(' ');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										arrayToInt(offsets);
							 | 
						||
| 
								 | 
							
										arrayToInt(indices);
							 | 
						||
| 
								 | 
							
										arrayToInt(untils);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										intToUntil(untils, indices.length);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return {
							 | 
						||
| 
								 | 
							
											name       : data[0],
							 | 
						||
| 
								 | 
							
											abbrs      : mapIndices(data[1].split(' '), indices),
							 | 
						||
| 
								 | 
							
											offsets    : mapIndices(offsets, indices),
							 | 
						||
| 
								 | 
							
											untils     : untils,
							 | 
						||
| 
								 | 
							
											population : data[5] | 0
							 | 
						||
| 
								 | 
							
										};
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/************************************
							 | 
						||
| 
								 | 
							
										Zone object
							 | 
						||
| 
								 | 
							
									************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function Zone (packedString) {
							 | 
						||
| 
								 | 
							
										if (packedString) {
							 | 
						||
| 
								 | 
							
											this._set(unpack(packedString));
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Zone.prototype = {
							 | 
						||
| 
								 | 
							
										_set : function (unpacked) {
							 | 
						||
| 
								 | 
							
											this.name       = unpacked.name;
							 | 
						||
| 
								 | 
							
											this.abbrs      = unpacked.abbrs;
							 | 
						||
| 
								 | 
							
											this.untils     = unpacked.untils;
							 | 
						||
| 
								 | 
							
											this.offsets    = unpacked.offsets;
							 | 
						||
| 
								 | 
							
											this.population = unpacked.population;
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										_index : function (timestamp) {
							 | 
						||
| 
								 | 
							
											var target = +timestamp,
							 | 
						||
| 
								 | 
							
												untils = this.untils,
							 | 
						||
| 
								 | 
							
												i;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											for (i = 0; i < untils.length; i++) {
							 | 
						||
| 
								 | 
							
												if (target < untils[i]) {
							 | 
						||
| 
								 | 
							
													return i;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										countries : function () {
							 | 
						||
| 
								 | 
							
											var zone_name = this.name;
							 | 
						||
| 
								 | 
							
											return Object.keys(countries).filter(function (country_code) {
							 | 
						||
| 
								 | 
							
												return countries[country_code].zones.indexOf(zone_name) !== -1;
							 | 
						||
| 
								 | 
							
											});
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										parse : function (timestamp) {
							 | 
						||
| 
								 | 
							
											var target  = +timestamp,
							 | 
						||
| 
								 | 
							
												offsets = this.offsets,
							 | 
						||
| 
								 | 
							
												untils  = this.untils,
							 | 
						||
| 
								 | 
							
												max     = untils.length - 1,
							 | 
						||
| 
								 | 
							
												offset, offsetNext, offsetPrev, i;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											for (i = 0; i < max; i++) {
							 | 
						||
| 
								 | 
							
												offset     = offsets[i];
							 | 
						||
| 
								 | 
							
												offsetNext = offsets[i + 1];
							 | 
						||
| 
								 | 
							
												offsetPrev = offsets[i ? i - 1 : i];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if (offset < offsetNext && tz.moveAmbiguousForward) {
							 | 
						||
| 
								 | 
							
													offset = offsetNext;
							 | 
						||
| 
								 | 
							
												} else if (offset > offsetPrev && tz.moveInvalidForward) {
							 | 
						||
| 
								 | 
							
													offset = offsetPrev;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if (target < untils[i] - (offset * 60000)) {
							 | 
						||
| 
								 | 
							
													return offsets[i];
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											return offsets[max];
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										abbr : function (mom) {
							 | 
						||
| 
								 | 
							
											return this.abbrs[this._index(mom)];
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										offset : function (mom) {
							 | 
						||
| 
								 | 
							
											logError("zone.offset has been deprecated in favor of zone.utcOffset");
							 | 
						||
| 
								 | 
							
											return this.offsets[this._index(mom)];
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										utcOffset : function (mom) {
							 | 
						||
| 
								 | 
							
											return this.offsets[this._index(mom)];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/************************************
							 | 
						||
| 
								 | 
							
										Country object
							 | 
						||
| 
								 | 
							
									************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function Country (country_name, zone_names) {
							 | 
						||
| 
								 | 
							
										this.name = country_name;
							 | 
						||
| 
								 | 
							
										this.zones = zone_names;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/************************************
							 | 
						||
| 
								 | 
							
										Current Timezone
							 | 
						||
| 
								 | 
							
									************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function OffsetAt(at) {
							 | 
						||
| 
								 | 
							
										var timeString = at.toTimeString();
							 | 
						||
| 
								 | 
							
										var abbr = timeString.match(/\([a-z ]+\)/i);
							 | 
						||
| 
								 | 
							
										if (abbr && abbr[0]) {
							 | 
						||
| 
								 | 
							
											// 17:56:31 GMT-0600 (CST)
							 | 
						||
| 
								 | 
							
											// 17:56:31 GMT-0600 (Central Standard Time)
							 | 
						||
| 
								 | 
							
											abbr = abbr[0].match(/[A-Z]/g);
							 | 
						||
| 
								 | 
							
											abbr = abbr ? abbr.join('') : undefined;
							 | 
						||
| 
								 | 
							
										} else {
							 | 
						||
| 
								 | 
							
											// 17:56:31 CST
							 | 
						||
| 
								 | 
							
											// 17:56:31 GMT+0800 (台北標準時間)
							 | 
						||
| 
								 | 
							
											abbr = timeString.match(/[A-Z]{3,5}/g);
							 | 
						||
| 
								 | 
							
											abbr = abbr ? abbr[0] : undefined;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (abbr === 'GMT') {
							 | 
						||
| 
								 | 
							
											abbr = undefined;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.at = +at;
							 | 
						||
| 
								 | 
							
										this.abbr = abbr;
							 | 
						||
| 
								 | 
							
										this.offset = at.getTimezoneOffset();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function ZoneScore(zone) {
							 | 
						||
| 
								 | 
							
										this.zone = zone;
							 | 
						||
| 
								 | 
							
										this.offsetScore = 0;
							 | 
						||
| 
								 | 
							
										this.abbrScore = 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
							 | 
						||
| 
								 | 
							
										this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
							 | 
						||
| 
								 | 
							
										if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
							 | 
						||
| 
								 | 
							
											this.abbrScore++;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function findChange(low, high) {
							 | 
						||
| 
								 | 
							
										var mid, diff;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
							 | 
						||
| 
								 | 
							
											mid = new OffsetAt(new Date(low.at + diff));
							 | 
						||
| 
								 | 
							
											if (mid.offset === low.offset) {
							 | 
						||
| 
								 | 
							
												low = mid;
							 | 
						||
| 
								 | 
							
											} else {
							 | 
						||
| 
								 | 
							
												high = mid;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return low;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function userOffsets() {
							 | 
						||
| 
								 | 
							
										var startYear = new Date().getFullYear() - 2,
							 | 
						||
| 
								 | 
							
											last = new OffsetAt(new Date(startYear, 0, 1)),
							 | 
						||
| 
								 | 
							
											offsets = [last],
							 | 
						||
| 
								 | 
							
											change, next, i;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (i = 1; i < 48; i++) {
							 | 
						||
| 
								 | 
							
											next = new OffsetAt(new Date(startYear, i, 1));
							 | 
						||
| 
								 | 
							
											if (next.offset !== last.offset) {
							 | 
						||
| 
								 | 
							
												change = findChange(last, next);
							 | 
						||
| 
								 | 
							
												offsets.push(change);
							 | 
						||
| 
								 | 
							
												offsets.push(new OffsetAt(new Date(change.at + 6e4)));
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											last = next;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (i = 0; i < 4; i++) {
							 | 
						||
| 
								 | 
							
											offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
							 | 
						||
| 
								 | 
							
											offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return offsets;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function sortZoneScores (a, b) {
							 | 
						||
| 
								 | 
							
										if (a.offsetScore !== b.offsetScore) {
							 | 
						||
| 
								 | 
							
											return a.offsetScore - b.offsetScore;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										if (a.abbrScore !== b.abbrScore) {
							 | 
						||
| 
								 | 
							
											return a.abbrScore - b.abbrScore;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										if (a.zone.population !== b.zone.population) {
							 | 
						||
| 
								 | 
							
											return b.zone.population - a.zone.population;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return b.zone.name.localeCompare(a.zone.name);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function addToGuesses (name, offsets) {
							 | 
						||
| 
								 | 
							
										var i, offset;
							 | 
						||
| 
								 | 
							
										arrayToInt(offsets);
							 | 
						||
| 
								 | 
							
										for (i = 0; i < offsets.length; i++) {
							 | 
						||
| 
								 | 
							
											offset = offsets[i];
							 | 
						||
| 
								 | 
							
											guesses[offset] = guesses[offset] || {};
							 | 
						||
| 
								 | 
							
											guesses[offset][name] = true;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function guessesForUserOffsets (offsets) {
							 | 
						||
| 
								 | 
							
										var offsetsLength = offsets.length,
							 | 
						||
| 
								 | 
							
											filteredGuesses = {},
							 | 
						||
| 
								 | 
							
											out = [],
							 | 
						||
| 
								 | 
							
											i, j, guessesOffset;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (i = 0; i < offsetsLength; i++) {
							 | 
						||
| 
								 | 
							
											guessesOffset = guesses[offsets[i].offset] || {};
							 | 
						||
| 
								 | 
							
											for (j in guessesOffset) {
							 | 
						||
| 
								 | 
							
												if (guessesOffset.hasOwnProperty(j)) {
							 | 
						||
| 
								 | 
							
													filteredGuesses[j] = true;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (i in filteredGuesses) {
							 | 
						||
| 
								 | 
							
											if (filteredGuesses.hasOwnProperty(i)) {
							 | 
						||
| 
								 | 
							
												out.push(names[i]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return out;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function rebuildGuess () {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// use Intl API when available and returning valid time zone
							 | 
						||
| 
								 | 
							
										try {
							 | 
						||
| 
								 | 
							
											var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
							 | 
						||
| 
								 | 
							
											if (intlName && intlName.length > 3) {
							 | 
						||
| 
								 | 
							
												var name = names[normalizeName(intlName)];
							 | 
						||
| 
								 | 
							
												if (name) {
							 | 
						||
| 
								 | 
							
													return name;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
												logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										} catch (e) {
							 | 
						||
| 
								 | 
							
											// Intl unavailable, fall back to manual guessing.
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var offsets = userOffsets(),
							 | 
						||
| 
								 | 
							
											offsetsLength = offsets.length,
							 | 
						||
| 
								 | 
							
											guesses = guessesForUserOffsets(offsets),
							 | 
						||
| 
								 | 
							
											zoneScores = [],
							 | 
						||
| 
								 | 
							
											zoneScore, i, j;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (i = 0; i < guesses.length; i++) {
							 | 
						||
| 
								 | 
							
											zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
							 | 
						||
| 
								 | 
							
											for (j = 0; j < offsetsLength; j++) {
							 | 
						||
| 
								 | 
							
												zoneScore.scoreOffsetAt(offsets[j]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											zoneScores.push(zoneScore);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										zoneScores.sort(sortZoneScores);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function guess (ignoreCache) {
							 | 
						||
| 
								 | 
							
										if (!cachedGuess || ignoreCache) {
							 | 
						||
| 
								 | 
							
											cachedGuess = rebuildGuess();
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return cachedGuess;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/************************************
							 | 
						||
| 
								 | 
							
										Global Methods
							 | 
						||
| 
								 | 
							
									************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function normalizeName (name) {
							 | 
						||
| 
								 | 
							
										return (name || '').toLowerCase().replace(/\//g, '_');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function addZone (packed) {
							 | 
						||
| 
								 | 
							
										var i, name, split, normalized;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (typeof packed === "string") {
							 | 
						||
| 
								 | 
							
											packed = [packed];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (i = 0; i < packed.length; i++) {
							 | 
						||
| 
								 | 
							
											split = packed[i].split('|');
							 | 
						||
| 
								 | 
							
											name = split[0];
							 | 
						||
| 
								 | 
							
											normalized = normalizeName(name);
							 | 
						||
| 
								 | 
							
											zones[normalized] = packed[i];
							 | 
						||
| 
								 | 
							
											names[normalized] = name;
							 | 
						||
| 
								 | 
							
											addToGuesses(normalized, split[2].split(' '));
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function getZone (name, caller) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										name = normalizeName(name);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var zone = zones[name];
							 | 
						||
| 
								 | 
							
										var link;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (zone instanceof Zone) {
							 | 
						||
| 
								 | 
							
											return zone;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (typeof zone === 'string') {
							 | 
						||
| 
								 | 
							
											zone = new Zone(zone);
							 | 
						||
| 
								 | 
							
											zones[name] = zone;
							 | 
						||
| 
								 | 
							
											return zone;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Pass getZone to prevent recursion more than 1 level deep
							 | 
						||
| 
								 | 
							
										if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
							 | 
						||
| 
								 | 
							
											zone = zones[name] = new Zone();
							 | 
						||
| 
								 | 
							
											zone._set(link);
							 | 
						||
| 
								 | 
							
											zone.name = names[name];
							 | 
						||
| 
								 | 
							
											return zone;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function getNames () {
							 | 
						||
| 
								 | 
							
										var i, out = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (i in names) {
							 | 
						||
| 
								 | 
							
											if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
							 | 
						||
| 
								 | 
							
												out.push(names[i]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return out.sort();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function getCountryNames () {
							 | 
						||
| 
								 | 
							
										return Object.keys(countries);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function addLink (aliases) {
							 | 
						||
| 
								 | 
							
										var i, alias, normal0, normal1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (typeof aliases === "string") {
							 | 
						||
| 
								 | 
							
											aliases = [aliases];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (i = 0; i < aliases.length; i++) {
							 | 
						||
| 
								 | 
							
											alias = aliases[i].split('|');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											normal0 = normalizeName(alias[0]);
							 | 
						||
| 
								 | 
							
											normal1 = normalizeName(alias[1]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											links[normal0] = normal1;
							 | 
						||
| 
								 | 
							
											names[normal0] = alias[0];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											links[normal1] = normal0;
							 | 
						||
| 
								 | 
							
											names[normal1] = alias[1];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function addCountries (data) {
							 | 
						||
| 
								 | 
							
										var i, country_code, country_zones, split;
							 | 
						||
| 
								 | 
							
										if (!data || !data.length) return;
							 | 
						||
| 
								 | 
							
										for (i = 0; i < data.length; i++) {
							 | 
						||
| 
								 | 
							
											split = data[i].split('|');
							 | 
						||
| 
								 | 
							
											country_code = split[0].toUpperCase();
							 | 
						||
| 
								 | 
							
											country_zones = split[1].split(' ');
							 | 
						||
| 
								 | 
							
											countries[country_code] = new Country(
							 | 
						||
| 
								 | 
							
												country_code,
							 | 
						||
| 
								 | 
							
												country_zones
							 | 
						||
| 
								 | 
							
											);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function getCountry (name) {
							 | 
						||
| 
								 | 
							
										name = name.toUpperCase();
							 | 
						||
| 
								 | 
							
										return countries[name] || null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function zonesForCountry(country, with_offset) {
							 | 
						||
| 
								 | 
							
										country = getCountry(country);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (!country) return null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var zones = country.zones.sort();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (with_offset) {
							 | 
						||
| 
								 | 
							
											return zones.map(function (zone_name) {
							 | 
						||
| 
								 | 
							
												var zone = getZone(zone_name);
							 | 
						||
| 
								 | 
							
												return {
							 | 
						||
| 
								 | 
							
													name: zone_name,
							 | 
						||
| 
								 | 
							
													offset: zone.utcOffset(new Date())
							 | 
						||
| 
								 | 
							
												};
							 | 
						||
| 
								 | 
							
											});
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return zones;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function loadData (data) {
							 | 
						||
| 
								 | 
							
										addZone(data.zones);
							 | 
						||
| 
								 | 
							
										addLink(data.links);
							 | 
						||
| 
								 | 
							
										addCountries(data.countries);
							 | 
						||
| 
								 | 
							
										tz.dataVersion = data.version;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function zoneExists (name) {
							 | 
						||
| 
								 | 
							
										if (!zoneExists.didShowError) {
							 | 
						||
| 
								 | 
							
											zoneExists.didShowError = true;
							 | 
						||
| 
								 | 
							
												logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return !!getZone(name);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function needsOffset (m) {
							 | 
						||
| 
								 | 
							
										var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
							 | 
						||
| 
								 | 
							
										return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function logError (message) {
							 | 
						||
| 
								 | 
							
										if (typeof console !== 'undefined' && typeof console.error === 'function') {
							 | 
						||
| 
								 | 
							
											console.error(message);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/************************************
							 | 
						||
| 
								 | 
							
										moment.tz namespace
							 | 
						||
| 
								 | 
							
									************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function tz (input) {
							 | 
						||
| 
								 | 
							
										var args = Array.prototype.slice.call(arguments, 0, -1),
							 | 
						||
| 
								 | 
							
											name = arguments[arguments.length - 1],
							 | 
						||
| 
								 | 
							
											zone = getZone(name),
							 | 
						||
| 
								 | 
							
											out  = moment.utc.apply(null, args);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (zone && !moment.isMoment(input) && needsOffset(out)) {
							 | 
						||
| 
								 | 
							
											out.add(zone.parse(out), 'minutes');
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										out.tz(name);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return out;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									tz.version      = VERSION;
							 | 
						||
| 
								 | 
							
									tz.dataVersion  = '';
							 | 
						||
| 
								 | 
							
									tz._zones       = zones;
							 | 
						||
| 
								 | 
							
									tz._links       = links;
							 | 
						||
| 
								 | 
							
									tz._names       = names;
							 | 
						||
| 
								 | 
							
									tz._countries	= countries;
							 | 
						||
| 
								 | 
							
									tz.add          = addZone;
							 | 
						||
| 
								 | 
							
									tz.link         = addLink;
							 | 
						||
| 
								 | 
							
									tz.load         = loadData;
							 | 
						||
| 
								 | 
							
									tz.zone         = getZone;
							 | 
						||
| 
								 | 
							
									tz.zoneExists   = zoneExists; // deprecated in 0.1.0
							 | 
						||
| 
								 | 
							
									tz.guess        = guess;
							 | 
						||
| 
								 | 
							
									tz.names        = getNames;
							 | 
						||
| 
								 | 
							
									tz.Zone         = Zone;
							 | 
						||
| 
								 | 
							
									tz.unpack       = unpack;
							 | 
						||
| 
								 | 
							
									tz.unpackBase60 = unpackBase60;
							 | 
						||
| 
								 | 
							
									tz.needsOffset  = needsOffset;
							 | 
						||
| 
								 | 
							
									tz.moveInvalidForward   = true;
							 | 
						||
| 
								 | 
							
									tz.moveAmbiguousForward = false;
							 | 
						||
| 
								 | 
							
									tz.countries    = getCountryNames;
							 | 
						||
| 
								 | 
							
									tz.zonesForCountry = zonesForCountry;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/************************************
							 | 
						||
| 
								 | 
							
										Interface with Moment.js
							 | 
						||
| 
								 | 
							
									************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var fn = moment.fn;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									moment.tz = tz;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									moment.defaultZone = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									moment.updateOffset = function (mom, keepTime) {
							 | 
						||
| 
								 | 
							
										var zone = moment.defaultZone,
							 | 
						||
| 
								 | 
							
											offset;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (mom._z === undefined) {
							 | 
						||
| 
								 | 
							
											if (zone && needsOffset(mom) && !mom._isUTC) {
							 | 
						||
| 
								 | 
							
												mom._d = moment.utc(mom._a)._d;
							 | 
						||
| 
								 | 
							
												mom.utc().add(zone.parse(mom), 'minutes');
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											mom._z = zone;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										if (mom._z) {
							 | 
						||
| 
								 | 
							
											offset = mom._z.utcOffset(mom);
							 | 
						||
| 
								 | 
							
											if (Math.abs(offset) < 16) {
							 | 
						||
| 
								 | 
							
												offset = offset / 60;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											if (mom.utcOffset !== undefined) {
							 | 
						||
| 
								 | 
							
												var z = mom._z;
							 | 
						||
| 
								 | 
							
												mom.utcOffset(-offset, keepTime);
							 | 
						||
| 
								 | 
							
												mom._z = z;
							 | 
						||
| 
								 | 
							
											} else {
							 | 
						||
| 
								 | 
							
												mom.zone(offset, keepTime);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									fn.tz = function (name, keepTime) {
							 | 
						||
| 
								 | 
							
										if (name) {
							 | 
						||
| 
								 | 
							
											if (typeof name !== 'string') {
							 | 
						||
| 
								 | 
							
												throw new Error('Time zone name must be a string, got ' + name + ' [' + typeof name + ']');
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											this._z = getZone(name);
							 | 
						||
| 
								 | 
							
											if (this._z) {
							 | 
						||
| 
								 | 
							
												moment.updateOffset(this, keepTime);
							 | 
						||
| 
								 | 
							
											} else {
							 | 
						||
| 
								 | 
							
												logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											return this;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										if (this._z) { return this._z.name; }
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function abbrWrap (old) {
							 | 
						||
| 
								 | 
							
										return function () {
							 | 
						||
| 
								 | 
							
											if (this._z) { return this._z.abbr(this); }
							 | 
						||
| 
								 | 
							
											return old.call(this);
							 | 
						||
| 
								 | 
							
										};
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function resetZoneWrap (old) {
							 | 
						||
| 
								 | 
							
										return function () {
							 | 
						||
| 
								 | 
							
											this._z = null;
							 | 
						||
| 
								 | 
							
											return old.apply(this, arguments);
							 | 
						||
| 
								 | 
							
										};
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function resetZoneWrap2 (old) {
							 | 
						||
| 
								 | 
							
										return function () {
							 | 
						||
| 
								 | 
							
											if (arguments.length > 0) this._z = null;
							 | 
						||
| 
								 | 
							
											return old.apply(this, arguments);
							 | 
						||
| 
								 | 
							
										};
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									fn.zoneName  = abbrWrap(fn.zoneName);
							 | 
						||
| 
								 | 
							
									fn.zoneAbbr  = abbrWrap(fn.zoneAbbr);
							 | 
						||
| 
								 | 
							
									fn.utc       = resetZoneWrap(fn.utc);
							 | 
						||
| 
								 | 
							
									fn.local     = resetZoneWrap(fn.local);
							 | 
						||
| 
								 | 
							
									fn.utcOffset = resetZoneWrap2(fn.utcOffset);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									moment.tz.setDefault = function(name) {
							 | 
						||
| 
								 | 
							
										if (major < 2 || (major === 2 && minor < 9)) {
							 | 
						||
| 
								 | 
							
											logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										moment.defaultZone = name ? getZone(name) : null;
							 | 
						||
| 
								 | 
							
										return moment;
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Cloning a moment should include the _z property.
							 | 
						||
| 
								 | 
							
									var momentProperties = moment.momentProperties;
							 | 
						||
| 
								 | 
							
									if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
							 | 
						||
| 
								 | 
							
										// moment 2.8.1+
							 | 
						||
| 
								 | 
							
										momentProperties.push('_z');
							 | 
						||
| 
								 | 
							
										momentProperties.push('_a');
							 | 
						||
| 
								 | 
							
									} else if (momentProperties) {
							 | 
						||
| 
								 | 
							
										// moment 2.7.0
							 | 
						||
| 
								 | 
							
										momentProperties._z = null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// INJECT DATA
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return moment;
							 | 
						||
| 
								 | 
							
								}));
							 |