@bicharts/chart-mcp 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.mjs +2 -2
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -53,7 +53,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
53
53
  `:`[${o[l]}\r
54
54
  ]`;continue}n+=o[l],o[l]==="\\"?i=!0:a&&o[l]==="]"?a=!1:!a&&o[l]==="["&&(a=!0)}try{new RegExp(n)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return n}function S2(t,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&t.keyType?._def.typeName===T.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((o,n)=>({...o,[n]:Q(t.valueType._def,{...e,currentPath:[...e.currentPath,"properties",n]})??H3(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let r={type:"object",additionalProperties:Q(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return r;if(t.keyType?._def.typeName===T.ZodString&&t.keyType._def.checks?.length){let{type:o,...n}=A2(t.keyType._def,e);return{...r,propertyNames:n}}else{if(t.keyType?._def.typeName===T.ZodEnum)return{...r,propertyNames:{enum:t.keyType._def.values}};if(t.keyType?._def.typeName===T.ZodBranded&&t.keyType._def.type._def.typeName===T.ZodString&&t.keyType._def.type._def.checks?.length){let{type:o,...n}=P2(t.keyType._def,e);return{...r,propertyNames:n}}}return r}function wi(t,e){if(e.mapStrategy==="record")return S2(t,e);let r=Q(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||H3(e),o=Q(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||H3(e);return{type:"array",maxItems:125,items:{type:"array",items:[r,o],minItems:2,maxItems:2}}}function Ni(t){let e=t.values,o=Object.keys(t.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),n=Array.from(new Set(o.map(i=>typeof i)));return{type:n.length===1?n[0]==="string"?"string":"number":["string","number"],enum:o}}function ki(t){return t.target==="openAi"?void 0:{not:H3({...t,currentPath:[...t.currentPath,"not"]})}}function Ti(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var j9={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function xi(t,e){if(e.target==="openApi3")return zi(t,e);let r=t.options instanceof Map?Array.from(t.options.values()):t.options;if(r.every(o=>o._def.typeName in j9&&(!o._def.checks||!o._def.checks.length))){let o=r.reduce((n,i)=>{let a=j9[i._def.typeName];return a&&!n.includes(a)?[...n,a]:n},[]);return{type:o.length>1?o:o[0]}}else if(r.every(o=>o._def.typeName==="ZodLiteral"&&!o.description)){let o=r.reduce((n,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...n,a];case"bigint":return[...n,"integer"];case"object":if(i._def.value===null)return[...n,"null"];default:return n}},[]);if(o.length===r.length){let n=o.filter((i,a,s)=>s.indexOf(i)===a);return{type:n.length>1?n:n[0],enum:r.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(r.every(o=>o._def.typeName==="ZodEnum"))return{type:"string",enum:r.reduce((o,n)=>[...o,...n._def.values.filter(i=>!o.includes(i))],[])};return zi(t,e)}var zi=(t,e)=>{let r=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((o,n)=>Q(o._def,{...e,currentPath:[...e.currentPath,"anyOf",`${n}`]})).filter(o=>!!o&&(!e.strictUnions||typeof o=="object"&&Object.keys(o).length>0));return r.length?{anyOf:r}:void 0};function Fi(t,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length))return e.target==="openApi3"?{type:j9[t.innerType._def.typeName],nullable:!0}:{type:[j9[t.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let o=Q(t.innerType._def,{...e,currentPath:[...e.currentPath]});return o&&"$ref"in o?{allOf:[o],nullable:!0}:o&&{...o,nullable:!0}}let r=Q(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return r&&{anyOf:[r,{type:"null"}]}}function Ii(t,e){let r={type:"number"};if(!t.checks)return r;for(let o of t.checks)switch(o.kind){case"int":r.type="integer",qe(r,"type",o.message,e);break;case"min":e.target==="jsonSchema7"?o.inclusive?M3(r,"minimum",o.value,o.message,e):M3(r,"exclusiveMinimum",o.value,o.message,e):(o.inclusive||(r.exclusiveMinimum=!0),M3(r,"minimum",o.value,o.message,e));break;case"max":e.target==="jsonSchema7"?o.inclusive?M3(r,"maximum",o.value,o.message,e):M3(r,"exclusiveMaximum",o.value,o.message,e):(o.inclusive||(r.exclusiveMaximum=!0),M3(r,"maximum",o.value,o.message,e));break;case"multipleOf":M3(r,"multipleOf",o.value,o.message,e);break}return r}function Li(t,e){let r=e.target==="openAi",o={type:"object",properties:{}},n=[],i=t.shape();for(let s in i){let l=i[s];if(l===void 0||l._def===void 0)continue;let c=Yy(l);c&&r&&(l._def.typeName==="ZodOptional"&&(l=l._def.innerType),l.isNullable()||(l=l.nullable()),c=!1);let p=Q(l._def,{...e,currentPath:[...e.currentPath,"properties",s],propertyPath:[...e.currentPath,"properties",s]});p!==void 0&&(o.properties[s]=p,c||n.push(s))}n.length&&(o.required=n);let a=Ky(t,e);return a!==void 0&&(o.additionalProperties=a),o}function Ky(t,e){if(t.catchall._def.typeName!=="ZodNever")return Q(t.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(t.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function Yy(t){try{return t.isOptional()}catch{return!0}}var Ri=(t,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return Q(t.innerType._def,e);let r=Q(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return r?{anyOf:[{not:H3(e)},r]}:H3(e)};var $i=(t,e)=>{if(e.pipeStrategy==="input")return Q(t.in._def,e);if(e.pipeStrategy==="output")return Q(t.out._def,e);let r=Q(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),o=Q(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",r?"1":"0"]});return{allOf:[r,o].filter(n=>n!==void 0)}};function Oi(t,e){return Q(t.type._def,e)}function Ei(t,e){let o={type:"array",uniqueItems:!0,items:Q(t.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return t.minSize&&M3(o,"minItems",t.minSize.value,t.minSize.message,e),t.maxSize&&M3(o,"maxItems",t.maxSize.value,t.maxSize.message,e),o}function Di(t,e){return t.rest?{type:"array",minItems:t.items.length,items:t.items.map((r,o)=>Q(r._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((r,o)=>o===void 0?r:[...r,o],[]),additionalItems:Q(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((r,o)=>Q(r._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((r,o)=>o===void 0?r:[...r,o],[])}}function Xi(t){return{not:H3(t)}}function Bi(t){return H3(t)}var Hi=(t,e)=>Q(t.innerType._def,e);var Zi=(t,e,r)=>{switch(e){case T.ZodString:return A2(t,r);case T.ZodNumber:return Ii(t,r);case T.ZodObject:return Li(t,r);case T.ZodBigInt:return gi(t,r);case T.ZodBoolean:return Mi();case T.ZodDate:return Ke(t,r);case T.ZodUndefined:return Xi(r);case T.ZodNull:return Ti(r);case T.ZodArray:return fi(t,r);case T.ZodUnion:case T.ZodDiscriminatedUnion:return xi(t,r);case T.ZodIntersection:return Ai(t,r);case T.ZodTuple:return Di(t,r);case T.ZodRecord:return S2(t,r);case T.ZodLiteral:return Si(t,r);case T.ZodEnum:return Pi(t);case T.ZodNativeEnum:return Ni(t);case T.ZodNullable:return Fi(t,r);case T.ZodOptional:return Ri(t,r);case T.ZodMap:return wi(t,r);case T.ZodSet:return Ei(t,r);case T.ZodLazy:return()=>t.getter()._def;case T.ZodPromise:return Oi(t,r);case T.ZodNaN:case T.ZodNever:return ki(r);case T.ZodEffects:return _i(t,r);case T.ZodAny:return H3(r);case T.ZodUnknown:return Bi(r);case T.ZodDefault:return vi(t,r);case T.ZodBranded:return P2(t,r);case T.ZodReadonly:return Hi(t,r);case T.ZodCatch:return Ci(t,r);case T.ZodPipeline:return $i(t,r);case T.ZodFunction:case T.ZodVoid:case T.ZodSymbol:return;default:return(o=>{})(e)}};function Q(t,e,r=!1){let o=e.seen.get(t);if(e.override){let s=e.override?.(t,e,o,r);if(s!==mi)return s}if(o&&!r){let s=Jy(o,e);if(s!==void 0)return s}let n={def:t,path:e.currentPath,jsonSchema:void 0};e.seen.set(t,n);let i=Zi(t,t.typeName,e),a=typeof i=="function"?Q(i(),e):i;if(a&&Qy(t,e,a),e.postProcess){let s=e.postProcess(a,t,e);return n.jsonSchema=a,s}return n.jsonSchema=a,a}var Jy=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:_2(e.currentPath,t.path)};case"none":case"seen":return t.path.length<e.currentPath.length&&t.path.every((r,o)=>e.currentPath[o]===r)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),H3(e)):e.$refStrategy==="seen"?H3(e):void 0}},Qy=(t,e,r)=>(t.description&&(r.description=t.description,e.markdownDescription&&(r.markdownDescription=t.description)),r);var Qe=(t,e)=>{let r=hi(e),o=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((l,[c,p])=>({...l,[c]:Q(p._def,{...r,currentPath:[...r.basePath,r.definitionPath,c]},!0)??H3(r)}),{}):void 0,n=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=Q(t._def,n===void 0?r:{...r,currentPath:[...r.basePath,r.definitionPath,n]},!1)??H3(r),a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(i.title=a),r.flags.hasReferencedOpenAiAnyType&&(o||(o={}),o[r.openAiAnyTypeName]||(o[r.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:r.$refStrategy==="relative"?"1":[...r.basePath,r.definitionPath,r.openAiAnyTypeName].join("/")}}));let s=n===void 0?o?{...i,[r.definitionPath]:o}:i:{$ref:[...r.$refStrategy==="relative"?[]:r.basePath,r.definitionPath,n].join("/"),[r.definitionPath]:{...o,[n]:i}};return r.target==="jsonSchema7"?s.$schema="http://json-schema.org/draft-07/schema#":(r.target==="jsonSchema2019-09"||r.target==="openAi")&&(s.$schema="https://json-schema.org/draft/2019-09/schema#"),r.target==="openAi"&&("anyOf"in s||"oneOf"in s||"allOf"in s||"type"in s&&Array.isArray(s.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),s};function eh(t){return!t||t==="jsonSchema7"||t==="draft-7"?"draft-7":t==="jsonSchema2019-09"||t==="draft-2020-12"?"draft-2020-12":"draft-7"}function e0(t,e){return I1(t)?Pe(t,{target:eh(e?.target),io:e?.pipeStrategy??"input"}):Qe(t,{strictUnions:e?.strictUnions??!0,pipeStrategy:e?.pipeStrategy??"input"})}function t0(t){let r=z4(t)?.method;if(!r)throw new Error("Schema is missing a method literal");let o=Y7(r);if(typeof o!="string")throw new Error("Schema method literal must be a string");return o}function r0(t,e){let r=T4(t,e);if(!r.success)throw r.error;return r.data}var th=6e4,b2=class{constructor(e){this._options=e,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(n2,r=>{this._oncancel(r)}),this.setNotificationHandler(a2,r=>{this._onprogress(r)}),this.setRequestHandler(i2,r=>({})),this._taskStore=e?.taskStore,this._taskMessageQueue=e?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(s2,async(r,o)=>{let n=await this._taskStore.getTask(r.params.taskId,o.sessionId);if(!n)throw new B(U.InvalidParams,"Failed to retrieve task: Task not found");return{...n}}),this.setRequestHandler(c2,async(r,o)=>{let n=async()=>{let i=r.params.taskId;if(this._taskMessageQueue){let s;for(;s=await this._taskMessageQueue.dequeue(i,o.sessionId);){if(s.type==="response"||s.type==="error"){let l=s.message,c=l.id,p=this._requestResolvers.get(c);if(p)if(this._requestResolvers.delete(c),s.type==="response")p(l);else{let u=l,m=new B(u.error.code,u.error.message,u.error.data);p(m)}else{let u=s.type==="response"?"Response":"Error";this._onerror(new Error(`${u} handler missing for request ${c}`))}continue}await this._transport?.send(s.message,{relatedRequestId:o.requestId})}}let a=await this._taskStore.getTask(i,o.sessionId);if(!a)throw new B(U.InvalidParams,`Task not found: ${i}`);if(!F4(a.status))return await this._waitForTaskUpdate(i,o.signal),await n();if(F4(a.status)){let s=await this._taskStore.getTaskResult(i,o.sessionId);return this._clearTaskQueue(i),{...s,_meta:{...s._meta,[x4]:{taskId:i}}}}return await n()};return await n()}),this.setRequestHandler(u2,async(r,o)=>{try{let{tasks:n,nextCursor:i}=await this._taskStore.listTasks(r.params?.cursor,o.sessionId);return{tasks:n,nextCursor:i,_meta:{}}}catch(n){throw new B(U.InvalidParams,`Failed to list tasks: ${n instanceof Error?n.message:String(n)}`)}}),this.setRequestHandler(d2,async(r,o)=>{try{let n=await this._taskStore.getTask(r.params.taskId,o.sessionId);if(!n)throw new B(U.InvalidParams,`Task not found: ${r.params.taskId}`);if(F4(n.status))throw new B(U.InvalidParams,`Cannot cancel task in terminal status: ${n.status}`);await this._taskStore.updateTaskStatus(r.params.taskId,"cancelled","Client cancelled task execution.",o.sessionId),this._clearTaskQueue(r.params.taskId);let i=await this._taskStore.getTask(r.params.taskId,o.sessionId);if(!i)throw new B(U.InvalidParams,`Task not found after cancellation: ${r.params.taskId}`);return{_meta:{},...i}}catch(n){throw n instanceof B?n:new B(U.InvalidRequest,`Failed to cancel task: ${n instanceof Error?n.message:String(n)}`)}}))}async _oncancel(e){if(!e.params.requestId)return;this._requestHandlerAbortControllers.get(e.params.requestId)?.abort(e.params.reason)}_setupTimeout(e,r,o,n,i=!1){this._timeoutInfo.set(e,{timeoutId:setTimeout(n,r),startTime:Date.now(),timeout:r,maxTotalTimeout:o,resetTimeoutOnProgress:i,onTimeout:n})}_resetTimeout(e){let r=this._timeoutInfo.get(e);if(!r)return!1;let o=Date.now()-r.startTime;if(r.maxTotalTimeout&&o>=r.maxTotalTimeout)throw this._timeoutInfo.delete(e),B.fromError(U.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:r.maxTotalTimeout,totalElapsed:o});return clearTimeout(r.timeoutId),r.timeoutId=setTimeout(r.onTimeout,r.timeout),!0}_cleanupTimeout(e){let r=this._timeoutInfo.get(e);r&&(clearTimeout(r.timeoutId),this._timeoutInfo.delete(e))}async connect(e){if(this._transport)throw new Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection.");this._transport=e;let r=this.transport?.onclose;this._transport.onclose=()=>{r?.(),this._onclose()};let o=this.transport?.onerror;this._transport.onerror=i=>{o?.(i),this._onerror(i)};let n=this._transport?.onmessage;this._transport.onmessage=(i,a)=>{n?.(i,a),R9(i)||ti(i)?this._onresponse(i):Re(i)?this._onrequest(i,a):ei(i)?this._onnotification(i):this._onerror(new Error(`Unknown message type: ${JSON.stringify(i)}`))},await this._transport.start()}_onclose(){let e=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();for(let o of this._timeoutInfo.values())clearTimeout(o.timeoutId);this._timeoutInfo.clear();for(let o of this._requestHandlerAbortControllers.values())o.abort();this._requestHandlerAbortControllers.clear();let r=B.fromError(U.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let o of e.values())o(r)}_onerror(e){this.onerror?.(e)}_onnotification(e){let r=this._notificationHandlers.get(e.method)??this.fallbackNotificationHandler;r!==void 0&&Promise.resolve().then(()=>r(e)).catch(o=>this._onerror(new Error(`Uncaught error in notification handler: ${o}`)))}_onrequest(e,r){let o=this._requestHandlers.get(e.method)??this.fallbackRequestHandler,n=this._transport,i=e.params?._meta?.[x4]?.taskId;if(o===void 0){let p={jsonrpc:"2.0",id:e.id,error:{code:U.MethodNotFound,message:"Method not found"}};i&&this._taskMessageQueue?this._enqueueTaskMessage(i,{type:"error",message:p,timestamp:Date.now()},n?.sessionId).catch(u=>this._onerror(new Error(`Failed to enqueue error response: ${u}`))):n?.send(p).catch(u=>this._onerror(new Error(`Failed to send an error response: ${u}`)));return}let a=new AbortController;this._requestHandlerAbortControllers.set(e.id,a);let s=Yn(e.params)?e.params.task:void 0,l=this._taskStore?this.requestTaskStore(e,n?.sessionId):void 0,c={signal:a.signal,sessionId:n?.sessionId,_meta:e.params?._meta,sendNotification:async p=>{if(a.signal.aborted)return;let u={relatedRequestId:e.id};i&&(u.relatedTask={taskId:i}),await this.notification(p,u)},sendRequest:async(p,u,m)=>{if(a.signal.aborted)throw new B(U.ConnectionClosed,"Request was cancelled");let y={...m,relatedRequestId:e.id};i&&!y.relatedTask&&(y.relatedTask={taskId:i});let d=y.relatedTask?.taskId??i;return d&&l&&await l.updateTaskStatus(d,"input_required"),await this.request(p,u,y)},authInfo:r?.authInfo,requestId:e.id,requestInfo:r?.requestInfo,taskId:i,taskStore:l,taskRequestedTtl:s?.ttl,closeSSEStream:r?.closeSSEStream,closeStandaloneSSEStream:r?.closeStandaloneSSEStream};Promise.resolve().then(()=>{s&&this.assertTaskHandlerCapability(e.method)}).then(()=>o(e,c)).then(async p=>{if(a.signal.aborted)return;let u={result:p,jsonrpc:"2.0",id:e.id};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"response",message:u,timestamp:Date.now()},n?.sessionId):await n?.send(u)},async p=>{if(a.signal.aborted)return;let u={jsonrpc:"2.0",id:e.id,error:{code:Number.isSafeInteger(p.code)?p.code:U.InternalError,message:p.message??"Internal error",...p.data!==void 0&&{data:p.data}}};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"error",message:u,timestamp:Date.now()},n?.sessionId):await n?.send(u)}).catch(p=>this._onerror(new Error(`Failed to send response: ${p}`))).finally(()=>{this._requestHandlerAbortControllers.get(e.id)===a&&this._requestHandlerAbortControllers.delete(e.id)})}_onprogress(e){let{progressToken:r,...o}=e.params,n=Number(r),i=this._progressHandlers.get(n);if(!i){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(e)}`));return}let a=this._responseHandlers.get(n),s=this._timeoutInfo.get(n);if(s&&a&&s.resetTimeoutOnProgress)try{this._resetTimeout(n)}catch(l){this._responseHandlers.delete(n),this._progressHandlers.delete(n),this._cleanupTimeout(n),a(l);return}i(o)}_onresponse(e){let r=Number(e.id),o=this._requestResolvers.get(r);if(o){if(this._requestResolvers.delete(r),R9(e))o(e);else{let a=new B(e.error.code,e.error.message,e.error.data);o(a)}return}let n=this._responseHandlers.get(r);if(n===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(e)}`));return}this._responseHandlers.delete(r),this._cleanupTimeout(r);let i=!1;if(R9(e)&&e.result&&typeof e.result=="object"){let a=e.result;if(a.task&&typeof a.task=="object"){let s=a.task;typeof s.taskId=="string"&&(i=!0,this._taskProgressTokens.set(s.taskId,r))}}if(i||this._progressHandlers.delete(r),R9(e))n(e);else{let a=B.fromError(e.error.code,e.error.message,e.error.data);n(a)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(e,r,o){let{task:n}=o??{};if(!n){try{yield{type:"result",result:await this.request(e,r,o)}}catch(a){yield{type:"error",error:a instanceof B?a:new B(U.InternalError,String(a))}}return}let i;try{let a=await this.request(e,W8,o);if(a.task)i=a.task.taskId,yield{type:"taskCreated",task:a.task};else throw new B(U.InternalError,"Task creation did not return a task");for(;;){let s=await this.getTask({taskId:i},o);if(yield{type:"taskStatus",task:s},F4(s.status)){s.status==="completed"?yield{type:"result",result:await this.getTaskResult({taskId:i},r,o)}:s.status==="failed"?yield{type:"error",error:new B(U.InternalError,`Task ${i} failed`)}:s.status==="cancelled"&&(yield{type:"error",error:new B(U.InternalError,`Task ${i} was cancelled`)});return}if(s.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId:i},r,o)};return}let l=s.pollInterval??this._options?.defaultTaskPollInterval??1e3;await new Promise(c=>setTimeout(c,l)),o?.signal?.throwIfAborted()}}catch(a){yield{type:"error",error:a instanceof B?a:new B(U.InternalError,String(a))}}}request(e,r,o){let{relatedRequestId:n,resumptionToken:i,onresumptiontoken:a,task:s,relatedTask:l}=o??{};return new Promise((c,p)=>{let u=M=>{p(M)};if(!this._transport){u(new Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{this.assertCapabilityForMethod(e.method),s&&this.assertTaskCapability(e.method)}catch(M){u(M);return}o?.signal?.throwIfAborted();let m=this._requestMessageId++,y={...e,jsonrpc:"2.0",id:m};o?.onprogress&&(this._progressHandlers.set(m,o.onprogress),y.params={...e.params,_meta:{...e.params?._meta||{},progressToken:m}}),s&&(y.params={...y.params,task:s}),l&&(y.params={...y.params,_meta:{...y.params?._meta||{},[x4]:l}});let d=M=>{this._responseHandlers.delete(m),this._progressHandlers.delete(m),this._cleanupTimeout(m),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:m,reason:String(M)}},{relatedRequestId:n,resumptionToken:i,onresumptiontoken:a}).catch(S=>this._onerror(new Error(`Failed to send cancellation: ${S}`)));let _=M instanceof B?M:new B(U.RequestTimeout,String(M));p(_)};this._responseHandlers.set(m,M=>{if(!o?.signal?.aborted){if(M instanceof Error)return p(M);try{let _=T4(r,M.result);_.success?c(_.data):p(_.error)}catch(_){p(_)}}}),o?.signal?.addEventListener("abort",()=>{d(o?.signal?.reason)});let h=o?.timeout??th,f=()=>d(B.fromError(U.RequestTimeout,"Request timed out",{timeout:h}));this._setupTimeout(m,h,o?.maxTotalTimeout,f,o?.resetTimeoutOnProgress??!1);let C=l?.taskId;if(C){let M=_=>{let S=this._responseHandlers.get(m);S?S(_):this._onerror(new Error(`Response handler missing for side-channeled request ${m}`))};this._requestResolvers.set(m,M),this._enqueueTaskMessage(C,{type:"request",message:y,timestamp:Date.now()}).catch(_=>{this._cleanupTimeout(m),p(_)})}else this._transport.send(y,{relatedRequestId:n,resumptionToken:i,onresumptiontoken:a}).catch(M=>{this._cleanupTimeout(m),p(M)})})}async getTask(e,r){return this.request({method:"tasks/get",params:e},l2,r)}async getTaskResult(e,r,o){return this.request({method:"tasks/result",params:e},r,o)}async listTasks(e,r){return this.request({method:"tasks/list",params:e},p2,r)}async cancelTask(e,r){return this.request({method:"tasks/cancel",params:e},ni,r)}async notification(e,r){if(!this._transport)throw new Error("Not connected");this.assertNotificationCapability(e.method);let o=r?.relatedTask?.taskId;if(o){let s={...e,jsonrpc:"2.0",params:{...e.params,_meta:{...e.params?._meta||{},[x4]:r.relatedTask}}};await this._enqueueTaskMessage(o,{type:"notification",message:s,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(e.method)&&!e.params&&!r?.relatedRequestId&&!r?.relatedTask){if(this._pendingDebouncedNotifications.has(e.method))return;this._pendingDebouncedNotifications.add(e.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(e.method),!this._transport)return;let s={...e,jsonrpc:"2.0"};r?.relatedTask&&(s={...s,params:{...s.params,_meta:{...s.params?._meta||{},[x4]:r.relatedTask}}}),this._transport?.send(s,r).catch(l=>this._onerror(l))});return}let a={...e,jsonrpc:"2.0"};r?.relatedTask&&(a={...a,params:{...a.params,_meta:{...a.params?._meta||{},[x4]:r.relatedTask}}}),await this._transport.send(a,r)}setRequestHandler(e,r){let o=t0(e);this.assertRequestHandlerCapability(o),this._requestHandlers.set(o,(n,i)=>{let a=r0(e,n);return Promise.resolve(r(a,i))})}removeRequestHandler(e){this._requestHandlers.delete(e)}assertCanSetRequestHandler(e){if(this._requestHandlers.has(e))throw new Error(`A request handler for ${e} already exists, which would be overridden`)}setNotificationHandler(e,r){let o=t0(e);this._notificationHandlers.set(o,n=>{let i=r0(e,n);return Promise.resolve(r(i))})}removeNotificationHandler(e){this._notificationHandlers.delete(e)}_cleanupTaskProgressHandler(e){let r=this._taskProgressTokens.get(e);r!==void 0&&(this._progressHandlers.delete(r),this._taskProgressTokens.delete(e))}async _enqueueTaskMessage(e,r,o){if(!this._taskStore||!this._taskMessageQueue)throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let n=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(e,r,o,n)}async _clearTaskQueue(e,r){if(this._taskMessageQueue){let o=await this._taskMessageQueue.dequeueAll(e,r);for(let n of o)if(n.type==="request"&&Re(n.message)){let i=n.message.id,a=this._requestResolvers.get(i);a?(a(new B(U.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(i)):this._onerror(new Error(`Resolver missing for request ${i} during task ${e} cleanup`))}}}async _waitForTaskUpdate(e,r){let o=this._options?.defaultTaskPollInterval??1e3;try{let n=await this._taskStore?.getTask(e);n?.pollInterval&&(o=n.pollInterval)}catch{}return new Promise((n,i)=>{if(r.aborted){i(new B(U.InvalidRequest,"Request cancelled"));return}let a=setTimeout(n,o);r.addEventListener("abort",()=>{clearTimeout(a),i(new B(U.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(e,r){let o=this._taskStore;if(!o)throw new Error("No task store configured");return{createTask:async n=>{if(!e)throw new Error("No request provided");return await o.createTask(n,e.id,{method:e.method,params:e.params},r)},getTask:async n=>{let i=await o.getTask(n,r);if(!i)throw new B(U.InvalidParams,"Failed to retrieve task: Task not found");return i},storeTaskResult:async(n,i,a)=>{await o.storeTaskResult(n,i,a,r);let s=await o.getTask(n,r);if(s){let l=X9.parse({method:"notifications/tasks/status",params:s});await this.notification(l),F4(s.status)&&this._cleanupTaskProgressHandler(n)}},getTaskResult:n=>o.getTaskResult(n,r),updateTaskStatus:async(n,i,a)=>{let s=await o.getTask(n,r);if(!s)throw new B(U.InvalidParams,`Task "${n}" not found - it may have been cleaned up`);if(F4(s.status))throw new B(U.InvalidParams,`Cannot update task "${n}" from terminal status "${s.status}" to "${i}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await o.updateTaskStatus(n,i,a,r);let l=await o.getTask(n,r);if(l){let c=X9.parse({method:"notifications/tasks/status",params:l});await this.notification(c),F4(l.status)&&this._cleanupTaskProgressHandler(n)}},listTasks:n=>o.listTasks(n,r)}}};function ji(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Wi(t,e){let r={...t};for(let o in e){let n=o,i=e[n];if(i===void 0)continue;let a=r[n];ji(a)&&ji(i)?r[n]={...a,...i}:r[n]=i}return r}var $l=b7(Ht(),1),Ol=b7(Rl(),1);function a_(){let t=new $l.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,Ol.default)(t),t}var a5=class{constructor(e){this._ajv=e??a_()}getValidator(e){let r="$id"in e&&typeof e.$id=="string"?this._ajv.getSchema(e.$id)??this._ajv.compile(e):this._ajv.compile(e);return o=>r(o)?{valid:!0,data:o,errorMessage:void 0}:{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(r.errors)}}};var s5=class{constructor(e){this._server=e}requestStream(e,r,o){return this._server.requestStream(e,r,o)}createMessageStream(e,r){let o=this._server.getClientCapabilities();if((e.tools||e.toolChoice)&&!o?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let n=e.messages[e.messages.length-1],i=Array.isArray(n.content)?n.content:[n.content],a=i.some(p=>p.type==="tool_result"),s=e.messages.length>1?e.messages[e.messages.length-2]:void 0,l=s?Array.isArray(s.content)?s.content:[s.content]:[],c=l.some(p=>p.type==="tool_use");if(a){if(i.some(p=>p.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!c)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(c){let p=new Set(l.filter(m=>m.type==="tool_use").map(m=>m.id)),u=new Set(i.filter(m=>m.type==="tool_result").map(m=>m.toolUseId));if(p.size!==u.size||![...p].every(m=>u.has(m)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params:e},Z9,r)}elicitInputStream(e,r){let o=this._server.getClientCapabilities(),n=e.mode??"form";switch(n){case"url":{if(!o?.elicitation?.url)throw new Error("Client does not support url elicitation.");break}case"form":{if(!o?.elicitation?.form)throw new Error("Client does not support form elicitation.");break}}let i=n==="form"&&e.mode===void 0?{...e,mode:"form"}:e;return this.requestStream({method:"elicitation/create",params:i},G8,r)}async getTask(e,r){return this._server.getTask({taskId:e},r)}async getTaskResult(e,r,o){return this._server.getTaskResult({taskId:e},r,o)}async listTasks(e,r){return this._server.listTasks(e?{cursor:e}:void 0,r)}async cancelTask(e,r){return this._server.cancelTask({taskId:e},r)}};function El(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"tools/call":if(!t.tools?.call)throw new Error(`${r} does not support task creation for tools/call (required for ${e})`);break;default:break}}function Dl(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"sampling/createMessage":if(!t.sampling?.createMessage)throw new Error(`${r} does not support task creation for sampling/createMessage (required for ${e})`);break;case"elicitation/create":if(!t.elicitation?.create)throw new Error(`${r} does not support task creation for elicitation/create (required for ${e})`);break;default:break}}var l5=class extends b2{constructor(e,r){super(r),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(H9.options.map((o,n)=>[o,n])),this.isMessageIgnored=(o,n)=>{let i=this._loggingLevels.get(n);return i?this.LOG_LEVEL_SEVERITY.get(o)<this.LOG_LEVEL_SEVERITY.get(i):!1},this._capabilities=r?.capabilities??{},this._instructions=r?.instructions,this._jsonSchemaValidator=r?.jsonSchemaValidator??new a5,this.setRequestHandler(Ee,o=>this._oninitialize(o)),this.setNotificationHandler(De,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(Ve,async(o,n)=>{let i=n.sessionId||n.requestInfo?.headers["mcp-session-id"]||void 0,{level:a}=o.params,s=H9.safeParse(a);return s.success&&this._loggingLevels.set(i,s.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new s5(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=Wi(this._capabilities,e)}setRequestHandler(e,r){let n=z4(e)?.method;if(!n)throw new Error("Schema is missing a method literal");let i;if(I1(n)){let s=n;i=s._zod?.def?.value??s.value}else{let s=n;i=s._def?.value??s.value}if(typeof i!="string")throw new Error("Schema method literal must be a string");if(i==="tools/call"){let s=async(l,c)=>{let p=T4(U8,l);if(!p.success){let d=p.error instanceof Error?p.error.message:String(p.error);throw new B(U.InvalidParams,`Invalid tools/call request: ${d}`)}let{params:u}=p.data,m=await Promise.resolve(r(l,c));if(u.task){let d=T4(W8,m);if(!d.success){let h=d.error instanceof Error?d.error.message:String(d.error);throw new B(U.InvalidParams,`Invalid task creation result: ${h}`)}return d.data}let y=T4(C2,m);if(!y.success){let d=y.error instanceof Error?y.error.message:String(y.error);throw new B(U.InvalidParams,`Invalid tools/call result: ${d}`)}return y.data};return super.setRequestHandler(e,s)}return super.setRequestHandler(e,r)}assertCapabilityForMethod(e){switch(e){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${e})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${e})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${e})`);break;case"ping":break}}assertNotificationCapability(e){switch(e){case"notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw new Error(`Server does not support notifying about resources (required for ${e})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${e})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${e})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${e})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(e){if(this._capabilities)switch(e){case"completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${e})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${e})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw new Error(`Server does not support resources (required for ${e})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${e})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Server does not support tasks capability (required for ${e})`);break;case"ping":case"initialize":break}}assertTaskCapability(e){Dl(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&El(this._capabilities.tasks?.requests,e,"Server")}async _oninitialize(e){let r=e.params.protocolVersion;return this._clientCapabilities=e.params.capabilities,this._clientVersion=e.params.clientInfo,{protocolVersion:Gn.includes(r)?r:Ie,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},o2)}async createMessage(e,r){if((e.tools||e.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let o=e.messages[e.messages.length-1],n=Array.isArray(o.content)?o.content:[o.content],i=n.some(c=>c.type==="tool_result"),a=e.messages.length>1?e.messages[e.messages.length-2]:void 0,s=a?Array.isArray(a.content)?a.content:[a.content]:[],l=s.some(c=>c.type==="tool_use");if(i){if(n.some(c=>c.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!l)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(l){let c=new Set(s.filter(u=>u.type==="tool_use").map(u=>u.id)),p=new Set(n.filter(u=>u.type==="tool_result").map(u=>u.toolUseId));if(c.size!==p.size||![...c].every(u=>p.has(u)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return e.tools?this.request({method:"sampling/createMessage",params:e},Ue,r):this.request({method:"sampling/createMessage",params:e},Z9,r)}async elicitInput(e,r){switch(e.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let n=e;return this.request({method:"elicitation/create",params:n},G8,r)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let n=e.mode==="form"?e:{...e,mode:"form"},i=await this.request({method:"elicitation/create",params:n},G8,r);if(i.action==="accept"&&i.content&&n.requestedSchema)try{let s=this._jsonSchemaValidator.getValidator(n.requestedSchema)(i.content);if(!s.valid)throw new B(U.InvalidParams,`Elicitation response content does not match requested schema: ${s.errorMessage}`)}catch(a){throw a instanceof B?a:new B(U.InternalError,`Error validating elicitation response: ${a instanceof Error?a.message:String(a)}`)}return i}}}createElicitationCompletionNotifier(e,r){if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId:e}},r)}async listRoots(e,r){return this.request({method:"roots/list",params:e},Ge,r)}async sendLoggingMessage(e,r){if(this._capabilities.logging&&!this.isMessageIgnored(e.level,r))return this.notification({method:"notifications/message",params:e})}async sendResourceUpdated(e){return this.notification({method:"notifications/resources/updated",params:e})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}};var Bl=Symbol.for("mcp.completable");function Kt(t){return!!t&&typeof t=="object"&&Bl in t}function Hl(t){return t[Bl]?.complete}var Xl;(function(t){t.Completable="McpCompletable"})(Xl||(Xl={}));var s_=/^[A-Za-z0-9._-]{1,128}$/;function l_(t){let e=[];if(t.length===0)return{isValid:!1,warnings:["Tool name cannot be empty"]};if(t.length>128)return{isValid:!1,warnings:[`Tool name exceeds maximum length of 128 characters (current: ${t.length})`]};if(t.includes(" ")&&e.push("Tool name contains spaces, which may cause parsing issues"),t.includes(",")&&e.push("Tool name contains commas, which may cause parsing issues"),(t.startsWith("-")||t.endsWith("-"))&&e.push("Tool name starts or ends with a dash, which may cause parsing issues in some contexts"),(t.startsWith(".")||t.endsWith("."))&&e.push("Tool name starts or ends with a dot, which may cause parsing issues in some contexts"),!s_.test(t)){let r=t.split("").filter(o=>!/[A-Za-z0-9._-]/.test(o)).filter((o,n,i)=>i.indexOf(o)===n);return e.push(`Tool name contains invalid characters: ${r.map(o=>`"${o}"`).join(", ")}`,"Allowed characters are: A-Z, a-z, 0-9, underscore (_), dash (-), and dot (.)"),{isValid:!1,warnings:e}}return{isValid:!0,warnings:e}}function c_(t,e){if(e.length>0){console.warn(`Tool name validation warning for "${t}":`);for(let r of e)console.warn(` - ${r}`);console.warn("Tool registration will proceed, but this may cause compatibility issues."),console.warn("Consider updating the tool name to conform to the MCP tool naming standard."),console.warn("See SEP: Specify Format for Tool Names (https://github.com/modelcontextprotocol/modelcontextprotocol/issues/986) for more details.")}}function Yt(t){let e=l_(t);return c_(t,e.warnings),e.isValid}var c5=class{constructor(e){this._mcpServer=e}registerToolTask(e,r,o){let n={taskSupport:"required",...r.execution};if(n.taskSupport==="forbidden")throw new Error(`Cannot register task-based tool '${e}' with taskSupport 'forbidden'. Use registerTool() instead.`);return this._mcpServer._createRegisteredTool(e,r.title,r.description,r.inputSchema,r.outputSchema,r.annotations,n,r._meta,o)}};var u5=class{constructor(e,r){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new l5(e,r)}get experimental(){return this._experimental||(this._experimental={tasks:new c5(this)}),this._experimental}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(B4(M2)),this.server.assertCanSetRequestHandler(B4(U8)),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(M2,()=>({tools:Object.entries(this._registeredTools).filter(([,e])=>e.enabled).map(([e,r])=>{let o={name:e,title:r.title,description:r.description,inputSchema:(()=>{let n=Z8(r.inputSchema);return n?e0(n,{strictUnions:!0,pipeStrategy:"input"}):u_})(),annotations:r.annotations,execution:r.execution,_meta:r._meta};if(r.outputSchema){let n=Z8(r.outputSchema);n&&(o.outputSchema=e0(n,{strictUnions:!0,pipeStrategy:"output"}))}return o})})),this.server.setRequestHandler(U8,async(e,r)=>{try{let o=this._registeredTools[e.params.name];if(!o)throw new B(U.InvalidParams,`Tool ${e.params.name} not found`);if(!o.enabled)throw new B(U.InvalidParams,`Tool ${e.params.name} disabled`);let n=!!e.params.task,i=o.execution?.taskSupport,a="createTask"in o.handler;if((i==="required"||i==="optional")&&!a)throw new B(U.InternalError,`Tool ${e.params.name} has taskSupport '${i}' but was not registered with registerToolTask`);if(i==="required"&&!n)throw new B(U.MethodNotFound,`Tool ${e.params.name} requires task augmentation (taskSupport: 'required')`);if(i==="optional"&&!n&&a)return await this.handleAutomaticTaskPolling(o,e,r);let s=await this.validateToolInput(o,e.params.arguments,e.params.name),l=await this.executeToolHandler(o,s,r);return n||await this.validateToolOutput(o,l,e.params.name),l}catch(o){if(o instanceof B&&o.code===U.UrlElicitationRequired)throw o;return this.createToolError(o instanceof Error?o.message:String(o))}}),this._toolHandlersInitialized=!0)}createToolError(e){return{content:[{type:"text",text:e}],isError:!0}}async validateToolInput(e,r,o){if(!e.inputSchema)return;let i=Z8(e.inputSchema)??e.inputSchema,a=await q7(i,r);if(!a.success){let s="error"in a?a.error:"Unknown error",l=K7(s);throw new B(U.InvalidParams,`Input validation error: Invalid arguments for tool ${o}: ${l}`)}return a.data}async validateToolOutput(e,r,o){if(!e.outputSchema||!("content"in r)||r.isError)return;if(!r.structuredContent)throw new B(U.InvalidParams,`Output validation error: Tool ${o} has an output schema but no structured content was provided`);let n=Z8(e.outputSchema),i=await q7(n,r.structuredContent);if(!i.success){let a="error"in i?i.error:"Unknown error",s=K7(a);throw new B(U.InvalidParams,`Output validation error: Invalid structured content for tool ${o}: ${s}`)}}async executeToolHandler(e,r,o){let n=e.handler;if("createTask"in n){if(!o.taskStore)throw new Error("No task store provided.");let a={...o,taskStore:o.taskStore};if(e.inputSchema){let s=n;return await Promise.resolve(s.createTask(r,a))}else{let s=n;return await Promise.resolve(s.createTask(a))}}if(e.inputSchema){let a=n;return await Promise.resolve(a(r,o))}else{let a=n;return await Promise.resolve(a(o))}}async handleAutomaticTaskPolling(e,r,o){if(!o.taskStore)throw new Error("No task store provided for task-capable tool.");let n=await this.validateToolInput(e,r.params.arguments,r.params.name),i=e.handler,a={...o,taskStore:o.taskStore},s=n?await Promise.resolve(i.createTask(n,a)):await Promise.resolve(i.createTask(a)),l=s.task.taskId,c=s.task,p=c.pollInterval??5e3;for(;c.status!=="completed"&&c.status!=="failed"&&c.status!=="cancelled";){await new Promise(m=>setTimeout(m,p));let u=await o.taskStore.getTask(l);if(!u)throw new B(U.InternalError,`Task ${l} not found during polling`);c=u}return await o.taskStore.getTaskResult(l)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(B4(v2)),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(v2,async e=>{switch(e.params.ref.type){case"ref/prompt":return ui(e),this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return pi(e),this.handleResourceCompletion(e,e.params.ref);default:throw new B(U.InvalidParams,`Invalid completion reference: ${e.params.ref}`)}}),this._completionHandlerInitialized=!0)}async handlePromptCompletion(e,r){let o=this._registeredPrompts[r.name];if(!o)throw new B(U.InvalidParams,`Prompt ${r.name} not found`);if(!o.enabled)throw new B(U.InvalidParams,`Prompt ${r.name} disabled`);if(!o.argsSchema)return v7;let i=z4(o.argsSchema)?.[e.params.argument.name];if(!Kt(i))return v7;let a=Hl(i);if(!a)return v7;let s=await a(e.params.argument.value,e.params.context);return jl(s)}async handleResourceCompletion(e,r){let o=Object.values(this._registeredResourceTemplates).find(a=>a.resourceTemplate.uriTemplate.toString()===r.uri);if(!o){if(this._registeredResources[r.uri])return v7;throw new B(U.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let n=o.resourceTemplate.completeCallback(e.params.argument.name);if(!n)return v7;let i=await n(e.params.argument.value,e.params.context);return jl(i)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(B4(m2)),this.server.assertCanSetRequestHandler(B4(y2)),this.server.assertCanSetRequestHandler(B4(h2)),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(m2,async(e,r)=>{let o=Object.entries(this._registeredResources).filter(([i,a])=>a.enabled).map(([i,a])=>({uri:i,name:a.name,...a.metadata})),n=[];for(let i of Object.values(this._registeredResourceTemplates)){if(!i.resourceTemplate.listCallback)continue;let a=await i.resourceTemplate.listCallback(r);for(let s of a.resources)n.push({...i.metadata,...s})}return{resources:[...o,...n]}}),this.server.setRequestHandler(y2,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([r,o])=>({name:r,uriTemplate:o.resourceTemplate.uriTemplate.toString(),...o.metadata}))})),this.server.setRequestHandler(h2,async(e,r)=>{let o=new URL(e.params.uri),n=this._registeredResources[o.toString()];if(n){if(!n.enabled)throw new B(U.InvalidParams,`Resource ${o} disabled`);return n.readCallback(o,r)}for(let i of Object.values(this._registeredResourceTemplates)){let a=i.resourceTemplate.uriTemplate.match(o.toString());if(a)return i.readCallback(o,a,r)}throw new B(U.InvalidParams,`Resource ${o} not found`)}),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(B4(f2)),this.server.assertCanSetRequestHandler(B4(g2)),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(f2,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,r])=>({name:e,title:r.title,description:r.description,arguments:r.argsSchema?p_(r.argsSchema):void 0}))})),this.server.setRequestHandler(g2,async(e,r)=>{let o=this._registeredPrompts[e.params.name];if(!o)throw new B(U.InvalidParams,`Prompt ${e.params.name} not found`);if(!o.enabled)throw new B(U.InvalidParams,`Prompt ${e.params.name} disabled`);if(o.argsSchema){let n=Z8(o.argsSchema),i=await q7(n,e.params.arguments);if(!i.success){let l="error"in i?i.error:"Unknown error",c=K7(l);throw new B(U.InvalidParams,`Invalid arguments for prompt ${e.params.name}: ${c}`)}let a=i.data,s=o.callback;return await Promise.resolve(s(a,r))}else{let n=o.callback;return await Promise.resolve(n(r))}}),this._promptHandlersInitialized=!0)}resource(e,r,...o){let n;typeof o[0]=="object"&&(n=o.shift());let i=o[0];if(typeof r=="string"){if(this._registeredResources[r])throw new Error(`Resource ${r} is already registered`);let a=this._createRegisteredResource(e,void 0,r,n,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let a=this._createRegisteredResourceTemplate(e,void 0,r,n,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}}registerResource(e,r,o,n){if(typeof r=="string"){if(this._registeredResources[r])throw new Error(`Resource ${r} is already registered`);let i=this._createRegisteredResource(e,o.title,r,o,n);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),i}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let i=this._createRegisteredResourceTemplate(e,o.title,r,o,n);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),i}}_createRegisteredResource(e,r,o,n,i){let a={name:e,title:r,metadata:n,readCallback:i,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({uri:null}),update:s=>{typeof s.uri<"u"&&s.uri!==o&&(delete this._registeredResources[o],s.uri&&(this._registeredResources[s.uri]=a)),typeof s.name<"u"&&(a.name=s.name),typeof s.title<"u"&&(a.title=s.title),typeof s.metadata<"u"&&(a.metadata=s.metadata),typeof s.callback<"u"&&(a.readCallback=s.callback),typeof s.enabled<"u"&&(a.enabled=s.enabled),this.sendResourceListChanged()}};return this._registeredResources[o]=a,a}_createRegisteredResourceTemplate(e,r,o,n,i){let a={resourceTemplate:o,title:r,metadata:n,readCallback:i,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:c=>{typeof c.name<"u"&&c.name!==e&&(delete this._registeredResourceTemplates[e],c.name&&(this._registeredResourceTemplates[c.name]=a)),typeof c.title<"u"&&(a.title=c.title),typeof c.template<"u"&&(a.resourceTemplate=c.template),typeof c.metadata<"u"&&(a.metadata=c.metadata),typeof c.callback<"u"&&(a.readCallback=c.callback),typeof c.enabled<"u"&&(a.enabled=c.enabled),this.sendResourceListChanged()}};this._registeredResourceTemplates[e]=a;let s=o.uriTemplate.variableNames;return Array.isArray(s)&&s.some(c=>!!o.completeCallback(c))&&this.setCompletionRequestHandler(),a}_createRegisteredPrompt(e,r,o,n,i){let a={title:r,description:o,argsSchema:n===void 0?void 0:f8(n),callback:i,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:s=>{typeof s.name<"u"&&s.name!==e&&(delete this._registeredPrompts[e],s.name&&(this._registeredPrompts[s.name]=a)),typeof s.title<"u"&&(a.title=s.title),typeof s.description<"u"&&(a.description=s.description),typeof s.argsSchema<"u"&&(a.argsSchema=f8(s.argsSchema)),typeof s.callback<"u"&&(a.callback=s.callback),typeof s.enabled<"u"&&(a.enabled=s.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[e]=a,n&&Object.values(n).some(l=>{let c=l instanceof v1?l._def?.innerType:l;return Kt(c)})&&this.setCompletionRequestHandler(),a}_createRegisteredTool(e,r,o,n,i,a,s,l,c){Yt(e);let p={title:r,description:o,inputSchema:Zl(n),outputSchema:Zl(i),annotations:a,execution:s,_meta:l,handler:c,enabled:!0,disable:()=>p.update({enabled:!1}),enable:()=>p.update({enabled:!0}),remove:()=>p.update({name:null}),update:u=>{typeof u.name<"u"&&u.name!==e&&(typeof u.name=="string"&&Yt(u.name),delete this._registeredTools[e],u.name&&(this._registeredTools[u.name]=p)),typeof u.title<"u"&&(p.title=u.title),typeof u.description<"u"&&(p.description=u.description),typeof u.paramsSchema<"u"&&(p.inputSchema=f8(u.paramsSchema)),typeof u.outputSchema<"u"&&(p.outputSchema=f8(u.outputSchema)),typeof u.callback<"u"&&(p.handler=u.callback),typeof u.annotations<"u"&&(p.annotations=u.annotations),typeof u._meta<"u"&&(p._meta=u._meta),typeof u.enabled<"u"&&(p.enabled=u.enabled),this.sendToolListChanged()}};return this._registeredTools[e]=p,this.setToolRequestHandlers(),this.sendToolListChanged(),p}tool(e,...r){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let o,n,i,a;if(typeof r[0]=="string"&&(o=r.shift()),r.length>1){let l=r[0];if(Jt(l))n=r.shift(),r.length>1&&typeof r[0]=="object"&&r[0]!==null&&!Jt(r[0])&&(a=r.shift());else if(typeof l=="object"&&l!==null){if(Object.values(l).some(c=>typeof c=="object"&&c!==null))throw new Error(`Tool ${e} expected a Zod schema or ToolAnnotations, but received an unrecognized object`);a=r.shift()}}let s=r[0];return this._createRegisteredTool(e,void 0,o,n,i,a,{taskSupport:"forbidden"},void 0,s)}registerTool(e,r,o){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let{title:n,description:i,inputSchema:a,outputSchema:s,annotations:l,_meta:c}=r;return this._createRegisteredTool(e,n,i,a,s,l,{taskSupport:"forbidden"},c,o)}prompt(e,...r){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let o;typeof r[0]=="string"&&(o=r.shift());let n;r.length>1&&(n=r.shift());let i=r[0],a=this._createRegisteredPrompt(e,void 0,o,n,i);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),a}registerPrompt(e,r,o){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let{title:n,description:i,argsSchema:a}=r,s=this._createRegisteredPrompt(e,n,i,a,o);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),s}isConnected(){return this.server.transport!==void 0}async sendLoggingMessage(e,r){return this.server.sendLoggingMessage(e,r)}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged()}};var u_={type:"object",properties:{}};function Wl(t){return t!==null&&typeof t=="object"&&"parse"in t&&typeof t.parse=="function"&&"safeParse"in t&&typeof t.safeParse=="function"}function Vl(t){return"_def"in t||"_zod"in t||Wl(t)}function Jt(t){return typeof t!="object"||t===null||Vl(t)?!1:Object.keys(t).length===0?!0:Object.values(t).some(Wl)}function Zl(t){if(t){if(Jt(t))return f8(t);if(!Vl(t))throw new Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");return t}}function p_(t){let e=z4(t);return e?Object.entries(e).map(([r,o])=>{let n=Sn(o),i=bn(o);return{name:r,description:n,required:!i}}):[]}function B4(t){let r=z4(t)?.method;if(!r)throw new Error("Schema is missing a method literal");let o=Y7(r);if(typeof o=="string")return o;throw new Error("Schema method literal must be a string")}function jl(t){return{completion:{values:t.slice(0,100),total:t.length,hasMore:t.length>100}}}var v7={completion:{values:[],hasMore:!1}};import Gl from"node:process";var p5=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
55
55
  `);if(e===-1)return null;let r=this._buffer.toString("utf8",0,e).replace(/\r$/,"");return this._buffer=this._buffer.subarray(e+1),d_(r)}clear(){this._buffer=void 0}};function d_(t){return ri.parse(JSON.parse(t))}function Ul(t){return JSON.stringify(t)+`
56
- `}var d5=class{constructor(e=Gl.stdin,r=Gl.stdout){this._stdin=e,this._stdout=r,this._readBuffer=new p5,this._started=!1,this._ondata=o=>{this._readBuffer.append(o),this.processReadBuffer()},this._onerror=o=>{this.onerror?.(o)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(r=>{let o=Ul(e);this._stdout.write(o)?r():this._stdout.once("drain",r)})}};import{readFileSync as QP,writeFileSync as f5,mkdirSync as eA}from"node:fs";import{join as g5,resolve as Jc}from"node:path";var mc=b7(tr(),1);/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var ql={};function m5(t){return t.toLowerCase().replace(/[.‎‏\s]/g,"")}function Kl(t){let e=t||"en",r=ql[e];if(r)return r;let o={};try{let n=new Intl.DateTimeFormat(e,{month:"long"}),i=new Intl.DateTimeFormat(e,{month:"short"});for(let a=0;a<12;++a){let s=new Date(Date.UTC(2020,a,15));o[m5(n.format(s))]=a,o[m5(i.format(s))]=a}}catch{}return ql[e]=o,o}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */function rr(t){return t!=null?t.toString():""}function m9(t){if(!t)return 0;let e=0xcbf29ce484222325n,r=0x100000001b3n,o=e;for(let n=0;n<t.length;n++)o^=BigInt(t.charCodeAt(n)),o=o*r&0xFFFFFFFFFFFFFFFFn;return Number(o&0x1FFFFFFFFFFFFFn)}function k8(){let t=typeof globalThis<"u"?globalThis:{};if(t.crypto&&typeof t.crypto.getRandomValues=="function"){let e=new Uint32Array(1);return t.crypto.getRandomValues(e),e[0]/4294967296}return Math.floor(Date.now()%4294967295)/4294967296}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var m_="Abasolo|MX11|-101.53|20.45|27,Abbotsford|BC|-122.25|49.06|141,Aberdeen|SD|-98.49|45.46|28,Abilene|TX|-99.73|32.45|125,Abington|PA|-75.12|40.12|55,Acambaro|MX11|-100.72|20.03|57,Acapulco de Juarez|MX12|-99.91|16.85|658,Acatzingo|MX21|-97.78|18.98|25,Acayucan|MX30|-94.91|17.95|50,Actopan|MX13|-98.94|20.27|32,Addison|IL|-87.99|41.93|37,Adelanto|CA|-117.41|34.58|33,Agawam|MA|-72.61|42.07|28,Agincourt North|ON|-79.28|43.8|29,Agua Caliente|CA|-122.49|38.32|27,Agua Dulce|MX30|-94.15|18.14|36,Agua Prieta|MX26|-109.54|31.32|77,Aguascalientes|MX01|-102.28|21.88|722,Ahuntsic-Cartierville|QC|-73.67|45.57|135,Ahwatukee Foothills|AZ|-111.98|33.34|83,Aiken|SC|-81.72|33.56|30,Airdrie|AB|-114.04|51.3|90,Airport|HI|-157.93|21.34|28,Ajalpan|MX21|-97.26|18.38|28,Ajax|ON|-79.03|43.85|119,Akron|OH|-81.52|41.08|197,Alabaster|AL|-86.82|33.24|32,Alafaya|FL|-81.21|28.56|78,Alameda|CA|-122.26|37.77|78,Alamo|MX30|-97.68|20.91|25,Alamogordo|NM|-105.96|32.9|30,Albany|NY|-73.76|42.65|101,Albany|GA|-84.16|31.58|74,Albany|OR|-123.11|44.64|52,Albany Park|IL|-87.72|41.97|52,Albuquerque|NM|-106.65|35.08|564,Alexandria|VA|-77.05|38.8|159,Alexandria|LA|-92.45|31.31|47,Algonquin|IL|-88.29|42.17|30,Alhambra|AZ|-112.13|33.5|127,Alhambra|CA|-118.13|34.1|85,Aliamanu / Salt Lakes / Foster Village|HI|-157.92|21.36|38,Alief|TX|-95.6|29.71|98,Aliso Viejo|CA|-117.73|33.57|50,Allapattah|FL|-80.22|25.81|54,Allen|TX|-96.67|33.1|98,Allen Park|MI|-83.21|42.26|27,Allentown|PA|-75.49|40.61|120,Allston|MA|-71.13|42.36|28,Alma|QC|-71.65|48.55|29,Aloha|OR|-122.87|45.49|49,Alpharetta|GA|-84.29|34.08|63,Altadena|CA|-118.13|34.19|42,Altamira|MX28|-97.94|22.39|59,Altamonte Springs|FL|-81.37|28.66|43,Alton|IL|-90.18|38.89|27,Altoona|PA|-78.39|40.52|45,Alvaro Obregon|MX09|-99.2|19.36|726,Alvin|TX|-95.24|29.42|25,Amarillo|TX|-101.83|35.22|198,Ameca|MX14|-104.05|20.55|36,Amecameca|MX15|-98.77|19.12|31,American Fork|UT|-111.8|40.38|28,Ames|IA|-93.62|42.03|65,Amherst|NY|-78.8|42.98|122,Amherst|MA|-72.52|42.37|39,Amozoc de Mota|MX21|-98.05|19.05|95,Anaheim|CA|-117.91|33.84|350,Ancaster|ON|-79.99|43.22|40,Anchorage|AK|-149.9|61.22|289,Anderson|IN|-85.68|40.11|55,Anderson|SC|-82.65|34.5|27,Andover|MN|-93.29|45.23|32,Ankeny|IA|-93.61|41.73|56,Ann Arbor|MI|-83.74|42.28|117,Annandale|VA|-77.2|38.83|41,Annapolis|MD|-76.49|38.98|40,Annex|ON|-79.4|43.67|30,Antelope|CA|-121.33|38.71|45,Antioch|CA|-121.81|38|110,Apache Junction|AZ|-111.55|33.42|38,Apan|MX13|-98.45|19.71|26,Apaseo el Alto|MX11|-100.62|20.46|27,Apaseo el Grande|MX11|-100.69|20.55|26,Apatzingan|MX16|-102.36|19.09|102,Apex|NC|-78.85|35.73|45,Apizaco|MX29|-98.14|19.41|49,Apopka|FL|-81.51|28.68|48,Apple Valley|CA|-117.19|34.5|72,Apple Valley|MN|-93.22|44.73|51,Appleton|WI|-88.42|44.26|74,Arandas|MX14|-102.35|20.71|52,Arcadia|CA|-118.04|34.14|58,Arcola East|SK|-104.54|50.43|33,Arden-Arcade|CA|-121.38|38.6|92,Ardmore|OK|-97.14|34.17|25,Arlington|TX|-97.11|32.74|388,Arlington|VA|-77.1|38.88|207,Arlington|MA|-71.16|42.42|42,Arlington Heights|IL|-87.98|42.09|75,Arvada|CO|-105.09|39.8|115,Ashburn|VA|-77.49|39.04|43,Ashburn|IL|-87.71|41.75|42,Asheboro|NC|-79.81|35.71|26,Asheville|NC|-82.55|35.6|95,Ashmont|MA|-71.07|42.28|30,Aspen Hill|MD|-77.07|39.08|48,Astoria|NY|-73.93|40.77|150,Atascadero|CA|-120.67|35.49|29,Atascocita|TX|-95.18|30|65,Athens|GA|-83.38|33.96|127,Athens|OH|-82.1|39.33|25,Atlanta|GA|-84.39|33.75|510,Atlantic City|NJ|-74.42|39.36|39,Atlixco|MX21|-98.44|18.91|86,Atotonilco el Alto|MX14|-102.51|20.55|26,Attleboro|MA|-71.29|41.94|44,Atwater|CA|-120.61|37.35|29,Auburn|WA|-122.23|47.31|77,Auburn|AL|-85.48|32.61|62,Auburn|NY|-76.57|42.93|26,Auburn Gresham|IL|-87.65|41.74|45,Augusta|GA|-81.97|33.47|43,Aurora|CO|-104.83|39.73|359,Aurora|IL|-88.32|41.76|200,Aurora|ON|-79.47|44|55,Austin|TX|-97.74|30.27|974,Austintown|OH|-80.76|41.1|29,Autlan de Navarro|MX14|-104.37|19.77|45,Aventura|FL|-80.14|25.96|37,Avondale|AZ|-112.35|33.44|80,Avondale|IL|-87.71|41.94|39,Aylmer|QC|-75.81|45.4|56,Azcapotzalco|MX09|-99.19|19.49|414,Azusa|CA|-117.91|34.13|49,Back Mountain|PA|-76|41.34|26,Bakersfield|CA|-119.02|35.37|373,Balch Springs|TX|-96.62|32.73|25,Baldwin Park|CA|-117.96|34.09|77,Ballwin|MO|-90.55|38.6|30,Baltimore|MD|-76.61|39.29|585,Banbury-Don Mills|ON|-79.35|43.74|27,Bangor|ME|-68.77|44.8|32,Banning|CA|-116.88|33.93|30,Barberton|OH|-81.61|41.01|26,Barnstable|MA|-70.3|41.7|47,Barrie|ON|-79.67|44.4|147,Bartlesville|OK|-95.98|36.75|36,Bartlett|TN|-89.87|35.2|58,Bartlett|IL|-88.19|42|41,Batavia|IL|-88.31|41.85|26,Bath Beach|NY|-74|40.6|33,Baton Rouge|LA|-91.19|30.44|227,Battle Creek|MI|-85.18|42.32|51,Bay City|MI|-83.89|43.59|33,Bay Shore|NY|-73.25|40.73|26,Bay Street Corridor|ON|-79.39|43.66|25,Bayonne|NJ|-74.11|40.67|66,Bayside|NY|-73.78|40.77|66,Baytown|TX|-94.98|29.74|76,Bayview-Hunters Point|CA|-122.38|37.73|34,Beaumont|TX|-94.1|30.09|115,Beaumont|CA|-116.98|33.93|43,Beauport|QC|-71.19|46.86|81,Beavercreek|OH|-84.06|39.71|46,Beaverton|OR|-122.8|45.49|96,Bedford|TX|-97.14|32.84|49,Bel Air North|MD|-76.37|39.55|30,Bel Air South|MD|-76.32|39.51|47,Bell|CA|-118.19|33.98|36,Bell Gardens|CA|-118.15|33.97|43,Bella Vista|AR|-94.27|36.48|27,Belleville|ON|-77.38|44.17|50,Belleville|IL|-89.98|38.52|42,Belleville|NJ|-74.15|40.79|36,Bellevue|WA|-122.2|47.61|139,Bellevue|NE|-95.89|41.14|55,Bellflower|CA|-118.12|33.88|78,Bellingham|WA|-122.49|48.76|85,Belmont|CA|-122.28|37.52|27,Belmont Cragin|IL|-87.77|41.93|79,Beloit|WI|-89.03|42.51|36,Beltline|AB|-114.07|51.04|25,Belvidere|IL|-88.84|42.26|25,Bend|OR|-121.32|44.06|87,Bendale|ON|-79.25|43.77|29,Benicia|CA|-122.16|38.05|28,Benito Juarez|MX09|-99.16|19.37|385,Benito Juarez|MX09|-99.16|19.4|355,Bensalem|PA|-74.95|40.1|60,Bensonhurst|NY|-73.99|40.6|60,Benton|AR|-92.59|34.56|34,Bentonville|AR|-94.21|36.37|44,Bergenfield|NJ|-74|40.93|27,Berkeley|CA|-122.27|37.87|120,Berriozabal|MX05|-93.27|16.8|28,Berwyn|IL|-87.79|41.85|56,Bessemer|AL|-86.95|33.4|26,Bethel Park|PA|-80.04|40.33|32,Bethesda|MD|-77.1|38.98|60,Bethlehem|PA|-75.37|40.63|74,Bettendorf|IA|-90.52|41.52|35,Beverly|MA|-70.88|42.56|41,Beverly Cove|MA|-70.85|42.55|40,Beverly Hills|CA|-118.4|34.07|34,Big Spring|TX|-101.48|32.25|28,Billerica|MA|-71.27|42.56|39,Billings|MT|-108.5|45.78|117,Biloxi|MS|-88.89|30.4|45,Binghamton|NY|-75.92|42.1|46,Birmingham|AL|-86.8|33.52|196,Bismarck|ND|-100.78|46.81|75,Blacksburg|VA|-80.41|37.23|44,Blaine|MN|-93.23|45.16|62,Blainville|QC|-73.88|45.67|46,Bloomfield|NJ|-74.19|40.81|49,Bloomington|MN|-93.3|44.84|86,Bloomington|IN|-86.53|39.17|84,Bloomington|IL|-88.99|40.48|78,Blue Springs|MO|-94.28|39.02|54,Boardman|OH|-80.66|41.02|35,Boca Raton|FL|-80.08|26.36|93,Boisbriand|QC|-73.83|45.62|26,Boise|ID|-116.2|43.61|235,Bolingbrook|IL|-88.07|41.7|74,Bolton|ON|-79.74|43.88|26,Bonita Springs|FL|-81.78|26.34|51,Borough Park|NY|-74|40.63|149,Bossier City|LA|-93.73|32.52|68,Boston|MA|-71.06|42.36|653,Bothell|WA|-122.21|47.76|42,Boucherville|QC|-73.44|45.59|39,Boulder|CO|-105.27|40.01|106,Bountiful|UT|-111.88|40.89|43,Bowie|MD|-76.73|38.94|58,Bowling Green|KY|-86.44|36.99|63,Bowling Green|OH|-83.65|41.37|31,Bowmanville|ON|-78.68|43.92|39,Boyle Heights|CA|-118.21|34.03|92,Boynton Beach|FL|-80.07|26.53|73,Bozeman|MT|-111.04|45.68|43,Bradenton|FL|-82.57|27.5|54,Braintree|MA|-71|42.2|37,Brampton|ON|-79.77|43.68|656,Brandon|FL|-82.29|27.94|103,Brandon|MB|-99.95|49.85|48,Branford|CT|-72.82|41.28|29,Brant|ON|-80.35|43.13|34,Brantford|ON|-80.27|43.13|104,Brawley|CA|-115.53|32.98|25,Brea|CA|-117.9|33.92|41,Bremerton|WA|-122.63|47.57|39,Brentwood|NY|-73.25|40.78|60,Brentwood|CA|-121.7|37.93|58,Brentwood|TN|-86.78|36.03|41,Brentwood|CA|-118.47|34.05|33,Brentwood Estates|TN|-86.78|36.03|31,Briarwood|NY|-73.82|40.71|53,Brick|NJ|-74.14|40.06|76,Bridgeport|CT|-73.19|41.18|147,Bridgeport|IL|-87.65|41.84|33,Bridgeton|NJ|-75.23|39.43|25,Bridgewater|NJ|-74.65|40.6|44,Brighouse-City Centre|BC|-123.13|49.17|62,Brighton|MA|-71.16|42.35|45,Brighton|CO|-104.82|39.99|37,Brighton|NY|-77.55|43.15|36,Brighton Beach|NY|-73.96|40.58|31,Brighton Park|IL|-87.7|41.82|44,Bristol|CT|-72.95|41.67|60,Bristol|TN|-82.19|36.6|26,Brockton|MA|-71.02|42.08|95,Broken Arrow|OK|-95.79|36.05|106,Brookfield|WI|-88.11|43.06|38,Brookhaven|GA|-84.34|33.86|51,Brooklin|ON|-78.96|43.96|25,Brookline|MA|-71.12|42.33|58,Brooklyn|NY|-73.95|40.65|2736,Brooklyn Center|MN|-93.33|45.08|30,Brooklyn Park|MN|-93.36|45.09|79,Broomfield|CO|-105.09|39.92|65,Brossard|QC|-73.47|45.45|69,Brownsville|TX|-97.5|25.9|186,Brownsville|NY|-73.92|40.66|74,Brunswick|OH|-81.84|41.24|34,Bryan|TX|-96.37|30.67|82,Buckeye|AZ|-112.58|33.37|50,Buena Park|CA|-118|33.87|83,Buenaventura Lakes|FL|-81.35|28.34|26,Buenavista|MX15|-99.17|19.61|216,Buffalo|NY|-78.88|42.89|258,Buffalo Grove|IL|-87.96|42.15|41,Bullhead City|AZ|-114.57|35.15|39,Burbank|CA|-118.31|34.18|105,Burbank|IL|-87.78|41.73|29,Burien|WA|-122.35|47.47|50,Burke|VA|-77.27|38.79|41,Burleson|TX|-97.32|32.54|43,Burlingame|CA|-122.37|37.58|30,Burlington|ON|-79.84|43.39|186,Burlington|NC|-79.44|36.1|52,Burlington|VT|-73.21|44.48|42,Burlington|IA|-91.11|40.81|25,Burnaby|BC|-122.95|49.27|249,Burnsville|MN|-93.28|44.77|61,Burton|MI|-83.62|43|28,Bushwick|NY|-73.92|40.69|112,Bustleton|PA|-75.03|40.08|32,Butte|MT|-112.53|46|34,Cabo San Lucas|MX03|-109.91|22.89|202,Cabot|AR|-92.02|34.97|25,Cadereyta|MX19|-99.98|25.58|67,Cadereyta Jimenez|MX19|-100|25.59|68,Caldwell|ID|-116.69|43.66|51,Caledon|ON|-79.99|43.87|76,Calexico|CA|-115.5|32.68|40,Calgary|AB|-114.09|51.05|1306,Calpulalpan|MX29|-98.57|19.59|33,Calumet City|IL|-87.53|41.62|37,Camarillo|CA|-119.04|34.22|67,Cambridge|ON|-80.31|43.36|129,Cambridge|MA|-71.11|42.38|110,Camden|NJ|-75.12|39.93|76,Campbell|CA|-121.95|37.29|41,Campbell River|BC|-125.24|50.02|33,Campeche|MX04|-90.52|19.84|220,Cananea|MX26|-110.3|30.98|31,Canarsie|NY|-73.9|40.64|87,Cancun|MX23|-86.85|21.17|888,Canoga Park|CA|-118.6|34.2|60,Canton|MI|-83.48|42.31|86,Canton|OH|-81.38|40.8|71,Canton|GA|-84.49|34.24|25,Cantonment|FL|-87.34|30.61|26,Canyon Country|CA|-118.47|34.42|59,Cape Coral|FL|-81.95|26.56|175,Cape Girardeau|MO|-89.52|37.31|39,Carbondale|IL|-89.22|37.73|26,Cardenas|MX27|-93.38|18|91,Carlsbad|CA|-117.35|33.16|114,Carlsbad|NM|-104.23|32.42|28,Carmel|IN|-86.12|39.98|88,Carmichael|CA|-121.33|38.62|61,Carney|MD|-76.52|39.39|29,Carol City|FL|-80.25|25.94|63,Carol Stream|IL|-88.13|41.91|40,Carpentersville|IL|-88.26|42.12|38,Carrollton|TX|-96.89|32.95|133,Carrollton|GA|-85.08|33.58|26,Carrollwood|FL|-82.49|28.05|33,Carrollwood Village|FL|-82.52|28.07|40,Carson|CA|-118.28|33.83|93,Carson City|NV|-119.77|39.16|58,Cartierville|QC|-73.7|45.53|34,Cary|NC|-78.78|35.79|159,Casa Grande|AZ|-111.76|32.88|51,Casas Adobes|AZ|-111|32.32|66,Casper|WY|-106.31|42.87|60,Casselberry|FL|-81.33|28.68|27,Castle Rock|CO|-104.86|39.37|55,Castlewood|CO|-104.9|39.58|25,Castro Valley|CA|-122.09|37.69|61,Catalina Foothills|AZ|-110.92|32.3|50,Catemaco|MX30|-95.11|18.42|27,Cathedral City|CA|-116.47|33.78|53,Catonsville|MD|-76.73|39.27|41,Cedar City|UT|-113.06|37.68|30,Cedar Falls|IA|-92.45|42.53|41,Cedar Hill|TX|-96.96|32.59|48,Cedar Park|TX|-97.82|30.51|65,Cedar Rapids|IA|-91.64|42.01|130,Celaya|MX11|-100.81|20.52|340,Celina|TX|-96.78|33.32|64,Centennial|CO|-104.88|39.58|109,Center City|PA|-75.16|39.95|57,Centereach|NY|-73.1|40.86|31,Central|LA|-91.04|30.55|28,Central 14th Street / Spring Road|DC|-77.03|38.94|25,Central City|AZ|-112.06|33.44|58,Central Islip|NY|-73.2|40.79|34,Centre City|AB|-114.07|51.05|41,Centretown|ON|-75.7|45.42|25,Centreville|VA|-77.43|38.84|71,Centro Familiar la Soledad|MX11|-101.75|21.14|32,Ceres|CA|-120.96|37.59|47,Cerritos|CA|-118.06|33.86|49,Chalco|MX15|-98.9|19.26|168,Chamblee|GA|-84.3|33.89|28,Champaign|IL|-88.24|40.12|86,Champoton|MX04|-90.72|19.34|30,Chandler|AZ|-111.84|33.31|260,Chanhassen|MN|-93.53|44.86|25,Channelview|TX|-95.11|29.78|38,Chapel Hill|NC|-79.06|35.91|59,Charlesbourg|QC|-71.31|46.9|82,Charleston|SC|-79.93|32.78|132,Charleston|WV|-81.63|38.35|46,Charlotte|NC|-80.84|35.23|911,Charlottesville|VA|-78.48|38.03|46,Charlottetown|PE|-63.13|46.23|38,Chaska|MN|-93.6|44.79|25,Chateauguay|QC|-73.75|45.38|42,Chatham|ON|-82.18|42.41|43,Chatham|IL|-87.61|41.74|31,Chatsworth|CA|-118.6|34.26|41,Chattanooga|TN|-85.31|35.05|181,Cheektowaga|NY|-78.75|42.9|75,Chelmsford|MA|-71.37|42.6|33,Chelsea|MA|-71.03|42.39|39,Cherry Hill|NJ|-75.03|39.93|70,Chesapeake|VA|-76.27|36.82|235,Cheshire|CT|-72.9|41.5|29,Chester|PA|-75.36|39.85|34,Chesterfield|MO|-90.58|38.66|47,Chestermere|AB|-113.82|51.03|32,Chetumal|MX23|-88.3|18.52|169,Cheyenne|WY|-104.82|41.14|65,Chiapa de Corzo|MX05|-93.01|16.71|45,Chicago|IL|-87.65|41.85|2664,Chicago Heights|IL|-87.64|41.51|30,Chicago Lawn|IL|-87.7|41.78|55,Chicago Loop|IL|-87.63|41.88|33,Chico|CA|-121.84|39.73|121,Chicoloapan|MX15|-98.9|19.42|172,Chicopee|MA|-72.61|42.15|56,Chicoutimi|QC|-71.06|48.42|69,Chihuahua|MX06|-106.09|28.64|925,Chilapa de Alvarez|MX12|-99.17|17.6|31,Chilliwack|BC|-121.95|49.17|101,Chilliwack-Downtown|BC|-121.96|49.16|31,Chillum|MD|-76.99|38.96|33,Chilpancingo|MX12|-99.5|17.55|187,Chinatown|CA|-122.41|37.8|100,Chinatown|NY|-74|40.72|90,Chino|CA|-117.69|34.01|85,Chino Hills|CA|-117.76|33.99|78,Cholula|MX21|-98.3|19.06|292,Chomedey|QC|-73.75|45.53|94,Chula Vista|CA|-117.08|32.64|265,Church-Yonge Corridor|ON|-79.38|43.66|31,Cibolo|TX|-98.23|29.56|33,Cicero|IL|-87.75|41.85|83,Cicero|NY|-76.12|43.18|31,Cihuatlan|MX14|-104.57|19.24|40,Cincinnati|OH|-84.51|39.13|311,Cintalapa de Figueroa|MX05|-93.72|16.68|42,Citrus Heights|CA|-121.28|38.71|87,City of Milford (balance)|CT|-73.06|41.22|51,City of Sammamish|WA|-122.04|47.6|45,Ciudad Acuna|MX07|-100.95|29.32|216,Ciudad Altamirano|MX12|-100.67|18.36|25,Ciudad Apodaca|MX19|-100.19|25.78|467,Ciudad Benito Juarez|MX19|-100.09|25.65|308,Ciudad Constitucion|MX03|-111.66|25.03|40,Ciudad de Allende|MX19|-100.02|25.28|26,Ciudad de Huajuapan de Leon|MX20|-97.78|17.81|53,Ciudad de Villa de Alvarez|MX08|-103.74|19.27|117,Ciudad del Carmen|MX04|-91.83|18.65|191,Ciudad Delicias|MX06|-105.47|28.19|148,Ciudad Fernandez|MX24|-100.01|21.94|32,Ciudad General Escobedo|MX19|-100.32|25.8|454,Ciudad Guzman|MX14|-103.46|19.7|111,Ciudad Hidalgo|MX16|-100.56|19.69|60,Ciudad Juarez|MX06|-106.46|31.72|1512,Ciudad Lazaro Cardenas|MX16|-102.2|17.96|196,Ciudad Lopez Mateos|MX15|-99.26|19.56|489,Ciudad Madero|MX28|-97.84|22.25|197,Ciudad Mante|MX28|-98.97|22.74|84,Ciudad Melchor Muzquiz|MX07|-101.52|27.88|35,Ciudad Mendoza|MX30|-97.18|18.81|35,Ciudad Nezahualcoyotl|MX15|-99.01|19.4|1077,Ciudad Obregon|MX26|-109.94|27.49|329,Ciudad Rio Bravo|MX28|-98.09|25.99|95,Ciudad Sabinas Hidalgo|MX19|-100.18|26.5|33,Ciudad Sahagun|MX13|-98.57|19.78|28,Ciudad Valles|MX24|-99.01|22|124,Ciudad Victoria|MX28|-99.14|23.74|332,Clairlea-Birchmount|ON|-79.28|43.71|26,Claremont|CA|-117.72|34.1|36,Clarksville|TN|-87.36|36.53|166,Clay|NY|-76.17|43.19|58,Clearfield|UT|-112.03|41.11|30,Clearwater|FL|-82.8|27.97|117,Cleburne|TX|-97.39|32.35|30,Clermont|FL|-81.77|28.55|32,Cleveland|OH|-81.7|41.5|365,Cleveland|TN|-84.88|35.16|43,Cleveland Heights|OH|-81.56|41.52|44,Clifton|NJ|-74.16|40.86|86,Clifton Park|NY|-73.77|42.87|36,Clinton|MD|-76.9|38.77|35,Clinton|IA|-90.19|41.84|26,Clinton|MS|-90.32|32.34|25,Clinton Township|MI|-82.92|42.59|99,Cloverdale|BC|-122.73|49.11|73,Clovis|CA|-119.7|36.83|104,Clovis|NM|-103.21|34.4|39,Coacalco|MX15|-99.11|19.63|277,Coachella|CA|-116.17|33.68|44,Coatepec|MX30|-96.96|19.45|53,Coatzacoalcos|MX30|-94.44|18.15|310,Coatzintla|MX30|-97.47|20.49|34,Cobbs Creek|PA|-75.24|39.95|33,Cochrane|AB|-114.47|51.18|32,Coconut Creek|FL|-80.18|26.25|59,Cocula|MX14|-103.82|20.37|29,Coeur d'Alene|ID|-116.78|47.68|49,Colima|MX08|-103.71|19.24|146,College Park|MD|-76.94|38.98|32,College Point|NY|-73.85|40.79|27,College Station|TX|-96.33|30.63|107,Colleyville|TX|-97.16|32.88|25,Collierville|TN|-89.66|35.04|48,Collinwood|OH|-81.57|41.56|34,Colonia del Sol|MX03|-109.93|22.91|48,Colonia del Valle|MX09|-99.16|19.39|250,Colonia Lindavista|MX15|-99.12|19.49|100,Colonia Nativitas|MX09|-99.14|19.38|60,Colorado Springs|CO|-104.82|38.83|456,Colton|CA|-117.31|34.07|54,Columbia|SC|-81.03|34|142,Columbia|MO|-92.33|38.95|129,Columbia|MD|-76.84|39.24|99,Columbia|TN|-87.04|35.62|36,Columbia Heights|DC|-77.03|38.93|38,Columbus|OH|-83|39.96|913,Columbus|GA|-84.99|32.46|206,Columbus|IN|-85.92|39.2|46,Comalcalco|MX27|-93.22|18.26|41,Comitan|MX05|-92.14|16.24|166,Commack|NY|-73.29|40.84|36,Commerce City|CO|-104.93|39.81|53,Compton|CA|-118.22|33.9|98,Conception Bay South|NL|-53|47.5|27,Concord|CA|-122.03|37.98|128,Concord|NC|-80.58|35.41|87,Concord|NH|-71.54|43.21|43,Coney Island|NY|-73.99|40.58|60,Confederation|SK|-106.7|52.14|70,Conroe|TX|-95.46|30.31|68,Contla|MX29|-98.17|19.33|27,Conway|AR|-92.44|35.09|64,Cookeville|TN|-85.5|36.16|32,Coon Rapids|MN|-93.29|45.12|62,Cooper City|FL|-80.27|26.06|35,Coppell|TX|-97.02|32.95|41,Copperas Cove|TX|-97.9|31.12|33,Coquitlam|BC|-122.78|49.28|148,Coquitlam West|BC|-122.88|49.26|25,Coral Gables|FL|-80.27|25.72|51,Coral Springs|FL|-80.27|26.27|129,Coram|NY|-73|40.87|39,Cordoba|MX30|-96.93|18.88|204,Cordova|TN|-89.78|35.16|68,Core Neighbourhoods|SK|-106.67|52.13|36,Cornelius|NC|-80.86|35.49|28,Cornwall|ON|-74.73|45.02|48,Corona|CA|-117.57|33.88|164,Corona|NY|-73.86|40.75|109,Corpus Christi|TX|-97.4|27.8|316,Cortazar|MX11|-100.96|20.48|61,Corvallis|OR|-123.26|44.56|55,Cosamaloapan|MX30|-95.8|18.37|30,Costa Mesa|CA|-117.92|33.64|113,Cote-Saint-Luc|QC|-73.67|45.47|31,Cottage Grove|MN|-92.94|44.83|35,Cottonwood Heights|UT|-111.81|40.62|34,Council Bluffs|IA|-95.86|41.26|62,Country Club|FL|-80.32|25.95|47,Courtenay|BC|-124.99|49.69|28,Coventry|RI|-71.68|41.7|35,Covina|CA|-117.89|34.09|48,Covington|KY|-84.51|39.08|40,Coyoacan|MX09|-99.16|19.35|614,Coyotepec|MX15|-99.21|19.78|35,Coyula|MX14|-103.23|20.66|29,Cozumel|MX23|-86.94|20.5|77,Cranberry Township|PA|-80.11|40.68|28,Cranston|RI|-71.44|41.78|81,Crofton|MD|-76.69|39|27,Crown Point|IN|-87.37|41.42|28,Crystal Lake|IL|-88.32|42.24|40,Cuauhtemoc|MX09|-99.15|19.45|531,Cuauhtemoc|MX06|-106.87|28.41|168,Cuautitlan|MX15|-99.18|19.67|178,Cuautitlan Izcalli|MX15|-99.22|19.64|555,Cuautla|MX17|-98.94|18.81|157,Cuautlancingo|MX21|-98.27|19.09|25,Cuernavaca|MX17|-99.23|18.93|338,Culiacan|MX25|-107.39|24.8|808,Culver City|CA|-118.4|34.02|39,Cumberland|RI|-71.43|41.97|34,Cupertino|CA|-122.03|37.32|60,Cutler Bay|FL|-80.34|25.58|45,Cutler Ridge|FL|-80.35|25.58|26,Cuyahoga Falls|OH|-81.48|41.13|49,Cypress|TX|-95.7|29.97|200,Cypress|CA|-118.04|33.82|49,Cypress Hills|NY|-73.89|40.68|54,Dakota Ridge|CO|-105.14|39.62|33,Dale City|VA|-77.31|38.64|65,Dallas|TX|-96.81|32.78|1326,Dalton|GA|-84.97|34.77|33,Daly City|CA|-122.46|37.71|106,Dana Point|CA|-117.7|33.47|34,Danbury|CT|-73.45|41.39|84,Dania Beach|FL|-80.14|26.05|31,Danvers|MA|-70.93|42.58|26,Danville|CA|-122|37.82|44,Danville|VA|-79.4|36.59|42,Danville|IL|-87.63|40.12|32,Dartmouth|NS|-63.58|44.67|101,Davenport|IA|-90.58|41.52|102,Davie|FL|-80.23|26.06|100,Davis|CA|-121.74|38.54|67,Dayton|OH|-84.19|39.76|135,Daytona Beach|FL|-81.02|29.21|72,Dearborn|MI|-83.18|42.32|95,Dearborn Heights|MI|-83.27|42.34|56,Decatur|IL|-88.95|39.84|73,Decatur|AL|-86.98|34.61|55,Deer Park|TX|-95.12|29.71|33,Deer Park|NY|-73.33|40.76|27,Deer Valley|AZ|-112.13|33.68|165,Deerfield Beach|FL|-80.1|26.32|79,DeKalb|IL|-88.75|41.93|43,Del Rio|TX|-100.9|29.36|36,DeLand|FL|-81.3|29.03|30,Delano|CA|-119.25|35.77|52,Delaware|OH|-83.07|40.3|37,Delegacion Cuajimalpa de Morelos|MX09|-99.29|19.37|160,Delray Beach|FL|-80.07|26.46|66,Delta|BC|-123.05|49.09|101,Deltona|FL|-81.26|28.9|88,Denton|TX|-97.13|33.21|131,Denver|CO|-104.98|39.74|729,Derry Village|NH|-71.31|42.89|34,Des Moines|IA|-93.61|41.6|214,Des Moines|WA|-122.32|47.4|31,Des Plaines|IL|-87.88|42.03|58,Desert Hot Springs|CA|-116.5|33.96|28,Desmarchais-Crawford|QC|-73.58|45.45|29,DeSoto|TX|-96.86|32.59|52,Detroit|MI|-83.05|42.33|645,Diamond Bar|CA|-117.81|34.03|56,Dieppe|NB|-64.69|46.08|27,Dix Hills|NY|-73.34|40.8|26,Dodge City|KS|-100.02|37.75|27,Dollard-Des Ormeaux|QC|-73.82|45.49|48,Dolores Hidalgo|MX11|-100.93|21.16|67,Don Valley Village|ON|-79.35|43.78|27,Doral|FL|-80.36|25.82|75,Dorchester|MA|-71.07|42.3|97,Dorset Park|ON|-79.28|43.75|25,Dothan|AL|-85.39|31.22|68,Douglasville|GA|-84.75|33.75|32,Dover|DE|-75.52|39.16|39,Dover|NH|-70.87|43.2|30,Dovercourt-Wallace Emerson-Junction|ON|-79.44|43.67|36,Downers Grove|IL|-88.01|41.81|49,Downey|CA|-118.13|33.94|114,Downsview-Roding-CFB|ON|-79.49|43.73|35,Downtown DC|DC|-77.02|38.89|52,Downtown Halifax|NS|-63.58|44.65|25,Downtown Vancouver|BC|-123.12|49.28|62,Dracut|MA|-71.3|42.67|28,Draper|UT|-111.86|40.52|46,Drexel Heights|AZ|-111.03|32.14|27,Drexel Hill|PA|-75.29|39.95|28,Drummondville|QC|-72.48|45.88|59,Dublin|CA|-121.94|37.7|57,Dublin|OH|-83.11|40.1|45,Dubuque|IA|-90.66|42.5|58,Duluth|MN|-92.11|46.78|86,Duluth|GA|-84.14|34|29,Duncanville|TX|-96.91|32.65|39,Dundalk|MD|-76.52|39.25|63,Dunedin|FL|-82.77|28.02|36,Dunwoody|GA|-84.33|33.95|48,Durham|NC|-78.9|35.99|257,Duvernay|QC|-73.67|45.58|37,Dyker Heights|NY|-74.01|40.62|34,Eagan|MN|-93.17|44.8|66,Eagle Mountain|UT|-112.01|40.31|27,Eagle Pass|TX|-100.5|28.71|28,East Boston|MA|-71.04|42.38|43,East Brunswick|NJ|-74.42|40.43|48,East Chattanooga|TN|-85.25|35.07|154,East Chicago|IN|-87.45|41.64|28,East Concord|NH|-71.54|43.24|42,East Flatbush|NY|-73.93|40.65|178,East Florence|AL|-87.65|34.81|35,East Hampton|VA|-76.33|37.04|147,East Harlem|NY|-73.94|40.79|115,East Hartford|CT|-72.61|41.78|51,East Hastings|BC|-123.06|49.27|80,East Haven|CT|-72.87|41.28|29,East Hill-Meridian|WA|-122.17|47.41|29,East Honolulu|HI|-157.72|21.29|49,East Independence|MO|-94.36|39.1|110,East Lake|FL|-82.69|28.11|30,East Lansing|MI|-84.48|42.74|48,East Los Angeles|CA|-118.17|34.02|126,East Meadow|NY|-73.56|40.71|38,East New York|NY|-73.88|40.67|173,East Norwalk|CT|-73.4|41.11|84,East Orange|NJ|-74.2|40.77|64,East Palo Alto|CA|-122.14|37.47|29,East Pensacola Heights|FL|-87.18|30.43|54,East Point|GA|-84.44|33.68|35,East Providence|RI|-71.37|41.81|47,East Saint Louis|IL|-90.15|38.62|27,East Village|NY|-73.99|40.73|62,Easton|PA|-75.22|40.69|26,Eastpointe|MI|-82.96|42.47|32,Eastvale|CA|-117.56|33.96|59,Eau Claire|WI|-91.5|44.81|67,Ecatepec de Morelos|MX15|-99.06|19.6|1645,Echo Park|CA|-118.26|34.08|43,Eden Prairie|MN|-93.47|44.85|63,Edgewater|IL|-87.66|41.98|54,Edgewood|MD|-76.29|39.42|25,Edina|MN|-93.35|44.89|50,Edinburg|TX|-98.16|26.3|84,Edison|NJ|-74.41|40.52|102,Edmond|OK|-97.48|35.65|90,Edmonds|WA|-122.38|47.81|41,Edmonton|AB|-113.47|53.55|1010,Egypt Lake-Leto|FL|-82.51|28.02|35,El Cajon|CA|-116.96|32.79|103,El Centro|CA|-115.56|32.79|43,El Dorado Hills|CA|-121.08|38.69|42,El Mirage|AZ|-112.32|33.61|33,El Monte|CA|-118.03|34.07|116,El Paso|TX|-106.49|31.76|678,El Pueblito|MX22|-100.44|20.54|71,Eldersburg|MD|-76.95|39.4|30,Elgin|IL|-88.28|42.04|112,Elizabeth|NJ|-74.21|40.66|129,Elizabethtown|KY|-85.86|37.69|29,Elk Grove|CA|-121.37|38.41|166,Elk Grove Village|IL|-87.97|42|33,Elkhart|IN|-85.98|41.68|52,Ellendale|TN|-89.83|35.23|25,Ellicott City|MD|-76.8|39.27|65,Elmhurst|NY|-73.88|40.74|113,Elmhurst|IL|-87.94|41.9|45,Elmira|NY|-76.81|42.09|28,Elmont|NY|-73.71|40.7|33,Elyria|OH|-82.11|41.37|53,Emiliano Zapata|MX17|-99.18|18.84|49,Emiliano Zapata|MX15|-98.97|19.34|25,Empalme|MX26|-110.81|27.96|42,Encanto|AZ|-112.08|33.48|54,Encarnacion de Diaz|MX14|-102.24|21.53|25,Enchanted Hills|NM|-106.59|35.34|87,Encinitas|CA|-117.29|33.04|62,Encino|CA|-118.5|34.16|44,Enfield|CT|-72.59|41.98|45,Englewood|CO|-104.99|39.65|33,Englewood|NJ|-73.97|40.89|28,Englewood|IL|-87.65|41.78|26,Enid|OK|-97.88|36.4|51,Ensenada|MX02|-116.6|31.87|443,Enterprise|NV|-115.24|36.03|108,Enterprise|AL|-85.86|31.32|27,Erie|PA|-80.09|42.13|99,Escarcega|MX04|-90.75|18.61|29,Escondido|CA|-117.09|33.12|151,Escuinapa de Hidalgo|MX25|-105.78|22.83|30,Esperanza|MX26|-109.93|27.58|38,Essex|MD|-76.47|39.31|39,Estero|FL|-81.81|26.44|30,Etobicoke|ON|-79.57|43.64|365,Euclid|OH|-81.53|41.59|47,Eugene|OR|-123.09|44.05|176,Euless|TX|-97.08|32.84|54,Eureka|CA|-124.16|40.8|27,Evans|GA|-82.13|33.53|29,Evanston|IL|-87.69|42.04|75,Evansville|IN|-87.56|37.97|119,Everett|WA|-122.2|47.98|108,Everett|MA|-71.05|42.41|46,'Ewa Gentry-West Loch|HI|-158.03|21.35|35,Ewing|NJ|-74.8|40.27|36,Fair Lawn|NJ|-74.13|40.94|33,Fair Oaks|CA|-121.27|38.64|30,Fairbanks|AK|-147.72|64.84|32,Fairborn|OH|-84.02|39.82|33,Fairfield|CA|-122.04|38.25|112,Fairfield|CT|-73.26|41.14|59,Fairfield|OH|-84.56|39.35|42,Fairview|BC|-123.13|49.26|33,Fall River|MA|-71.16|41.7|94,Fallbrook|CA|-117.25|33.38|30,Fallingbrook|ON|-75.48|45.48|25,Far Rockaway|NY|-73.76|40.61|39,Fargo|ND|-96.79|46.88|118,Farmers Branch|TX|-96.9|32.93|32,Farmington|NM|-108.22|36.73|42,Farmington|CT|-72.83|41.72|25,Farmington Hills|MI|-83.38|42.49|81,Fayetteville|NC|-78.88|35.05|201,Fayetteville|AR|-94.16|36.06|82,Federal Way|WA|-122.31|47.32|95,Felipe Carrillo Puerto|MX23|-88.05|19.58|25,Fenway/Kenmore|MA|-71.1|42.34|37,Ferry Pass|FL|-87.21|30.51|28,Financial District|NY|-74.01|40.71|60,Findlay|OH|-83.65|41.04|41,Fishers|IN|-86.01|39.96|76,Fitchburg|MA|-71.8|42.58|40,Fitchburg|WI|-89.47|42.96|27,Flagami|FL|-80.32|25.76|50,Flagstaff|AZ|-111.65|35.2|70,Flatbush|NY|-73.96|40.65|93,Flatlands|NY|-73.93|40.62|63,Fleetwood|BC|-122.8|49.17|65,Fleming Island|FL|-81.72|30.09|27,Flint|MI|-83.69|43.01|98,Florence|AL|-87.68|34.8|40,Florence|SC|-79.76|34.2|38,Florence|KY|-84.63|39|32,Florence|AZ|-111.39|33.03|31,Florence-Graham|CA|-118.24|33.97|63,Florin|CA|-121.41|38.5|47,Florissant|MO|-90.32|38.79|52,Flower Mound|TX|-97.1|33.01|71,Folsom|CA|-121.18|38.68|76,Fond du Lac|WI|-88.44|43.77|42,Fontana|CA|-117.44|34.09|212,Foothill Farms|CA|-121.35|38.68|33,Fordham|NY|-73.9|40.86|94,Forest Hills|NY|-73.85|40.72|67,Forest Hills|MI|-85.49|42.96|25,Fort Bragg|NC|-79.01|35.14|29,Fort Cavazos|TX|-97.78|31.13|29,Fort Collins|CO|-105.08|40.59|170,Fort Erie|ON|-78.93|42.9|30,Fort Garry South|MB|-97.16|49.79|65,Fort Hamilton|NY|-74.03|40.62|28,Fort Lauderdale|FL|-80.14|26.12|183,Fort Lee|NJ|-73.97|40.85|36,Fort McMurray|AB|-111.38|56.73|66,Fort Myers|FL|-81.84|26.62|74,Fort Pierce|FL|-80.33|27.45|44,Fort Smith|AR|-94.4|35.39|88,Fort Wayne|IN|-85.13|41.13|260,Fort Worth|TX|-97.32|32.73|1008,Fortuna Foothills|AZ|-114.41|32.66|26,Foster City|CA|-122.27|37.56|33,Fountain|CO|-104.7|38.68|27,Fountain Valley|CA|-117.95|33.71|56,Fountainebleau|FL|-80.35|25.77|59,Four Corners|FL|-81.65|28.33|26,Fraccionamiento Real Palmas|MX19|-100.16|25.9|34,Framingham|MA|-71.42|42.28|68,Framingham Center|MA|-71.44|42.3|65,Francisco I. Madero|MX07|-103.27|25.77|26,Frankfort|KY|-84.87|38.2|28,Franklin|TN|-86.87|35.93|72,Franklin|WI|-88.04|42.89|36,Franklin|MA|-71.4|42.08|30,Franklin Square|NY|-73.68|40.71|29,Fraser Heights|BC|-122.78|49.2|25,Frederick|MD|-77.41|39.41|69,Fredericksburg|VA|-77.46|38.3|28,Fredericton|NB|-66.67|45.95|63,Fredericton Northside|NB|-66.64|45.98|28,Freeport|NY|-73.58|40.66|43,Fremont|CA|-121.99|37.55|232,Fremont|NE|-96.5|41.43|26,Fresh Meadows|NY|-73.79|40.73|28,Fresnillo|MX32|-102.87|23.17|143,Fresno|CA|-119.77|36.75|542,Fridley|MN|-93.26|45.09|27,Friendswood|TX|-95.2|29.53|38,Frisco|TX|-96.82|33.15|154,Frontera|MX07|-101.45|26.93|69,Fruit Cove|FL|-81.64|30.11|29,Fuentes del Valle|MX15|-99.14|19.63|74,Fullerton|CA|-117.93|33.87|140,Gabriel Leyva Solano|MX25|-108.64|25.66|27,Gadsden|AL|-86.01|34.01|36,Gage Park|IL|-87.7|41.8|41,Gahanna|OH|-82.88|40.02|34,Gainesville|FL|-82.32|29.65|145,Gainesville|GA|-83.82|34.3|38,Gaithersburg|MD|-77.2|39.14|67,Galesburg|IL|-90.37|40.95|31,Gallatin|TN|-86.45|36.39|34,Galt|CA|-121.3|38.25|25,Galveston|TX|-94.8|29.3|50,Garcia|MX19|-100.59|25.8|93,Garden City|KS|-100.87|37.97|27,Garden City|MI|-83.33|42.33|26,Garden Grove|CA|-117.94|33.77|175,Gardena|CA|-118.31|33.89|60,Garfield|NJ|-74.11|40.88|31,Garfield Heights|OH|-81.61|41.42|28,Garland|TX|-96.64|32.91|236,Garner|NC|-78.61|35.71|28,Gary|IN|-87.35|41.59|77,Gastonia|NC|-81.19|35.26|74,Gatineau|QC|-75.7|45.48|300,Georgetown|TX|-97.68|30.63|63,Georgetown|ON|-79.92|43.65|44,Georgetown|KY|-84.56|38.21|32,Germantown|MD|-77.27|39.17|86,Germantown|TN|-89.81|35.09|39,Gilbert|AZ|-111.79|33.35|247,Gillette|WY|-105.5|44.29|32,Gilroy|CA|-121.57|37.01|53,Gladstone|MO|-94.55|39.2|26,Glastonbury|CT|-72.61|41.71|31,Glen Burnie|MD|-76.62|39.16|67,Glen Cove|NY|-73.63|40.86|27,Glen Ellyn|IL|-88.07|41.88|28,Glendale|AZ|-112.19|33.54|240,Glendale|CA|-118.26|34.14|201,Glendale|NY|-73.89|40.7|34,Glendale Heights|IL|-88.06|41.91|34,Glendora|CA|-117.87|34.14|52,Glenfield-Jane Heights|ON|-79.51|43.75|30,Glenview|IL|-87.79|42.07|47,Glenville|NY|-74.05|42.93|29,Gloucester|ON|-75.63|45.35|150,Gloucester|MA|-70.66|42.61|29,Golden Glades|FL|-80.2|25.91|33,Goldsboro|NC|-77.99|35.38|35,Goleta|CA|-119.83|34.44|30,Gomez Palacio|MX10|-103.5|25.57|257,Goodyear|AZ|-112.36|33.44|79,Goose Creek|SC|-80.03|32.98|40,Goshen|IN|-85.83|41.58|32,Gramercy Park|NY|-73.99|40.74|27,Granby|QC|-72.73|45.4|66,Grand Forks|ND|-97.03|47.93|57,Grand Island|NE|-98.34|40.93|51,Grand Junction|CO|-108.55|39.06|60,Grand Prairie|TX|-97|32.75|187,Grand Rapids|MI|-85.67|42.96|195,Grande Prairie|AB|-118.8|55.17|70,Grandview|MO|-94.53|38.89|25,Grandview-Woodlands|BC|-123.07|49.28|29,Granger|IN|-86.11|41.75|30,Granite City|IL|-90.15|38.7|29,Grants Pass|OR|-123.33|42.44|37,Grapevine|TX|-97.08|32.93|51,Gravesend|NY|-73.97|40.6|112,Great Falls|MT|-111.3|47.5|59,Greater Grand Crossing|IL|-87.61|41.76|32,Greater Sudbury|ON|-80.99|46.49|166,Greeley|CO|-104.71|40.42|108,Green|OH|-81.48|40.95|25,Green Bay|WI|-88.02|44.52|105,Greenacres City|FL|-80.13|26.62|32,Greenburgh|NY|-73.84|41.03|86,Greenfield|WI|-88.01|42.96|37,Greenpoint|NY|-73.95|40.72|34,Greensboro|NC|-79.79|36.07|285,Greenville|NC|-77.37|35.61|90,Greenville|SC|-82.39|34.85|64,Greenville|MS|-91.06|33.41|32,Greenville|TX|-96.11|33.14|26,Greenwood|IN|-86.11|39.61|55,Greer|SC|-82.23|34.94|28,Gresham|OR|-122.43|45.5|110,Grimsby|ON|-79.57|43.2|27,Grove City|OH|-83.09|39.88|39,Guadalajara|MX14|-103.35|20.68|1385,Guadalupe|MX19|-100.26|25.68|673,Guadalupe|MX32|-102.52|22.75|170,Guamuchil|MX25|-108.08|25.46|72,Guanajuato|MX11|-101.26|21.02|72,Guasave|MX25|-108.47|25.57|71,Guelph|ON|-80.26|43.55|143,Guildford|BC|-122.8|49.19|64,Gulfport|MS|-89.09|30.37|71,Gurnee|IL|-87.9|42.37|31,Gustavo Adolfo Madero|MX09|-99.11|19.49|1185,Gwynn Oak|MD|-76.69|39.33|47,Hacienda Heights|CA|-117.97|33.99|54,Hacienda Santa Fe|MX14|-103.38|20.52|86,Hackensack|NJ|-74.04|40.89|44,Hagerstown|MD|-77.72|39.64|40,Halifax|NS|-63.58|44.64|471,Hallandale Beach|FL|-80.15|25.98|39,Haltom City|TX|-97.27|32.8|44,Halton Hills|ON|-79.93|43.64|62,Hamden|CT|-72.9|41.4|59,Hamilton|ON|-79.85|43.25|569,Hamilton|OH|-84.56|39.4|62,Hammond|IN|-87.5|41.58|77,Hampton|VA|-76.35|37.03|137,Hanford|CA|-119.65|36.33|55,Hanover|MD|-76.72|39.19|38,Hanover Park|IL|-88.15|42|38,Harker Heights|TX|-97.66|31.08|29,Harlem|NY|-73.95|40.81|116,Harlingen|TX|-97.7|26.19|65,Harrisburg|PA|-76.88|40.27|50,Harrison|NY|-73.71|40.97|28,Harrisonburg|VA|-78.87|38.45|52,Hartford|CT|-72.69|41.76|121,Harvey|IL|-87.65|41.61|25,Hastings-Sunrise|BC|-123.03|49.28|34,Hattiesburg|MS|-89.29|31.33|46,Haverhill|MA|-71.08|42.78|62,Havertown|PA|-75.31|39.98|50,Hawai'i Kai|HI|-157.7|21.3|30,Hawthorne|CA|-118.35|33.92|88,Hayward|CA|-122.08|37.67|158,Hazelwood|MO|-90.37|38.77|25,Helena|MT|-112.04|46.59|32,Hell's Kitchen|NY|-73.99|40.76|45,Hemet|CA|-116.97|33.75|83,Hempstead|NY|-73.62|40.71|55,Henderson|NV|-114.98|36.04|285,Henderson|KY|-87.59|37.84|28,Hendersonville|TN|-86.62|36.3|56,Henrietta|NY|-77.61|43.06|42,Hercules|CA|-122.29|38.02|25,Hermitage|TN|-86.62|36.2|37,Hermosillo|MX26|-110.97|29.09|812,Heroica Caborca|MX26|-112.16|30.72|59,Heroica Ciudad de Juchitan de Zaragoza|MX20|-95.02|16.43|88,Heroica Guaymas|MX26|-110.9|27.92|117,Heroica Matamoros|MX28|-97.5|25.88|510,Heroica Zitacuaro|MX16|-100.36|19.44|84,Herriman|UT|-112.03|40.51|30,Hesperia|CA|-117.3|34.43|93,Hialeah|FL|-80.28|25.86|237,Hickory|NC|-81.34|35.73|40,Hicksville|NY|-73.53|40.77|41,Hidalgo del Parral|MX06|-105.67|26.93|104,High Point|NC|-80.01|35.96|110,Highland|CA|-117.21|34.13|54,Highland Park|IL|-87.8|42.18|29,Highlands Ranch|CO|-104.97|39.55|96,Hilliard|OH|-83.16|40.03|33,Hillsboro|OR|-122.99|45.52|102,Hillsborough|NJ|-74.63|40.48|38,Hilo|HI|-155.09|19.73|43,Hilton Head|SC|-80.75|32.22|37,Hilton Head Island|SC|-80.74|32.19|40,Hinesville|GA|-81.6|31.85|33,Hobart|IN|-87.26|41.53|28,Hobbs|NM|-103.14|32.7|38,Hoboken|NJ|-74.03|40.74|53,Hoffman Estates|IL|-88.08|42.04|52,Holbrook|NY|-73.08|40.81|27,Holladay|UT|-111.82|40.67|30,Holland|MI|-86.11|42.79|33,Hollister|CA|-121.4|36.85|37,Holly Springs|NC|-78.83|35.65|31,Hollywood|CA|-118.33|34.1|167,Hollywood|FL|-80.15|26.01|149,Holmesburg|PA|-75.03|40.04|28,Holyoke|MA|-72.62|42.2|40,Homestead|FL|-80.48|25.47|80,Homewood|AL|-86.8|33.47|25,Honolulu|HI|-157.86|21.31|350,Hoover|AL|-86.81|33.41|84,Hopkinsville|KY|-87.49|36.87|32,Horn Lake|MS|-90.03|34.96|26,Hot Springs|AR|-93.06|34.5|35,Houma|LA|-90.72|29.6|34,Houston|TX|-95.36|29.76|2314,Howard Beach|NY|-73.84|40.66|26,Huamantla|MX29|-97.93|19.31|51,Huatabampo|MX26|-109.64|26.83|30,Huatusco|MX30|-96.97|19.15|31,Huauchinango|MX21|-98.05|20.17|56,Huber Heights|OH|-84.12|39.84|38,Huejotzingo|MX21|-98.41|19.16|25,Huejutla de Reyes|MX13|-98.42|21.14|40,Huimanguillo|MX27|-93.39|17.83|27,Huixquilucan|MX15|-99.35|19.36|124,Huixtla|MX05|-92.46|15.14|32,Hull|QC|-75.71|45.43|63,Huntersville|NC|-80.84|35.41|52,Huntington|WV|-82.45|38.42|48,Huntington Beach|CA|-118|33.66|201,Huntington Park|CA|-118.23|33.98|59,Huntington Station|NY|-73.41|40.85|33,Huntley|IL|-88.43|42.17|26,Hunts Point|NY|-73.88|40.81|27,Huntsville|AL|-86.59|34.73|215,Huntsville|TX|-95.55|30.72|40,Hurst|TX|-97.17|32.82|39,Hutchinson|KS|-97.93|38.06|41,Hyde Park|MA|-71.12|42.26|31,Hyde Park|IL|-87.59|41.79|26,Idaho Falls|ID|-112.03|43.47|59,Iguala de la Independencia|MX12|-99.54|18.35|118,Imperial Beach|CA|-117.11|32.58|27,Independence|MO|-94.42|39.09|117,Independence|KY|-84.54|38.94|26,Indian Trail|NC|-80.67|35.08|37,Indianapolis|IN|-86.16|39.77|887,Indio|CA|-116.22|33.72|87,Inglewood|CA|-118.35|33.96|111,Innisfil|ON|-79.65|44.3|43,Inver Grove Heights|MN|-93.04|44.85|34,Iowa City|IA|-91.53|41.66|74,Irapuato|MX11|-101.36|20.67|380,Irondequoit|NY|-77.58|43.21|51,Irvine|CA|-117.82|33.67|256,Irving|TX|-96.95|32.81|236,Irving Park|IL|-87.74|41.95|56,Irvington|NJ|-74.23|40.73|61,Isla|MX30|-95.53|18.03|26,Islington-City Centre West|ON|-79.54|43.63|43,Issaquah|WA|-122.03|47.53|36,Ithaca|NY|-76.5|42.44|30,Ixmiquilpan|MX13|-99.22|20.48|34,Ixtaczoquitlan|MX30|-97.06|18.85|26,Ixtapa|MX14|-105.21|20.72|29,Ixtapa-Zihuatanejo|MX12|-101.55|17.64|67,Ixtapaluca|MX15|-98.88|19.32|322,Ixtepec|MX20|-95.1|16.56|25,Iztacalco|MX09|-99.1|19.4|384,Iztapalapa|MX09|-99.06|19.36|1835,Izucar de Matamoros|MX21|-98.46|18.6|42,Jackson|MS|-90.18|32.3|153,Jackson|TN|-88.81|35.61|66,Jackson|NJ|-74.86|39.78|54,Jackson|MI|-84.4|42.25|33,Jackson Heights|NY|-73.89|40.76|67,Jacksonville|FL|-81.66|30.33|1009,Jacksonville|NC|-77.43|34.75|67,Jacksonville|AR|-92.11|34.87|28,Jacona de Plancarte|MX16|-102.31|19.96|53,Jaltipan de Morelos|MX30|-94.71|17.97|32,Jamaica|NY|-73.81|40.69|216,Jamaica Plain|MA|-71.12|42.31|37,Jamestown|NY|-79.24|42.1|30,Janesville|WI|-89.02|42.68|64,Jardines de la Silla|MX19|-100.19|25.63|53,Jefferson City|MO|-92.17|38.58|42,Jeffersontown|KY|-85.56|38.19|26,Jeffersonville|IN|-85.74|38.28|46,Jerez de Garcia Salinas|MX32|-102.99|22.65|43,Jersey City|NJ|-74.08|40.73|264,Jesus Maria|MX01|-102.34|21.96|43,Jiutepec|MX17|-99.18|18.88|215,Johns Creek|GA|-84.2|34.03|83,Johnson City|TN|-82.35|36.31|66,Johnston|RI|-71.51|41.82|29,Joint Base Pearl Harbor Hickam|HI|-157.95|21.35|42,Joliet|IL|-88.08|41.53|147,Joliette|QC|-73.42|46.02|34,Jonesboro|AR|-90.7|35.84|73,Jonquiere|QC|-71.25|48.42|54,Joplin|MO|-94.51|37.08|51,Jose Mariano Jimenez|MX06|-104.92|27.13|34,Juneau|AK|-134.42|58.3|31,Jupiter|FL|-80.09|26.93|62,Juventino Rosas|MX11|-101|20.64|42,Kahului|HI|-156.47|20.89|26,Kailua|HI|-157.74|21.4|38,Kalamazoo|MI|-85.59|42.29|76,Kalihi-Palama|HI|-157.88|21.33|43,Kamloops|BC|-120.32|50.67|104,Kanasin|MX31|-89.56|20.93|77,Kanata|ON|-75.92|45.3|90,Kaneohe|HI|-157.8|21.4|34,Kankakee|IL|-87.86|41.12|26,Kannapolis|NC|-80.62|35.49|46,Kansas City|MO|-94.58|39.1|475,Kansas City|KS|-94.63|39.11|152,Kaysville|UT|-111.94|41.04|30,Kearney|NE|-99.08|40.7|33,Kearns|UT|-112|40.66|35,Kearny|NJ|-74.15|40.77|42,Keizer|OR|-123.03|44.99|37,Keller|TX|-97.25|32.93|45,Kelowna|BC|-119.49|49.88|144,Ken Caryl|CO|-105.11|39.58|32,Kendale Lakes|FL|-80.41|25.71|56,Kendall|FL|-80.32|25.68|80,Kendall West|FL|-80.44|25.71|36,Kenner|LA|-90.24|29.99|67,Kennesaw|GA|-84.62|34.02|33,Kennewick|WA|-119.14|46.21|78,Kenosha|WI|-87.82|42.58|99,Kensington|NY|-73.97|40.65|39,Kensington-Cedar Cottage|BC|-123.07|49.25|49,Kent|WA|-122.23|47.38|126,Kent|OH|-81.36|41.15|29,Kentwood|MI|-85.64|42.87|51,Kettering|OH|-84.17|39.69|55,Kew Gardens Hills|NY|-73.82|40.73|37,Key West|FL|-81.78|24.56|25,Killarney|BC|-123.04|49.23|29,Killeen|TX|-97.73|31.12|140,Kingman|AZ|-114.05|35.19|28,Kings Bridge|NY|-73.91|40.88|75,Kingsport|TN|-82.56|36.55|53,Kingston|ON|-76.48|44.23|132,Kingsville|TX|-97.86|27.52|26,Kirkland|WA|-122.21|47.68|87,Kirkwood|MO|-90.41|38.58|27,Kiryas Joel|NY|-74.17|41.34|32,Kissimmee|FL|-81.42|28.3|69,Kitchener|ON|-80.51|43.43|256,Kitsilano|BC|-123.17|49.27|43,Knoxville|TN|-83.92|35.96|190,Kokomo|IN|-86.13|40.49|57,Koreatown|CA|-118.3|34.06|124,Kyle|TX|-97.88|29.99|35,L'Amoreaux|ON|-79.31|43.8|43,La Barca|MX14|-102.54|20.29|35,La Cite-Limoilou|QC|-71.23|46.83|108,La Crosse|WI|-91.24|43.8|52,La Habra|CA|-117.95|33.93|62,La Haute-Saint-Charles|QC|-71.37|46.89|88,La Jolla|CA|-117.27|32.85|42,La Joya|MX02|-117|32.44|26,La Mesa|CA|-117.02|32.77|60,La Mirada|CA|-118.01|33.92|49,La Paz|MX03|-110.31|24.14|250,La Piedad de Cabadas|MX16|-102.02|20.34|83,La Porte|TX|-95.02|29.67|35,La Presa|CA|-117|32.71|34,La Puente|CA|-117.95|34.02|40,La Quinta|CA|-116.31|33.66|40,La Vergne|TN|-86.58|36.02|34,La Verne|CA|-117.77|34.1|32,Lacey|WA|-122.82|47.03|46,Lafayette|LA|-92.02|30.22|121,Lafayette|IN|-86.88|40.42|71,Lafayette|CO|-105.09|39.99|27,Lafayette|CA|-122.12|37.89|25,Lagos de Moreno|MX14|-101.93|21.36|98,LaGrange|GA|-85.03|33.04|29,Laguna|CA|-121.42|38.42|46,Laguna Hills|CA|-117.71|33.61|31,Laguna Niguel|CA|-117.71|33.52|65,Lake Charles|LA|-93.2|30.21|76,Lake Elsinore|CA|-117.33|33.67|61,Lake Forest|CA|-117.69|33.65|82,Lake Havasu City|AZ|-114.32|34.48|53,Lake in the Hills|IL|-88.33|42.18|29,Lake Jackson|TX|-95.43|29.03|27,Lake Magdalene|FL|-82.47|28.07|28,Lake Oswego|OR|-122.67|45.42|38,Lake Ridge|VA|-77.3|38.69|41,Lake Stevens|WA|-122.06|48.02|30,Lake Worth Beach|FL|-80.07|26.62|37,Lakeland|FL|-81.95|28.04|104,Lakeside|FL|-81.77|30.13|30,Lakeville|MN|-93.24|44.65|60,Lakewood|CO|-105.08|39.7|152,Lakewood|CA|-118.13|33.85|81,Lakewood|WA|-122.52|47.17|59,Lakewood|NJ|-74.22|40.1|53,Lakewood|SK|-106.59|52.11|51,Lakewood|OH|-81.8|41.48|50,Lancaster|CA|-118.14|34.7|161,Lancaster|PA|-76.31|40.04|59,Lancaster|OH|-82.6|39.71|39,Lancaster|TX|-96.76|32.59|38,Land O' Lakes|FL|-82.46|28.22|31,Langford|BC|-123.5|48.45|46,Langley|BC|-122.66|49.1|132,Lansing|MI|-84.56|42.73|112,Lansing|IL|-87.54|41.56|28,Laplace|LA|-90.48|30.07|29,Laramie|WY|-105.59|41.31|32,Laredo|TX|-99.51|27.51|256,Largo|FL|-82.79|27.91|81,Las Choapas|MX30|-94.1|17.91|42,Las Cruces|NM|-106.78|32.31|101,Las Guacamayas|MX16|-102.21|18.02|37,Las Pintitas|MX14|-103.3|20.56|26,Las Vegas|NV|-115.14|36.17|641,LaSalle|ON|-83.06|42.24|32,Lauderdale Lakes|FL|-80.21|26.17|34,Lauderhill|FL|-80.21|26.14|71,Laurel|MD|-76.85|39.1|26,Laval|QC|-73.69|45.57|438,Laval-des-Rapides|QC|-73.7|45.56|36,Lawndale|CA|-118.35|33.89|33,Lawrence|KS|-95.24|38.97|93,Lawrence|MA|-71.16|42.71|80,Lawrence|IN|-86.03|39.84|47,Lawrenceville|GA|-83.99|33.96|30,Lawson|SK|-106.64|52.16|34,Lawton|OK|-98.39|34.61|96,Layton|UT|-111.97|41.06|74,Le Plateau-Mont-Royal|QC|-73.58|45.53|105,Le Sud-Ouest|QC|-73.59|45.47|86,Le Vieux-Longueuil|QC|-73.51|45.54|135,League City|TX|-95.09|29.51|98,Leamington|ON|-82.6|42.05|35,Leander|TX|-97.85|30.58|59,Leavenworth|KS|-94.92|39.31|35,Leawood|KS|-94.62|38.97|34,Lebanon|TN|-86.29|36.21|30,Lebanon|PA|-76.41|40.34|25,Lee's Summit|MO|-94.38|38.91|95,Leesburg|VA|-77.56|39.12|51,Lehi|UT|-111.85|40.39|58,Lehigh Acres|FL|-81.62|26.63|86,Leisure City|FL|-80.43|25.5|26,Lemon Grove|CA|-117.03|32.74|26,Lemoore|CA|-119.78|36.3|25,Lenexa|KS|-94.73|38.95|52,Leominster|MA|-71.76|42.53|41,Leon de los Aldama|MX11|-101.68|21.12|1579,Lerdo|MX10|-103.52|25.54|79,Les Rivieres|QC|-71.27|46.82|77,Lethbridge|AB|-112.82|49.7|103,Levis|QC|-71.18|46.8|143,Levittown|PA|-74.83|40.16|52,Levittown|NY|-73.51|40.73|51,Lewiston|ME|-70.21|44.1|36,Lewiston|ID|-117.02|46.42|32,Lewiston Orchards|ID|-116.98|46.38|31,Lewisville|TX|-96.99|33.05|104,Lexington|KY|-84.48|37.99|320,Lexington|MA|-71.22|42.45|31,Lexington-Fayette|KY|-84.46|38.05|314,Liberty|MO|-94.42|39.25|30,Lima|OH|-84.11|40.74|37,Linares|MX19|-99.57|24.86|70,Lincoln|NE|-96.67|40.8|294,Lincoln|CA|-121.29|38.89|49,Lincoln Park|IL|-87.65|41.92|66,Lincoln Park|MI|-83.18|42.25|37,Lincoln Square|IL|-87.69|41.98|40,Linden|NJ|-74.24|40.62|42,Lindenhurst|NY|-73.37|40.69|27,Linton Hall|VA|-77.57|38.76|35,Little Elm|TX|-96.94|33.16|38,Little Havana|FL|-80.23|25.77|53,Little Rock|AR|-92.29|34.75|202,Littleton|CO|-105.02|39.61|46,Livermore|CA|-121.77|37.68|88,Livingston|NJ|-74.31|40.8|27,Livonia|MI|-83.35|42.37|94,Lloydminster|AB|-110.02|53.27|31,Lochearn|MD|-76.72|39.34|25,Lockport|IL|-88.06|41.59|25,Lodi|CA|-121.27|38.13|64,Logan|UT|-111.83|41.74|50,Logan Square|IL|-87.7|41.92|73,Loma Bonita|MX20|-95.88|18.11|40,Lombard|IL|-88.01|41.88|43,Lompoc|CA|-120.46|34.64|44,London|ON|-81.23|42.98|422,Long Beach|CA|-118.19|33.77|474,Long Beach|NY|-73.66|40.59|33,Long Branch|NJ|-73.99|40.3|30,Long Island City|NY|-73.95|40.74|25,Longfellow Community|MN|-93.23|44.94|29,Longmont|CO|-105.1|40.17|92,Longueuil|QC|-73.47|45.52|229,Longview|TX|-94.74|32.5|82,Longview|WA|-122.94|46.14|36,Lorain|OH|-82.18|41.45|63,Los Altos|CA|-122.11|37.39|30,Los Angeles|CA|-118.24|34.05|3820,Los Banos|CA|-120.85|37.06|37,Los Gatos|CA|-121.97|37.23|30,Los Mochis|MX25|-109|25.79|256,Los Reyes Acaquilpan|MX15|-98.98|19.36|85,Los Reyes de Salgado|MX16|-102.47|19.59|39,Louisville|KY|-85.76|38.25|624,Loveland|CO|-105.07|40.4|75,Lowell|MA|-71.32|42.63|110,Lower Sackville|NS|-63.68|44.78|51,Lower West Side|IL|-87.67|41.85|34,Lubbock|TX|-101.86|33.58|249,Lufkin|TX|-94.73|31.34|36,Lynchburg|VA|-79.14|37.41|79,Lynn|MA|-70.95|42.47|92,Lynnwood|WA|-122.32|47.82|36,Lynwood|CA|-118.21|33.93|71,Mableton|GA|-84.58|33.82|37,Macon|GA|-83.63|32.84|91,Macuspana|MX27|-92.6|17.76|32,Madera|CA|-120.06|36.96|64,Madison|WI|-89.4|43.07|280,Madison|AL|-86.75|34.7|46,Madison|MS|-90.12|32.46|25,Madison Heights|MI|-83.11|42.49|30,Magdalena Atlicpac|MX15|-98.95|19.37|26,Magdalena Contreras|MX09|-99.21|19.33|238,Magdalena de Kino|MX26|-110.96|30.63|26,Magna|UT|-112.1|40.71|26,Makakilo / Kapolei / Honokai Hale|HI|-158.1|21.34|46,Makiki / Lower Punchbowl / Tantalus|HI|-157.83|21.32|31,Malden|MA|-71.07|42.43|61,Malvern|ON|-79.22|43.81|43,Manassas|VA|-77.48|38.75|41,Manchester|NH|-71.45|43|110,Manchester|CT|-72.52|41.78|30,Manhattan|NY|-73.97|40.78|1487,Manhattan|KS|-96.57|39.18|56,Manhattan Beach|CA|-118.41|33.88|35,Manhattan Valley|NY|-73.97|40.79|38,Manitowoc|WI|-87.66|44.09|33,Mankato|MN|-94.01|44.16|41,Mansfield|TX|-97.14|32.56|64,Mansfield|OH|-82.52|40.76|46,Mansfield City|CT|-72.23|41.77|26,Manteca|CA|-121.22|37.8|75,Manzanillo|MX08|-104.34|19.12|159,Maple Grove|MN|-93.46|45.07|68,Maple Ridge|BC|-122.6|49.22|82,Maple Valley|WA|-122.05|47.39|25,Maplewood|MN|-93|44.95|40,Maplewood|NJ|-74.27|40.73|25,Marana|AZ|-111.23|32.44|41,Maravatio de Ocampo|MX16|-100.44|19.89|34,Marfil|MX11|-101.29|21|29,Margate|FL|-80.21|26.24|57,Maricopa|AZ|-112.05|33.06|48,Marietta|GA|-84.55|33.95|59,Marion|IA|-91.6|42.03|37,Marion|OH|-83.13|40.59|36,Marion|IN|-85.66|40.56|29,Markham|ON|-79.27|43.87|338,Marlboro|NJ|-74.25|40.32|40,Marlborough|MA|-71.55|42.35|39,Marpole|BC|-123.13|49.21|27,Marrero|LA|-90.1|29.9|33,Marshalltown|IA|-92.91|42.05|27,Martinez|CA|-122.13|38.02|38,Martinez|GA|-82.08|33.52|35,Martinez de la Torre|MX30|-97.06|20.07|60,Maryland Heights|MO|-90.43|38.71|27,Marysville|WA|-122.18|48.05|66,Maryvale|AZ|-112.18|33.5|208,Maryville|TN|-83.97|35.76|28,Mascouche|QC|-73.6|45.75|34,Mason|OH|-84.31|39.36|32,Mason City|IA|-93.2|43.15|27,Maspeth|NY|-73.91|40.72|48,Massillon|OH|-81.52|40.8|32,Matamoros|MX07|-103.23|25.53|52,Matehuala|MX24|-100.64|23.65|77,Mattapan|MA|-71.09|42.27|36,Matthews|NC|-80.72|35.12|30,Mauldin|SC|-82.31|34.78|25,Maywood|CA|-118.19|33.99|27,Mazatlan|MX25|-106.42|23.22|381,McAllen|TX|-98.23|26.2|140,McCully - Moiliili|HI|-157.83|21.29|28,McHenry|IL|-88.27|42.33|26,McKinney|TX|-96.62|33.2|162,McLean|VA|-77.18|38.93|48,McMinnville|OR|-123.2|45.21|33,Meadow Woods|FL|-81.37|28.39|25,Meads|KY|-82.71|38.41|288,Mechanicsville|VA|-77.37|37.61|36,Medford|OR|-122.88|42.33|79,Medford|MA|-71.11|42.42|57,Medicine Hat|AB|-110.68|50.04|63,Medina|OH|-81.86|41.14|26,Mehlville|MO|-90.32|38.51|28,Melbourne|FL|-80.61|28.08|84,Melchor Ocampo|MX15|-99.14|19.7|38,Melrose|MA|-71.07|42.46|27,Melrose Park|IL|-87.86|41.9|25,Memphis|TN|-90.05|35.15|633,Menifee|CA|-117.15|33.73|87,Menlo Park|CA|-122.18|37.45|33,Menomonee Falls|WI|-88.12|43.18|36,Mentor|OH|-81.34|41.67|46,Merced|CA|-120.48|37.3|82,Mercer Island|WA|-122.22|47.57|25,Mercerville-Hamilton Square|NJ|-74.67|40.23|26,Mercier-Hochelaga-Maisonneuve|QC|-73.55|45.57|142,Merida|MX31|-89.62|20.97|1201,Meriden|CT|-72.81|41.54|59,Meridian|ID|-116.39|43.61|90,Meridian|MS|-88.7|32.36|39,Merrillville|IN|-87.33|41.48|35,Merrimack|NH|-71.49|42.87|26,Merritt Island|FL|-80.69|28.36|34,Mesa|AZ|-111.82|33.42|471,Mesquite|TX|-96.6|32.77|144,Metairie|LA|-90.15|29.98|138,Metairie Terrace|LA|-90.16|29.98|142,Metepec|MX15|-99.6|19.26|28,Methuen|MA|-71.19|42.73|52,Metrotown|BC|-123|49.23|52,Mexicali|MX02|-115.45|32.63|1032,Mexico City|MX09|-99.13|19.43|12294,Miami|FL|-80.19|25.77|487,Miami Beach|FL|-80.13|25.79|92,Miami Gardens|FL|-80.25|25.94|113,Miami Lakes|FL|-80.31|25.91|30,Michigan City|IN|-86.9|41.71|31,Mid-City|CA|-118.36|34.04|83,Middle River|MD|-76.44|39.33|25,Middle Village|NY|-73.88|40.72|29,Middletown|NJ|-74.12|40.39|65,Middletown|OH|-84.4|39.52|48,Middletown|CT|-72.65|41.56|46,Middletown|NY|-74.42|41.45|27,Midland|TX|-102.08|32|132,Midland|MI|-84.25|43.62|42,Midvale|UT|-111.9|40.61|32,Midwest City|OK|-97.4|35.45|57,Miguel Aleman (La Doce)|MX26|-111.48|28.84|30,Miguel Hidalgo|MX09|-99.2|19.43|372,Milford|CT|-73.06|41.22|52,Milford|MA|-71.52|42.14|25,Milford Mill|MD|-76.77|39.35|29,Mililani Town|HI|-158.02|21.45|27,Millcreek|UT|-111.88|40.69|62,Milliken|ON|-79.3|43.82|26,Millville|NJ|-75.04|39.4|28,Milpitas|CA|-121.91|37.43|77,Milton|ON|-79.88|43.52|132,Milton|GA|-84.3|34.13|37,Milton|MA|-71.07|42.25|27,Milwaukee|WI|-87.91|43.04|563,Mimico|ON|-79.51|43.62|33,Minatitlan|MX30|-94.56|18|112,Minneapolis|MN|-93.26|44.98|410,Minnetonka|MN|-93.5|44.91|51,Minnetonka Mills|MN|-93.44|44.94|50,Minot|ND|-101.3|48.23|49,Mint Hill|NC|-80.65|35.18|25,Mira Mesa|CA|-117.14|32.92|70,Mirabel|QC|-74.08|45.65|34,Miramar|FL|-80.23|25.99|137,Miramar|MX28|-97.9|22.36|118,Misantla|MX30|-96.85|19.93|26,Mishawaka|IN|-86.16|41.66|48,Mission|TX|-98.33|26.22|83,Mission|BC|-122.3|49.13|41,Mission Bend|TX|-95.66|29.69|36,Mission District|CA|-122.42|37.76|47,Mission Viejo|CA|-117.67|33.6|97,Mississauga|ON|-79.66|43.58|717,Missoula|MT|-113.99|46.87|71,Missouri City|TX|-95.54|29.62|74,Mixquiahuala de Juarez|MX13|-99.21|20.23|25,Mobile|AL|-88.04|30.69|183,Modesto|CA|-121|37.64|211,Moline|IL|-90.52|41.51|42,Monclova|MX07|-101.42|26.91|215,Moncton|NB|-64.8|46.09|86,Monroe|LA|-92.12|32.51|49,Monroe|NC|-80.55|34.99|34,Monroeville|PA|-79.79|40.42|28,Monrovia|CA|-118|34.15|37,Montclair|NJ|-74.21|40.83|39,Montclair|CA|-117.69|34.08|38,Montebello|CA|-118.11|34.01|63,Montemorelos|MX19|-99.83|25.19|67,Monterey|CA|-121.89|36.6|28,Monterey Park|CA|-118.12|34.06|61,Monterrey|MX19|-100.32|25.68|1135,Montgomery|AL|-86.3|32.37|195,Montgomery Village|MD|-77.2|39.18|32,Montreal|QC|-73.59|45.51|1762,Montreal-Nord|QC|-73.63|45.6|86,Moore|OK|-97.49|35.34|60,Mooresville|NC|-80.81|35.58|36,Moorhead|MN|-96.77|46.87|42,Moorpark|CA|-118.88|34.29|36,Moose Jaw|SK|-105.53|50.4|33,Morelia|MX16|-101.18|19.7|743,Moreno Valley|CA|-117.23|33.94|204,Morgan Hill|CA|-121.65|37.13|42,Morgantown|WV|-79.96|39.63|30,Morningside Heights|NY|-73.96|40.81|55,Moroleon|MX11|-101.19|20.13|43,Morris Heights|NY|-73.92|40.85|40,Morristown|TN|-83.29|36.21|29,Moscow|ID|-117|46.73|25,Mott Haven|NY|-73.92|40.81|51,Mount Juliet|TN|-86.52|36.2|31,Mount Laurel|NJ|-74.89|39.93|41,Mount Lebanon|PA|-80.05|40.36|32,Mount Olive-Silverstone-Jamestown|ON|-79.59|43.75|32,Mount Pleasant|SC|-79.86|32.79|81,Mount Pleasant|DC|-77.04|38.93|35,Mount Pleasant|BC|-123.1|49.27|33,Mount Pleasant|WI|-87.86|42.7|26,Mount Pleasant|MI|-84.77|43.6|26,Mount Pleasant West|ON|-79.39|43.7|29,Mount Prospect|IL|-87.94|42.07|54,Mount Vernon|NY|-73.84|40.91|68,Mount Vernon|WA|-122.33|48.42|34,Mountain View|CA|-122.08|37.39|80,Moyotzingo|MX21|-98.4|19.25|27,Mt Pleasant|BC|-123.1|49.26|32,Muncie|IN|-85.39|40.19|70,Mundelein|IL|-88|42.26|31,Murfreesboro|TN|-86.39|35.85|165,Murray|UT|-111.89|40.67|49,Murrieta|CA|-117.21|33.55|109,Muskegon|MI|-86.25|43.23|38,Muskogee|OK|-95.37|35.75|38,Myrtle Beach|SC|-78.89|33.69|31,Nacogdoches|TX|-94.66|31.6|33,Nampa|ID|-116.56|43.54|89,Nanaimo|BC|-123.94|49.17|90,Nanchital de Lazaro Cardenas del Rio|MX30|-94.41|18.07|25,Napa|CA|-122.29|38.3|80,Naperville|IL|-88.15|41.79|147,Nashua|NH|-71.47|42.77|87,Nashville|TN|-86.78|36.17|689,Natick|MA|-71.35|42.28|32,National City|CA|-117.1|32.68|61,Naucalpan de Juarez|MX15|-99.24|19.48|834,Naugatuck|CT|-73.05|41.49|31,Navarre|FL|-86.86|30.4|31,Navojoa|MX26|-109.44|27.07|113,Navolato|MX25|-107.7|24.77|29,Near North Side|IL|-87.63|41.9|85,Needham|MA|-71.23|42.28|28,Neenah|WI|-88.46|44.19|25,Nepean|ON|-75.72|45.34|180,Neufchatel-Est-Lebourgneuf|QC|-71.34|46.85|37,New Albany|IN|-85.82|38.29|36,New Bedford|MA|-70.93|41.64|101,New Berlin|WI|-88.11|42.98|39,New Bern|NC|-77.04|35.11|30,New Braunfels|TX|-98.12|29.7|70,New Britain|CT|-72.78|41.66|72,New Brunswick|NJ|-74.45|40.49|57,New City|IL|-87.66|41.81|40,New City|NY|-73.99|41.15|33,New Haven|CT|-72.93|41.31|130,New Iberia|LA|-91.82|30|30,New Lenox|IL|-87.97|41.51|25,New London|CT|-72.1|41.36|27,New Orleans|LA|-90.08|29.95|362,New Rochelle|NY|-73.78|40.91|79,New South Memphis|TN|-90.06|35.09|641,New Westminster|BC|-122.91|49.21|78,New York City|NY|-74.01|40.71|8804,Newark|NJ|-74.17|40.74|281,Newark|OH|-82.4|40.06|47,Newark|CA|-122.04|37.53|45,Newark|DE|-75.75|39.68|33,Newburgh|NY|-74.01|41.5|28,Newington|CT|-72.72|41.7|30,Newmarket|ON|-79.47|44.05|91,Newnan|GA|-84.8|33.38|37,Newport Beach|CA|-117.93|33.62|87,Newport News|VA|-76.43|36.98|186,Newton|BC|-122.85|49.13|159,Newton|MA|-71.21|42.34|88,Niagara|ON|-79.41|43.64|31,Niagara Falls|ON|-79.07|43.1|99,Niagara Falls|NY|-79.06|43.09|48,Nicholasville|KY|-84.57|37.88|29,Nicolas Romero|MX15|-99.31|19.64|281,Niles|IL|-87.8|42.02|29,Noblesville|IN|-86.01|40.05|59,Nogales|MX26|-110.94|31.31|264,Norco|CA|-117.55|33.93|26,Norfolk|VA|-76.29|36.85|238,Norfolk County|ON|-80.38|42.83|60,Normal|IL|-88.99|40.51|54,Norman|OK|-97.44|35.22|128,Norristown|PA|-75.34|40.12|34,North Andover|MA|-71.14|42.7|28,North Bay|ON|-79.47|46.32|50,North Bel Air|MD|-76.35|39.54|33,North Bergen|NJ|-74.01|40.8|63,North Bethesda|MD|-77.12|39.04|43,North Brunswick|NJ|-74.48|40.45|43,North Center|IL|-87.68|41.95|34,North Charleston|SC|-79.97|32.85|108,North Chicago|IL|-87.84|42.33|29,North Chicopee|MA|-72.6|42.18|55,North Cowichan|BC|-123.69|48.84|29,North Creek|WA|-122.18|47.82|26,North Delta|BC|-122.92|49.17|60,North Fort Myers|FL|-81.88|26.67|39,North Highlands|CA|-121.37|38.69|42,North Hills|CA|-118.48|34.24|56,North Hollywood|CA|-118.38|34.17|64,North Kingstown|RI|-71.47|41.55|28,North La Crosse|WI|-91.25|43.85|50,North Las Vegas|NV|-115.12|36.2|234,North Lauderdale|FL|-80.23|26.22|43,North Lawndale|IL|-87.72|41.86|35,North Little Rock|AR|-92.27|34.77|66,North Miami|FL|-80.19|25.89|62,North Miami Beach|FL|-80.16|25.93|43,North Olmsted|OH|-81.92|41.42|32,North Peoria|IL|-89.58|40.72|113,North Port|FL|-82.24|27.04|62,North Providence|RI|-71.47|41.85|33,North Richland Hills|TX|-97.23|32.83|69,North Ridgeville|OH|-82.02|41.39|32,North Royalton|OH|-81.72|41.31|30,North Stamford|CT|-73.54|41.14|121,North Tonawanda|NY|-78.86|43.04|30,North Vancouver|BC|-123.07|49.32|88,Northampton|MA|-72.64|42.33|28,Northbrook|IL|-87.83|42.13|33,Northglenn|CO|-104.99|39.89|39,Northridge|CA|-118.54|34.23|68,Norwalk|CA|-118.08|33.9|107,Norwalk|CT|-73.41|41.12|88,Norwich|CT|-72.08|41.52|39,Norwood|MA|-71.2|42.19|28,Notre-Dame-de-Grace|QC|-73.61|45.48|68,Novato|CA|-122.57|38.11|55,Novi|MI|-83.48|42.48|58,Nueva Italia de Ruiz|MX16|-102.09|19.02|32,Nueva Rosita|MX07|-101.22|27.94|38,Nuevo Casas Grandes|MX06|-107.91|30.42|55,Nuevo Laredo|MX28|-99.52|27.48|416,Nuevo Mexico|MX14|-103.44|20.76|28,Nutana Sector|SK|-106.64|52.1|72,Nutley|NJ|-74.16|40.82|27,O'Fallon|MO|-90.7|38.81|85,O'Fallon|IL|-89.91|38.59|29,Oak Creek|WI|-87.86|42.89|35,Oak Forest|IL|-87.74|41.6|28,Oak Hill|VA|-77.4|38.93|33,Oak Lawn|IL|-87.76|41.71|56,Oak Park|IL|-87.78|41.89|52,Oak Park|MI|-83.18|42.46|29,Oak Ridge|TN|-84.27|36.01|29,Oakdale|MN|-92.96|44.96|28,Oakland|CA|-122.27|37.8|419,Oakland Park|FL|-80.13|26.17|44,Oakley|CA|-121.71|38|39,Oakton|VA|-77.3|38.88|34,Oakville|ON|-79.68|43.45|213,Oakville|MO|-90.3|38.47|36,Oaxaca|MX20|-96.73|17.06|255,Ocala|FL|-82.14|29.19|58,Oceanside|CA|-117.38|33.2|175,Oceanside|NY|-73.64|40.64|32,Ocoee|FL|-81.54|28.57|43,Ocosingo|MX05|-92.09|16.91|41,Ocotlan|MX14|-102.77|20.35|83,Ocoyoacac|MX15|-99.46|19.27|26,Ocozocoautla de Espinosa|MX05|-93.37|16.76|39,Odenton|MD|-76.7|39.08|37,Odessa|TX|-102.37|31.85|114,Ogden|UT|-111.97|41.22|85,Oildale|CA|-119.02|35.42|32,Ojinaga|MX06|-104.54|29.57|28,Ojo de Agua|MX15|-99.01|19.68|386,Okanagan Mission|BC|-119.48|49.82|38,Oklahoma City|OK|-97.52|35.47|681,Okotoks|AB|-113.98|50.73|30,Olathe|KS|-94.82|38.88|134,Olive Branch|MS|-89.83|34.96|36,Olney|PA|-75.12|40.04|39,Olney|MD|-77.07|39.15|33,Olympia|WA|-122.9|47.04|55,Omaha|NE|-95.94|41.26|486,Ontario|CA|-117.65|34.06|171,Opelika|AL|-85.38|32.65|29,Opportunity|WA|-117.24|47.65|25,Orange|CA|-117.85|33.79|140,Orange|NJ|-74.23|40.77|34,Orangevale|CA|-121.23|38.68|33,Orangeville|ON|-80.1|43.92|30,Orcutt|CA|-120.44|34.87|28,Oregon City|OR|-122.61|45.36|35,Orem|UT|-111.69|40.3|94,Orillia|ON|-79.42|44.61|31,Orizaba|MX30|-97.1|18.85|123,Orland Park|IL|-87.85|41.63|58,Orlando|FL|-81.38|28.54|334,Orleans|ON|-75.5|45.46|125,Ormond Beach|FL|-81.06|29.29|40,Oro Valley|AZ|-110.97|32.39|45,Oshawa|ON|-78.85|43.9|175,Oshkosh|WI|-88.54|44.02|66,Ossining|NY|-73.86|41.16|25,Oswego|IL|-88.35|41.68|33,Ottawa|ON|-75.7|45.41|1017,Ottawa South|ON|-75.69|45.39|125,Overbrook|PA|-75.24|39.99|32,Overland Park|KS|-94.67|38.98|186,Oviedo|FL|-81.21|28.67|38,Owasso|OK|-95.85|36.27|34,Owatonna|MN|-93.23|44.08|25,Owensboro|KY|-87.11|37.77|59,Owings Mills|MD|-76.78|39.42|30,Oxford Circle|PA|-75.07|40.05|48,Oxnard|CA|-119.18|34.2|207,Oxon Hill-Glassmanor|MD|-76.97|38.8|35,Ozone Park|NY|-73.84|40.68|53,Pabellon de Arteaga|MX01|-102.28|22.15|28,Pachuca de Soto|MX13|-98.73|20.12|256,Pacifica|CA|-122.49|37.61|39,Pahrump|NV|-115.98|36.21|36,Palatine|IL|-88.03|42.11|69,Palenque|MX05|-91.98|17.51|42,Palm Bay|FL|-80.59|28.03|119,Palm Beach Gardens|FL|-80.14|26.82|52,Palm Coast|FL|-81.21|29.58|82,Palm Desert|CA|-116.38|33.72|51,Palm Harbor|FL|-82.76|28.08|57,Palm Springs|CA|-116.55|33.83|47,Palmdale|CA|-118.12|34.58|158,Palo Alto|CA|-122.14|37.44|66,Panama City|FL|-85.66|30.16|38,Panorama Hills|AB|-114.08|51.15|25,Panuco|MX30|-98.18|22.05|40,Papantla de Olarte|MX30|-97.32|20.45|53,Paracho de Verduzco|MX16|-102.05|19.65|37,Paradise|NV|-115.15|36.1|223,Paradise|CA|-121.62|39.76|26,Paragould|AR|-90.5|36.06|27,Paraiso|MX27|-93.21|18.4|86,Paramount|CA|-118.16|33.89|55,Paramus|NJ|-74.08|40.94|26,Parc-Extension|QC|-73.63|45.53|33,Park Ridge|IL|-87.84|42.01|37,Park Slope|NY|-73.99|40.67|65,Parkchester|NY|-73.86|40.84|65,Parker|CO|-104.76|39.52|49,Parkersburg|WV|-81.56|39.27|30,Parkland|WA|-122.43|47.16|35,Parkland|FL|-80.24|26.31|30,Parkville|MD|-76.54|39.38|30,Parkwoods-Donalda|ON|-79.33|43.76|34,Parma|OH|-81.72|41.4|79,Parras de la Fuente|MX07|-102.18|25.44|33,Parsippany|NJ|-74.43|40.86|51,Pasadena|TX|-95.21|29.69|153,Pasadena|CA|-118.14|34.15|142,Pasco|WA|-119.1|46.24|69,Paso Robles|CA|-120.69|35.63|27,Passaic|NJ|-74.13|40.86|71,Paterson|NJ|-74.17|40.92|147,Patzcuaro|MX16|-101.61|19.51|55,Pawtucket|RI|-71.38|41.88|71,Peabody|MA|-70.93|42.53|52,Peachtree City|GA|-84.6|33.4|35,Peachtree Corners|GA|-84.22|33.97|40,Pearl|MS|-90.13|32.27|26,Pearl City|HI|-157.98|21.4|47,Pearland|TX|-95.29|29.56|108,Pekin|IL|-89.64|40.57|33,Pembroke Pines|FL|-80.22|26|166,Penjamo|MX11|-101.72|20.43|40,Penn Hills|PA|-79.84|40.5|44,Pennsauken|NJ|-75.06|39.96|36,Pennsport|PA|-75.15|39.93|26,Pensacola|FL|-87.22|30.42|53,Penticton|BC|-119.59|49.48|33,Peoria|AZ|-112.24|33.58|190,Peoria|IL|-89.59|40.69|115,Perote|MX30|-97.24|19.56|37,Perris|CA|-117.23|33.78|74,Perry Hall|MD|-76.46|39.41|28,Perth Amboy|NJ|-74.27|40.51|52,Petaluma|CA|-122.64|38.23|60,Peterborough|ON|-78.32|44.3|85,Petersburg|VA|-77.4|37.23|32,Pflugerville|TX|-97.62|30.44|57,Pharr|TX|-98.18|26.19|76,Phenix City|AL|-85|32.47|37,Philadelphia|PA|-75.16|39.95|1573,Phoenix|AZ|-112.07|33.45|1650,Pickering|ON|-79.13|43.9|91,Pico Rivera|CA|-118.1|33.98|64,Piedras Negras|MX07|-100.52|28.7|150,Pierrefonds|QC|-73.89|45.46|59,Pierrefonds-Roxboro|QC|-73.84|45.5|73,Pijijiapan|MX05|-93.21|15.69|50,Pikesville|MD|-76.72|39.37|30,Pine Bluff|AR|-92|34.23|44,Pine Hills|FL|-81.45|28.56|60,Pinellas Park|FL|-82.7|27.84|51,Pinotepa Nacional|MX20|-98.05|16.34|29,Piscataway|NJ|-74.4|40.5|56,Pittsburg|CA|-121.88|38.03|69,Pittsburgh|PA|-80|40.44|304,Pittsfield|MA|-73.25|42.45|43,Placentia|CA|-117.87|33.87|52,Plainfield|NJ|-74.41|40.63|51,Plainfield|IL|-88.2|41.63|42,Plainfield|IN|-86.4|39.7|30,Plainview|NY|-73.47|40.78|26,Plano|TX|-96.7|33.02|283,Plant City|FL|-82.11|28.02|37,Plantation|FL|-80.23|26.13|92,Playa del Carmen|MX23|-87.08|20.63|149,Pleasant Grove|UT|-111.74|40.36|38,Pleasant Hill|CA|-122.06|37.95|34,Pleasanton|CA|-121.87|37.66|79,Pleasure Ridge Park|KY|-85.86|38.15|25,Plum|PA|-79.75|40.5|27,Plymouth|MN|-93.46|45.01|75,Pocatello|ID|-112.45|42.87|54,Poinciana|FL|-81.46|28.14|53,Pointe-Claire|QC|-73.82|45.45|30,Polanco|MX09|-99.2|19.43|50,Pomona|CA|-117.75|34.06|153,Pompano Beach|FL|-80.12|26.24|107,Ponte Vedra Beach|FL|-81.39|30.24|35,Pontiac|MI|-83.29|42.64|59,Port Arthur|TX|-93.94|29.89|55,Port Charlotte|FL|-82.09|26.98|54,Port Chester|NY|-73.67|41|29,Port Coquitlam|BC|-122.77|49.27|58,Port Huron|MI|-82.42|42.97|29,Port Moody|BC|-122.82|49.28|27,Port Orange|FL|-81|29.14|59,Port Richmond|PA|-75.1|39.99|27,Port Saint Lucie|FL|-80.35|27.29|164,Portage|MI|-85.58|42.2|48,Portage|IN|-87.18|41.58|36,Portage Park|IL|-87.77|41.96|64,Porterville|CA|-119.02|36.07|56,Porticos de San Antonio|MX02|-117.03|32.44|34,Portland|OR|-122.68|45.52|652,Portland|ME|-70.26|43.66|66,Portsmouth|VA|-76.3|36.84|96,Portsmouth Heights|VA|-76.37|36.82|99,Post Falls|ID|-116.95|47.72|30,Potomac|MD|-77.21|39.02|44,Poughkeepsie|NY|-73.92|41.7|30,Poway|CA|-117.04|32.96|50,Poza Rica de Hidalgo|MX30|-97.46|20.53|185,Prairieville|LA|-90.97|30.3|26,Prattville|AL|-86.46|32.46|35,Prescott|AZ|-112.47|34.54|41,Prescott Valley|AZ|-112.32|34.61|42,Prince Albert|SK|-105.77|53.2|35,Prince Edward|ON|-77.25|44|25,Prince George|BC|-122.75|53.92|78,Princeton|FL|-80.41|25.54|39,Princeton|NJ|-74.66|40.35|29,Prior Lake|MN|-93.42|44.71|25,Progreso|MX31|-89.66|21.28|37,Providence|RI|-71.41|41.82|190,Provo|UT|-111.66|40.23|115,Puebla|MX21|-98.21|19.05|1692,Pueblo|CO|-104.61|38.25|109,Pueblo West|CO|-104.72|38.35|29,Puerto Escondido|MX20|-97.07|15.86|29,Puerto Penasco|MX26|-113.54|31.32|62,Puerto Vallarta|MX14|-105.23|20.62|224,Pullman|WA|-117.18|46.73|32,Purisima de Bustos|MX11|-101.88|21.03|43,Puruandiro|MX16|-101.52|20.09|30,Puyallup|WA|-122.29|47.19|39,Quebec|QC|-71.21|46.81|531,Queen Creek|AZ|-111.63|33.25|34,Queens|NY|-73.84|40.68|2316,Queens Village|NY|-73.74|40.73|51,Queensbury|NY|-73.61|43.38|27,Quincy|MA|-71|42.25|93,Quincy|IL|-91.41|39.94|40,Quinte West|ON|-77.57|44.18|43,Racine|WI|-87.78|42.73|77,Radnor|PA|-75.36|40.05|30,Rahway|NJ|-74.28|40.61|29,Raleigh|NC|-78.64|35.77|482,Ramos Arizpe|MX07|-100.95|25.54|66,Ramsey|MN|-93.45|45.26|25,Rancho Cordova|CA|-121.3|38.59|71,Rancho Cucamonga|CA|-117.59|34.11|175,Rancho Palos Verdes|CA|-118.39|33.74|42,Rancho Penasquitos|CA|-117.12|32.96|60,Rancho Santa Margarita|CA|-117.6|33.64|49,Randallstown|MD|-76.8|39.37|32,Randolph|MA|-71.04|42.16|32,Randolph|NJ|-74.58|40.85|25,Rapid City|SD|-103.23|44.08|73,Raytown|MO|-94.46|39.01|29,Reading|PA|-75.93|40.34|87,Red Deer|AB|-113.8|52.27|100,Redan|GA|-84.13|33.75|33,Redding|CA|-122.39|40.59|91,Redford|MI|-83.3|42.38|49,Redlands|CA|-117.18|34.06|71,Redmond|WA|-122.12|47.67|60,Redmond|OR|-121.17|44.27|28,Redondo Beach|CA|-118.39|33.85|68,Redwood City|CA|-122.24|37.49|85,Reedley|CA|-119.45|36.6|25,Reforma|MX05|-93.15|17.86|26,Regina|SK|-104.62|50.45|226,Rego Park|NY|-73.85|40.73|43,Reisterstown|MD|-76.83|39.47|25,Renfrew-Collingwood|BC|-123.04|49.24|51,Reno|NV|-119.81|39.53|264,Renton|WA|-122.22|47.48|100,Repentigny|QC|-73.45|45.74|84,Reseda|CA|-118.54|34.2|65,Reston|VA|-77.34|38.97|58,Revere|MA|-71.01|42.41|53,Rexburg|ID|-111.79|43.83|27,Reynoldsburg|OH|-82.81|39.95|37,Reynosa|MX28|-98.28|26.08|589,Rhawnhurst|PA|-75.06|40.06|25,Rialto|CA|-117.37|34.11|103,Richardson|TX|-96.73|32.95|110,Richfield|MN|-93.28|44.88|36,Richland|WA|-119.28|46.29|54,Richmond|VA|-77.46|37.55|226,Richmond|BC|-123.14|49.17|209,Richmond|CA|-122.35|37.94|109,Richmond|IN|-84.89|39.83|35,Richmond|KY|-84.29|37.75|33,Richmond Hill|ON|-79.44|43.87|202,Richmond Hill|NY|-73.83|40.7|98,Richmond West|FL|-80.43|25.61|35,Ridgecrest|CA|-117.67|35.62|28,Ridgewood|NY|-73.91|40.7|69,Ridgewood|NJ|-74.12|40.98|25,Rimouski|QC|-68.52|48.45|42,Rincon de Romos|MX01|-102.32|22.23|27,Rio Blanco|MX30|-97.16|18.83|40,Rio de Teapa|MX27|-92.9|17.77|26,Rio Grande|MX32|-103.03|23.83|32,Rio Rancho|NM|-106.66|35.23|87,Rioverde|MX24|-99.99|21.93|53,Riverside|CA|-117.4|33.95|317,Riverton|UT|-111.94|40.52|41,Riverview|FL|-82.33|27.87|71,Riviera Beach|FL|-80.06|26.78|34,Riviere-des-Prairies-Pointe-aux-Trembles|QC|-73.58|45.64|113,Roanoke|VA|-79.94|37.27|100,Rochester|NY|-77.62|43.15|209,Rochester|MN|-92.47|44.02|112,Rochester|NH|-70.98|43.3|30,Rochester Hills|MI|-83.15|42.66|73,Rock Forest|QC|-72|45.36|35,Rock Hill|SC|-81.03|34.92|71,Rock Island|IL|-90.58|41.51|38,Rockford|IL|-89.09|42.27|148,Rocklin|CA|-121.24|38.79|61,Rockville|MD|-77.15|39.08|66,Rockwall|TX|-96.46|32.93|42,Rocky Mount|NC|-77.79|35.94|55,Rogers|AR|-94.12|36.33|63,Rogers Park|IL|-87.67|42.01|54,Rohnert Park|CA|-122.7|38.34|42,Rome|GA|-85.16|34.26|36,Rome|NY|-75.46|43.21|32,Romeoville|IL|-88.09|41.65|39,Rosarito|MX02|-117.05|32.36|100,Rosedale|NY|-73.74|40.66|25,Rosemead|CA|-118.07|34.08|54,Rosemont-La Petite-Patrie|QC|-73.61|45.54|146,Rosenberg|TX|-95.81|29.56|35,Roseville|CA|-121.29|38.75|130,Roseville|MI|-82.94|42.5|47,Roseville|MN|-93.16|45.01|35,Roslindale|MA|-71.12|42.29|27,Roswell|GA|-84.36|34.02|94,Roswell|NM|-104.52|33.39|48,Rouge|ON|-79.17|43.8|46,Round Lake Beach|IL|-88.09|42.37|27,Round Rock|TX|-97.68|30.51|115,Rowland Heights|CA|-117.91|33.98|48,Rowlett|TX|-96.56|32.9|60,Roy|UT|-112.03|41.16|37,Royal Oak|MI|-83.14|42.49|59,Royal Palm Beach|FL|-80.23|26.71|37,Rubidoux|CA|-117.41|34|34,Russellville|AR|-93.13|35.28|29,Rutland|BC|-119.39|49.9|34,Saanich|BC|-123.37|48.55|117,Sabinas|MX07|-101.12|27.86|54,Sacramento|CA|-121.49|38.58|524,Saginaw|MI|-83.95|43.42|49,Saguenay|QC|-71.07|48.42|148,Sahuarita|AZ|-110.96|31.96|25,Sahuayo de Morelos|MX16|-102.72|20.06|64,Saint Charles|MO|-90.48|38.78|65,Saint Charles|MD|-76.94|38.6|36,Saint Clair Shores|MI|-82.89|42.5|59,Saint Cloud|MN|-94.16|45.56|65,Saint Cloud|FL|-81.28|28.25|35,Saint-Constant|QC|-73.57|45.37|27,Saint-Eustache|QC|-73.91|45.56|42,Saint George|UT|-113.58|37.1|72,Saint-Georges|QC|-70.67|46.11|31,Saint-Hubert|QC|-73.42|45.5|82,Saint-Hyacinthe|QC|-72.96|45.63|50,Saint-Jean-sur-Richelieu|QC|-73.26|45.31|98,Saint-Jerome|QC|-74|45.78|54,Saint John|NB|-66.06|45.27|71,Saint Joseph|MO|-94.85|39.77|76,Saint-Laurent|QC|-73.67|45.5|98,Saint-Leonard|QC|-73.6|45.59|79,Saint-Louis-de-Terrebonne|QC|-73.79|45.7|119,Saint Louis Park|MN|-93.35|44.95|45,Saint-Michel|QC|-73.62|45.57|56,Saint Paul|MN|-93.09|44.94|303,Saint Peters|MO|-90.63|38.8|52,Sainte-Foy|QC|-71.29|46.78|111,Sainte-Julie|QC|-73.33|45.58|29,Sainte-Therese|QC|-73.83|45.64|25,Salaberry-de-Valleyfield|QC|-74.13|45.25|42,Salamanca|MX11|-101.2|20.57|160,Salem|OR|-123.04|44.94|175,Salem|MA|-70.9|42.52|42,Salem|NH|-71.2|42.79|29,Salem|VA|-80.05|37.29|25,Salina|KS|-97.61|38.84|47,Salina Cruz|MX20|-95.19|16.18|84,Salinas|CA|-121.66|36.68|157,Salisbury|NC|-80.47|35.67|34,Salisbury|MD|-75.6|38.36|32,Salt Lake City|UT|-111.89|40.76|215,Saltillo|MX07|-100.98|25.43|709,Salvatierra|MX11|-100.88|20.22|37,Sammamish|WA|-122.08|47.64|52,San Agustin|MX14|-103.47|20.55|30,San Andres Cholula|MX21|-98.3|19.05|39,San Andres Tuxtla|MX30|-95.21|18.45|61,San Angelo|TX|-100.44|31.46|99,San Antonio|TX|-98.49|29.42|1526,San Bernardino|CA|-117.29|34.11|216,San Bernardino Tlaxcalancingo|MX21|-98.28|19.03|54,San Bruno|CA|-122.41|37.63|43,San Buenaventura|MX15|-98.86|19.3|44,San Carlos|CA|-122.26|37.51|29,San Clemente|CA|-117.61|33.43|65,San Cristobal de las Casas|MX05|-92.64|16.73|215,San Diego|CA|-117.16|32.72|1404,San Dimas|CA|-117.81|34.11|34,San Felipe|MX11|-101.22|21.48|28,San Fernando|MX28|-98.15|24.85|29,San Francisco|CA|-122.42|37.77|827,San Francisco Acuautla|MX15|-98.86|19.35|27,San Francisco del Rincon|MX11|-101.86|21.02|71,San Francisco Tesistan|MX14|-103.48|20.8|62,San Gabriel|CA|-118.11|34.1|40,San Isidro|MX15|-98.95|19.34|33,San Jacinto|CA|-116.96|33.78|46,San Jeronimo|MX15|-99.59|19.28|26,San Jeronimo Cuatro Vientos|MX15|-98.84|19.29|36,San Jose|CA|-121.89|37.34|997,San Jose del Cabo|MX03|-109.7|23.05|136,San Jose del Castillo|MX14|-103.24|20.51|39,San Jose Guadalupe Otzacatipan|MX15|-99.59|19.34|31,San Juan|TX|-98.16|26.19|36,San Juan Capistrano|CA|-117.66|33.5|36,San Juan de los Lagos|MX14|-102.33|21.25|48,San Juan del Rio|MX22|-100|20.39|138,San Leandro|CA|-122.16|37.72|90,San Luis|AZ|-114.78|32.49|31,San Luis de la Paz|MX11|-100.51|21.3|49,San Luis Obispo|CA|-120.66|35.28|47,San Luis Potosi|MX24|-100.97|22.15|722,San Luis Rio Colorado|MX26|-114.77|32.46|176,San Marcos|CA|-117.17|33.14|92,San Marcos|TX|-97.94|29.88|60,San Martin Azcatepec|MX15|-98.97|19.69|35,San Martin Texmelucan de Labastida|MX21|-98.44|19.28|155,San Mateo|CA|-122.33|37.56|103,San Mateo Atenco|MX15|-99.53|19.27|67,San Miguel Ajusco|MX09|-99.2|19.22|29,San Miguel de Allende|MX11|-100.74|20.92|174,San Miguel Topilejo|MX09|-99.14|19.2|34,San Nicolas de los Garza|MX19|-100.3|25.74|412,San Pablo|CA|-122.35|37.96|30,San Pablo Autopan|MX15|-99.66|19.36|35,San Pablo de las Salinas|MX15|-99.09|19.67|156,San Pedro|CA|-118.29|33.74|83,San Pedro|MX07|-102.98|25.76|48,San Pedro|MX07|-103.22|25.43|41,San Pedro Garza Garcia|MX19|-100.4|25.66|132,San Rafael|CA|-122.53|37.97|59,San Ramon|CA|-121.98|37.78|76,San Salvador Tizatlalli|MX15|-99.59|19.26|61,San Sebastian el Grande|MX14|-103.43|20.53|28,San Tan Valley|AZ|-111.53|33.19|81,Sanctorum|MX21|-98.25|19.1|27,Sandusky|OH|-82.71|41.45|25,Sandy|UT|-111.88|40.59|87,Sandy Hills|UT|-111.85|40.58|89,Sandy Springs|GA|-84.38|33.92|105,Sanford|FL|-81.27|28.8|58,Sanford|NC|-79.18|35.48|29,Santa Ana|CA|-117.87|33.75|310,Santa Ana Chiautempan|MX29|-98.19|19.31|48,Santa Barbara|CA|-119.7|34.42|91,Santa Catarina|MX19|-100.46|25.67|304,Santa Clara|CA|-121.96|37.35|126,Santa Clarita|CA|-118.54|34.39|182,Santa Cruz|CA|-122.03|36.97|64,Santa Cruz Xoxocotlan|MX20|-96.74|17.03|67,Santa Fe|NM|-105.94|35.69|87,Santa Isabel|MX02|-115.57|32.63|29,Santa Maria|CA|-120.44|34.95|105,Santa Maria Chimalhuacan|MX15|-98.95|19.42|70,Santa Monica|CA|-118.49|34.02|93,Santa Paula|CA|-119.06|34.35|30,Santa Rosa|CA|-122.71|38.44|178,Santa Rosa Beach|FL|-86.23|30.4|32,Santa Rosalia de Camargo|MX06|-105.17|27.68|40,Santa Teresa|MX15|-99.23|19.84|36,Santee|CA|-116.97|32.84|57,Santiago|MX19|-100.15|25.43|36,Santiago de Queretaro|MX22|-100.39|20.59|1594,Santiago Papasquiaro|MX10|-105.42|25.04|26,Santiago Teyahualco|MX15|-99.12|19.66|53,Santo Domingo Tehuantepec|MX20|-95.24|16.32|67,Sarasota|FL|-82.53|27.34|55,Saratoga|CA|-122.02|37.26|30,Saratoga Springs|NY|-73.78|43.08|27,Saratoga Springs|UT|-111.9|40.35|25,Sarnia|ON|-82.4|42.98|72,Saskatoon|SK|-106.67|52.13|266,Saugus|MA|-71.01|42.46|26,Sault Ste. Marie|ON|-84.33|46.52|72,Savage|MN|-93.34|44.78|30,Savannah|GA|-81.1|32.08|147,Sawtelle|CA|-118.45|34.04|39,Sayreville|NJ|-74.36|40.46|44,Sayreville Junction|NJ|-74.33|40.47|42,Sayula|MX14|-103.6|19.88|26,Schaumburg|IL|-88.08|42.03|74,Schenectady|NY|-73.94|42.81|65,Schererville|IN|-87.45|41.48|28,Schertz|TX|-98.27|29.55|43,Scottsdale|AZ|-111.9|33.51|236,Scranton|PA|-75.66|41.41|77,Seaside|CA|-121.85|36.61|33,SeaTac|WA|-122.29|47.45|28,Seattle|WA|-122.33|47.61|780,Security-Widefield|CO|-104.71|38.75|32,Seguin|TX|-97.96|29.57|27,Sept-Iles|QC|-66.38|50.2|28,Severn|MD|-76.7|39.14|44,Severna Park|MD|-76.55|39.07|37,Sewell|NJ|-75.14|39.77|37,Shaker Heights|OH|-81.54|41.47|27,Shakopee|MN|-93.53|44.8|39,Shawinigan|QC|-72.75|46.57|38,Shawnee|KS|-94.72|39.04|65,Shawnee|OK|-96.93|35.33|31,Sheboygan|WI|-87.71|43.75|48,Sheepshead Bay|NY|-73.94|40.59|122,Shelby|MI|-83.03|42.67|74,Shelton|CT|-73.09|41.32|41,Sherbrooke|QC|-71.9|45.4|129,Sherman|TX|-96.61|33.64|40,Sherman Oaks|CA|-118.45|34.15|52,Sherwood|AR|-92.22|34.82|30,Sherwood Park|AB|-113.32|53.52|70,Shirley|NY|-72.87|40.8|27,Shoreline|WA|-122.34|47.76|55,Shoreview|MN|-93.15|45.08|26,Shreveport|LA|-93.75|32.53|187,Shrewsbury|MA|-71.71|42.3|33,Sicklerville|NJ|-74.97|39.72|42,Sierra Vista|AZ|-110.3|31.55|43,Silao de la Victoria|MX11|-101.43|20.94|74,Silver Lake|CA|-118.27|34.09|32,Silver Spring|MD|-77.03|38.99|71,Simi Valley|CA|-118.78|34.27|126,Sioux City|IA|-96.4|42.5|82,Sioux Falls|SD|-96.73|43.54|171,Skokie|IL|-87.73|42.03|64,Slidell|LA|-89.78|30.28|27,Smithtown|NY|-73.2|40.86|26,Smyrna|GA|-84.51|33.88|56,Smyrna|TN|-86.52|35.98|46,Snowdon|QC|-73.63|45.49|32,Socorro|TX|-106.3|31.65|33,Socorro Mission Number 1 Colonia|TX|-106.29|31.64|28,Soledad|CA|-121.33|36.42|25,Soledad de Graciano Sanchez|MX24|-100.94|22.19|332,Somerton|PA|-75.01|40.12|33,Somerville|MA|-71.1|42.39|80,Sorel-Tracy|QC|-73.11|46.04|41,South Bel Air|MD|-76.34|39.53|48,South Bend|IN|-86.25|41.68|101,South Boston|MA|-71.05|42.33|571,South Chicago|IL|-87.55|41.74|28,South Fulton|GA|-84.67|33.59|107,South Gate|CA|-118.21|33.95|96,South Gate|MD|-76.63|39.13|29,South Hill|WA|-122.27|47.14|52,South Jordan|UT|-111.93|40.56|66,South Jordan Heights|UT|-111.95|40.56|37,South Kingstown|RI|-71.52|41.45|30,South Laurel|MD|-76.85|39.07|26,South Lawndale|IL|-87.71|41.84|73,South Miami Heights|FL|-80.38|25.6|36,South Ozone Park|NY|-73.82|40.67|75,South Pasadena|CA|-118.15|34.12|26,South Peabody|MA|-70.95|42.51|50,South Portland|ME|-70.24|43.64|25,South Riverdale|ON|-79.34|43.65|27,South San Francisco|CA|-122.41|37.65|67,South Shore|IL|-87.58|41.76|51,South Suffolk|VA|-76.59|36.72|80,South Surrey|BC|-122.79|49.05|77,South Valley|NM|-106.68|35.01|40,South Vineland|NJ|-75.03|39.45|58,South Whittier|CA|-118.04|33.95|57,Southaven|MS|-90.01|34.99|52,Southfield|MI|-83.22|42.47|73,Southgate|MI|-83.19|42.21|29,Southglenn|CO|-104.95|39.59|42,Southington|CT|-72.88|41.6|43,Southlake|TX|-97.13|32.94|29,Spanaway|WA|-122.43|47.1|27,Spanish Fork|UT|-111.65|40.11|37,Sparks|NV|-119.75|39.53|96,Spartanburg|SC|-81.93|34.95|37,Spokane|WA|-117.43|47.66|229,Spokane Valley|WA|-117.24|47.67|94,Spring|TX|-95.42|30.08|54,Spring Hill|FL|-82.53|28.48|98,Spring Hill|TN|-86.93|35.75|36,Spring Valley|NV|-115.25|36.11|178,Spring Valley|NY|-74.04|41.11|32,Spring Valley|CA|-117|32.74|28,Springdale|AR|-94.13|36.19|77,Springfield|MO|-93.3|37.22|170,Springfield|MA|-72.59|42.1|154,Springfield|IL|-89.64|39.8|114,Springfield|OR|-123.02|44.05|60,Springfield|OH|-83.81|39.92|59,Springfield|VA|-77.19|38.79|30,Springfield Gardens|NY|-73.76|40.66|30,Springville|UT|-111.61|40.17|32,Spruce Grove|AB|-113.92|53.53|38,St. Albert|AB|-113.64|53.63|57,St. Catharines|ON|-79.24|43.17|136,St. Charles|MD|-76.92|38.61|33,St. Charles|IL|-88.31|41.91|32,St. James-Assiniboia East|MB|-97.23|49.89|27,St. John's|NL|-52.71|47.56|110,St. Johns|FL|-81.55|30.08|40,St. Louis|MO|-90.2|38.63|279,St. Petersburg|FL|-82.68|27.77|257,St. Thomas|ON|-81.18|42.77|38,Stamford|CT|-73.54|41.05|128,Stanton|CA|-117.99|33.8|38,Starkville|MS|-88.82|33.45|25,State College|PA|-77.86|40.79|42,Staten Island|NY|-74.14|40.56|468,Statesboro|GA|-81.78|32.45|30,Statesville|NC|-80.89|35.78|26,Sterling|VA|-77.43|39.01|27,Sterling Heights|MI|-83.03|42.58|132,Stevens Point|WI|-89.57|44.52|26,Steveston|BC|-123.18|49.13|25,Stillwater|OK|-97.06|36.12|48,Stittsville|ON|-75.92|45.25|40,Stockbridge|GA|-84.23|33.54|28,Stockton|CA|-121.29|37.96|305,Stonecrest|GA|-84.13|33.71|50,Stonegate-Queensway|ON|-79.5|43.64|25,Stoney Creek|ON|-79.77|43.22|76,Stouffville|ON|-79.25|43.97|36,Stoughton|MA|-71.1|42.13|26,Stow|OH|-81.44|41.16|34,Stratford|CT|-73.13|41.18|51,Stratford|ON|-80.95|43.37|31,Strawberry Hill|BC|-122.88|49.13|41,Streamwood|IL|-88.18|42.03|40,Strongsville|OH|-81.84|41.31|44,Studio City|CA|-118.4|34.15|34,Suffolk|VA|-76.58|36.73|88,Sugar Land|TX|-95.63|29.62|88,Suisun|CA|-122.04|38.24|28,Suitland|MD|-76.92|38.85|25,Suitland-Silver Hill|MD|-76.93|38.85|33,Summerville|SC|-80.18|33.02|48,Sumter|SC|-80.34|33.92|40,Sun City|AZ|-112.27|33.6|37,Sun Prairie|WI|-89.21|43.18|32,Sunnyside|NY|-73.94|40.74|49,Sunnyvale|CA|-122.04|37.37|155,Sunrise|FL|-80.11|26.13|84,Sunrise Manor|NV|-115.07|36.21|189,Sunset|BC|-123.1|49.22|36,Sunset Park|NY|-74.01|40.65|126,Superior|WI|-92.1|46.72|26,Surprise|AZ|-112.33|33.63|143,Surrey|BC|-122.83|49.11|568,Surrey City Centre|BC|-122.85|49.19|33,Sydney|NS|-60.18|46.14|105,Sylmar|CA|-118.45|34.31|79,Syracuse|NY|-76.15|43.05|144,Syracuse|UT|-112.06|41.09|27,Tacambaro de Codallos|MX16|-101.46|19.24|25,Tacoma|WA|-122.44|47.25|222,Tala|MX14|-103.7|20.65|35,Tallahassee|FL|-84.28|30.44|201,Tam O'Shanter-Sullivan|ON|-79.3|43.78|27,Tamarac|FL|-80.25|26.21|64,Tamiami|FL|-80.4|25.76|55,Tampa|FL|-82.46|27.95|414,Tampico|MX28|-97.88|22.29|309,Tantoyuca|MX30|-98.23|21.35|30,Tapachula|MX05|-92.26|14.91|353,Taunton|MA|-71.09|41.9|56,Taxco de Alarcon|MX12|-99.61|18.55|50,Taylor|MI|-83.27|42.24|61,Taylorsville|UT|-111.94|40.67|60,Teaneck|NJ|-74.02|40.9|40,Teapa|MX27|-92.95|17.56|26,Tecamachalco|MX21|-97.73|18.88|28,Tecate|MX02|-116.63|32.57|64,Tecax|MX31|-89.29|20.21|25,Tecoman|MX08|-103.88|18.92|85,Tehuacan|MX21|-97.4|18.46|248,Tejupilco de Hidalgo|MX15|-100.15|18.9|25,Temecula|CA|-117.15|33.49|110,Temixco|MX17|-99.23|18.85|97,Tempe|AZ|-111.91|33.41|175,Tempe Junction|AZ|-111.94|33.41|158,Temple|TX|-97.34|31.1|72,Temple City|CA|-118.06|34.11|36,Temple Terrace|FL|-82.39|28.04|25,Tenosique|MX27|-91.42|17.47|32,Teoloyucan|MX15|-99.18|19.74|51,Tepatitlan de Morelos|MX14|-102.76|20.82|91,Tepeaca|MX21|-97.9|18.97|27,Tepeji del Rio de Ocampo|MX13|-99.34|19.9|80,Tepexpan|MX15|-98.94|19.61|102,Tepic|MX18|-104.89|21.51|332,Tepotzotlan|MX15|-99.22|19.72|38,Tequila|MX14|-103.84|20.88|29,Tequisquiapan|MX22|-99.89|20.52|29,Terre Haute|IN|-87.41|39.47|60,Terrebonne|QC|-73.65|45.7|111,Tewksbury|MA|-71.23|42.61|29,Texarkana|TX|-94.05|33.43|37,Texarkana|AR|-94.04|33.44|30,Texas City|TX|-94.9|29.38|47,Texcoco de Mora|MX15|-98.88|19.51|105,Teziutlan|MX21|-97.36|19.82|103,The Acreage|FL|-80.27|26.79|38,The Bronx|NY|-73.87|40.85|1385,The Colony|TX|-96.89|33.09|41,The Hammocks|FL|-80.44|25.67|51,The Trails of Frisco|TX|-96.87|33.16|51,The Villages|FL|-81.96|28.93|51,The Woodlands|TX|-95.49|30.16|93,Thetford-Mines|QC|-71.31|46.09|25,Thomasville|NC|-80.08|35.88|27,Thornton|CO|-104.97|39.87|133,Thousand Oaks|CA|-118.84|34.17|129,Throgs Neck|NY|-73.82|40.82|33,Thunder Bay|ON|-89.25|48.38|108,Ticul|MX31|-89.53|20.4|32,Tierra Blanca|MX30|-96.36|18.45|47,Tigard|OR|-122.77|45.43|51,Tijuana|MX02|-117|32.5|1922,Timmins|ON|-81.33|48.47|41,Tinley Park|IL|-87.78|41.57|57,Titusville|FL|-80.81|28.61|45,Tizayuca|MX13|-98.98|19.84|43,Tizimin|MX31|-88.15|21.14|46,Tlahuac|MX09|-99.01|19.29|305,Tlajomulco de Zuniga|MX14|-103.45|20.47|30,Tlalnepantla|MX15|-99.2|19.54|653,Tlalpan|MX09|-99.16|19.3|574,Tlapa de Comonfort|MX12|-98.58|17.55|46,Tlapacoyan|MX30|-97.21|19.96|35,Tlaquepaque|MX14|-103.29|20.64|650,Tlaxcala|MX29|-98.24|19.32|84,Toledo|OH|-83.56|41.66|265,Toluca|MX15|-99.65|19.29|489,Toms River|NJ|-74.2|39.95|88,Tonala|MX14|-103.24|20.62|408,Tonala|MX05|-93.75|16.09|35,Tooele|UT|-112.3|40.53|33,Topeka|KS|-95.68|39.05|125,Toronto|ON|-79.4|43.71|2794,Torrance|CA|-118.34|33.84|143,Torreon|MX07|-103.42|25.54|735,Torrington|CT|-73.12|41.8|34,Town 'n' Country|FL|-82.58|28.01|78,Towson|MD|-76.6|39.4|55,Tracy|CA|-121.43|37.74|87,Trenton|NJ|-74.74|40.22|89,Tri-Cities|WA|-119.2|46.25|244,Trois-Rivieres|QC|-72.55|46.35|144,Troy|MI|-83.15|42.61|83,Troy|NY|-73.69|42.73|49,Troy|OH|-84.2|40.04|25,Trumbull|CT|-73.2|41.24|36,Tualatin|OR|-122.76|45.38|27,Tuckahoe|VA|-77.56|37.59|44,Tucker|GA|-84.22|33.85|27,Tucson|AZ|-110.93|32.22|542,Tujunga|CA|-118.29|34.25|26,Tula de Allende|MX13|-99.34|20.05|28,Tulancingo|MX13|-98.36|20.08|102,Tulare|CA|-119.35|36.21|62,Tulsa|OK|-95.99|36.15|413,Tultepec|MX15|-99.13|19.68|65,Tultitlan de Mariano Escobedo|MX15|-99.17|19.65|28,Tupelo|MS|-88.7|34.26|35,Turlock|CA|-120.85|37.49|72,Tuscaloosa|AL|-87.57|33.21|111,Tustin|CA|-117.83|33.75|80,Tuxpam de Rodriguez Cano|MX30|-97.41|20.96|84,Tuxpan|MX14|-103.38|19.56|27,Tuxtepec|MX20|-96.13|18.09|159,Tuxtla|MX05|-93.12|16.75|604,Twentynine Palms|CA|-116.05|34.14|26,Twin Falls|ID|-114.46|42.56|47,Tyler|TX|-95.3|32.35|103,Uman|MX31|-89.75|20.88|39,Union|NJ|-74.26|40.7|56,Union City|CA|-122.02|37.6|74,Union City|NJ|-74.02|40.78|69,Universal City|CA|-118.35|34.14|105,University|FL|-82.44|28.07|41,University City|MO|-90.31|38.66|35,University Heights|SK|-106.58|52.14|51,University Heights|NY|-73.91|40.86|27,University of Texas|TX|-97.74|30.29|53,University Park|FL|-80.37|25.75|26,University Place|WA|-122.55|47.24|32,Upland|CA|-117.65|34.1|76,Upper Alton|IL|-90.15|38.91|29,Upper Arlington|OH|-83.06|39.99|34,Upper West Side|NY|-73.98|40.79|226,Uptown|IL|-87.65|41.97|55,Urbana|IL|-88.21|40.11|42,Urbandale|IA|-93.71|41.63|44,Uriangato|MX11|-101.18|20.14|51,Uruapan|MX16|-102.06|19.42|299,Utica|NY|-75.23|43.1|61,Vacaville|CA|-121.99|38.36|96,Val-d'Or|QC|-77.8|48.1|25,Val-des-Arbres|QC|-73.68|45.6|40,Valdosta|GA|-83.28|30.83|55,Valencia|CA|-118.61|34.44|148,Valente Diaz|MX30|-96.22|19.16|25,Valladolid|MX31|-88.2|20.69|48,Valle de Bravo|MX15|-100.13|19.2|25,Valle de Santiago|MX11|-101.19|20.39|68,Valle Hermoso|MX28|-97.81|25.67|48,Vallejo|CA|-122.26|38.1|121,Valley Glen|CA|-118.42|34.19|60,Valley Stream|NY|-73.71|40.66|37,Valparaiso|IN|-87.06|41.47|32,Valrico|FL|-82.24|27.94|35,Van Nuys|CA|-118.45|34.19|136,Vancouver|BC|-123.12|49.25|662,Vancouver|WA|-122.66|45.64|196,Vaudreuil-Dorion|QC|-74.03|45.4|25,Vaughan|ON|-79.5|43.84|323,Venice|CA|-118.46|33.99|40,Ventura|CA|-119.29|34.28|96,Venustiano Carranza|MX09|-99.1|19.44|430,Veracruz|MX30|-96.14|19.18|428,Verdun|QC|-73.57|45.46|69,Vermont Square|CA|-118.3|34|47,Vernon|BC|-119.27|50.27|40,Vernon Hills|IL|-87.98|42.22|26,Vestal|NY|-76.05|42.09|28,Vestavia Hills|AL|-86.79|33.45|34,Victor Rosales|MX32|-102.7|22.95|32,Victoria|BC|-123.35|48.44|289,Victoria|TX|-97|28.81|67,Victoria de Durango|MX10|-104.66|24.02|518,Victoria-Downtown|BC|-123.36|48.43|46,Victoria-Fraserview|BC|-123.07|49.22|31,Victoriaville|QC|-71.97|46.05|34,Victorville|CA|-117.29|34.54|122,Villa Vicente Guerrero|MX29|-98.17|19.12|60,Villaflores|MX05|-93.27|16.23|37,Villagran|MX11|-101|20.51|27,Villahermosa|MX27|-92.94|17.99|353,Ville-Emard|QC|-73.6|45.45|30,Ville-Marie|QC|-73.57|45.5|104,Villeray-Saint-Michel-Parc-Extension|QC|-73.61|45.56|144,Vineland|NJ|-75.03|39.49|60,Virginia Beach|VA|-75.98|36.85|454,Visalia|CA|-119.29|36.33|130,Vista|CA|-117.24|33.2|100,Waco|TX|-97.15|31.55|132,Waiau-Pacific Palisades|HI|-157.95|21.4|47,Waipahu|HI|-158.01|21.39|38,Wake Forest|NC|-78.51|35.98|38,Wakefield|NY|-73.85|40.9|52,Waldorf|MD|-76.94|38.62|67,Walla Walla|WA|-118.34|46.06|32,Walnut|CA|-117.87|34.02|30,Walnut Creek|CA|-122.06|37.91|68,Walnut Grove|BC|-122.64|49.16|25,Waltham|MA|-71.24|42.38|63,Warner Robins|GA|-83.63|32.62|73,Warren|MI|-83.01|42.49|134,Warren|OH|-80.82|41.24|40,Warwick|RI|-71.42|41.7|81,Wasco|CA|-119.34|35.59|26,Washington|DC|-77.04|38.9|689,Washington Heights|NY|-73.94|40.85|152,Waterbury|CT|-73.05|41.56|108,Waterford|MI|-83.41|42.69|75,Waterfront Communities-The Island|ON|-79.38|43.63|65,Waterloo|ON|-80.52|43.47|104,Waterloo|IA|-92.34|42.49|68,Watertown|MA|-71.18|42.37|31,Watertown|NY|-75.91|43.97|26,Watsonville|CA|-121.76|36.91|53,Waukegan|IL|-87.84|42.36|88,Waukesha|WI|-88.23|43.01|71,Wausau|WI|-89.63|44.96|39,Wauwatosa|WI|-88.01|43.05|47,Waxahachie|TX|-96.85|32.39|33,Wayne|NJ|-74.28|40.93|57,Wayne|PA|-75.39|40.04|30,Weatherford|TX|-97.8|32.76|28,Welland|ON|-79.25|42.98|52,Wellesley|MA|-71.29|42.3|27,Wellington|FL|-80.24|26.66|62,Wenatchee|WA|-120.31|47.42|33,Wentzville|MO|-90.85|38.81|35,Weslaco|TX|-97.99|26.16|39,Wesley Chapel|FL|-82.33|28.24|44,West Albany|NY|-73.78|42.68|93,West Allis|WI|-88.01|43.02|60,West Babylon|NY|-73.35|40.72|43,West Bend|WI|-88.18|43.43|31,West Bloomfield Township|MI|-83.38|42.57|64,West Chicago|IL|-88.2|41.88|27,West Coon Rapids|MN|-93.35|45.16|62,West Covina|CA|-117.94|34.07|108,West Des Moines|IA|-93.71|41.58|64,West Elkridge|MD|-76.73|39.21|28,West End|BC|-123.13|49.28|47,West Englewood|IL|-87.67|41.78|32,West Falls Church|VA|-77.19|38.86|29,West Fargo|ND|-96.9|46.87|33,West Gulfport|MS|-89.09|30.4|71,West Hartford|CT|-72.74|41.76|63,West Haven|CT|-72.95|41.27|54,West Hill|ON|-79.18|43.77|27,West Hills|CA|-118.64|34.2|41,West Hollywood|FL|-80.18|26.02|60,West Hollywood|CA|-118.36|34.09|36,West Humber-Clairville|ON|-79.6|43.72|33,West Islip|NY|-73.31|40.71|28,West Jordan|UT|-111.94|40.61|111,West Kelowna|BC|-119.58|49.86|28,West Lafayette|IN|-86.91|40.43|45,West Lake Sammamish|WA|-122.1|47.58|33,West Lawn|IL|-87.72|41.77|32,West Linn|OR|-122.61|45.37|26,West Little River|FL|-80.24|25.86|34,West Lynchburg|VA|-79.18|37.4|65,West Memphis|AR|-90.18|35.15|25,West Milford|NJ|-74.37|41.13|26,West New York|NJ|-74.01|40.79|53,West Oak Lane|PA|-75.17|40.07|38,West Orange|NJ|-74.24|40.8|48,West Palm Beach|FL|-80.05|26.72|120,West Raleigh|NC|-78.66|35.79|338,West Ridge|IL|-87.69|42|72,West Roxbury|MA|-71.15|42.28|30,West Sacramento|CA|-121.53|38.58|52,West Scarborough|ME|-70.39|43.57|27,West Seneca|NY|-78.8|42.85|44,West Springfield|MA|-72.62|42.11|27,West Torrington|CT|-73.14|41.82|36,West Town|IL|-87.67|41.89|86,West Valley City|UT|-112|40.69|136,West Vancouver|BC|-123.16|49.33|45,West Village|NY|-74.01|40.73|32,West Warwick|RI|-71.52|41.7|30,West Whittier-Los Nietos|CA|-118.07|33.98|25,Westchester|FL|-80.33|25.75|29,Westerville|OH|-82.93|40.13|38,Westfield|MA|-72.75|42.13|41,Westfield|IN|-86.13|40.04|36,Westfield|NJ|-74.35|40.66|30,Westlake|OH|-81.92|41.46|32,Westland|MI|-83.4|42.32|82,Westminster|CO|-105.04|39.84|116,Westminster|CA|-118.01|33.76|92,Westminster-Branson|ON|-79.45|43.78|26,Westmont|CA|-118.3|33.94|31,Weston|FL|-80.4|26.1|69,Westport|CT|-73.36|41.14|26,Wethersfield|CT|-72.65|41.71|26,Wexford/Maryvale|ON|-79.3|43.75|27,Weymouth|MA|-70.94|42.22|54,Whalley|BC|-122.87|49.18|102,Wharton|PA|-75.16|39.93|49,Wheat Ridge|CO|-105.08|39.77|31,Wheaton|IL|-88.11|41.87|53,Wheaton|MD|-77.06|39.04|48,Wheeling|IL|-87.93|42.14|38,Wheeling|WV|-80.72|40.06|27,Whitby|ON|-78.93|43.88|138,Whitchurch-Stouffville|ON|-79.32|44|49,White Bear Lake|MN|-93.01|45.08|25,White Plains|NY|-73.76|41.03|58,Whitehorse|YT|-135.05|60.72|28,Whitestone|NY|-73.82|40.79|36,Whitman|PA|-75.16|39.92|49,Whitney|NV|-115.04|36.1|38,Whittier|CA|-118.03|33.98|87,Wichita|KS|-97.34|37.69|396,Wichita Falls|TX|-98.49|33.91|104,Wildomar|CA|-117.28|33.6|35,Wildwood|MO|-90.66|38.58|35,Wilkes-Barre|PA|-75.88|41.25|40,Williamsburg|NY|-73.95|40.71|33,Williamsport|PA|-77|41.24|29,Willingboro|NJ|-74.87|40.03|31,Williston|ND|-103.62|48.15|26,Willoughby|BC|-122.68|49.13|31,Willowbrook|CA|-118.26|33.92|35,Willowdale|ON|-79.4|43.77|79,Willowdale East|ON|-79.4|43.77|50,Wilmette|IL|-87.72|42.07|27,Wilmington|NC|-77.95|34.24|115,Wilmington|DE|-75.55|39.75|70,Wilmington|CA|-118.26|33.78|52,Wilson|NC|-77.92|35.72|49,Winchester|NV|-115.12|36.13|27,Winchester|VA|-78.16|39.19|27,Windsor|ON|-83.02|42.3|229,Windsor|CO|-104.9|40.48|32,Windsor|CT|-72.64|41.85|28,Windsor|CA|-122.82|38.55|27,Winnetka|CA|-118.57|34.21|47,Winnipeg|MB|-97.15|49.88|749,Winona|MN|-91.64|44.05|27,Winston-Salem|NC|-80.24|36.1|241,Winter Garden|FL|-81.59|28.57|40,Winter Haven|FL|-81.73|28.02|37,Winter Park|FL|-81.34|28.6|29,Winter Springs|FL|-81.31|28.7|34,Woburn|ON|-79.23|43.77|53,Woburn|MA|-71.15|42.48|39,Woodburn|OR|-122.86|45.14|25,Woodbury|MN|-92.96|44.92|67,Woodhaven|NY|-73.86|40.69|36,Woodland|CA|-121.77|38.68|58,Woodland Hills|CA|-118.61|34.17|70,Woodlawn|MD|-76.73|39.32|37,Woodridge|IL|-88.05|41.75|33,Woodside|NY|-73.91|40.75|41,Woodstock|ON|-80.75|43.13|40,Woodstock|GA|-84.52|34.1|29,Woodstock|IL|-88.45|42.31|25,Woonsocket|RI|-71.51|42|41,Wooster|OH|-81.94|40.81|26,Worcester|MA|-71.8|42.26|206,Wyandotte|MI|-83.15|42.21|25,Wylie|TX|-96.54|33.02|46,Wyoming|MI|-85.71|42.91|75,Xalapa de Enriquez|MX30|-96.92|19.53|424,Xalisco|MX18|-104.9|21.44|35,Xenia|OH|-83.93|39.68|25,Xico|MX15|-98.95|19.27|384,Xicotepec de Juarez|MX21|-97.96|20.28|39,Xochimilco|MX09|-99.1|19.25|442,Yakima|WA|-120.51|46.6|93,Yarmouth|MA|-70.23|41.71|25,Yautepec|MX17|-99.07|18.88|105,Yonkers|NY|-73.9|40.93|201,Yorba Linda|CA|-117.81|33.89|67,York|PA|-76.73|39.96|43,York University Heights|ON|-79.49|43.77|27,Youngstown|OH|-80.65|41.1|64,Yuba City|CA|-121.62|39.14|66,Yucaipa|CA|-117.04|34.03|53,Yukon|OK|-97.76|35.51|25,Yuma|AZ|-114.62|32.73|95,Yuriria|MX11|-101.13|20.21|25,Zacapu|MX16|-101.79|19.82|50,Zacatecas|MX32|-102.58|22.77|129,Zacatelco|MX29|-98.24|19.22|42,Zacatlan|MX21|-97.96|19.94|33,Zamora de Hidalgo|MX16|-102.29|19.98|186,Zanesville|OH|-82.01|39.94|25,Zapopan|MX14|-103.39|20.72|1476,Zapotlanejo|MX14|-103.07|20.62|32,Zinacantepec|MX15|-99.73|19.28|54,Zionsville|IN|-86.26|39.95|26,Zumpango|MX15|-99.1|19.8|280";function nr(t){return t.normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"").toLowerCase().replace(/[^\p{L}\p{N}\s]/gu," ").replace(/\s+/g," ").trim()}var or=null;function y_(){if(or)return or;let t=new Map;for(let e of m_.split(",")){let r=e.split("|");if(r.length<5)continue;let o=nr(r[0]);if(!o)continue;let n={a1:r[1],lon:+r[2],lat:+r[3],pop:+r[4]},i=t.get(o);i?i.push(n):t.set(o,[n])}for(let e of t.values())e.sort((r,o)=>o.pop-r.pop);return or=t,t}function Yl(t){return!!t&&y_().has(t)}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var h_="AD AND,AE ARE,AF AFG,AG ATG,AI AIA,AL ALB,AM ARM,AO AGO,AQ ATA,AR ARG,AS ASM,AT AUT,AU AUS,AW ABW,AX ALA,AZ AZE,BA BIH,BB BRB,BD BGD,BE BEL,BF BFA,BG BGR,BH BHR,BI BDI,BJ BEN,BL BLM,BM BMU,BN BRN,BO BOL,BQ BES,BR BRA,BS BHS,BT BTN,BV BVT,BW BWA,BY BLR,BZ BLZ,CA CAN,CC CCK,CD COD,CF CAF,CG COG,CH CHE,CI CIV,CK COK,CL CHL,CM CMR,CN CHN,CO COL,CR CRI,CU CUB,CV CPV,CW CUW,CX CXR,CY CYP,CZ CZE,DE DEU,DJ DJI,DK DNK,DM DMA,DO DOM,DZ DZA,EC ECU,EE EST,EG EGY,EH ESH,ER ERI,ES ESP,ET ETH,FI FIN,FJ FJI,FK FLK,FM FSM,FO FRO,FR FRA,GA GAB,GB GBR,GD GRD,GE GEO,GF GUF,GG GGY,GH GHA,GI GIB,GL GRL,GM GMB,GN GIN,GP GLP,GQ GNQ,GR GRC,GS SGS,GT GTM,GU GUM,GW GNB,GY GUY,HK HKG,HM HMD,HN HND,HR HRV,HT HTI,HU HUN,ID IDN,IE IRL,IL ISR,IM IMN,IN IND,IO IOT,IQ IRQ,IR IRN,IS ISL,IT ITA,JE JEY,JM JAM,JO JOR,JP JPN,KE KEN,KG KGZ,KH KHM,KI KIR,KM COM,KN KNA,KP PRK,KR KOR,KW KWT,KY CYM,KZ KAZ,LA LAO,LB LBN,LC LCA,LI LIE,LK LKA,LR LBR,LS LSO,LT LTU,LU LUX,LV LVA,LY LBY,MA MAR,MC MCO,MD MDA,ME MNE,MF MAF,MG MDG,MH MHL,MK MKD,ML MLI,MM MMR,MN MNG,MO MAC,MP MNP,MQ MTQ,MR MRT,MS MSR,MT MLT,MU MUS,MV MDV,MW MWI,MX MEX,MY MYS,MZ MOZ,NA NAM,NC NCL,NE NER,NF NFK,NG NGA,NI NIC,NL NLD,NO NOR,NP NPL,NR NRU,NU NIU,NZ NZL,OM OMN,PA PAN,PE PER,PF PYF,PG PNG,PH PHL,PK PAK,PL POL,PM SPM,PN PCN,PR PRI,PS PSE,PT PRT,PW PLW,PY PRY,QA QAT,RE REU,RO ROU,RS SRB,RU RUS,RW RWA,SA SAU,SB SLB,SC SYC,SD SDN,SE SWE,SG SGP,SH SHN,SI SVN,SJ SJM,SK SVK,SL SLE,SM SMR,SN SEN,SO SOM,SR SUR,SS SSD,ST STP,SV SLV,SX SXM,SY SYR,SZ SWZ,TC TCA,TD TCD,TF ATF,TG TGO,TH THA,TJ TJK,TK TKL,TL TLS,TM TKM,TN TUN,TO TON,TR TUR,TT TTO,TV TUV,TW TWN,TZ TZA,UA UKR,UG UGA,UM UMI,US USA,UY URY,UZ UZB,VA VAT,VC VCT,VE VEN,VG VGB,VI VIR,VN VNM,VU VUT,WF WLF,WS WSM,YE YEM,YT MYT,ZA ZAF,ZM ZMB,ZW ZWE",lr=(()=>{let t=new Map;for(let e of h_.split(",")){let[r,o]=e.split(" ");r&&o&&t.set(r,o)}return t})(),f_=new Set(lr.keys()),g_=new Set(lr.values()),M_=["en","fr","es","de","it","pt","ru","ja","zh","ko","ar","hi","tr","pl","he","nl","sv","fi","no","da","cs","el","uk","ro","id","vi","th"],C_={usa:"USA","u.s.":"USA","u.s.a.":"USA",us:"USA",america:"USA","united states of america":"USA","the united states":"USA",uk:"GBR","u.k.":"GBR","great britain":"GBR",britain:"GBR",england:"GBR","south korea":"KOR","north korea":"PRK",korea:"KOR","ivory coast":"CIV","cote d ivoire":"CIV",vietnam:"VNM",laos:"LAO",syria:"SYR",iran:"IRN",russia:"RUS",moldova:"MDA",tanzania:"TZA",bolivia:"BOL",venezuela:"VEN",brunei:"BRN","czech republic":"CZE",czechia:"CZE",slovakia:"SVK",uae:"ARE","united arab emirates":"ARE",drc:"COD","dr congo":"COD","democratic republic of the congo":"COD","republic of the congo":"COG",congo:"COG",swaziland:"SWZ",eswatini:"SWZ","cape verde":"CPV","cabo verde":"CPV",burma:"MMR",myanmar:"MMR",holland:"NLD","the netherlands":"NLD",netherlands:"NLD",vatican:"VAT","vatican city":"VAT",palestine:"PSE",macau:"MAC",macao:"MAC","hong kong":"HKG",taiwan:"TWN",turkey:"TUR",turkiye:"TUR",macedonia:"MKD","north macedonia":"MKD",gambia:"GMB","the gambia":"GMB",bahamas:"BHS","the bahamas":"BHS","east timor":"TLS","timor leste":"TLS"},Ql=[["AL","Alabama"],["AK","Alaska"],["AZ","Arizona"],["AR","Arkansas"],["CA","California"],["CO","Colorado"],["CT","Connecticut"],["DE","Delaware"],["FL","Florida"],["GA","Georgia"],["HI","Hawaii"],["ID","Idaho"],["IL","Illinois"],["IN","Indiana"],["IA","Iowa"],["KS","Kansas"],["KY","Kentucky"],["LA","Louisiana"],["ME","Maine"],["MD","Maryland"],["MA","Massachusetts"],["MI","Michigan"],["MN","Minnesota"],["MS","Mississippi"],["MO","Missouri"],["MT","Montana"],["NE","Nebraska"],["NV","Nevada"],["NH","New Hampshire"],["NJ","New Jersey"],["NM","New Mexico"],["NY","New York"],["NC","North Carolina"],["ND","North Dakota"],["OH","Ohio"],["OK","Oklahoma"],["OR","Oregon"],["PA","Pennsylvania"],["RI","Rhode Island"],["SC","South Carolina"],["SD","South Dakota"],["TN","Tennessee"],["TX","Texas"],["UT","Utah"],["VT","Vermont"],["VA","Virginia"],["WA","Washington"],["WV","West Virginia"],["WI","Wisconsin"],["WY","Wyoming"],["DC","District of Columbia"],["PR","Puerto Rico"],["GU","Guam"],["VI","U.S. Virgin Islands"],["AS","American Samoa"],["MP","Northern Mariana Islands"]],v_=new Set(Ql.map(t=>t[0])),__={"Ala.":"AL","Alab.":"AL","Ariz.":"AZ","Ark.":"AR","Calif.":"CA","Cal.":"CA","Colo.":"CO","Col.":"CO","Conn.":"CT","Del.":"DE","Fla.":"FL","Flor.":"FL","Ga.":"GA","Ill.":"IL","Ind.":"IN","Kan.":"KS","Kans.":"KS","Ky.":"KY","La.":"LA","Md.":"MD","Mass.":"MA","Mich.":"MI","Minn.":"MN","Miss.":"MS","Mo.":"MO","Mont.":"MT","Neb.":"NE","Nebr.":"NE","Nev.":"NV","N.H.":"NH","N.J.":"NJ","N.M.":"NM","N.Mex.":"NM","N. Mex.":"NM","N.Y.":"NY","N.C.":"NC","N.D.":"ND","N.Dak.":"ND","N. Dak.":"ND","Okla.":"OK","Ore.":"OR","Oreg.":"OR","Pa.":"PA","Penn.":"PA","Penna.":"PA","R.I.":"RI","S.C.":"SC","S.D.":"SD","S.Dak.":"SD","S. Dak.":"SD","Tenn.":"TN","Tex.":"TX","Vt.":"VT","Va.":"VA","Wash.":"WA","W.Va.":"WV","W. Va.":"WV","Wis.":"WI","Wisc.":"WI","Wyo.":"WY","D.C.":"DC","Wash. D.C.":"DC","Wash., D.C.":"DC","P.R.":"PR","V.I.":"VI"},P_=(()=>{let t=new Map;for(let[e,r]of Ql)t.set(Z4(r),e);t.set(Z4("Washington DC"),"DC"),t.set(Z4("Washington D.C."),"DC"),t.set(Z4("US Virgin Islands"),"VI");for(let[e,r]of Object.entries(__)){let o=Z4(e);o&&!t.has(o)&&t.set(o,r)}return t})(),A_=new Set(["01","02","04","05","06","08","09","10","11","12","13","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","44","45","46","47","48","49","50","51","53","54","55","56","60","66","69","72","78"]);function S_(t){return t.trim().toUpperCase()}function Z4(t){return nr(t)}var ir=null;function b_(){if(ir)return ir;let t=new Map,e=["en",...M_.filter(r=>r!=="en")];for(let r of e){let o=null;try{o=new Intl.DisplayNames([r],{type:"region"})}catch{continue}for(let[n,i]of lr){let a;try{a=o.of(n)}catch{a=void 0}if(!a||a===n)continue;let s=Z4(a);s&&!t.has(s)&&t.set(s,i)}}for(let[r,o]of Object.entries(C_)){let n=Z4(r);n&&t.set(n,o)}return ir=t,t}var ar=new Set(["country","countries","nation","nationality","iso","geo"]),sr=new Set(["state","province","st"]),Jl=new Set(["zip","zipcode","postal","postcode","plz"]),w_=new Set(["county","fips","borough","parish"]),N_=new Set(["city","cities","town","municipality","metro","location","place"]);function k_(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_\-./]+/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>0)}function H4(t,e){if(!t)return!1;for(let r of k_(t))if(e.has(r))return!0;return!1}var T_=85,z_=5,x_=6e4;function ec(t,e,r){if(!t||t.length===0)return null;let o=[],n=new Set;for(let k of t){if(k==null)continue;let x=String(k).trim();if(x.length===0)continue;let V=x.toLowerCase();if(!n.has(V)&&(n.add(V),o.push(x),o.length>x_))return null}let i=o.length;if(i<2)return null;let a=o.map(S_),s=o.map(Z4),l=b_(),c=0,p=0,u=0,m=0,y=0,d=0,h=0,f=0,C=0,M=0,_=0,S=H4(e,Jl);for(let k=0;k<i;++k){let x=a[k],V=s[k],H=o[k],D=f_.has(x),d3=v_.has(x);g_.has(x)&&c++,D&&p++,d3&&u++,D&&d3&&C++;let z3=l.has(V),L3=P_.has(V);z3&&m++,L3&&y++,z3&&L3&&M++,d3&&L3&&_++,(/^\d{5}(-\d{4})?$/.test(H)||S&&/^\d{3,4}$/.test(H))&&d++,/^\d{5}$/.test(H)&&A_.has(H.slice(0,2))&&h++,Yl(V)&&f++}let b=k=>k/i*100,F=[],$=(k,x,V,H=!1)=>{let D=b(x);D<T_||x<2||H&&x<z_&&!H4(e,k==="country-name"?ar:k==="city-name"?N_:sr)||F.push({kind:k,matched:x,spec:V,pct:D})};$("country-iso3",c,6),$("country-name",m,5,!0),$("us-state-name",y,5,!0),$("us-zip5",d,4),$("us-county-fips",h,4),$("country-iso2",p,3),$("us-state-code",u,3),$("city-name",f,2,!0);let o3=u-_,c3=y-_;if(o3>0&&c3>0&&$("us-state-name",u+y-_,5,!0),F.length===0)return null;F.sort((k,x)=>x.pct-k.pct||x.spec-k.spec);let Z=F[0],Y=!1,I={"country-iso2":"us-state-code","us-state-code":"country-iso2","us-zip5":"us-county-fips","us-county-fips":"us-zip5","country-name":"us-state-name","us-state-name":"country-name"}[Z.kind],g=F[1],v=I&&g&&g.kind===I&&Math.abs(Z.pct-g.pct)<=15;if(Z.kind==="country-iso2"||Z.kind==="us-state-code"){let k=Z.matched>0?C/Z.matched:0,x=H4(e,ar),V=H4(e,sr);if(v||k>=.5){if(x&&!V)return w("country-iso2",p,!1);if(V&&!x)return w("us-state-code",u,!1);Y=!0}}else if(Z.kind==="us-zip5"||Z.kind==="us-county-fips"){let k=h===d&&d===i,x=H4(e,Jl),V=H4(e,w_);return V&&!x?w("us-county-fips",h,!1):x&&!V?w("us-zip5",d,!1):k?w("us-zip5",d,!0):w("us-zip5",d,!1)}else if(v&&(Z.kind==="country-name"||Z.kind==="us-state-name")){let k=Z.matched>0?M/Z.matched:0,x=H4(e,ar),V=H4(e,sr);if(x&&!V)return w("country-name",m,!1);if(V&&!x)return w("us-state-name",y,!1);k>=.5&&(Y=!0)}return w(Z.kind,Z.matched,Y);function w(k,x,V){let H={geoKind:k,geoMatchPct:Math.round(b(x)*10)/10};return V&&(H.geoAmbiguous=!0),H}}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var nc=[{name:"likert7_agreement",minMatches:5,canonical:["strongly disagree","disagree","slightly disagree","neutral","slightly agree","agree","strongly agree"]},{name:"likert5_agreement",minMatches:3,canonical:["strongly disagree","disagree","neutral","agree","strongly agree"]},{name:"likert3_agreement",minMatches:2,canonical:["disagree","neutral","agree"]},{name:"likert5_satisfaction",minMatches:3,canonical:["very dissatisfied","dissatisfied","neutral","satisfied","very satisfied"]},{name:"likert3_satisfaction",minMatches:2,canonical:["dissatisfied","neutral","satisfied"]},{name:"likert5_quality",minMatches:3,canonical:["poor","fair","good","very good","excellent"]},{name:"likert3_quality",minMatches:2,canonical:["poor","fair","good"]},{name:"frequency5",minMatches:3,canonical:["never","rarely","sometimes","often","always"]},{name:"intensity5",minMatches:3,canonical:["not at all","slightly","moderately","very","extremely"]},{name:"importance5",minMatches:3,canonical:["not important","slightly important","moderately important","very important","extremely important"]},{name:"severity_low_critical",minMatches:3,canonical:["low","medium","high","critical"]},{name:"severity_low_urgent",minMatches:3,canonical:["low","medium","high","urgent"]},{name:"severity_none_critical",minMatches:3,canonical:["none","mild","moderate","severe","critical"]},{name:"priority_p4_p1",minMatches:3,canonical:["p4","p3","p2","p1","p0"]},{name:"severity_trivial_blocker",minMatches:3,canonical:["trivial","minor","major","critical","blocker"]},{name:"severity_minor_severe",minMatches:3,canonical:["minor","moderate","major","severe"]},{name:"magnitude5_medium",minMatches:3,canonical:["very low","low","medium","high","very high"]},{name:"magnitude5_moderate",minMatches:3,canonical:["very low","low","moderate","high","very high"]},{name:"speed5",minMatches:3,canonical:["very slow","slow","moderate","fast","very fast"]},{name:"temperature6",minMatches:3,canonical:["freezing","cold","cool","mild","warm","hot"]},{name:"experience6",minMatches:3,canonical:["novice","beginner","intermediate","advanced","expert","master"]},{name:"tier_metal",minMatches:3,canonical:["bronze","silver","gold","platinum","diamond"]},{name:"tshirt_letter_sizes",minMatches:4,canonical:["xxs","xs","s","m","l","xl","xxl","xxxl"]},{name:"tshirt_word_sizes",minMatches:3,canonical:["extra small","small","medium","large","extra large"]},{name:"nps_bands",minMatches:2,canonical:["detractor","passive","promoter"]},{name:"likelihood5",minMatches:3,canonical:["very unlikely","unlikely","neutral","likely","very likely"]},{name:"education",minMatches:3,canonical:["none","primary","secondary","bachelors","masters","doctoral"]},{name:"grades_a_to_f",minMatches:3,canonical:["a","b","c","d","f"]},{name:"grades_a_to_f_plusminus",minMatches:4,canonical:["a+","a","a-","b+","b","b-","c+","c","c-","d+","d","d-","f"]}],F_={seldom:"rarely",infrequently:"rarely","hardly ever":"rarely",occasionally:"sometimes",periodically:"sometimes","now and then":"sometimes",frequently:"often",frequent:"often",regularly:"often",commonly:"often",usually:"often",constantly:"always","every time":"always","all the time":"always",consistently:"always",continually:"always",bad:"poor",weak:"poor",subpar:"poor",mediocre:"fair",passable:"fair","so so":"fair",decent:"good",solid:"good",outstanding:"excellent",superb:"excellent",exceptional:"excellent",stellar:"excellent",unsatisfied:"dissatisfied",unhappy:"dissatisfied",displeased:"dissatisfied",happy:"satisfied",content:"satisfied",pleased:"satisfied",delighted:"very satisfied","highly satisfied":"very satisfied","extremely satisfied":"very satisfied","highly dissatisfied":"very dissatisfied","extremely dissatisfied":"very dissatisfied",neither:"neutral",undecided:"neutral","no opinion":"neutral","neither agree nor disagree":"neutral","completely agree":"strongly agree","totally agree":"strongly agree","completely disagree":"strongly disagree","totally disagree":"strongly disagree","highly unlikely":"very unlikely","extremely unlikely":"very unlikely","highly likely":"very likely","extremely likely":"very likely","almost certain":"very likely",bachelor:"bachelors","bachelor's":"bachelors",undergraduate:"bachelors","bachelor degree":"bachelors","master's":"masters",graduate:"masters","master degree":"masters",doctorate:"doctoral",phd:"doctoral"},I_=(()=>{let t=new Set;for(let e of nc)for(let r of e.canonical)t.add(g4(r));return t})(),L_=(()=>{let t=new Map;for(let[e,r]of Object.entries(F_)){let o=g4(e);I_.has(o)||t.has(o)||t.set(o,g4(r))}return t})();function tc(t){return L_.get(t)??t}var R_=new Set(["hour","hr","day","dow","dom","weekday","week","wk","woy","month","mth","quarter","qtr","year","yr","semester","trimester","decade","period","fiscal","fy","rank","level","lvl","tier","grade","band","decile","percentile","quartile","quintile","score","rating","stars","step","stage","phase","round","wave","episode","chapter","age","cohort","generation","seniority","position","sequence","seq","priority"]);function $_(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_\-./]+/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>0)}function ic(t){if(!t)return!1;for(let e of $_(t))if(R_.has(e))return!0;return!1}function g4(t){return t.toLowerCase().replace(/[-_]+/g," ").replace(/\s+/g," ").trim()}function cr(t){let e=new Map;for(let[r,o]of t)for(let n of r)e.set(g4(n),o);return e}var ac=[{name:"weekday_mon_sun",minMatches:4,dict:cr([[["monday","mon"],0],[["tuesday","tue","tues"],1],[["wednesday","wed","weds"],2],[["thursday","thu","thur","thurs","thr"],3],[["friday","fri"],4],[["saturday","sat"],5],[["sunday","sun"],6]])},{name:"month_jan_dec",minMatches:4,dict:cr([[["january","jan"],0],[["february","feb"],1],[["march","mar"],2],[["april","apr"],3],[["may"],4],[["june","jun"],5],[["july","jul"],6],[["august","aug"],7],[["september","sep","sept"],8],[["october","oct"],9],[["november","nov"],10],[["december","dec"],11]])},{name:"quarter_q1_q4",minMatches:3,dict:cr([[["q1","qtr 1","qtr1","quarter 1","q 1"],0],[["q2","qtr 2","qtr2","quarter 2","q 2"],1],[["q3","qtr 3","qtr3","quarter 3","q 3"],2],[["q4","qtr 4","qtr4","quarter 4","q 4"],3]])}],rc={};function O_(t){let e=t||"";if(!e)return{weekday:new Map,month:new Map};let r=rc[e];if(r)return r;let o=new Map,n=new Map,i=(s,l,c)=>{let p=g4(l);p&&s.set(p,c);let u=g4(l.replace(/\./g,""));u&&u!==p&&s.set(u,c)};try{let s=new Intl.DateTimeFormat(e,{weekday:"long"}),l=new Intl.DateTimeFormat(e,{weekday:"short"});for(let u=0;u<7;++u){let m=new Date(Date.UTC(2024,0,1+u));i(o,s.format(m),u),i(o,l.format(m),u)}let c=new Intl.DateTimeFormat(e,{month:"long"}),p=new Intl.DateTimeFormat(e,{month:"short"});for(let u=0;u<12;++u){let m=new Date(Date.UTC(2020,u,15));i(n,c.format(m),u),i(n,p.format(m),u)}}catch{}let a={weekday:o,month:n};return rc[e]=a,a}function oc(t,e){if(e.size===0)return t;let r=new Map(t);for(let[o,n]of e)r.has(o)||r.set(o,n);return r}function E_(t,e){let r=O_(e);for(let o of ac){let n=o.name==="weekday_mon_sun"?oc(o.dict,r.weekday):o.name==="month_jan_dec"?oc(o.dict,r.month):o.dict,i=!0,a=new Map;for(let[l,c]of t){let p=n.get(l);if(p===void 0){i=!1;break}a.has(p)||a.set(p,c)}if(!i||a.size<o.minMatches)continue;let s=[...a.entries()].sort((l,c)=>l[0]-c[0]).map(l=>l[1]);return{pattern:o.name,orderedDomain:s}}return null}function D_(t){let e=new Map;for(let r of t){if(r==null)continue;let o=String(r);if(o.length===0)continue;let n=g4(o);e.has(n)||e.set(n,o)}return e}var X_=15,B_=10,H_=(()=>{let t=["xxs","xs","s","sm","small","m","med","medium","l","lg","large","xl","xlarge","xxl","xxxl","2xl","3xl","4xl","y","n","yes","no","t","f","true","false","na","n/a","n a","none","null","unknown","other","all","both","low","medium","med","high","very low","very high","minimal","critical","urgent"],e=new Set(t.map(g4));for(let r of ac)for(let o of r.dict.keys())e.add(o);return e})();function Z_(t){let e=t.trim();return e.length===0||e.length>B_||(e.match(new RegExp("\\p{L}","gu"))||[]).length>1?!1:new RegExp("\\p{Nd}","u").test(e)}function sc(t){if(!t||t.length===0)return null;let e=new Set,r=[];for(let o of t){if(o==null)continue;let n=String(o);if(e.has(n))continue;let i=g4(n);if(!(i===""||H_.has(i)||Z_(n))||(e.add(n),r.push(n),r.length>X_))return null}return r.length>0?r:null}function lc(t,e){if(!t||t.length<2)return null;let r=D_(t);if(r.size<2)return null;let o=new Map;for(let[i,a]of r){let s=tc(i);o.has(s)||o.set(s,a)}let n=null;for(let i of nc){let a=[];for(let p of i.canonical){let u=o.get(p);u!==void 0&&a.push(u)}if(a.length<i.minMatches)continue;let s=new Set(i.canonical),l=!0;for(let p of r.keys())if(!s.has(tc(p))){l=!1;break}if(!l)continue;let c;n===null||a.length>n.matched||a.length===n.matched&&i.canonical.length<n.pattern.canonical.length?c=!0:c=!1,c&&(n={pattern:i,matched:a.length,orderedDomain:a})}return n?{pattern:n.pattern.name,orderedDomain:n.orderedDomain}:E_(r,e)}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */function j_(t){if(t==null)return null;let e=String(t);if(e.length===0)return null;let r=e.length;if(r===36&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e))return"UUID";if(/^[^\s@]+@[^\s@]+\.[A-Za-z]{2,}$/.test(e))return"EMAIL_LIKE";if(/^https?:\/\//i.test(e)||/^www\./i.test(e))return"URL_LIKE";if(/^[+\d][\d\s().\-]{5,17}\d$/.test(e)){let i=(e.match(/\d/g)||[]).length;if(i>=7&&i<=15)return"PHONE_LIKE"}if(/^\d{4}-\d{2}-\d{2}([T ]\d{2}:\d{2}(:\d{2})?(\.\d+)?Z?)?$/.test(e)||/^\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}$/.test(e))return"DATE_STR";if(/^(true|false|yes|no|t|f|y|n)$/i.test(e))return"BOOLEAN";if(/^\d+$/.test(e))return r>=6?"NUMERIC_ID":null;if(r>=8&&/^[0-9a-f]+$/i.test(e))return"HEX_ID";if(/^[A-Z][A-Z0-9]*$/.test(e)&&!/^\d+$/.test(e))return"ALL_UPPER";if(r>=6&&/^[A-Za-z0-9_-]+$/.test(e)&&/\d/.test(e)&&/[A-Za-z]/.test(e))return"OPAQUE_ID_ALPHANUMERIC";let o=e.trim().split(/\s+/).length,n=/[.!?,;:]/.test(e);return o>=2?n||/[a-z][A-Z]/.test(e)||e.length>40?"SENTENCE_TEXT":/^[A-Z]/.test(e)&&/\b[A-Z][a-z]+/.test(e)?"TITLE_CASE_WORDS":/^[a-z]/.test(e)&&!/[A-Z]/.test(e)?"LOWER_WORDS":"SENTENCE_TEXT":/^[A-Z][a-z]+$/.test(e)?"TITLE_CASE_WORDS":/^[a-z]+$/.test(e)?"LOWER_WORDS":null}function cc(t){if(!t||t.length===0)return"OTHER";let e=new Map,r=new Map,o=0;for(let a of t){let s=j_(a);s&&(o++,e.set(s,(e.get(s)||0)+1),r.has(s)||r.set(s,new Set),r.get(s).add(String(a).length))}if(o===0)return"OTHER";let n=null,i=0;for(let[a,s]of e.entries())s>i&&(i=s,n=a);if(!n)return"OTHER";if(i/t.length<.7)return"MIXED";if(n==="ALL_UPPER"){let a=r.get("ALL_UPPER");if(a.size===1)return`ALL_UPPER_FIXED_${a.values().next().value}`}return n}var dr=b7(tr(),1);/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var W_=12,V_=100,U_=.3,G_=.9,q_=120,K_=1900,Y_=2100,J_=0,Q_=20,eP=new Set(["id","ids","uuid","guid","key","zip","zipcode","postal","postalcode","ssn","code","codes","sku","isbn","msisdn","imei"]);function y5(t){if(!t)return!1;let e=t.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_\-./]+/g," ").toLowerCase().split(/\s+/).filter(r=>r.length>0);return e.length===0?!1:eP.has(e[e.length-1])}var tP=/\b(year|yr|fy|fiscal\s*year|calendar\s*year)\b/i,rP=/^(?:(?:19|20)\d{2}(?:[-/ ]?(?:q[1-4]|w(?:0?[1-9]|[1-4]\d|5[0-3])|(?:0?[1-9]|1[0-2])))?|q[1-4][-/ ](?:19|20)\d{2}|(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*[-/ ]?(?:19|20)?\d{2})$/i;function ur(t){if(!Number.isInteger(t)||t<190001||t>210012)return!1;let e=t%100;return e>=1&&e<=12}function pr(t){if(!Number.isInteger(t)||t<19000101||t>21001231)return!1;let e=Math.floor(t/100)%100,r=t%100;return e>=1&&e<=12&&r>=1&&r<=31}function oP(t,e){if(!e||!/\b(?:19|20)\d{2}\b/.test(t))return!1;let r=t.replace(/\b(?:19|20)\d{2}\b/g,"").replace(/[-/.,]/g," ").trim();if(!r)return!1;let o=m5(r);return o.length>0&&e[o]!==void 0}function uc(t){let{dataType:e,name:r,isMeasure:o,distinctCount:n}=t;if(e==="DateTime")return!0;if(o)return!1;if(e==="Integer"||e==="Decimal"){let i=t.minNum,a=t.maxNum;if(!(i!=null&&a!=null&&Number.isFinite(i)&&Number.isFinite(a)&&Number.isInteger(i)&&Number.isInteger(a)&&a>=i))return!1;let s=i>=1900&&a<=2100;if(s&&n>=2&&tP.test(r)||s&&n>=3&&n===a-i+1)return!0;let l=ur(i)&&ur(a),c=pr(i)&&pr(a);if(l||c){if(!t.sampleValues)return!0;let p=0,u=0;for(let m of t.sampleValues){if(m==null||m==="")continue;p++;let y=Number(String(m).trim());if(Number.isFinite(y)&&(l?ur(y):pr(y))&&u++,p>=60)break}if(p>=2&&u===p)return!0}return!1}if(t.sampleValues){let i=t.locale?Kl(t.locale):null,a=0,s=0;for(let l of t.sampleValues){if(l==null||l==="")continue;a++;let c=String(l).trim();if((rP.test(c)||oP(c,i))&&s++,a>=60)break}if(a>=2&&s/a>=.8)return!0}return!1}function pc(t){let e=(t||"").trim().toLowerCase();return e.startsWith("sum ")||e.startsWith("total ")?"sum":e.startsWith("average ")||e.startsWith("avg. ")?"avg":e.startsWith("count ")||e.startsWith("distinct count ")||e.startsWith("count (distinct) ")?"count":e.startsWith("min ")||e.startsWith("minimum ")?"min":e.startsWith("max ")||e.startsWith("maximum ")?"max":null}function dc(t){let{rows:e,measureColIdx:r,measureName:o,candidateDims:n,minNum:i,maxNum:a,discourageAgg:s}=t,l=100,c=.01,p="";for(let m of n){if(m.distinct<2||m.distinct>l)continue;let y=n.filter(M=>M.idx!==m.idx).map(M=>M.idx),d=new Map;for(let M of e){let _=M[r];if(typeof _!="number"||!Number.isFinite(_))continue;let S=y.length?y.map(F=>String(M[F])).join(p):"",b=d.get(S);b||(b={sum:0,cset:new Set},d.set(S,b)),b.sum+=_,b.cset.add(String(M[m.idx]))}let h=0,f=0,C=0;for(let M of d.values())M.cset.size<2||(C++,Math.abs(M.sum-100)<=100*c?h++:Math.abs(M.sum-1)<=1*c&&f++);if(C>=2&&(h/C>=.9||f/C>=.9))return{additivity:"part_of_whole",partOfWholeDim:m.name}}if(s)return{additivity:"intensive_rate"};let u=pc(o);return u==="avg"||u==="min"||u==="max"?{additivity:"intensive_rate"}:u==="sum"||u==="count"?{additivity:"additive"}:i!=null&&a!=null&&Number.isFinite(i)&&Number.isFinite(a)&&i>=0&&a<=1.0001&&a>0?{additivity:"intensive_rate"}:{additivity:"unknown"}}function mr(t){let{dataType:e,isMeasure:r,name:o,distinct:n,nonblank:i,prec:a,maxval:s,minval:l}=t,c=s-l+1,p=c>0?n/c:1,u=i>0?n/i:0,m=e==="Decimal"||a>0;return y5(o)?"Categorical":p>=G_&&(ic(o)&&n<=q_||l>=K_&&s<=Y_||l>=J_&&s<=Q_)?"Ordinal":r||n>W_&&(m||n>=V_||u>=U_)?"Continuous":"Categorical"}var yr=class{_computedStatsForLevel=null;_cols=[];_rows=[];_origIndices=[];_rowHashes=new Set;dedupRows=!0;STR(t){return t==null?"":t.toString()}getPrecision(t){if(!isFinite(t))return 0;let e=t.toString().split(".")[1];return e?e.length:0}getColumns(){return this._cols}hasTimeComponent(t){return!(t instanceof Date)||isNaN(t.getTime())?!1:t.getHours()!==0||t.getMinutes()!==0||t.getSeconds()!==0||t.getMilliseconds()!==0}getColumnsWithStats(t,e){if(this._computedStatsForLevel==t)return this._cols;let r=0,o=parseInt(t),n=[];for(let y of this._cols){let d=new Map,h=[],f=0,C=0,M=0,_=null,S=null,b=null,F=!1,$=!0,o3=!0,c3=null,Z=!1;for(let Y of this._rows){let I=Y[r],g=this.STR(I);if(g!=""){if(f+=g.length,d.set(g,(d.get(g)||0)+1),C++,y.dataType=="Integer"||y.dataType=="Decimal"||y.dataType=="DateTime")if((_===null||I<_)&&(_=I),(S===null||I>S)&&(S=I),y.dataType=="Integer"||y.dataType=="Decimal"){if(b===null?b=I:b+=I,y.dataType=="Decimal"){let v=this.getPrecision(I);v>M&&(M=v)}h.push(I)}else F=F||this.hasTimeComponent(I);Z&&(I<c3?$=!1:I>c3&&(o3=!1)),c3=I,Z=!0}}if(C>=3&&($&&!o3?y.sortedDirection="asc":o3&&!$?y.sortedDirection="desc":y.sortedDirection="none"),C>0&&d.size>0&&!y.isMeasure){let Y=0,I=Number.MAX_SAFE_INTEGER;for(let g of d.values())g>Y&&(Y=g),g<I&&(I=g);if(y.modalShare=Y/C,y.minGroupCount=I===Number.MAX_SAFE_INTEGER?null:I,d.size===2){let g=[...d.keys()].map(k=>rr(k).trim().toLowerCase()).sort(),v=[["false","true"],["no","yes"],["n","y"],["0","1"],["f","t"]].some(k=>g[0]===k[0]&&g[1]===k[1]),w=/^(is|has)[_a-z0-9]|(?:default|churn|fraud|approv|convert|active|cancel|delinquen|flag|paid|win|pass|fail)/i.test(y.name);(v||w)&&(y.isBinaryFlag=!0)}}y.dataType=="DateTime"&&(y.dateWithTime=F),y.isTemporal=uc({dataType:y.dataType,name:y.name,isMeasure:y.isMeasure,distinctCount:d.size,minNum:typeof _=="number"?_:null,maxNum:typeof S=="number"?S:null,sampleValues:d.keys(),locale:e}),this.updateColumnStats10(o,y,C,d,M,S,_),this.updateColumnStats20(o,h,C,b,y,f,F,_,S,M,d,e),!y.isMeasure&&(y.dataType==="Integer"||y.dataType==="Decimal")&&mr({dataType:y.dataType,isMeasure:!1,name:y.name,distinct:d.size,nonblank:C,prec:M,maxval:typeof S=="number"?S:0,minval:typeof _=="number"?_:0})==="Continuous"&&(y.isMeasure=!0),n[r]=y.isMeasure||d.size>2e3?null:new Set(d.keys()),r++}let i=[];this._cols.forEach((y,d)=>{y.isMeasure||i.push({idx:d,distinct:y.distinctCount??0,name:y.name})}),this._cols.forEach((y,d)=>{if(!y.isMeasure)return;let h=typeof y.lowValue=="number"?y.lowValue:null,f=typeof y.highValue=="number"?y.highValue:null,C=dc({rows:this._rows,measureColIdx:d,measureName:y.name,candidateDims:i,minNum:h,maxNum:f,discourageAgg:!!y.discourageAggregationAcrossGroups});y.additivity=C.additivity,C.partOfWholeDim&&(y.partOfWholeDim=C.partOfWholeDim)});let a=50,s=i.filter(y=>y.distinct>=2&&y.distinct<=a);this._cols.forEach((y,d)=>{if(!y.isMeasure)return;let h=[];for(let c3 of this._rows){let Z=c3[d];if(Z==null||Z==="")continue;let Y=typeof Z=="number"?Z:parseFloat(Z);isNaN(Y)||h.push(Y)}if(h.length===0)return;let f=[...h].sort((c3,Z)=>c3-Z),C=c3=>f[Math.min(f.length-1,Math.max(0,Math.floor(c3*(f.length-1))))],M=C(.5),_=C(.1),S=C(.9),b=Math.abs(M)>1e-9?Math.abs(M):Math.abs(f[f.length-1])>1e-9?Math.abs(f[f.length-1]):1;y.relativeDispersion=Math.round((S-_)/b*1e3)/1e3;let F=0;for(let c3 of h)F+=c3;F/=h.length;let $=0;for(let c3 of h)$+=(c3-F)*(c3-F);if($<=1e-12)return;let o3=[];for(let c3 of s){let Z=new Map;for(let I of this._rows){let g=I[d];if(g==null||g==="")continue;let v=typeof g=="number"?g:parseFloat(g);if(isNaN(v))continue;let w=this.STR(I[c3.idx])+"",k=Z.get(w);k?(k.s+=v,k.n++):Z.set(w,{s:v,n:1})}let Y=0;for(let I of Z.values()){let g=I.s/I.n;Y+=I.n*(g-F)*(g-F)}o3.push({otherColumn:c3.name,eta2:Math.round(Y/$*1e4)/1e4})}o3.length>0&&(y.groupDiscrimination=o3)});let l=.97,c=5,p=this._cols.map((y,d)=>({c:y,i:d})).filter(y=>y.c.isMeasure);for(let y=0;y<p.length;y++)for(let d=y+1;d<p.length;d++){let h=p[y].i,f=p[d].i,C=0,M=0,_=0,S=0,b=0,F=0;for(let Z of this._rows){let Y=Z[h],I=Z[f];if(Y==null||Y===""||I===null||I===void 0||I==="")continue;let g=typeof Y=="number"?Y:parseFloat(Y),v=typeof I=="number"?I:parseFloat(I);isNaN(g)||isNaN(v)||(C++,M+=g,_+=v,S+=g*g,b+=v*v,F+=g*v)}if(C<c)continue;let $=C*S-M*M,o3=C*b-_*_;if($<=1e-12||o3<=1e-12)continue;let c3=(C*F-M*_)/Math.sqrt($*o3);if(Math.abs(c3)>=l){let Z=p[y].c,Y=p[d].c;Z.collinearWithMeasures||(Z.collinearWithMeasures=[]),Y.collinearWithMeasures||(Y.collinearWithMeasures=[]),Z.collinearWithMeasures.push(Y.name),Y.collinearWithMeasures.push(Z.name)}}for(let y=0;y<this._cols.length;y++){let d=n[y];if(!d||d.size===0)continue;let h=[];for(let f=0;f<this._cols.length;f++){if(f===y)continue;let C=n[f];if(!C||C.size===0)continue;let M=0;for(let S of d)C.has(S)&&M++;let _=Math.round(M/d.size*100);_>0&&h.push({otherColumn:this._cols[f].name,percentShared:_})}h.length>0&&(this._cols[y].sharedValueRatioWithOthers=h)}let u=50,m=[];for(let y=0;y<this._cols.length;y++){let d=n[y];d&&d.size>=2&&d.size<=u&&m.push(y)}if(m.length>=2){let y=new Map,d=(f,C)=>f+":"+C;for(let f=0;f<m.length;f++)for(let C=f+1;C<m.length;C++)y.set(d(m[f],m[C]),new Map);for(let f of this._rows)for(let C=0;C<m.length;C++){let M=this.STR(f[m[C]])+"";for(let _=C+1;_<m.length;_++){let S=""+this.STR(f[m[_]]),b=y.get(d(m[C],m[_])),F=M+""+S;b.set(F,(b.get(F)??0)+1)}}let h=new Map;for(let f=0;f<m.length;f++)for(let C=f+1;C<m.length;C++){let M=m[f],_=m[C],S=n[M].size,b=n[_].size,F=y.get(d(M,_)),$=F.size,o3=0;for(let I of F.values())(o3===0||I<o3)&&(o3=I);let c3=Math.round($/(S*b)*100),Z=$===S,Y=$===b;if((this._cols[M].categoricalPairStats||=[]).push({otherColumn:this._cols[_].name,fillPct:c3,determinesOther:Z,minCellCount:o3,distinctCombinations:$}),(this._cols[_].categoricalPairStats||=[]).push({otherColumn:this._cols[M].name,fillPct:c3,determinesOther:Y,minCellCount:o3,distinctCombinations:$}),Z&&S>b){let I=h.get(M);(!I||b<I.card)&&h.set(M,{name:this._cols[_].name,card:b,ratio:b/S})}if(Y&&b>S){let I=h.get(_);(!I||S<I.card)&&h.set(_,{name:this._cols[M].name,card:S,ratio:S/b})}}for(let[f,C]of h)this._cols[f].primaryParentColumn=C.name,this._cols[f].nestingRatio=Math.round(C.ratio*100)/100}return this._computedStatsForLevel=t,this._cols}updateColumnStats20(t,e,r,o,n,i,a,s,l,c,p,u){if(t>=20){let m=[...e].sort((h,f)=>h-f),y=Math.floor(m.length/2);if(r>0&&o!=null?n.avgValue=n.dataType=="Integer"?Math.round(o/r):o/r:n.avgValue=null,r>0&&(n.avgLength=i/r),this._rows.length>0&&(n.dataType!="DateTime"||a||!s?n.lowValue=s:n.lowValue=new Date(s).toISOString().slice(0,10)+"T00:00:00.000Z",n.dataType!="DateTime"||a||!l?n.highValue=l:n.highValue=new Date(l).toISOString().slice(0,10)+"T00:00:00.000Z",n.medianValue=m.length===0?null:m.length%2===0?n.dataType=="Integer"?Math.round((m[y-1]+m[y])/2):(m[y-1]+m[y])/2:m[y],n.numericPrecision=c),m.length>0){let h=n.avgValue??0,f=m.length,C=0,M=0;for(let S of m){let b=S-h;C+=b*b,M+=b*b*b}let _=C/f;n.skewness=_===0?0:M/f/Math.pow(Math.sqrt(_),3),n.stdDev=Math.sqrt(_)}o!==null&&(n.sum=o);let d=Array.from(p.entries()).sort((h,f)=>f[1]-h[1]);if(n.topCategories=d.slice(0,10).map(h=>h[1]),!n.isMeasure&&d.length>0){if(n.dataType==="String"){let f=d.map(M=>M[0]);n.formatSignature=cc(f);let C=/^(UUID|EMAIL_LIKE|URL_LIKE|PHONE_LIKE|NUMERIC_ID|HEX_ID|OPAQUE_ID_ALPHANUMERIC|DATE_STR|BOOLEAN)$/;n.formatSignature&&!C.test(n.formatSignature)&&(n.avgLength===void 0||n.avgLength>=3)&&(n.isFreeText=!0)}else n.topCategoryValues=d.slice(0,5).map(f=>f[0]);if(t>=20){let f=d.map(M=>M[0]),C=lc(f,u);if(C!==null)n.ordinalPattern=C.pattern,n.orderedDomain=C.orderedDomain;else if(n.dataType==="String"){let M=sc(f);M!==null&&(n.safeDistinctValues=M)}}let h=ec(d.map(f=>f[0]),n.name,u);h!==null&&(n.geoKind=h.geoKind,n.geoMatchPct=h.geoMatchPct,h.geoAmbiguous&&(n.geoAmbiguous=!0))}if(m.length>=8&&(n.dataType==="Integer"||n.dataType==="Decimal")){let h=f=>m[Math.floor((m.length-1)*f)];n.quantiles={p05:h(.05),p25:h(.25),p75:h(.75),p95:h(.95)}}}}updateColumnStats10(t,e,r,o,n,i,a){t>=10&&(e.blankCount=this._rows.length-r,e.distinctCount=o.size+(e.blankCount!=0?1:0),e.valueNature="Categorical",r>0&&(e.dataType==="Integer"||e.dataType==="Decimal"?e.valueNature=mr({dataType:e.dataType,isMeasure:!!e.isMeasure,name:e.name,distinct:o.size,nonblank:r,prec:n,maxval:i,minval:a}):e.dataType==="DateTime"&&(e.valueNature=e.dateWithTime?"Continuous":"Ordinal")))}getRowCount(){return this._rows.length}getLeafCardinality(){if(this._leafCardinality!==null)return this._leafCardinality;let t=[];if(this._cols.forEach((r,o)=>{r.isMeasure||t.push(o)}),t.length===0)return this._leafCardinality=this._rows.length,this._leafCardinality;let e=new Set;for(let r of this._rows)e.add(JSON.stringify(t.map(o=>r[o])));return this._leafCardinality=e.size,this._leafCardinality}_leafCardinality=null;obfuscateString(t){let e="abcdefghijklmnopqrstuvwxyz",r=()=>e[Math.floor(k8()*e.length)],o=()=>r().toUpperCase(),n=()=>Math.floor(k8()*10).toString(),i=y=>/[A-Z]/.test(y)?o():/[a-z]/.test(y)?r():/[0-9]/.test(y)?n():y,a=t.includes("@")&&t.includes("."),s=a?t.split("@"):[t],l=a?s[1]:"",c=l.endsWith(".com"),p=c?".com":"",u=c?l.slice(0,-4):l,m=y=>{let d="";for(let h of y)d+=i(h),/[a-zA-Z0-9]/.test(h)&&k8()<.2&&(d+=i(h));if(d.length>6){let h=Math.floor(k8()*Math.min(3,d.length-6));for(let f=0;f<h;f++){let C=0;for(;C<5;){let M=Math.floor(k8()*d.length);if(/[a-zA-Z0-9]/.test(d[M])){d=d.slice(0,M)+d.slice(M+1);break}C++}}}return d};if(a){let y=m(s[0]),d=m(u);return`${y}@${d}${p}`}else return m(t)}toObjectArray(){return this._rows.map(t=>{let e={};return this._cols.forEach((r,o)=>{e[r.name]=t[o]}),e})}async getCSVAsync(t){let e=[],r=t?25:1e7,o=t?4e3:1e7,n=new Map;for(let i of this._rows){let a={};for(let s=0;s<this._cols.length;s++){let l=this._cols[s],c=i[s];if(this.STR(c)!=""){if(t&&l.dataType=="String")if(n.has(c))c=n.get(c);else{let p=this.obfuscateString(c);n.set(c,p),c=p}else l.dataType=="DateTime"&&!l.dateWithTime&&(c=new Date(c).toISOString().slice(0,10)+"T00:00:00.000Z");o-=this.STR(c).length}else c=null;a[s]=c,--o}if(e.push(a),--r,r<=0||o<=0)break}return await dr.default.unparse(e,{header:!1})}getCSVHeaderLine(){return dr.default.unparse([this._cols.map(t=>this.STR(t.name))])}addRow(t,e){if(this.dedupRows){let r="";for(let n of t)r+=this.STR(n)+"~";let o=m9(r);if(this._rowHashes.has(o))return!1;this._rowHashes.add(o)}return this._rows.push(t),this._origIndices.push(e??-1),!0}getOriginalRowIndex(t){return t<0||t>=this._origIndices.length?-1:this._origIndices[t]}reset(){this._cols=[],this._rows=[],this._origIndices=[],this._rowHashes=new Set,this._leafCardinality=null}setColumns(t){this._cols=t}};/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var nP=500,yc=/^[+-]?\d{1,15}$/,hc=/^[+-]?(\d{1,3}(,\d{3})*|\d+)(\.\d+)?([eE][+-]?\d+)?$/,iP=/^\d{4}-\d{2}-\d{2}([T ]\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:?\d{2})?)?$/,aP=/^\d{1,2}[\/\-.]\d{1,2}[\/\-.]\d{2,4}$/;function sP(t){let e=0,r=0,o=0,n=0;for(let i of t){if(i==null)continue;if(typeof i=="number"){n++,r++,Number.isInteger(i)&&e++;continue}if(i instanceof Date){n++,o++;continue}if(typeof i=="boolean"){n++;continue}let a=String(i).trim();if(a!==""){if(n++,yc.test(a)){e++,r++;continue}if(hc.test(a)){r++;continue}if((iP.test(a)||aP.test(a))&&!isNaN(Date.parse(a))){o++;continue}}}return n===0?"String":o/n>.9?"DateTime":e===n?"Integer":r===n?"Decimal":"String"}function lP(t,e){if(t==null)return null;if(typeof t=="number")return e==="String"?String(t):t;if(t instanceof Date)return e==="DateTime"?t:t.toISOString();if(typeof t=="boolean")return String(t);let r=String(t).trim();if(r==="")return null;switch(e){case"Integer":return yc.test(r)?parseInt(r,10):null;case"Decimal":return hc.test(r)?parseFloat(r.replace(/,/g,"")):null;case"DateTime":{let o=Date.parse(r);return isNaN(o)?null:new Date(o)}default:return r}}function fc(t,e,r={}){if(t.length===0)throw new Error("no columns provided");let o=t.length,n=t.map((m,y)=>m.dataType??sP(e.slice(0,nP).map(d=>d?.[y]))),i=new Set((r.measures??[]).map(m=>m.toLowerCase())),a=new Set((r.dimensions??[]).map(m=>m.toLowerCase())),s=new Set((r.nonAdditive??[]).map(m=>m.toLowerCase())),l=t.map((m,y)=>{let d=m.name.toLowerCase(),h=m.isMeasure??((n[y]==="Integer"||n[y]==="Decimal")&&!y5(m.name));i.has(d)&&(h=!0),a.has(d)&&(h=!1);let f={name:m.name,dataType:n[y],isMeasure:h};return h&&s.has(d)&&(f.discourageAggregationAcrossGroups=!0),f}),c=new yr;c.setColumns(l);for(let m=0;m<e.length;m++){let y=e[m];c.addRow(Array.from({length:o},(d,h)=>lP(y?.[h],n[h])),m)}let p=c.getColumnsWithStats(r.privacyLevel??"20",r.locale??"en"),u=new Map(p.map(m=>[m.name,m]));t.forEach(m=>{let y=u.get(m.name);y&&(m.format&&(y.modelFormat=m.format),m.description&&(y.modelDesc=m.description))});for(let[m,y]of Object.entries(r.formats??{})){let d=u.get(m);d&&(d.modelFormat=y)}for(let[m,y]of Object.entries(r.descriptions??{})){let d=u.get(m);d&&(d.modelDesc=y)}for(let m of r.groupBy??[]){let y=u.get(m);y&&(y.isGrouping=!0)}return{shape:p,totalRows:c.getRowCount(),sampleCsv:null,index:c}}function hr(t,e={}){let r=mc.default.parse(t,{skipEmptyLines:!0});if(r.errors?.length&&r.data.length===0)throw new Error(`CSV parse failed: ${r.errors[0].message}`);let o=r.data;if(o.length<2)throw new Error("CSV needs a header line plus at least one data row.");let n=o[0].map(i=>(i??"").trim());return fc(n.map(i=>({name:i})),o.slice(1),e)}function gc(t,e,r={}){if(!t||t.length===0)throw new Error("profileTabular: at least one column is required");if(!e||e.length===0)throw new Error("profileTabular: at least one row is required");let o=t.map(i=>i.name),n=e.map(i=>Array.isArray(i)?i:o.map(a=>i[a]));return fc(t,n,r)}async function Mc(t,e){return parseInt(e)>=30&&(t.sampleCsv=await t.index.getCSVAsync(!0)),t}import{gzipSync as cP}from"node:zlib";import{randomBytes as gr}from"node:crypto";import{readFileSync as uP}from"node:fs";import{homedir as pP}from"node:os";import{join as dP}from"node:path";/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var Cc="2Qy@Y\\{>",mP="2.0.8.0";function vc(t=process.env){let e=t.BIC_CREDENTIALS_FILE||dP(pP(),".bic","credentials.json");try{return JSON.parse(uP(e,"utf-8"))}catch{return{}}}function _c(t=process.env){let e=vc(t),r={licenseKey:t.BIC_LICENSE_KEY??e.licenseKey??"",licensee:t.BIC_LICENSEE??e.licensee??"",secretKey:t.BIC_SECRET_KEY??e.secretKey??""};if(!r.licenseKey||!r.licensee)throw new Error(`Missing BIC trial/paid credentials. Set BIC_LICENSE_KEY + BIC_LICENSEE (BIC_SECRET_KEY optional) in the MCP server's env, or put {"licenseKey":"\u2026","licensee":"\u2026"} in ~/.bic/credentials.json. MCP access requires a trial or paid account (no freemium).`);return r}function Pc(t=process.env){let e=vc(t);return(t.BIC_URL??e.url??"https://bizintelligencechampions.com").replace(/\/+$/,"")}function Ac(t){let e=Buffer.from(JSON.stringify(t),"utf-8");return cP(e,{level:6}).toString("base64").replace(/\//g,".")}function Sc(t,e,r=process.env){let o=gr(16).toString("hex"),n=t.shape.reduce((i,a)=>!a.isMeasure&&(a.distinctCount??0)>i?a.distinctCount:i,0);return{payload:{licenseKey:e.licenseKey,licensee:e.licensee,secretKey:e.secretKey,freemiumKey:"",clientVersion:r.BIC_MCP_CLIENT_VERSION??mP,host:"SDK",supportsStreaming:!0,height:t.height??600,width:t.width??800,totalRows:t.totalRows,cultureCode:t.cultureCode??"en-US",genNew:!0,version:0,identifier:"",temp:7,modifiers:[],backgroundColor:"#ffffff",palette:"",shape:t.shape,model:t.model??r.BIC_MCP_MODEL??"",renderer:t.renderer??"D3",language:t.language??"",sampleCsv:t.sampleCsv??null,clientId:"mcp",triesLeft:3,maxTries:3,rendererSpecificPayload:null,reasoningMode:t.reasoningMode||r.BIC_MCP_REASONING||"",supportsVega:!1,correlationId:o,compactness:"",clientHints:{viewportWidth:t.width??800,viewportHeight:t.height??600,rowCount:t.totalRows,leafCardinality:t.leafCardinality,maxNonMeasureCardinality:n,favorStyle:t.chartHint??"",userCommentary:t.prompt??""}},correlationId:o}}async function yP(t,e){let r=t.body?.getReader?.();if(!r){let l=await t.text();return fr(l.trim())}let o=new TextDecoder,n="",i=null,a=l=>l&&(l.code!==void 0||l.errorMessage!==void 0||l.Code!==void 0||l.ErrorMessage!==void 0);try{for(;;){let{done:l,value:c}=await r.read();if(l)break;n+=o.decode(c,{stream:!0});let p;for(;(p=n.indexOf(`
56
+ `}var d5=class{constructor(e=Gl.stdin,r=Gl.stdout){this._stdin=e,this._stdout=r,this._readBuffer=new p5,this._started=!1,this._ondata=o=>{this._readBuffer.append(o),this.processReadBuffer()},this._onerror=o=>{this.onerror?.(o)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(r=>{let o=Ul(e);this._stdout.write(o)?r():this._stdout.once("drain",r)})}};import{readFileSync as QP,writeFileSync as f5,mkdirSync as eA}from"node:fs";import{join as g5,resolve as Jc}from"node:path";var mc=b7(tr(),1);/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var ql={};function m5(t){return t.toLowerCase().replace(/[.‎‏\s]/g,"")}function Kl(t){let e=t||"en",r=ql[e];if(r)return r;let o={};try{let n=new Intl.DateTimeFormat(e,{month:"long"}),i=new Intl.DateTimeFormat(e,{month:"short"});for(let a=0;a<12;++a){let s=new Date(Date.UTC(2020,a,15));o[m5(n.format(s))]=a,o[m5(i.format(s))]=a}}catch{}return ql[e]=o,o}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */function rr(t){return t!=null?t.toString():""}function m9(t){if(!t)return 0;let e=0xcbf29ce484222325n,r=0x100000001b3n,o=e;for(let n=0;n<t.length;n++)o^=BigInt(t.charCodeAt(n)),o=o*r&0xFFFFFFFFFFFFFFFFn;return Number(o&0x1FFFFFFFFFFFFFn)}function k8(){let t=typeof globalThis<"u"?globalThis:{};if(t.crypto&&typeof t.crypto.getRandomValues=="function"){let e=new Uint32Array(1);return t.crypto.getRandomValues(e),e[0]/4294967296}return Math.floor(Date.now()%4294967295)/4294967296}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var m_="Abasolo|MX11|-101.53|20.45|27,Abbotsford|BC|-122.25|49.06|141,Aberdeen|SD|-98.49|45.46|28,Abilene|TX|-99.73|32.45|125,Abington|PA|-75.12|40.12|55,Acambaro|MX11|-100.72|20.03|57,Acapulco de Juarez|MX12|-99.91|16.85|658,Acatzingo|MX21|-97.78|18.98|25,Acayucan|MX30|-94.91|17.95|50,Actopan|MX13|-98.94|20.27|32,Addison|IL|-87.99|41.93|37,Adelanto|CA|-117.41|34.58|33,Agawam|MA|-72.61|42.07|28,Agincourt North|ON|-79.28|43.8|29,Agua Caliente|CA|-122.49|38.32|27,Agua Dulce|MX30|-94.15|18.14|36,Agua Prieta|MX26|-109.54|31.32|77,Aguascalientes|MX01|-102.28|21.88|722,Ahuntsic-Cartierville|QC|-73.67|45.57|135,Ahwatukee Foothills|AZ|-111.98|33.34|83,Aiken|SC|-81.72|33.56|30,Airdrie|AB|-114.04|51.3|90,Airport|HI|-157.93|21.34|28,Ajalpan|MX21|-97.26|18.38|28,Ajax|ON|-79.03|43.85|119,Akron|OH|-81.52|41.08|197,Alabaster|AL|-86.82|33.24|32,Alafaya|FL|-81.21|28.56|78,Alameda|CA|-122.26|37.77|78,Alamo|MX30|-97.68|20.91|25,Alamogordo|NM|-105.96|32.9|30,Albany|NY|-73.76|42.65|101,Albany|GA|-84.16|31.58|74,Albany|OR|-123.11|44.64|52,Albany Park|IL|-87.72|41.97|52,Albuquerque|NM|-106.65|35.08|564,Alexandria|VA|-77.05|38.8|159,Alexandria|LA|-92.45|31.31|47,Algonquin|IL|-88.29|42.17|30,Alhambra|AZ|-112.13|33.5|127,Alhambra|CA|-118.13|34.1|85,Aliamanu / Salt Lakes / Foster Village|HI|-157.92|21.36|38,Alief|TX|-95.6|29.71|98,Aliso Viejo|CA|-117.73|33.57|50,Allapattah|FL|-80.22|25.81|54,Allen|TX|-96.67|33.1|98,Allen Park|MI|-83.21|42.26|27,Allentown|PA|-75.49|40.61|120,Allston|MA|-71.13|42.36|28,Alma|QC|-71.65|48.55|29,Aloha|OR|-122.87|45.49|49,Alpharetta|GA|-84.29|34.08|63,Altadena|CA|-118.13|34.19|42,Altamira|MX28|-97.94|22.39|59,Altamonte Springs|FL|-81.37|28.66|43,Alton|IL|-90.18|38.89|27,Altoona|PA|-78.39|40.52|45,Alvaro Obregon|MX09|-99.2|19.36|726,Alvin|TX|-95.24|29.42|25,Amarillo|TX|-101.83|35.22|198,Ameca|MX14|-104.05|20.55|36,Amecameca|MX15|-98.77|19.12|31,American Fork|UT|-111.8|40.38|28,Ames|IA|-93.62|42.03|65,Amherst|NY|-78.8|42.98|122,Amherst|MA|-72.52|42.37|39,Amozoc de Mota|MX21|-98.05|19.05|95,Anaheim|CA|-117.91|33.84|350,Ancaster|ON|-79.99|43.22|40,Anchorage|AK|-149.9|61.22|289,Anderson|IN|-85.68|40.11|55,Anderson|SC|-82.65|34.5|27,Andover|MN|-93.29|45.23|32,Ankeny|IA|-93.61|41.73|56,Ann Arbor|MI|-83.74|42.28|117,Annandale|VA|-77.2|38.83|41,Annapolis|MD|-76.49|38.98|40,Annex|ON|-79.4|43.67|30,Antelope|CA|-121.33|38.71|45,Antioch|CA|-121.81|38|110,Apache Junction|AZ|-111.55|33.42|38,Apan|MX13|-98.45|19.71|26,Apaseo el Alto|MX11|-100.62|20.46|27,Apaseo el Grande|MX11|-100.69|20.55|26,Apatzingan|MX16|-102.36|19.09|102,Apex|NC|-78.85|35.73|45,Apizaco|MX29|-98.14|19.41|49,Apopka|FL|-81.51|28.68|48,Apple Valley|CA|-117.19|34.5|72,Apple Valley|MN|-93.22|44.73|51,Appleton|WI|-88.42|44.26|74,Arandas|MX14|-102.35|20.71|52,Arcadia|CA|-118.04|34.14|58,Arcola East|SK|-104.54|50.43|33,Arden-Arcade|CA|-121.38|38.6|92,Ardmore|OK|-97.14|34.17|25,Arlington|TX|-97.11|32.74|388,Arlington|VA|-77.1|38.88|207,Arlington|MA|-71.16|42.42|42,Arlington Heights|IL|-87.98|42.09|75,Arvada|CO|-105.09|39.8|115,Ashburn|VA|-77.49|39.04|43,Ashburn|IL|-87.71|41.75|42,Asheboro|NC|-79.81|35.71|26,Asheville|NC|-82.55|35.6|95,Ashmont|MA|-71.07|42.28|30,Aspen Hill|MD|-77.07|39.08|48,Astoria|NY|-73.93|40.77|150,Atascadero|CA|-120.67|35.49|29,Atascocita|TX|-95.18|30|65,Athens|GA|-83.38|33.96|127,Athens|OH|-82.1|39.33|25,Atlanta|GA|-84.39|33.75|510,Atlantic City|NJ|-74.42|39.36|39,Atlixco|MX21|-98.44|18.91|86,Atotonilco el Alto|MX14|-102.51|20.55|26,Attleboro|MA|-71.29|41.94|44,Atwater|CA|-120.61|37.35|29,Auburn|WA|-122.23|47.31|77,Auburn|AL|-85.48|32.61|62,Auburn|NY|-76.57|42.93|26,Auburn Gresham|IL|-87.65|41.74|45,Augusta|GA|-81.97|33.47|43,Aurora|CO|-104.83|39.73|359,Aurora|IL|-88.32|41.76|200,Aurora|ON|-79.47|44|55,Austin|TX|-97.74|30.27|974,Austintown|OH|-80.76|41.1|29,Autlan de Navarro|MX14|-104.37|19.77|45,Aventura|FL|-80.14|25.96|37,Avondale|AZ|-112.35|33.44|80,Avondale|IL|-87.71|41.94|39,Aylmer|QC|-75.81|45.4|56,Azcapotzalco|MX09|-99.19|19.49|414,Azusa|CA|-117.91|34.13|49,Back Mountain|PA|-76|41.34|26,Bakersfield|CA|-119.02|35.37|373,Balch Springs|TX|-96.62|32.73|25,Baldwin Park|CA|-117.96|34.09|77,Ballwin|MO|-90.55|38.6|30,Baltimore|MD|-76.61|39.29|585,Banbury-Don Mills|ON|-79.35|43.74|27,Bangor|ME|-68.77|44.8|32,Banning|CA|-116.88|33.93|30,Barberton|OH|-81.61|41.01|26,Barnstable|MA|-70.3|41.7|47,Barrie|ON|-79.67|44.4|147,Bartlesville|OK|-95.98|36.75|36,Bartlett|TN|-89.87|35.2|58,Bartlett|IL|-88.19|42|41,Batavia|IL|-88.31|41.85|26,Bath Beach|NY|-74|40.6|33,Baton Rouge|LA|-91.19|30.44|227,Battle Creek|MI|-85.18|42.32|51,Bay City|MI|-83.89|43.59|33,Bay Shore|NY|-73.25|40.73|26,Bay Street Corridor|ON|-79.39|43.66|25,Bayonne|NJ|-74.11|40.67|66,Bayside|NY|-73.78|40.77|66,Baytown|TX|-94.98|29.74|76,Bayview-Hunters Point|CA|-122.38|37.73|34,Beaumont|TX|-94.1|30.09|115,Beaumont|CA|-116.98|33.93|43,Beauport|QC|-71.19|46.86|81,Beavercreek|OH|-84.06|39.71|46,Beaverton|OR|-122.8|45.49|96,Bedford|TX|-97.14|32.84|49,Bel Air North|MD|-76.37|39.55|30,Bel Air South|MD|-76.32|39.51|47,Bell|CA|-118.19|33.98|36,Bell Gardens|CA|-118.15|33.97|43,Bella Vista|AR|-94.27|36.48|27,Belleville|ON|-77.38|44.17|50,Belleville|IL|-89.98|38.52|42,Belleville|NJ|-74.15|40.79|36,Bellevue|WA|-122.2|47.61|139,Bellevue|NE|-95.89|41.14|55,Bellflower|CA|-118.12|33.88|78,Bellingham|WA|-122.49|48.76|85,Belmont|CA|-122.28|37.52|27,Belmont Cragin|IL|-87.77|41.93|79,Beloit|WI|-89.03|42.51|36,Beltline|AB|-114.07|51.04|25,Belvidere|IL|-88.84|42.26|25,Bend|OR|-121.32|44.06|87,Bendale|ON|-79.25|43.77|29,Benicia|CA|-122.16|38.05|28,Benito Juarez|MX09|-99.16|19.37|385,Benito Juarez|MX09|-99.16|19.4|355,Bensalem|PA|-74.95|40.1|60,Bensonhurst|NY|-73.99|40.6|60,Benton|AR|-92.59|34.56|34,Bentonville|AR|-94.21|36.37|44,Bergenfield|NJ|-74|40.93|27,Berkeley|CA|-122.27|37.87|120,Berriozabal|MX05|-93.27|16.8|28,Berwyn|IL|-87.79|41.85|56,Bessemer|AL|-86.95|33.4|26,Bethel Park|PA|-80.04|40.33|32,Bethesda|MD|-77.1|38.98|60,Bethlehem|PA|-75.37|40.63|74,Bettendorf|IA|-90.52|41.52|35,Beverly|MA|-70.88|42.56|41,Beverly Cove|MA|-70.85|42.55|40,Beverly Hills|CA|-118.4|34.07|34,Big Spring|TX|-101.48|32.25|28,Billerica|MA|-71.27|42.56|39,Billings|MT|-108.5|45.78|117,Biloxi|MS|-88.89|30.4|45,Binghamton|NY|-75.92|42.1|46,Birmingham|AL|-86.8|33.52|196,Bismarck|ND|-100.78|46.81|75,Blacksburg|VA|-80.41|37.23|44,Blaine|MN|-93.23|45.16|62,Blainville|QC|-73.88|45.67|46,Bloomfield|NJ|-74.19|40.81|49,Bloomington|MN|-93.3|44.84|86,Bloomington|IN|-86.53|39.17|84,Bloomington|IL|-88.99|40.48|78,Blue Springs|MO|-94.28|39.02|54,Boardman|OH|-80.66|41.02|35,Boca Raton|FL|-80.08|26.36|93,Boisbriand|QC|-73.83|45.62|26,Boise|ID|-116.2|43.61|235,Bolingbrook|IL|-88.07|41.7|74,Bolton|ON|-79.74|43.88|26,Bonita Springs|FL|-81.78|26.34|51,Borough Park|NY|-74|40.63|149,Bossier City|LA|-93.73|32.52|68,Boston|MA|-71.06|42.36|653,Bothell|WA|-122.21|47.76|42,Boucherville|QC|-73.44|45.59|39,Boulder|CO|-105.27|40.01|106,Bountiful|UT|-111.88|40.89|43,Bowie|MD|-76.73|38.94|58,Bowling Green|KY|-86.44|36.99|63,Bowling Green|OH|-83.65|41.37|31,Bowmanville|ON|-78.68|43.92|39,Boyle Heights|CA|-118.21|34.03|92,Boynton Beach|FL|-80.07|26.53|73,Bozeman|MT|-111.04|45.68|43,Bradenton|FL|-82.57|27.5|54,Braintree|MA|-71|42.2|37,Brampton|ON|-79.77|43.68|656,Brandon|FL|-82.29|27.94|103,Brandon|MB|-99.95|49.85|48,Branford|CT|-72.82|41.28|29,Brant|ON|-80.35|43.13|34,Brantford|ON|-80.27|43.13|104,Brawley|CA|-115.53|32.98|25,Brea|CA|-117.9|33.92|41,Bremerton|WA|-122.63|47.57|39,Brentwood|NY|-73.25|40.78|60,Brentwood|CA|-121.7|37.93|58,Brentwood|TN|-86.78|36.03|41,Brentwood|CA|-118.47|34.05|33,Brentwood Estates|TN|-86.78|36.03|31,Briarwood|NY|-73.82|40.71|53,Brick|NJ|-74.14|40.06|76,Bridgeport|CT|-73.19|41.18|147,Bridgeport|IL|-87.65|41.84|33,Bridgeton|NJ|-75.23|39.43|25,Bridgewater|NJ|-74.65|40.6|44,Brighouse-City Centre|BC|-123.13|49.17|62,Brighton|MA|-71.16|42.35|45,Brighton|CO|-104.82|39.99|37,Brighton|NY|-77.55|43.15|36,Brighton Beach|NY|-73.96|40.58|31,Brighton Park|IL|-87.7|41.82|44,Bristol|CT|-72.95|41.67|60,Bristol|TN|-82.19|36.6|26,Brockton|MA|-71.02|42.08|95,Broken Arrow|OK|-95.79|36.05|106,Brookfield|WI|-88.11|43.06|38,Brookhaven|GA|-84.34|33.86|51,Brooklin|ON|-78.96|43.96|25,Brookline|MA|-71.12|42.33|58,Brooklyn|NY|-73.95|40.65|2736,Brooklyn Center|MN|-93.33|45.08|30,Brooklyn Park|MN|-93.36|45.09|79,Broomfield|CO|-105.09|39.92|65,Brossard|QC|-73.47|45.45|69,Brownsville|TX|-97.5|25.9|186,Brownsville|NY|-73.92|40.66|74,Brunswick|OH|-81.84|41.24|34,Bryan|TX|-96.37|30.67|82,Buckeye|AZ|-112.58|33.37|50,Buena Park|CA|-118|33.87|83,Buenaventura Lakes|FL|-81.35|28.34|26,Buenavista|MX15|-99.17|19.61|216,Buffalo|NY|-78.88|42.89|258,Buffalo Grove|IL|-87.96|42.15|41,Bullhead City|AZ|-114.57|35.15|39,Burbank|CA|-118.31|34.18|105,Burbank|IL|-87.78|41.73|29,Burien|WA|-122.35|47.47|50,Burke|VA|-77.27|38.79|41,Burleson|TX|-97.32|32.54|43,Burlingame|CA|-122.37|37.58|30,Burlington|ON|-79.84|43.39|186,Burlington|NC|-79.44|36.1|52,Burlington|VT|-73.21|44.48|42,Burlington|IA|-91.11|40.81|25,Burnaby|BC|-122.95|49.27|249,Burnsville|MN|-93.28|44.77|61,Burton|MI|-83.62|43|28,Bushwick|NY|-73.92|40.69|112,Bustleton|PA|-75.03|40.08|32,Butte|MT|-112.53|46|34,Cabo San Lucas|MX03|-109.91|22.89|202,Cabot|AR|-92.02|34.97|25,Cadereyta|MX19|-99.98|25.58|67,Cadereyta Jimenez|MX19|-100|25.59|68,Caldwell|ID|-116.69|43.66|51,Caledon|ON|-79.99|43.87|76,Calexico|CA|-115.5|32.68|40,Calgary|AB|-114.09|51.05|1306,Calpulalpan|MX29|-98.57|19.59|33,Calumet City|IL|-87.53|41.62|37,Camarillo|CA|-119.04|34.22|67,Cambridge|ON|-80.31|43.36|129,Cambridge|MA|-71.11|42.38|110,Camden|NJ|-75.12|39.93|76,Campbell|CA|-121.95|37.29|41,Campbell River|BC|-125.24|50.02|33,Campeche|MX04|-90.52|19.84|220,Cananea|MX26|-110.3|30.98|31,Canarsie|NY|-73.9|40.64|87,Cancun|MX23|-86.85|21.17|888,Canoga Park|CA|-118.6|34.2|60,Canton|MI|-83.48|42.31|86,Canton|OH|-81.38|40.8|71,Canton|GA|-84.49|34.24|25,Cantonment|FL|-87.34|30.61|26,Canyon Country|CA|-118.47|34.42|59,Cape Coral|FL|-81.95|26.56|175,Cape Girardeau|MO|-89.52|37.31|39,Carbondale|IL|-89.22|37.73|26,Cardenas|MX27|-93.38|18|91,Carlsbad|CA|-117.35|33.16|114,Carlsbad|NM|-104.23|32.42|28,Carmel|IN|-86.12|39.98|88,Carmichael|CA|-121.33|38.62|61,Carney|MD|-76.52|39.39|29,Carol City|FL|-80.25|25.94|63,Carol Stream|IL|-88.13|41.91|40,Carpentersville|IL|-88.26|42.12|38,Carrollton|TX|-96.89|32.95|133,Carrollton|GA|-85.08|33.58|26,Carrollwood|FL|-82.49|28.05|33,Carrollwood Village|FL|-82.52|28.07|40,Carson|CA|-118.28|33.83|93,Carson City|NV|-119.77|39.16|58,Cartierville|QC|-73.7|45.53|34,Cary|NC|-78.78|35.79|159,Casa Grande|AZ|-111.76|32.88|51,Casas Adobes|AZ|-111|32.32|66,Casper|WY|-106.31|42.87|60,Casselberry|FL|-81.33|28.68|27,Castle Rock|CO|-104.86|39.37|55,Castlewood|CO|-104.9|39.58|25,Castro Valley|CA|-122.09|37.69|61,Catalina Foothills|AZ|-110.92|32.3|50,Catemaco|MX30|-95.11|18.42|27,Cathedral City|CA|-116.47|33.78|53,Catonsville|MD|-76.73|39.27|41,Cedar City|UT|-113.06|37.68|30,Cedar Falls|IA|-92.45|42.53|41,Cedar Hill|TX|-96.96|32.59|48,Cedar Park|TX|-97.82|30.51|65,Cedar Rapids|IA|-91.64|42.01|130,Celaya|MX11|-100.81|20.52|340,Celina|TX|-96.78|33.32|64,Centennial|CO|-104.88|39.58|109,Center City|PA|-75.16|39.95|57,Centereach|NY|-73.1|40.86|31,Central|LA|-91.04|30.55|28,Central 14th Street / Spring Road|DC|-77.03|38.94|25,Central City|AZ|-112.06|33.44|58,Central Islip|NY|-73.2|40.79|34,Centre City|AB|-114.07|51.05|41,Centretown|ON|-75.7|45.42|25,Centreville|VA|-77.43|38.84|71,Centro Familiar la Soledad|MX11|-101.75|21.14|32,Ceres|CA|-120.96|37.59|47,Cerritos|CA|-118.06|33.86|49,Chalco|MX15|-98.9|19.26|168,Chamblee|GA|-84.3|33.89|28,Champaign|IL|-88.24|40.12|86,Champoton|MX04|-90.72|19.34|30,Chandler|AZ|-111.84|33.31|260,Chanhassen|MN|-93.53|44.86|25,Channelview|TX|-95.11|29.78|38,Chapel Hill|NC|-79.06|35.91|59,Charlesbourg|QC|-71.31|46.9|82,Charleston|SC|-79.93|32.78|132,Charleston|WV|-81.63|38.35|46,Charlotte|NC|-80.84|35.23|911,Charlottesville|VA|-78.48|38.03|46,Charlottetown|PE|-63.13|46.23|38,Chaska|MN|-93.6|44.79|25,Chateauguay|QC|-73.75|45.38|42,Chatham|ON|-82.18|42.41|43,Chatham|IL|-87.61|41.74|31,Chatsworth|CA|-118.6|34.26|41,Chattanooga|TN|-85.31|35.05|181,Cheektowaga|NY|-78.75|42.9|75,Chelmsford|MA|-71.37|42.6|33,Chelsea|MA|-71.03|42.39|39,Cherry Hill|NJ|-75.03|39.93|70,Chesapeake|VA|-76.27|36.82|235,Cheshire|CT|-72.9|41.5|29,Chester|PA|-75.36|39.85|34,Chesterfield|MO|-90.58|38.66|47,Chestermere|AB|-113.82|51.03|32,Chetumal|MX23|-88.3|18.52|169,Cheyenne|WY|-104.82|41.14|65,Chiapa de Corzo|MX05|-93.01|16.71|45,Chicago|IL|-87.65|41.85|2664,Chicago Heights|IL|-87.64|41.51|30,Chicago Lawn|IL|-87.7|41.78|55,Chicago Loop|IL|-87.63|41.88|33,Chico|CA|-121.84|39.73|121,Chicoloapan|MX15|-98.9|19.42|172,Chicopee|MA|-72.61|42.15|56,Chicoutimi|QC|-71.06|48.42|69,Chihuahua|MX06|-106.09|28.64|925,Chilapa de Alvarez|MX12|-99.17|17.6|31,Chilliwack|BC|-121.95|49.17|101,Chilliwack-Downtown|BC|-121.96|49.16|31,Chillum|MD|-76.99|38.96|33,Chilpancingo|MX12|-99.5|17.55|187,Chinatown|CA|-122.41|37.8|100,Chinatown|NY|-74|40.72|90,Chino|CA|-117.69|34.01|85,Chino Hills|CA|-117.76|33.99|78,Cholula|MX21|-98.3|19.06|292,Chomedey|QC|-73.75|45.53|94,Chula Vista|CA|-117.08|32.64|265,Church-Yonge Corridor|ON|-79.38|43.66|31,Cibolo|TX|-98.23|29.56|33,Cicero|IL|-87.75|41.85|83,Cicero|NY|-76.12|43.18|31,Cihuatlan|MX14|-104.57|19.24|40,Cincinnati|OH|-84.51|39.13|311,Cintalapa de Figueroa|MX05|-93.72|16.68|42,Citrus Heights|CA|-121.28|38.71|87,City of Milford (balance)|CT|-73.06|41.22|51,City of Sammamish|WA|-122.04|47.6|45,Ciudad Acuna|MX07|-100.95|29.32|216,Ciudad Altamirano|MX12|-100.67|18.36|25,Ciudad Apodaca|MX19|-100.19|25.78|467,Ciudad Benito Juarez|MX19|-100.09|25.65|308,Ciudad Constitucion|MX03|-111.66|25.03|40,Ciudad de Allende|MX19|-100.02|25.28|26,Ciudad de Huajuapan de Leon|MX20|-97.78|17.81|53,Ciudad de Villa de Alvarez|MX08|-103.74|19.27|117,Ciudad del Carmen|MX04|-91.83|18.65|191,Ciudad Delicias|MX06|-105.47|28.19|148,Ciudad Fernandez|MX24|-100.01|21.94|32,Ciudad General Escobedo|MX19|-100.32|25.8|454,Ciudad Guzman|MX14|-103.46|19.7|111,Ciudad Hidalgo|MX16|-100.56|19.69|60,Ciudad Juarez|MX06|-106.46|31.72|1512,Ciudad Lazaro Cardenas|MX16|-102.2|17.96|196,Ciudad Lopez Mateos|MX15|-99.26|19.56|489,Ciudad Madero|MX28|-97.84|22.25|197,Ciudad Mante|MX28|-98.97|22.74|84,Ciudad Melchor Muzquiz|MX07|-101.52|27.88|35,Ciudad Mendoza|MX30|-97.18|18.81|35,Ciudad Nezahualcoyotl|MX15|-99.01|19.4|1077,Ciudad Obregon|MX26|-109.94|27.49|329,Ciudad Rio Bravo|MX28|-98.09|25.99|95,Ciudad Sabinas Hidalgo|MX19|-100.18|26.5|33,Ciudad Sahagun|MX13|-98.57|19.78|28,Ciudad Valles|MX24|-99.01|22|124,Ciudad Victoria|MX28|-99.14|23.74|332,Clairlea-Birchmount|ON|-79.28|43.71|26,Claremont|CA|-117.72|34.1|36,Clarksville|TN|-87.36|36.53|166,Clay|NY|-76.17|43.19|58,Clearfield|UT|-112.03|41.11|30,Clearwater|FL|-82.8|27.97|117,Cleburne|TX|-97.39|32.35|30,Clermont|FL|-81.77|28.55|32,Cleveland|OH|-81.7|41.5|365,Cleveland|TN|-84.88|35.16|43,Cleveland Heights|OH|-81.56|41.52|44,Clifton|NJ|-74.16|40.86|86,Clifton Park|NY|-73.77|42.87|36,Clinton|MD|-76.9|38.77|35,Clinton|IA|-90.19|41.84|26,Clinton|MS|-90.32|32.34|25,Clinton Township|MI|-82.92|42.59|99,Cloverdale|BC|-122.73|49.11|73,Clovis|CA|-119.7|36.83|104,Clovis|NM|-103.21|34.4|39,Coacalco|MX15|-99.11|19.63|277,Coachella|CA|-116.17|33.68|44,Coatepec|MX30|-96.96|19.45|53,Coatzacoalcos|MX30|-94.44|18.15|310,Coatzintla|MX30|-97.47|20.49|34,Cobbs Creek|PA|-75.24|39.95|33,Cochrane|AB|-114.47|51.18|32,Coconut Creek|FL|-80.18|26.25|59,Cocula|MX14|-103.82|20.37|29,Coeur d'Alene|ID|-116.78|47.68|49,Colima|MX08|-103.71|19.24|146,College Park|MD|-76.94|38.98|32,College Point|NY|-73.85|40.79|27,College Station|TX|-96.33|30.63|107,Colleyville|TX|-97.16|32.88|25,Collierville|TN|-89.66|35.04|48,Collinwood|OH|-81.57|41.56|34,Colonia del Sol|MX03|-109.93|22.91|48,Colonia del Valle|MX09|-99.16|19.39|250,Colonia Lindavista|MX15|-99.12|19.49|100,Colonia Nativitas|MX09|-99.14|19.38|60,Colorado Springs|CO|-104.82|38.83|456,Colton|CA|-117.31|34.07|54,Columbia|SC|-81.03|34|142,Columbia|MO|-92.33|38.95|129,Columbia|MD|-76.84|39.24|99,Columbia|TN|-87.04|35.62|36,Columbia Heights|DC|-77.03|38.93|38,Columbus|OH|-83|39.96|913,Columbus|GA|-84.99|32.46|206,Columbus|IN|-85.92|39.2|46,Comalcalco|MX27|-93.22|18.26|41,Comitan|MX05|-92.14|16.24|166,Commack|NY|-73.29|40.84|36,Commerce City|CO|-104.93|39.81|53,Compton|CA|-118.22|33.9|98,Conception Bay South|NL|-53|47.5|27,Concord|CA|-122.03|37.98|128,Concord|NC|-80.58|35.41|87,Concord|NH|-71.54|43.21|43,Coney Island|NY|-73.99|40.58|60,Confederation|SK|-106.7|52.14|70,Conroe|TX|-95.46|30.31|68,Contla|MX29|-98.17|19.33|27,Conway|AR|-92.44|35.09|64,Cookeville|TN|-85.5|36.16|32,Coon Rapids|MN|-93.29|45.12|62,Cooper City|FL|-80.27|26.06|35,Coppell|TX|-97.02|32.95|41,Copperas Cove|TX|-97.9|31.12|33,Coquitlam|BC|-122.78|49.28|148,Coquitlam West|BC|-122.88|49.26|25,Coral Gables|FL|-80.27|25.72|51,Coral Springs|FL|-80.27|26.27|129,Coram|NY|-73|40.87|39,Cordoba|MX30|-96.93|18.88|204,Cordova|TN|-89.78|35.16|68,Core Neighbourhoods|SK|-106.67|52.13|36,Cornelius|NC|-80.86|35.49|28,Cornwall|ON|-74.73|45.02|48,Corona|CA|-117.57|33.88|164,Corona|NY|-73.86|40.75|109,Corpus Christi|TX|-97.4|27.8|316,Cortazar|MX11|-100.96|20.48|61,Corvallis|OR|-123.26|44.56|55,Cosamaloapan|MX30|-95.8|18.37|30,Costa Mesa|CA|-117.92|33.64|113,Cote-Saint-Luc|QC|-73.67|45.47|31,Cottage Grove|MN|-92.94|44.83|35,Cottonwood Heights|UT|-111.81|40.62|34,Council Bluffs|IA|-95.86|41.26|62,Country Club|FL|-80.32|25.95|47,Courtenay|BC|-124.99|49.69|28,Coventry|RI|-71.68|41.7|35,Covina|CA|-117.89|34.09|48,Covington|KY|-84.51|39.08|40,Coyoacan|MX09|-99.16|19.35|614,Coyotepec|MX15|-99.21|19.78|35,Coyula|MX14|-103.23|20.66|29,Cozumel|MX23|-86.94|20.5|77,Cranberry Township|PA|-80.11|40.68|28,Cranston|RI|-71.44|41.78|81,Crofton|MD|-76.69|39|27,Crown Point|IN|-87.37|41.42|28,Crystal Lake|IL|-88.32|42.24|40,Cuauhtemoc|MX09|-99.15|19.45|531,Cuauhtemoc|MX06|-106.87|28.41|168,Cuautitlan|MX15|-99.18|19.67|178,Cuautitlan Izcalli|MX15|-99.22|19.64|555,Cuautla|MX17|-98.94|18.81|157,Cuautlancingo|MX21|-98.27|19.09|25,Cuernavaca|MX17|-99.23|18.93|338,Culiacan|MX25|-107.39|24.8|808,Culver City|CA|-118.4|34.02|39,Cumberland|RI|-71.43|41.97|34,Cupertino|CA|-122.03|37.32|60,Cutler Bay|FL|-80.34|25.58|45,Cutler Ridge|FL|-80.35|25.58|26,Cuyahoga Falls|OH|-81.48|41.13|49,Cypress|TX|-95.7|29.97|200,Cypress|CA|-118.04|33.82|49,Cypress Hills|NY|-73.89|40.68|54,Dakota Ridge|CO|-105.14|39.62|33,Dale City|VA|-77.31|38.64|65,Dallas|TX|-96.81|32.78|1326,Dalton|GA|-84.97|34.77|33,Daly City|CA|-122.46|37.71|106,Dana Point|CA|-117.7|33.47|34,Danbury|CT|-73.45|41.39|84,Dania Beach|FL|-80.14|26.05|31,Danvers|MA|-70.93|42.58|26,Danville|CA|-122|37.82|44,Danville|VA|-79.4|36.59|42,Danville|IL|-87.63|40.12|32,Dartmouth|NS|-63.58|44.67|101,Davenport|IA|-90.58|41.52|102,Davie|FL|-80.23|26.06|100,Davis|CA|-121.74|38.54|67,Dayton|OH|-84.19|39.76|135,Daytona Beach|FL|-81.02|29.21|72,Dearborn|MI|-83.18|42.32|95,Dearborn Heights|MI|-83.27|42.34|56,Decatur|IL|-88.95|39.84|73,Decatur|AL|-86.98|34.61|55,Deer Park|TX|-95.12|29.71|33,Deer Park|NY|-73.33|40.76|27,Deer Valley|AZ|-112.13|33.68|165,Deerfield Beach|FL|-80.1|26.32|79,DeKalb|IL|-88.75|41.93|43,Del Rio|TX|-100.9|29.36|36,DeLand|FL|-81.3|29.03|30,Delano|CA|-119.25|35.77|52,Delaware|OH|-83.07|40.3|37,Delegacion Cuajimalpa de Morelos|MX09|-99.29|19.37|160,Delray Beach|FL|-80.07|26.46|66,Delta|BC|-123.05|49.09|101,Deltona|FL|-81.26|28.9|88,Denton|TX|-97.13|33.21|131,Denver|CO|-104.98|39.74|729,Derry Village|NH|-71.31|42.89|34,Des Moines|IA|-93.61|41.6|214,Des Moines|WA|-122.32|47.4|31,Des Plaines|IL|-87.88|42.03|58,Desert Hot Springs|CA|-116.5|33.96|28,Desmarchais-Crawford|QC|-73.58|45.45|29,DeSoto|TX|-96.86|32.59|52,Detroit|MI|-83.05|42.33|645,Diamond Bar|CA|-117.81|34.03|56,Dieppe|NB|-64.69|46.08|27,Dix Hills|NY|-73.34|40.8|26,Dodge City|KS|-100.02|37.75|27,Dollard-Des Ormeaux|QC|-73.82|45.49|48,Dolores Hidalgo|MX11|-100.93|21.16|67,Don Valley Village|ON|-79.35|43.78|27,Doral|FL|-80.36|25.82|75,Dorchester|MA|-71.07|42.3|97,Dorset Park|ON|-79.28|43.75|25,Dothan|AL|-85.39|31.22|68,Douglasville|GA|-84.75|33.75|32,Dover|DE|-75.52|39.16|39,Dover|NH|-70.87|43.2|30,Dovercourt-Wallace Emerson-Junction|ON|-79.44|43.67|36,Downers Grove|IL|-88.01|41.81|49,Downey|CA|-118.13|33.94|114,Downsview-Roding-CFB|ON|-79.49|43.73|35,Downtown DC|DC|-77.02|38.89|52,Downtown Halifax|NS|-63.58|44.65|25,Downtown Vancouver|BC|-123.12|49.28|62,Dracut|MA|-71.3|42.67|28,Draper|UT|-111.86|40.52|46,Drexel Heights|AZ|-111.03|32.14|27,Drexel Hill|PA|-75.29|39.95|28,Drummondville|QC|-72.48|45.88|59,Dublin|CA|-121.94|37.7|57,Dublin|OH|-83.11|40.1|45,Dubuque|IA|-90.66|42.5|58,Duluth|MN|-92.11|46.78|86,Duluth|GA|-84.14|34|29,Duncanville|TX|-96.91|32.65|39,Dundalk|MD|-76.52|39.25|63,Dunedin|FL|-82.77|28.02|36,Dunwoody|GA|-84.33|33.95|48,Durham|NC|-78.9|35.99|257,Duvernay|QC|-73.67|45.58|37,Dyker Heights|NY|-74.01|40.62|34,Eagan|MN|-93.17|44.8|66,Eagle Mountain|UT|-112.01|40.31|27,Eagle Pass|TX|-100.5|28.71|28,East Boston|MA|-71.04|42.38|43,East Brunswick|NJ|-74.42|40.43|48,East Chattanooga|TN|-85.25|35.07|154,East Chicago|IN|-87.45|41.64|28,East Concord|NH|-71.54|43.24|42,East Flatbush|NY|-73.93|40.65|178,East Florence|AL|-87.65|34.81|35,East Hampton|VA|-76.33|37.04|147,East Harlem|NY|-73.94|40.79|115,East Hartford|CT|-72.61|41.78|51,East Hastings|BC|-123.06|49.27|80,East Haven|CT|-72.87|41.28|29,East Hill-Meridian|WA|-122.17|47.41|29,East Honolulu|HI|-157.72|21.29|49,East Independence|MO|-94.36|39.1|110,East Lake|FL|-82.69|28.11|30,East Lansing|MI|-84.48|42.74|48,East Los Angeles|CA|-118.17|34.02|126,East Meadow|NY|-73.56|40.71|38,East New York|NY|-73.88|40.67|173,East Norwalk|CT|-73.4|41.11|84,East Orange|NJ|-74.2|40.77|64,East Palo Alto|CA|-122.14|37.47|29,East Pensacola Heights|FL|-87.18|30.43|54,East Point|GA|-84.44|33.68|35,East Providence|RI|-71.37|41.81|47,East Saint Louis|IL|-90.15|38.62|27,East Village|NY|-73.99|40.73|62,Easton|PA|-75.22|40.69|26,Eastpointe|MI|-82.96|42.47|32,Eastvale|CA|-117.56|33.96|59,Eau Claire|WI|-91.5|44.81|67,Ecatepec de Morelos|MX15|-99.06|19.6|1645,Echo Park|CA|-118.26|34.08|43,Eden Prairie|MN|-93.47|44.85|63,Edgewater|IL|-87.66|41.98|54,Edgewood|MD|-76.29|39.42|25,Edina|MN|-93.35|44.89|50,Edinburg|TX|-98.16|26.3|84,Edison|NJ|-74.41|40.52|102,Edmond|OK|-97.48|35.65|90,Edmonds|WA|-122.38|47.81|41,Edmonton|AB|-113.47|53.55|1010,Egypt Lake-Leto|FL|-82.51|28.02|35,El Cajon|CA|-116.96|32.79|103,El Centro|CA|-115.56|32.79|43,El Dorado Hills|CA|-121.08|38.69|42,El Mirage|AZ|-112.32|33.61|33,El Monte|CA|-118.03|34.07|116,El Paso|TX|-106.49|31.76|678,El Pueblito|MX22|-100.44|20.54|71,Eldersburg|MD|-76.95|39.4|30,Elgin|IL|-88.28|42.04|112,Elizabeth|NJ|-74.21|40.66|129,Elizabethtown|KY|-85.86|37.69|29,Elk Grove|CA|-121.37|38.41|166,Elk Grove Village|IL|-87.97|42|33,Elkhart|IN|-85.98|41.68|52,Ellendale|TN|-89.83|35.23|25,Ellicott City|MD|-76.8|39.27|65,Elmhurst|NY|-73.88|40.74|113,Elmhurst|IL|-87.94|41.9|45,Elmira|NY|-76.81|42.09|28,Elmont|NY|-73.71|40.7|33,Elyria|OH|-82.11|41.37|53,Emiliano Zapata|MX17|-99.18|18.84|49,Emiliano Zapata|MX15|-98.97|19.34|25,Empalme|MX26|-110.81|27.96|42,Encanto|AZ|-112.08|33.48|54,Encarnacion de Diaz|MX14|-102.24|21.53|25,Enchanted Hills|NM|-106.59|35.34|87,Encinitas|CA|-117.29|33.04|62,Encino|CA|-118.5|34.16|44,Enfield|CT|-72.59|41.98|45,Englewood|CO|-104.99|39.65|33,Englewood|NJ|-73.97|40.89|28,Englewood|IL|-87.65|41.78|26,Enid|OK|-97.88|36.4|51,Ensenada|MX02|-116.6|31.87|443,Enterprise|NV|-115.24|36.03|108,Enterprise|AL|-85.86|31.32|27,Erie|PA|-80.09|42.13|99,Escarcega|MX04|-90.75|18.61|29,Escondido|CA|-117.09|33.12|151,Escuinapa de Hidalgo|MX25|-105.78|22.83|30,Esperanza|MX26|-109.93|27.58|38,Essex|MD|-76.47|39.31|39,Estero|FL|-81.81|26.44|30,Etobicoke|ON|-79.57|43.64|365,Euclid|OH|-81.53|41.59|47,Eugene|OR|-123.09|44.05|176,Euless|TX|-97.08|32.84|54,Eureka|CA|-124.16|40.8|27,Evans|GA|-82.13|33.53|29,Evanston|IL|-87.69|42.04|75,Evansville|IN|-87.56|37.97|119,Everett|WA|-122.2|47.98|108,Everett|MA|-71.05|42.41|46,'Ewa Gentry-West Loch|HI|-158.03|21.35|35,Ewing|NJ|-74.8|40.27|36,Fair Lawn|NJ|-74.13|40.94|33,Fair Oaks|CA|-121.27|38.64|30,Fairbanks|AK|-147.72|64.84|32,Fairborn|OH|-84.02|39.82|33,Fairfield|CA|-122.04|38.25|112,Fairfield|CT|-73.26|41.14|59,Fairfield|OH|-84.56|39.35|42,Fairview|BC|-123.13|49.26|33,Fall River|MA|-71.16|41.7|94,Fallbrook|CA|-117.25|33.38|30,Fallingbrook|ON|-75.48|45.48|25,Far Rockaway|NY|-73.76|40.61|39,Fargo|ND|-96.79|46.88|118,Farmers Branch|TX|-96.9|32.93|32,Farmington|NM|-108.22|36.73|42,Farmington|CT|-72.83|41.72|25,Farmington Hills|MI|-83.38|42.49|81,Fayetteville|NC|-78.88|35.05|201,Fayetteville|AR|-94.16|36.06|82,Federal Way|WA|-122.31|47.32|95,Felipe Carrillo Puerto|MX23|-88.05|19.58|25,Fenway/Kenmore|MA|-71.1|42.34|37,Ferry Pass|FL|-87.21|30.51|28,Financial District|NY|-74.01|40.71|60,Findlay|OH|-83.65|41.04|41,Fishers|IN|-86.01|39.96|76,Fitchburg|MA|-71.8|42.58|40,Fitchburg|WI|-89.47|42.96|27,Flagami|FL|-80.32|25.76|50,Flagstaff|AZ|-111.65|35.2|70,Flatbush|NY|-73.96|40.65|93,Flatlands|NY|-73.93|40.62|63,Fleetwood|BC|-122.8|49.17|65,Fleming Island|FL|-81.72|30.09|27,Flint|MI|-83.69|43.01|98,Florence|AL|-87.68|34.8|40,Florence|SC|-79.76|34.2|38,Florence|KY|-84.63|39|32,Florence|AZ|-111.39|33.03|31,Florence-Graham|CA|-118.24|33.97|63,Florin|CA|-121.41|38.5|47,Florissant|MO|-90.32|38.79|52,Flower Mound|TX|-97.1|33.01|71,Folsom|CA|-121.18|38.68|76,Fond du Lac|WI|-88.44|43.77|42,Fontana|CA|-117.44|34.09|212,Foothill Farms|CA|-121.35|38.68|33,Fordham|NY|-73.9|40.86|94,Forest Hills|NY|-73.85|40.72|67,Forest Hills|MI|-85.49|42.96|25,Fort Bragg|NC|-79.01|35.14|29,Fort Cavazos|TX|-97.78|31.13|29,Fort Collins|CO|-105.08|40.59|170,Fort Erie|ON|-78.93|42.9|30,Fort Garry South|MB|-97.16|49.79|65,Fort Hamilton|NY|-74.03|40.62|28,Fort Lauderdale|FL|-80.14|26.12|183,Fort Lee|NJ|-73.97|40.85|36,Fort McMurray|AB|-111.38|56.73|66,Fort Myers|FL|-81.84|26.62|74,Fort Pierce|FL|-80.33|27.45|44,Fort Smith|AR|-94.4|35.39|88,Fort Wayne|IN|-85.13|41.13|260,Fort Worth|TX|-97.32|32.73|1008,Fortuna Foothills|AZ|-114.41|32.66|26,Foster City|CA|-122.27|37.56|33,Fountain|CO|-104.7|38.68|27,Fountain Valley|CA|-117.95|33.71|56,Fountainebleau|FL|-80.35|25.77|59,Four Corners|FL|-81.65|28.33|26,Fraccionamiento Real Palmas|MX19|-100.16|25.9|34,Framingham|MA|-71.42|42.28|68,Framingham Center|MA|-71.44|42.3|65,Francisco I. Madero|MX07|-103.27|25.77|26,Frankfort|KY|-84.87|38.2|28,Franklin|TN|-86.87|35.93|72,Franklin|WI|-88.04|42.89|36,Franklin|MA|-71.4|42.08|30,Franklin Square|NY|-73.68|40.71|29,Fraser Heights|BC|-122.78|49.2|25,Frederick|MD|-77.41|39.41|69,Fredericksburg|VA|-77.46|38.3|28,Fredericton|NB|-66.67|45.95|63,Fredericton Northside|NB|-66.64|45.98|28,Freeport|NY|-73.58|40.66|43,Fremont|CA|-121.99|37.55|232,Fremont|NE|-96.5|41.43|26,Fresh Meadows|NY|-73.79|40.73|28,Fresnillo|MX32|-102.87|23.17|143,Fresno|CA|-119.77|36.75|542,Fridley|MN|-93.26|45.09|27,Friendswood|TX|-95.2|29.53|38,Frisco|TX|-96.82|33.15|154,Frontera|MX07|-101.45|26.93|69,Fruit Cove|FL|-81.64|30.11|29,Fuentes del Valle|MX15|-99.14|19.63|74,Fullerton|CA|-117.93|33.87|140,Gabriel Leyva Solano|MX25|-108.64|25.66|27,Gadsden|AL|-86.01|34.01|36,Gage Park|IL|-87.7|41.8|41,Gahanna|OH|-82.88|40.02|34,Gainesville|FL|-82.32|29.65|145,Gainesville|GA|-83.82|34.3|38,Gaithersburg|MD|-77.2|39.14|67,Galesburg|IL|-90.37|40.95|31,Gallatin|TN|-86.45|36.39|34,Galt|CA|-121.3|38.25|25,Galveston|TX|-94.8|29.3|50,Garcia|MX19|-100.59|25.8|93,Garden City|KS|-100.87|37.97|27,Garden City|MI|-83.33|42.33|26,Garden Grove|CA|-117.94|33.77|175,Gardena|CA|-118.31|33.89|60,Garfield|NJ|-74.11|40.88|31,Garfield Heights|OH|-81.61|41.42|28,Garland|TX|-96.64|32.91|236,Garner|NC|-78.61|35.71|28,Gary|IN|-87.35|41.59|77,Gastonia|NC|-81.19|35.26|74,Gatineau|QC|-75.7|45.48|300,Georgetown|TX|-97.68|30.63|63,Georgetown|ON|-79.92|43.65|44,Georgetown|KY|-84.56|38.21|32,Germantown|MD|-77.27|39.17|86,Germantown|TN|-89.81|35.09|39,Gilbert|AZ|-111.79|33.35|247,Gillette|WY|-105.5|44.29|32,Gilroy|CA|-121.57|37.01|53,Gladstone|MO|-94.55|39.2|26,Glastonbury|CT|-72.61|41.71|31,Glen Burnie|MD|-76.62|39.16|67,Glen Cove|NY|-73.63|40.86|27,Glen Ellyn|IL|-88.07|41.88|28,Glendale|AZ|-112.19|33.54|240,Glendale|CA|-118.26|34.14|201,Glendale|NY|-73.89|40.7|34,Glendale Heights|IL|-88.06|41.91|34,Glendora|CA|-117.87|34.14|52,Glenfield-Jane Heights|ON|-79.51|43.75|30,Glenview|IL|-87.79|42.07|47,Glenville|NY|-74.05|42.93|29,Gloucester|ON|-75.63|45.35|150,Gloucester|MA|-70.66|42.61|29,Golden Glades|FL|-80.2|25.91|33,Goldsboro|NC|-77.99|35.38|35,Goleta|CA|-119.83|34.44|30,Gomez Palacio|MX10|-103.5|25.57|257,Goodyear|AZ|-112.36|33.44|79,Goose Creek|SC|-80.03|32.98|40,Goshen|IN|-85.83|41.58|32,Gramercy Park|NY|-73.99|40.74|27,Granby|QC|-72.73|45.4|66,Grand Forks|ND|-97.03|47.93|57,Grand Island|NE|-98.34|40.93|51,Grand Junction|CO|-108.55|39.06|60,Grand Prairie|TX|-97|32.75|187,Grand Rapids|MI|-85.67|42.96|195,Grande Prairie|AB|-118.8|55.17|70,Grandview|MO|-94.53|38.89|25,Grandview-Woodlands|BC|-123.07|49.28|29,Granger|IN|-86.11|41.75|30,Granite City|IL|-90.15|38.7|29,Grants Pass|OR|-123.33|42.44|37,Grapevine|TX|-97.08|32.93|51,Gravesend|NY|-73.97|40.6|112,Great Falls|MT|-111.3|47.5|59,Greater Grand Crossing|IL|-87.61|41.76|32,Greater Sudbury|ON|-80.99|46.49|166,Greeley|CO|-104.71|40.42|108,Green|OH|-81.48|40.95|25,Green Bay|WI|-88.02|44.52|105,Greenacres City|FL|-80.13|26.62|32,Greenburgh|NY|-73.84|41.03|86,Greenfield|WI|-88.01|42.96|37,Greenpoint|NY|-73.95|40.72|34,Greensboro|NC|-79.79|36.07|285,Greenville|NC|-77.37|35.61|90,Greenville|SC|-82.39|34.85|64,Greenville|MS|-91.06|33.41|32,Greenville|TX|-96.11|33.14|26,Greenwood|IN|-86.11|39.61|55,Greer|SC|-82.23|34.94|28,Gresham|OR|-122.43|45.5|110,Grimsby|ON|-79.57|43.2|27,Grove City|OH|-83.09|39.88|39,Guadalajara|MX14|-103.35|20.68|1385,Guadalupe|MX19|-100.26|25.68|673,Guadalupe|MX32|-102.52|22.75|170,Guamuchil|MX25|-108.08|25.46|72,Guanajuato|MX11|-101.26|21.02|72,Guasave|MX25|-108.47|25.57|71,Guelph|ON|-80.26|43.55|143,Guildford|BC|-122.8|49.19|64,Gulfport|MS|-89.09|30.37|71,Gurnee|IL|-87.9|42.37|31,Gustavo Adolfo Madero|MX09|-99.11|19.49|1185,Gwynn Oak|MD|-76.69|39.33|47,Hacienda Heights|CA|-117.97|33.99|54,Hacienda Santa Fe|MX14|-103.38|20.52|86,Hackensack|NJ|-74.04|40.89|44,Hagerstown|MD|-77.72|39.64|40,Halifax|NS|-63.58|44.64|471,Hallandale Beach|FL|-80.15|25.98|39,Haltom City|TX|-97.27|32.8|44,Halton Hills|ON|-79.93|43.64|62,Hamden|CT|-72.9|41.4|59,Hamilton|ON|-79.85|43.25|569,Hamilton|OH|-84.56|39.4|62,Hammond|IN|-87.5|41.58|77,Hampton|VA|-76.35|37.03|137,Hanford|CA|-119.65|36.33|55,Hanover|MD|-76.72|39.19|38,Hanover Park|IL|-88.15|42|38,Harker Heights|TX|-97.66|31.08|29,Harlem|NY|-73.95|40.81|116,Harlingen|TX|-97.7|26.19|65,Harrisburg|PA|-76.88|40.27|50,Harrison|NY|-73.71|40.97|28,Harrisonburg|VA|-78.87|38.45|52,Hartford|CT|-72.69|41.76|121,Harvey|IL|-87.65|41.61|25,Hastings-Sunrise|BC|-123.03|49.28|34,Hattiesburg|MS|-89.29|31.33|46,Haverhill|MA|-71.08|42.78|62,Havertown|PA|-75.31|39.98|50,Hawai'i Kai|HI|-157.7|21.3|30,Hawthorne|CA|-118.35|33.92|88,Hayward|CA|-122.08|37.67|158,Hazelwood|MO|-90.37|38.77|25,Helena|MT|-112.04|46.59|32,Hell's Kitchen|NY|-73.99|40.76|45,Hemet|CA|-116.97|33.75|83,Hempstead|NY|-73.62|40.71|55,Henderson|NV|-114.98|36.04|285,Henderson|KY|-87.59|37.84|28,Hendersonville|TN|-86.62|36.3|56,Henrietta|NY|-77.61|43.06|42,Hercules|CA|-122.29|38.02|25,Hermitage|TN|-86.62|36.2|37,Hermosillo|MX26|-110.97|29.09|812,Heroica Caborca|MX26|-112.16|30.72|59,Heroica Ciudad de Juchitan de Zaragoza|MX20|-95.02|16.43|88,Heroica Guaymas|MX26|-110.9|27.92|117,Heroica Matamoros|MX28|-97.5|25.88|510,Heroica Zitacuaro|MX16|-100.36|19.44|84,Herriman|UT|-112.03|40.51|30,Hesperia|CA|-117.3|34.43|93,Hialeah|FL|-80.28|25.86|237,Hickory|NC|-81.34|35.73|40,Hicksville|NY|-73.53|40.77|41,Hidalgo del Parral|MX06|-105.67|26.93|104,High Point|NC|-80.01|35.96|110,Highland|CA|-117.21|34.13|54,Highland Park|IL|-87.8|42.18|29,Highlands Ranch|CO|-104.97|39.55|96,Hilliard|OH|-83.16|40.03|33,Hillsboro|OR|-122.99|45.52|102,Hillsborough|NJ|-74.63|40.48|38,Hilo|HI|-155.09|19.73|43,Hilton Head|SC|-80.75|32.22|37,Hilton Head Island|SC|-80.74|32.19|40,Hinesville|GA|-81.6|31.85|33,Hobart|IN|-87.26|41.53|28,Hobbs|NM|-103.14|32.7|38,Hoboken|NJ|-74.03|40.74|53,Hoffman Estates|IL|-88.08|42.04|52,Holbrook|NY|-73.08|40.81|27,Holladay|UT|-111.82|40.67|30,Holland|MI|-86.11|42.79|33,Hollister|CA|-121.4|36.85|37,Holly Springs|NC|-78.83|35.65|31,Hollywood|CA|-118.33|34.1|167,Hollywood|FL|-80.15|26.01|149,Holmesburg|PA|-75.03|40.04|28,Holyoke|MA|-72.62|42.2|40,Homestead|FL|-80.48|25.47|80,Homewood|AL|-86.8|33.47|25,Honolulu|HI|-157.86|21.31|350,Hoover|AL|-86.81|33.41|84,Hopkinsville|KY|-87.49|36.87|32,Horn Lake|MS|-90.03|34.96|26,Hot Springs|AR|-93.06|34.5|35,Houma|LA|-90.72|29.6|34,Houston|TX|-95.36|29.76|2314,Howard Beach|NY|-73.84|40.66|26,Huamantla|MX29|-97.93|19.31|51,Huatabampo|MX26|-109.64|26.83|30,Huatusco|MX30|-96.97|19.15|31,Huauchinango|MX21|-98.05|20.17|56,Huber Heights|OH|-84.12|39.84|38,Huejotzingo|MX21|-98.41|19.16|25,Huejutla de Reyes|MX13|-98.42|21.14|40,Huimanguillo|MX27|-93.39|17.83|27,Huixquilucan|MX15|-99.35|19.36|124,Huixtla|MX05|-92.46|15.14|32,Hull|QC|-75.71|45.43|63,Huntersville|NC|-80.84|35.41|52,Huntington|WV|-82.45|38.42|48,Huntington Beach|CA|-118|33.66|201,Huntington Park|CA|-118.23|33.98|59,Huntington Station|NY|-73.41|40.85|33,Huntley|IL|-88.43|42.17|26,Hunts Point|NY|-73.88|40.81|27,Huntsville|AL|-86.59|34.73|215,Huntsville|TX|-95.55|30.72|40,Hurst|TX|-97.17|32.82|39,Hutchinson|KS|-97.93|38.06|41,Hyde Park|MA|-71.12|42.26|31,Hyde Park|IL|-87.59|41.79|26,Idaho Falls|ID|-112.03|43.47|59,Iguala de la Independencia|MX12|-99.54|18.35|118,Imperial Beach|CA|-117.11|32.58|27,Independence|MO|-94.42|39.09|117,Independence|KY|-84.54|38.94|26,Indian Trail|NC|-80.67|35.08|37,Indianapolis|IN|-86.16|39.77|887,Indio|CA|-116.22|33.72|87,Inglewood|CA|-118.35|33.96|111,Innisfil|ON|-79.65|44.3|43,Inver Grove Heights|MN|-93.04|44.85|34,Iowa City|IA|-91.53|41.66|74,Irapuato|MX11|-101.36|20.67|380,Irondequoit|NY|-77.58|43.21|51,Irvine|CA|-117.82|33.67|256,Irving|TX|-96.95|32.81|236,Irving Park|IL|-87.74|41.95|56,Irvington|NJ|-74.23|40.73|61,Isla|MX30|-95.53|18.03|26,Islington-City Centre West|ON|-79.54|43.63|43,Issaquah|WA|-122.03|47.53|36,Ithaca|NY|-76.5|42.44|30,Ixmiquilpan|MX13|-99.22|20.48|34,Ixtaczoquitlan|MX30|-97.06|18.85|26,Ixtapa|MX14|-105.21|20.72|29,Ixtapa-Zihuatanejo|MX12|-101.55|17.64|67,Ixtapaluca|MX15|-98.88|19.32|322,Ixtepec|MX20|-95.1|16.56|25,Iztacalco|MX09|-99.1|19.4|384,Iztapalapa|MX09|-99.06|19.36|1835,Izucar de Matamoros|MX21|-98.46|18.6|42,Jackson|MS|-90.18|32.3|153,Jackson|TN|-88.81|35.61|66,Jackson|NJ|-74.86|39.78|54,Jackson|MI|-84.4|42.25|33,Jackson Heights|NY|-73.89|40.76|67,Jacksonville|FL|-81.66|30.33|1009,Jacksonville|NC|-77.43|34.75|67,Jacksonville|AR|-92.11|34.87|28,Jacona de Plancarte|MX16|-102.31|19.96|53,Jaltipan de Morelos|MX30|-94.71|17.97|32,Jamaica|NY|-73.81|40.69|216,Jamaica Plain|MA|-71.12|42.31|37,Jamestown|NY|-79.24|42.1|30,Janesville|WI|-89.02|42.68|64,Jardines de la Silla|MX19|-100.19|25.63|53,Jefferson City|MO|-92.17|38.58|42,Jeffersontown|KY|-85.56|38.19|26,Jeffersonville|IN|-85.74|38.28|46,Jerez de Garcia Salinas|MX32|-102.99|22.65|43,Jersey City|NJ|-74.08|40.73|264,Jesus Maria|MX01|-102.34|21.96|43,Jiutepec|MX17|-99.18|18.88|215,Johns Creek|GA|-84.2|34.03|83,Johnson City|TN|-82.35|36.31|66,Johnston|RI|-71.51|41.82|29,Joint Base Pearl Harbor Hickam|HI|-157.95|21.35|42,Joliet|IL|-88.08|41.53|147,Joliette|QC|-73.42|46.02|34,Jonesboro|AR|-90.7|35.84|73,Jonquiere|QC|-71.25|48.42|54,Joplin|MO|-94.51|37.08|51,Jose Mariano Jimenez|MX06|-104.92|27.13|34,Juneau|AK|-134.42|58.3|31,Jupiter|FL|-80.09|26.93|62,Juventino Rosas|MX11|-101|20.64|42,Kahului|HI|-156.47|20.89|26,Kailua|HI|-157.74|21.4|38,Kalamazoo|MI|-85.59|42.29|76,Kalihi-Palama|HI|-157.88|21.33|43,Kamloops|BC|-120.32|50.67|104,Kanasin|MX31|-89.56|20.93|77,Kanata|ON|-75.92|45.3|90,Kaneohe|HI|-157.8|21.4|34,Kankakee|IL|-87.86|41.12|26,Kannapolis|NC|-80.62|35.49|46,Kansas City|MO|-94.58|39.1|475,Kansas City|KS|-94.63|39.11|152,Kaysville|UT|-111.94|41.04|30,Kearney|NE|-99.08|40.7|33,Kearns|UT|-112|40.66|35,Kearny|NJ|-74.15|40.77|42,Keizer|OR|-123.03|44.99|37,Keller|TX|-97.25|32.93|45,Kelowna|BC|-119.49|49.88|144,Ken Caryl|CO|-105.11|39.58|32,Kendale Lakes|FL|-80.41|25.71|56,Kendall|FL|-80.32|25.68|80,Kendall West|FL|-80.44|25.71|36,Kenner|LA|-90.24|29.99|67,Kennesaw|GA|-84.62|34.02|33,Kennewick|WA|-119.14|46.21|78,Kenosha|WI|-87.82|42.58|99,Kensington|NY|-73.97|40.65|39,Kensington-Cedar Cottage|BC|-123.07|49.25|49,Kent|WA|-122.23|47.38|126,Kent|OH|-81.36|41.15|29,Kentwood|MI|-85.64|42.87|51,Kettering|OH|-84.17|39.69|55,Kew Gardens Hills|NY|-73.82|40.73|37,Key West|FL|-81.78|24.56|25,Killarney|BC|-123.04|49.23|29,Killeen|TX|-97.73|31.12|140,Kingman|AZ|-114.05|35.19|28,Kings Bridge|NY|-73.91|40.88|75,Kingsport|TN|-82.56|36.55|53,Kingston|ON|-76.48|44.23|132,Kingsville|TX|-97.86|27.52|26,Kirkland|WA|-122.21|47.68|87,Kirkwood|MO|-90.41|38.58|27,Kiryas Joel|NY|-74.17|41.34|32,Kissimmee|FL|-81.42|28.3|69,Kitchener|ON|-80.51|43.43|256,Kitsilano|BC|-123.17|49.27|43,Knoxville|TN|-83.92|35.96|190,Kokomo|IN|-86.13|40.49|57,Koreatown|CA|-118.3|34.06|124,Kyle|TX|-97.88|29.99|35,L'Amoreaux|ON|-79.31|43.8|43,La Barca|MX14|-102.54|20.29|35,La Cite-Limoilou|QC|-71.23|46.83|108,La Crosse|WI|-91.24|43.8|52,La Habra|CA|-117.95|33.93|62,La Haute-Saint-Charles|QC|-71.37|46.89|88,La Jolla|CA|-117.27|32.85|42,La Joya|MX02|-117|32.44|26,La Mesa|CA|-117.02|32.77|60,La Mirada|CA|-118.01|33.92|49,La Paz|MX03|-110.31|24.14|250,La Piedad de Cabadas|MX16|-102.02|20.34|83,La Porte|TX|-95.02|29.67|35,La Presa|CA|-117|32.71|34,La Puente|CA|-117.95|34.02|40,La Quinta|CA|-116.31|33.66|40,La Vergne|TN|-86.58|36.02|34,La Verne|CA|-117.77|34.1|32,Lacey|WA|-122.82|47.03|46,Lafayette|LA|-92.02|30.22|121,Lafayette|IN|-86.88|40.42|71,Lafayette|CO|-105.09|39.99|27,Lafayette|CA|-122.12|37.89|25,Lagos de Moreno|MX14|-101.93|21.36|98,LaGrange|GA|-85.03|33.04|29,Laguna|CA|-121.42|38.42|46,Laguna Hills|CA|-117.71|33.61|31,Laguna Niguel|CA|-117.71|33.52|65,Lake Charles|LA|-93.2|30.21|76,Lake Elsinore|CA|-117.33|33.67|61,Lake Forest|CA|-117.69|33.65|82,Lake Havasu City|AZ|-114.32|34.48|53,Lake in the Hills|IL|-88.33|42.18|29,Lake Jackson|TX|-95.43|29.03|27,Lake Magdalene|FL|-82.47|28.07|28,Lake Oswego|OR|-122.67|45.42|38,Lake Ridge|VA|-77.3|38.69|41,Lake Stevens|WA|-122.06|48.02|30,Lake Worth Beach|FL|-80.07|26.62|37,Lakeland|FL|-81.95|28.04|104,Lakeside|FL|-81.77|30.13|30,Lakeville|MN|-93.24|44.65|60,Lakewood|CO|-105.08|39.7|152,Lakewood|CA|-118.13|33.85|81,Lakewood|WA|-122.52|47.17|59,Lakewood|NJ|-74.22|40.1|53,Lakewood|SK|-106.59|52.11|51,Lakewood|OH|-81.8|41.48|50,Lancaster|CA|-118.14|34.7|161,Lancaster|PA|-76.31|40.04|59,Lancaster|OH|-82.6|39.71|39,Lancaster|TX|-96.76|32.59|38,Land O' Lakes|FL|-82.46|28.22|31,Langford|BC|-123.5|48.45|46,Langley|BC|-122.66|49.1|132,Lansing|MI|-84.56|42.73|112,Lansing|IL|-87.54|41.56|28,Laplace|LA|-90.48|30.07|29,Laramie|WY|-105.59|41.31|32,Laredo|TX|-99.51|27.51|256,Largo|FL|-82.79|27.91|81,Las Choapas|MX30|-94.1|17.91|42,Las Cruces|NM|-106.78|32.31|101,Las Guacamayas|MX16|-102.21|18.02|37,Las Pintitas|MX14|-103.3|20.56|26,Las Vegas|NV|-115.14|36.17|641,LaSalle|ON|-83.06|42.24|32,Lauderdale Lakes|FL|-80.21|26.17|34,Lauderhill|FL|-80.21|26.14|71,Laurel|MD|-76.85|39.1|26,Laval|QC|-73.69|45.57|438,Laval-des-Rapides|QC|-73.7|45.56|36,Lawndale|CA|-118.35|33.89|33,Lawrence|KS|-95.24|38.97|93,Lawrence|MA|-71.16|42.71|80,Lawrence|IN|-86.03|39.84|47,Lawrenceville|GA|-83.99|33.96|30,Lawson|SK|-106.64|52.16|34,Lawton|OK|-98.39|34.61|96,Layton|UT|-111.97|41.06|74,Le Plateau-Mont-Royal|QC|-73.58|45.53|105,Le Sud-Ouest|QC|-73.59|45.47|86,Le Vieux-Longueuil|QC|-73.51|45.54|135,League City|TX|-95.09|29.51|98,Leamington|ON|-82.6|42.05|35,Leander|TX|-97.85|30.58|59,Leavenworth|KS|-94.92|39.31|35,Leawood|KS|-94.62|38.97|34,Lebanon|TN|-86.29|36.21|30,Lebanon|PA|-76.41|40.34|25,Lee's Summit|MO|-94.38|38.91|95,Leesburg|VA|-77.56|39.12|51,Lehi|UT|-111.85|40.39|58,Lehigh Acres|FL|-81.62|26.63|86,Leisure City|FL|-80.43|25.5|26,Lemon Grove|CA|-117.03|32.74|26,Lemoore|CA|-119.78|36.3|25,Lenexa|KS|-94.73|38.95|52,Leominster|MA|-71.76|42.53|41,Leon de los Aldama|MX11|-101.68|21.12|1579,Lerdo|MX10|-103.52|25.54|79,Les Rivieres|QC|-71.27|46.82|77,Lethbridge|AB|-112.82|49.7|103,Levis|QC|-71.18|46.8|143,Levittown|PA|-74.83|40.16|52,Levittown|NY|-73.51|40.73|51,Lewiston|ME|-70.21|44.1|36,Lewiston|ID|-117.02|46.42|32,Lewiston Orchards|ID|-116.98|46.38|31,Lewisville|TX|-96.99|33.05|104,Lexington|KY|-84.48|37.99|320,Lexington|MA|-71.22|42.45|31,Lexington-Fayette|KY|-84.46|38.05|314,Liberty|MO|-94.42|39.25|30,Lima|OH|-84.11|40.74|37,Linares|MX19|-99.57|24.86|70,Lincoln|NE|-96.67|40.8|294,Lincoln|CA|-121.29|38.89|49,Lincoln Park|IL|-87.65|41.92|66,Lincoln Park|MI|-83.18|42.25|37,Lincoln Square|IL|-87.69|41.98|40,Linden|NJ|-74.24|40.62|42,Lindenhurst|NY|-73.37|40.69|27,Linton Hall|VA|-77.57|38.76|35,Little Elm|TX|-96.94|33.16|38,Little Havana|FL|-80.23|25.77|53,Little Rock|AR|-92.29|34.75|202,Littleton|CO|-105.02|39.61|46,Livermore|CA|-121.77|37.68|88,Livingston|NJ|-74.31|40.8|27,Livonia|MI|-83.35|42.37|94,Lloydminster|AB|-110.02|53.27|31,Lochearn|MD|-76.72|39.34|25,Lockport|IL|-88.06|41.59|25,Lodi|CA|-121.27|38.13|64,Logan|UT|-111.83|41.74|50,Logan Square|IL|-87.7|41.92|73,Loma Bonita|MX20|-95.88|18.11|40,Lombard|IL|-88.01|41.88|43,Lompoc|CA|-120.46|34.64|44,London|ON|-81.23|42.98|422,Long Beach|CA|-118.19|33.77|474,Long Beach|NY|-73.66|40.59|33,Long Branch|NJ|-73.99|40.3|30,Long Island City|NY|-73.95|40.74|25,Longfellow Community|MN|-93.23|44.94|29,Longmont|CO|-105.1|40.17|92,Longueuil|QC|-73.47|45.52|229,Longview|TX|-94.74|32.5|82,Longview|WA|-122.94|46.14|36,Lorain|OH|-82.18|41.45|63,Los Altos|CA|-122.11|37.39|30,Los Angeles|CA|-118.24|34.05|3820,Los Banos|CA|-120.85|37.06|37,Los Gatos|CA|-121.97|37.23|30,Los Mochis|MX25|-109|25.79|256,Los Reyes Acaquilpan|MX15|-98.98|19.36|85,Los Reyes de Salgado|MX16|-102.47|19.59|39,Louisville|KY|-85.76|38.25|624,Loveland|CO|-105.07|40.4|75,Lowell|MA|-71.32|42.63|110,Lower Sackville|NS|-63.68|44.78|51,Lower West Side|IL|-87.67|41.85|34,Lubbock|TX|-101.86|33.58|249,Lufkin|TX|-94.73|31.34|36,Lynchburg|VA|-79.14|37.41|79,Lynn|MA|-70.95|42.47|92,Lynnwood|WA|-122.32|47.82|36,Lynwood|CA|-118.21|33.93|71,Mableton|GA|-84.58|33.82|37,Macon|GA|-83.63|32.84|91,Macuspana|MX27|-92.6|17.76|32,Madera|CA|-120.06|36.96|64,Madison|WI|-89.4|43.07|280,Madison|AL|-86.75|34.7|46,Madison|MS|-90.12|32.46|25,Madison Heights|MI|-83.11|42.49|30,Magdalena Atlicpac|MX15|-98.95|19.37|26,Magdalena Contreras|MX09|-99.21|19.33|238,Magdalena de Kino|MX26|-110.96|30.63|26,Magna|UT|-112.1|40.71|26,Makakilo / Kapolei / Honokai Hale|HI|-158.1|21.34|46,Makiki / Lower Punchbowl / Tantalus|HI|-157.83|21.32|31,Malden|MA|-71.07|42.43|61,Malvern|ON|-79.22|43.81|43,Manassas|VA|-77.48|38.75|41,Manchester|NH|-71.45|43|110,Manchester|CT|-72.52|41.78|30,Manhattan|NY|-73.97|40.78|1487,Manhattan|KS|-96.57|39.18|56,Manhattan Beach|CA|-118.41|33.88|35,Manhattan Valley|NY|-73.97|40.79|38,Manitowoc|WI|-87.66|44.09|33,Mankato|MN|-94.01|44.16|41,Mansfield|TX|-97.14|32.56|64,Mansfield|OH|-82.52|40.76|46,Mansfield City|CT|-72.23|41.77|26,Manteca|CA|-121.22|37.8|75,Manzanillo|MX08|-104.34|19.12|159,Maple Grove|MN|-93.46|45.07|68,Maple Ridge|BC|-122.6|49.22|82,Maple Valley|WA|-122.05|47.39|25,Maplewood|MN|-93|44.95|40,Maplewood|NJ|-74.27|40.73|25,Marana|AZ|-111.23|32.44|41,Maravatio de Ocampo|MX16|-100.44|19.89|34,Marfil|MX11|-101.29|21|29,Margate|FL|-80.21|26.24|57,Maricopa|AZ|-112.05|33.06|48,Marietta|GA|-84.55|33.95|59,Marion|IA|-91.6|42.03|37,Marion|OH|-83.13|40.59|36,Marion|IN|-85.66|40.56|29,Markham|ON|-79.27|43.87|338,Marlboro|NJ|-74.25|40.32|40,Marlborough|MA|-71.55|42.35|39,Marpole|BC|-123.13|49.21|27,Marrero|LA|-90.1|29.9|33,Marshalltown|IA|-92.91|42.05|27,Martinez|CA|-122.13|38.02|38,Martinez|GA|-82.08|33.52|35,Martinez de la Torre|MX30|-97.06|20.07|60,Maryland Heights|MO|-90.43|38.71|27,Marysville|WA|-122.18|48.05|66,Maryvale|AZ|-112.18|33.5|208,Maryville|TN|-83.97|35.76|28,Mascouche|QC|-73.6|45.75|34,Mason|OH|-84.31|39.36|32,Mason City|IA|-93.2|43.15|27,Maspeth|NY|-73.91|40.72|48,Massillon|OH|-81.52|40.8|32,Matamoros|MX07|-103.23|25.53|52,Matehuala|MX24|-100.64|23.65|77,Mattapan|MA|-71.09|42.27|36,Matthews|NC|-80.72|35.12|30,Mauldin|SC|-82.31|34.78|25,Maywood|CA|-118.19|33.99|27,Mazatlan|MX25|-106.42|23.22|381,McAllen|TX|-98.23|26.2|140,McCully - Moiliili|HI|-157.83|21.29|28,McHenry|IL|-88.27|42.33|26,McKinney|TX|-96.62|33.2|162,McLean|VA|-77.18|38.93|48,McMinnville|OR|-123.2|45.21|33,Meadow Woods|FL|-81.37|28.39|25,Meads|KY|-82.71|38.41|288,Mechanicsville|VA|-77.37|37.61|36,Medford|OR|-122.88|42.33|79,Medford|MA|-71.11|42.42|57,Medicine Hat|AB|-110.68|50.04|63,Medina|OH|-81.86|41.14|26,Mehlville|MO|-90.32|38.51|28,Melbourne|FL|-80.61|28.08|84,Melchor Ocampo|MX15|-99.14|19.7|38,Melrose|MA|-71.07|42.46|27,Melrose Park|IL|-87.86|41.9|25,Memphis|TN|-90.05|35.15|633,Menifee|CA|-117.15|33.73|87,Menlo Park|CA|-122.18|37.45|33,Menomonee Falls|WI|-88.12|43.18|36,Mentor|OH|-81.34|41.67|46,Merced|CA|-120.48|37.3|82,Mercer Island|WA|-122.22|47.57|25,Mercerville-Hamilton Square|NJ|-74.67|40.23|26,Mercier-Hochelaga-Maisonneuve|QC|-73.55|45.57|142,Merida|MX31|-89.62|20.97|1201,Meriden|CT|-72.81|41.54|59,Meridian|ID|-116.39|43.61|90,Meridian|MS|-88.7|32.36|39,Merrillville|IN|-87.33|41.48|35,Merrimack|NH|-71.49|42.87|26,Merritt Island|FL|-80.69|28.36|34,Mesa|AZ|-111.82|33.42|471,Mesquite|TX|-96.6|32.77|144,Metairie|LA|-90.15|29.98|138,Metairie Terrace|LA|-90.16|29.98|142,Metepec|MX15|-99.6|19.26|28,Methuen|MA|-71.19|42.73|52,Metrotown|BC|-123|49.23|52,Mexicali|MX02|-115.45|32.63|1032,Mexico City|MX09|-99.13|19.43|12294,Miami|FL|-80.19|25.77|487,Miami Beach|FL|-80.13|25.79|92,Miami Gardens|FL|-80.25|25.94|113,Miami Lakes|FL|-80.31|25.91|30,Michigan City|IN|-86.9|41.71|31,Mid-City|CA|-118.36|34.04|83,Middle River|MD|-76.44|39.33|25,Middle Village|NY|-73.88|40.72|29,Middletown|NJ|-74.12|40.39|65,Middletown|OH|-84.4|39.52|48,Middletown|CT|-72.65|41.56|46,Middletown|NY|-74.42|41.45|27,Midland|TX|-102.08|32|132,Midland|MI|-84.25|43.62|42,Midvale|UT|-111.9|40.61|32,Midwest City|OK|-97.4|35.45|57,Miguel Aleman (La Doce)|MX26|-111.48|28.84|30,Miguel Hidalgo|MX09|-99.2|19.43|372,Milford|CT|-73.06|41.22|52,Milford|MA|-71.52|42.14|25,Milford Mill|MD|-76.77|39.35|29,Mililani Town|HI|-158.02|21.45|27,Millcreek|UT|-111.88|40.69|62,Milliken|ON|-79.3|43.82|26,Millville|NJ|-75.04|39.4|28,Milpitas|CA|-121.91|37.43|77,Milton|ON|-79.88|43.52|132,Milton|GA|-84.3|34.13|37,Milton|MA|-71.07|42.25|27,Milwaukee|WI|-87.91|43.04|563,Mimico|ON|-79.51|43.62|33,Minatitlan|MX30|-94.56|18|112,Minneapolis|MN|-93.26|44.98|410,Minnetonka|MN|-93.5|44.91|51,Minnetonka Mills|MN|-93.44|44.94|50,Minot|ND|-101.3|48.23|49,Mint Hill|NC|-80.65|35.18|25,Mira Mesa|CA|-117.14|32.92|70,Mirabel|QC|-74.08|45.65|34,Miramar|FL|-80.23|25.99|137,Miramar|MX28|-97.9|22.36|118,Misantla|MX30|-96.85|19.93|26,Mishawaka|IN|-86.16|41.66|48,Mission|TX|-98.33|26.22|83,Mission|BC|-122.3|49.13|41,Mission Bend|TX|-95.66|29.69|36,Mission District|CA|-122.42|37.76|47,Mission Viejo|CA|-117.67|33.6|97,Mississauga|ON|-79.66|43.58|717,Missoula|MT|-113.99|46.87|71,Missouri City|TX|-95.54|29.62|74,Mixquiahuala de Juarez|MX13|-99.21|20.23|25,Mobile|AL|-88.04|30.69|183,Modesto|CA|-121|37.64|211,Moline|IL|-90.52|41.51|42,Monclova|MX07|-101.42|26.91|215,Moncton|NB|-64.8|46.09|86,Monroe|LA|-92.12|32.51|49,Monroe|NC|-80.55|34.99|34,Monroeville|PA|-79.79|40.42|28,Monrovia|CA|-118|34.15|37,Montclair|NJ|-74.21|40.83|39,Montclair|CA|-117.69|34.08|38,Montebello|CA|-118.11|34.01|63,Montemorelos|MX19|-99.83|25.19|67,Monterey|CA|-121.89|36.6|28,Monterey Park|CA|-118.12|34.06|61,Monterrey|MX19|-100.32|25.68|1135,Montgomery|AL|-86.3|32.37|195,Montgomery Village|MD|-77.2|39.18|32,Montreal|QC|-73.59|45.51|1762,Montreal-Nord|QC|-73.63|45.6|86,Moore|OK|-97.49|35.34|60,Mooresville|NC|-80.81|35.58|36,Moorhead|MN|-96.77|46.87|42,Moorpark|CA|-118.88|34.29|36,Moose Jaw|SK|-105.53|50.4|33,Morelia|MX16|-101.18|19.7|743,Moreno Valley|CA|-117.23|33.94|204,Morgan Hill|CA|-121.65|37.13|42,Morgantown|WV|-79.96|39.63|30,Morningside Heights|NY|-73.96|40.81|55,Moroleon|MX11|-101.19|20.13|43,Morris Heights|NY|-73.92|40.85|40,Morristown|TN|-83.29|36.21|29,Moscow|ID|-117|46.73|25,Mott Haven|NY|-73.92|40.81|51,Mount Juliet|TN|-86.52|36.2|31,Mount Laurel|NJ|-74.89|39.93|41,Mount Lebanon|PA|-80.05|40.36|32,Mount Olive-Silverstone-Jamestown|ON|-79.59|43.75|32,Mount Pleasant|SC|-79.86|32.79|81,Mount Pleasant|DC|-77.04|38.93|35,Mount Pleasant|BC|-123.1|49.27|33,Mount Pleasant|WI|-87.86|42.7|26,Mount Pleasant|MI|-84.77|43.6|26,Mount Pleasant West|ON|-79.39|43.7|29,Mount Prospect|IL|-87.94|42.07|54,Mount Vernon|NY|-73.84|40.91|68,Mount Vernon|WA|-122.33|48.42|34,Mountain View|CA|-122.08|37.39|80,Moyotzingo|MX21|-98.4|19.25|27,Mt Pleasant|BC|-123.1|49.26|32,Muncie|IN|-85.39|40.19|70,Mundelein|IL|-88|42.26|31,Murfreesboro|TN|-86.39|35.85|165,Murray|UT|-111.89|40.67|49,Murrieta|CA|-117.21|33.55|109,Muskegon|MI|-86.25|43.23|38,Muskogee|OK|-95.37|35.75|38,Myrtle Beach|SC|-78.89|33.69|31,Nacogdoches|TX|-94.66|31.6|33,Nampa|ID|-116.56|43.54|89,Nanaimo|BC|-123.94|49.17|90,Nanchital de Lazaro Cardenas del Rio|MX30|-94.41|18.07|25,Napa|CA|-122.29|38.3|80,Naperville|IL|-88.15|41.79|147,Nashua|NH|-71.47|42.77|87,Nashville|TN|-86.78|36.17|689,Natick|MA|-71.35|42.28|32,National City|CA|-117.1|32.68|61,Naucalpan de Juarez|MX15|-99.24|19.48|834,Naugatuck|CT|-73.05|41.49|31,Navarre|FL|-86.86|30.4|31,Navojoa|MX26|-109.44|27.07|113,Navolato|MX25|-107.7|24.77|29,Near North Side|IL|-87.63|41.9|85,Needham|MA|-71.23|42.28|28,Neenah|WI|-88.46|44.19|25,Nepean|ON|-75.72|45.34|180,Neufchatel-Est-Lebourgneuf|QC|-71.34|46.85|37,New Albany|IN|-85.82|38.29|36,New Bedford|MA|-70.93|41.64|101,New Berlin|WI|-88.11|42.98|39,New Bern|NC|-77.04|35.11|30,New Braunfels|TX|-98.12|29.7|70,New Britain|CT|-72.78|41.66|72,New Brunswick|NJ|-74.45|40.49|57,New City|IL|-87.66|41.81|40,New City|NY|-73.99|41.15|33,New Haven|CT|-72.93|41.31|130,New Iberia|LA|-91.82|30|30,New Lenox|IL|-87.97|41.51|25,New London|CT|-72.1|41.36|27,New Orleans|LA|-90.08|29.95|362,New Rochelle|NY|-73.78|40.91|79,New South Memphis|TN|-90.06|35.09|641,New Westminster|BC|-122.91|49.21|78,New York City|NY|-74.01|40.71|8804,Newark|NJ|-74.17|40.74|281,Newark|OH|-82.4|40.06|47,Newark|CA|-122.04|37.53|45,Newark|DE|-75.75|39.68|33,Newburgh|NY|-74.01|41.5|28,Newington|CT|-72.72|41.7|30,Newmarket|ON|-79.47|44.05|91,Newnan|GA|-84.8|33.38|37,Newport Beach|CA|-117.93|33.62|87,Newport News|VA|-76.43|36.98|186,Newton|BC|-122.85|49.13|159,Newton|MA|-71.21|42.34|88,Niagara|ON|-79.41|43.64|31,Niagara Falls|ON|-79.07|43.1|99,Niagara Falls|NY|-79.06|43.09|48,Nicholasville|KY|-84.57|37.88|29,Nicolas Romero|MX15|-99.31|19.64|281,Niles|IL|-87.8|42.02|29,Noblesville|IN|-86.01|40.05|59,Nogales|MX26|-110.94|31.31|264,Norco|CA|-117.55|33.93|26,Norfolk|VA|-76.29|36.85|238,Norfolk County|ON|-80.38|42.83|60,Normal|IL|-88.99|40.51|54,Norman|OK|-97.44|35.22|128,Norristown|PA|-75.34|40.12|34,North Andover|MA|-71.14|42.7|28,North Bay|ON|-79.47|46.32|50,North Bel Air|MD|-76.35|39.54|33,North Bergen|NJ|-74.01|40.8|63,North Bethesda|MD|-77.12|39.04|43,North Brunswick|NJ|-74.48|40.45|43,North Center|IL|-87.68|41.95|34,North Charleston|SC|-79.97|32.85|108,North Chicago|IL|-87.84|42.33|29,North Chicopee|MA|-72.6|42.18|55,North Cowichan|BC|-123.69|48.84|29,North Creek|WA|-122.18|47.82|26,North Delta|BC|-122.92|49.17|60,North Fort Myers|FL|-81.88|26.67|39,North Highlands|CA|-121.37|38.69|42,North Hills|CA|-118.48|34.24|56,North Hollywood|CA|-118.38|34.17|64,North Kingstown|RI|-71.47|41.55|28,North La Crosse|WI|-91.25|43.85|50,North Las Vegas|NV|-115.12|36.2|234,North Lauderdale|FL|-80.23|26.22|43,North Lawndale|IL|-87.72|41.86|35,North Little Rock|AR|-92.27|34.77|66,North Miami|FL|-80.19|25.89|62,North Miami Beach|FL|-80.16|25.93|43,North Olmsted|OH|-81.92|41.42|32,North Peoria|IL|-89.58|40.72|113,North Port|FL|-82.24|27.04|62,North Providence|RI|-71.47|41.85|33,North Richland Hills|TX|-97.23|32.83|69,North Ridgeville|OH|-82.02|41.39|32,North Royalton|OH|-81.72|41.31|30,North Stamford|CT|-73.54|41.14|121,North Tonawanda|NY|-78.86|43.04|30,North Vancouver|BC|-123.07|49.32|88,Northampton|MA|-72.64|42.33|28,Northbrook|IL|-87.83|42.13|33,Northglenn|CO|-104.99|39.89|39,Northridge|CA|-118.54|34.23|68,Norwalk|CA|-118.08|33.9|107,Norwalk|CT|-73.41|41.12|88,Norwich|CT|-72.08|41.52|39,Norwood|MA|-71.2|42.19|28,Notre-Dame-de-Grace|QC|-73.61|45.48|68,Novato|CA|-122.57|38.11|55,Novi|MI|-83.48|42.48|58,Nueva Italia de Ruiz|MX16|-102.09|19.02|32,Nueva Rosita|MX07|-101.22|27.94|38,Nuevo Casas Grandes|MX06|-107.91|30.42|55,Nuevo Laredo|MX28|-99.52|27.48|416,Nuevo Mexico|MX14|-103.44|20.76|28,Nutana Sector|SK|-106.64|52.1|72,Nutley|NJ|-74.16|40.82|27,O'Fallon|MO|-90.7|38.81|85,O'Fallon|IL|-89.91|38.59|29,Oak Creek|WI|-87.86|42.89|35,Oak Forest|IL|-87.74|41.6|28,Oak Hill|VA|-77.4|38.93|33,Oak Lawn|IL|-87.76|41.71|56,Oak Park|IL|-87.78|41.89|52,Oak Park|MI|-83.18|42.46|29,Oak Ridge|TN|-84.27|36.01|29,Oakdale|MN|-92.96|44.96|28,Oakland|CA|-122.27|37.8|419,Oakland Park|FL|-80.13|26.17|44,Oakley|CA|-121.71|38|39,Oakton|VA|-77.3|38.88|34,Oakville|ON|-79.68|43.45|213,Oakville|MO|-90.3|38.47|36,Oaxaca|MX20|-96.73|17.06|255,Ocala|FL|-82.14|29.19|58,Oceanside|CA|-117.38|33.2|175,Oceanside|NY|-73.64|40.64|32,Ocoee|FL|-81.54|28.57|43,Ocosingo|MX05|-92.09|16.91|41,Ocotlan|MX14|-102.77|20.35|83,Ocoyoacac|MX15|-99.46|19.27|26,Ocozocoautla de Espinosa|MX05|-93.37|16.76|39,Odenton|MD|-76.7|39.08|37,Odessa|TX|-102.37|31.85|114,Ogden|UT|-111.97|41.22|85,Oildale|CA|-119.02|35.42|32,Ojinaga|MX06|-104.54|29.57|28,Ojo de Agua|MX15|-99.01|19.68|386,Okanagan Mission|BC|-119.48|49.82|38,Oklahoma City|OK|-97.52|35.47|681,Okotoks|AB|-113.98|50.73|30,Olathe|KS|-94.82|38.88|134,Olive Branch|MS|-89.83|34.96|36,Olney|PA|-75.12|40.04|39,Olney|MD|-77.07|39.15|33,Olympia|WA|-122.9|47.04|55,Omaha|NE|-95.94|41.26|486,Ontario|CA|-117.65|34.06|171,Opelika|AL|-85.38|32.65|29,Opportunity|WA|-117.24|47.65|25,Orange|CA|-117.85|33.79|140,Orange|NJ|-74.23|40.77|34,Orangevale|CA|-121.23|38.68|33,Orangeville|ON|-80.1|43.92|30,Orcutt|CA|-120.44|34.87|28,Oregon City|OR|-122.61|45.36|35,Orem|UT|-111.69|40.3|94,Orillia|ON|-79.42|44.61|31,Orizaba|MX30|-97.1|18.85|123,Orland Park|IL|-87.85|41.63|58,Orlando|FL|-81.38|28.54|334,Orleans|ON|-75.5|45.46|125,Ormond Beach|FL|-81.06|29.29|40,Oro Valley|AZ|-110.97|32.39|45,Oshawa|ON|-78.85|43.9|175,Oshkosh|WI|-88.54|44.02|66,Ossining|NY|-73.86|41.16|25,Oswego|IL|-88.35|41.68|33,Ottawa|ON|-75.7|45.41|1017,Ottawa South|ON|-75.69|45.39|125,Overbrook|PA|-75.24|39.99|32,Overland Park|KS|-94.67|38.98|186,Oviedo|FL|-81.21|28.67|38,Owasso|OK|-95.85|36.27|34,Owatonna|MN|-93.23|44.08|25,Owensboro|KY|-87.11|37.77|59,Owings Mills|MD|-76.78|39.42|30,Oxford Circle|PA|-75.07|40.05|48,Oxnard|CA|-119.18|34.2|207,Oxon Hill-Glassmanor|MD|-76.97|38.8|35,Ozone Park|NY|-73.84|40.68|53,Pabellon de Arteaga|MX01|-102.28|22.15|28,Pachuca de Soto|MX13|-98.73|20.12|256,Pacifica|CA|-122.49|37.61|39,Pahrump|NV|-115.98|36.21|36,Palatine|IL|-88.03|42.11|69,Palenque|MX05|-91.98|17.51|42,Palm Bay|FL|-80.59|28.03|119,Palm Beach Gardens|FL|-80.14|26.82|52,Palm Coast|FL|-81.21|29.58|82,Palm Desert|CA|-116.38|33.72|51,Palm Harbor|FL|-82.76|28.08|57,Palm Springs|CA|-116.55|33.83|47,Palmdale|CA|-118.12|34.58|158,Palo Alto|CA|-122.14|37.44|66,Panama City|FL|-85.66|30.16|38,Panorama Hills|AB|-114.08|51.15|25,Panuco|MX30|-98.18|22.05|40,Papantla de Olarte|MX30|-97.32|20.45|53,Paracho de Verduzco|MX16|-102.05|19.65|37,Paradise|NV|-115.15|36.1|223,Paradise|CA|-121.62|39.76|26,Paragould|AR|-90.5|36.06|27,Paraiso|MX27|-93.21|18.4|86,Paramount|CA|-118.16|33.89|55,Paramus|NJ|-74.08|40.94|26,Parc-Extension|QC|-73.63|45.53|33,Park Ridge|IL|-87.84|42.01|37,Park Slope|NY|-73.99|40.67|65,Parkchester|NY|-73.86|40.84|65,Parker|CO|-104.76|39.52|49,Parkersburg|WV|-81.56|39.27|30,Parkland|WA|-122.43|47.16|35,Parkland|FL|-80.24|26.31|30,Parkville|MD|-76.54|39.38|30,Parkwoods-Donalda|ON|-79.33|43.76|34,Parma|OH|-81.72|41.4|79,Parras de la Fuente|MX07|-102.18|25.44|33,Parsippany|NJ|-74.43|40.86|51,Pasadena|TX|-95.21|29.69|153,Pasadena|CA|-118.14|34.15|142,Pasco|WA|-119.1|46.24|69,Paso Robles|CA|-120.69|35.63|27,Passaic|NJ|-74.13|40.86|71,Paterson|NJ|-74.17|40.92|147,Patzcuaro|MX16|-101.61|19.51|55,Pawtucket|RI|-71.38|41.88|71,Peabody|MA|-70.93|42.53|52,Peachtree City|GA|-84.6|33.4|35,Peachtree Corners|GA|-84.22|33.97|40,Pearl|MS|-90.13|32.27|26,Pearl City|HI|-157.98|21.4|47,Pearland|TX|-95.29|29.56|108,Pekin|IL|-89.64|40.57|33,Pembroke Pines|FL|-80.22|26|166,Penjamo|MX11|-101.72|20.43|40,Penn Hills|PA|-79.84|40.5|44,Pennsauken|NJ|-75.06|39.96|36,Pennsport|PA|-75.15|39.93|26,Pensacola|FL|-87.22|30.42|53,Penticton|BC|-119.59|49.48|33,Peoria|AZ|-112.24|33.58|190,Peoria|IL|-89.59|40.69|115,Perote|MX30|-97.24|19.56|37,Perris|CA|-117.23|33.78|74,Perry Hall|MD|-76.46|39.41|28,Perth Amboy|NJ|-74.27|40.51|52,Petaluma|CA|-122.64|38.23|60,Peterborough|ON|-78.32|44.3|85,Petersburg|VA|-77.4|37.23|32,Pflugerville|TX|-97.62|30.44|57,Pharr|TX|-98.18|26.19|76,Phenix City|AL|-85|32.47|37,Philadelphia|PA|-75.16|39.95|1573,Phoenix|AZ|-112.07|33.45|1650,Pickering|ON|-79.13|43.9|91,Pico Rivera|CA|-118.1|33.98|64,Piedras Negras|MX07|-100.52|28.7|150,Pierrefonds|QC|-73.89|45.46|59,Pierrefonds-Roxboro|QC|-73.84|45.5|73,Pijijiapan|MX05|-93.21|15.69|50,Pikesville|MD|-76.72|39.37|30,Pine Bluff|AR|-92|34.23|44,Pine Hills|FL|-81.45|28.56|60,Pinellas Park|FL|-82.7|27.84|51,Pinotepa Nacional|MX20|-98.05|16.34|29,Piscataway|NJ|-74.4|40.5|56,Pittsburg|CA|-121.88|38.03|69,Pittsburgh|PA|-80|40.44|304,Pittsfield|MA|-73.25|42.45|43,Placentia|CA|-117.87|33.87|52,Plainfield|NJ|-74.41|40.63|51,Plainfield|IL|-88.2|41.63|42,Plainfield|IN|-86.4|39.7|30,Plainview|NY|-73.47|40.78|26,Plano|TX|-96.7|33.02|283,Plant City|FL|-82.11|28.02|37,Plantation|FL|-80.23|26.13|92,Playa del Carmen|MX23|-87.08|20.63|149,Pleasant Grove|UT|-111.74|40.36|38,Pleasant Hill|CA|-122.06|37.95|34,Pleasanton|CA|-121.87|37.66|79,Pleasure Ridge Park|KY|-85.86|38.15|25,Plum|PA|-79.75|40.5|27,Plymouth|MN|-93.46|45.01|75,Pocatello|ID|-112.45|42.87|54,Poinciana|FL|-81.46|28.14|53,Pointe-Claire|QC|-73.82|45.45|30,Polanco|MX09|-99.2|19.43|50,Pomona|CA|-117.75|34.06|153,Pompano Beach|FL|-80.12|26.24|107,Ponte Vedra Beach|FL|-81.39|30.24|35,Pontiac|MI|-83.29|42.64|59,Port Arthur|TX|-93.94|29.89|55,Port Charlotte|FL|-82.09|26.98|54,Port Chester|NY|-73.67|41|29,Port Coquitlam|BC|-122.77|49.27|58,Port Huron|MI|-82.42|42.97|29,Port Moody|BC|-122.82|49.28|27,Port Orange|FL|-81|29.14|59,Port Richmond|PA|-75.1|39.99|27,Port Saint Lucie|FL|-80.35|27.29|164,Portage|MI|-85.58|42.2|48,Portage|IN|-87.18|41.58|36,Portage Park|IL|-87.77|41.96|64,Porterville|CA|-119.02|36.07|56,Porticos de San Antonio|MX02|-117.03|32.44|34,Portland|OR|-122.68|45.52|652,Portland|ME|-70.26|43.66|66,Portsmouth|VA|-76.3|36.84|96,Portsmouth Heights|VA|-76.37|36.82|99,Post Falls|ID|-116.95|47.72|30,Potomac|MD|-77.21|39.02|44,Poughkeepsie|NY|-73.92|41.7|30,Poway|CA|-117.04|32.96|50,Poza Rica de Hidalgo|MX30|-97.46|20.53|185,Prairieville|LA|-90.97|30.3|26,Prattville|AL|-86.46|32.46|35,Prescott|AZ|-112.47|34.54|41,Prescott Valley|AZ|-112.32|34.61|42,Prince Albert|SK|-105.77|53.2|35,Prince Edward|ON|-77.25|44|25,Prince George|BC|-122.75|53.92|78,Princeton|FL|-80.41|25.54|39,Princeton|NJ|-74.66|40.35|29,Prior Lake|MN|-93.42|44.71|25,Progreso|MX31|-89.66|21.28|37,Providence|RI|-71.41|41.82|190,Provo|UT|-111.66|40.23|115,Puebla|MX21|-98.21|19.05|1692,Pueblo|CO|-104.61|38.25|109,Pueblo West|CO|-104.72|38.35|29,Puerto Escondido|MX20|-97.07|15.86|29,Puerto Penasco|MX26|-113.54|31.32|62,Puerto Vallarta|MX14|-105.23|20.62|224,Pullman|WA|-117.18|46.73|32,Purisima de Bustos|MX11|-101.88|21.03|43,Puruandiro|MX16|-101.52|20.09|30,Puyallup|WA|-122.29|47.19|39,Quebec|QC|-71.21|46.81|531,Queen Creek|AZ|-111.63|33.25|34,Queens|NY|-73.84|40.68|2316,Queens Village|NY|-73.74|40.73|51,Queensbury|NY|-73.61|43.38|27,Quincy|MA|-71|42.25|93,Quincy|IL|-91.41|39.94|40,Quinte West|ON|-77.57|44.18|43,Racine|WI|-87.78|42.73|77,Radnor|PA|-75.36|40.05|30,Rahway|NJ|-74.28|40.61|29,Raleigh|NC|-78.64|35.77|482,Ramos Arizpe|MX07|-100.95|25.54|66,Ramsey|MN|-93.45|45.26|25,Rancho Cordova|CA|-121.3|38.59|71,Rancho Cucamonga|CA|-117.59|34.11|175,Rancho Palos Verdes|CA|-118.39|33.74|42,Rancho Penasquitos|CA|-117.12|32.96|60,Rancho Santa Margarita|CA|-117.6|33.64|49,Randallstown|MD|-76.8|39.37|32,Randolph|MA|-71.04|42.16|32,Randolph|NJ|-74.58|40.85|25,Rapid City|SD|-103.23|44.08|73,Raytown|MO|-94.46|39.01|29,Reading|PA|-75.93|40.34|87,Red Deer|AB|-113.8|52.27|100,Redan|GA|-84.13|33.75|33,Redding|CA|-122.39|40.59|91,Redford|MI|-83.3|42.38|49,Redlands|CA|-117.18|34.06|71,Redmond|WA|-122.12|47.67|60,Redmond|OR|-121.17|44.27|28,Redondo Beach|CA|-118.39|33.85|68,Redwood City|CA|-122.24|37.49|85,Reedley|CA|-119.45|36.6|25,Reforma|MX05|-93.15|17.86|26,Regina|SK|-104.62|50.45|226,Rego Park|NY|-73.85|40.73|43,Reisterstown|MD|-76.83|39.47|25,Renfrew-Collingwood|BC|-123.04|49.24|51,Reno|NV|-119.81|39.53|264,Renton|WA|-122.22|47.48|100,Repentigny|QC|-73.45|45.74|84,Reseda|CA|-118.54|34.2|65,Reston|VA|-77.34|38.97|58,Revere|MA|-71.01|42.41|53,Rexburg|ID|-111.79|43.83|27,Reynoldsburg|OH|-82.81|39.95|37,Reynosa|MX28|-98.28|26.08|589,Rhawnhurst|PA|-75.06|40.06|25,Rialto|CA|-117.37|34.11|103,Richardson|TX|-96.73|32.95|110,Richfield|MN|-93.28|44.88|36,Richland|WA|-119.28|46.29|54,Richmond|VA|-77.46|37.55|226,Richmond|BC|-123.14|49.17|209,Richmond|CA|-122.35|37.94|109,Richmond|IN|-84.89|39.83|35,Richmond|KY|-84.29|37.75|33,Richmond Hill|ON|-79.44|43.87|202,Richmond Hill|NY|-73.83|40.7|98,Richmond West|FL|-80.43|25.61|35,Ridgecrest|CA|-117.67|35.62|28,Ridgewood|NY|-73.91|40.7|69,Ridgewood|NJ|-74.12|40.98|25,Rimouski|QC|-68.52|48.45|42,Rincon de Romos|MX01|-102.32|22.23|27,Rio Blanco|MX30|-97.16|18.83|40,Rio de Teapa|MX27|-92.9|17.77|26,Rio Grande|MX32|-103.03|23.83|32,Rio Rancho|NM|-106.66|35.23|87,Rioverde|MX24|-99.99|21.93|53,Riverside|CA|-117.4|33.95|317,Riverton|UT|-111.94|40.52|41,Riverview|FL|-82.33|27.87|71,Riviera Beach|FL|-80.06|26.78|34,Riviere-des-Prairies-Pointe-aux-Trembles|QC|-73.58|45.64|113,Roanoke|VA|-79.94|37.27|100,Rochester|NY|-77.62|43.15|209,Rochester|MN|-92.47|44.02|112,Rochester|NH|-70.98|43.3|30,Rochester Hills|MI|-83.15|42.66|73,Rock Forest|QC|-72|45.36|35,Rock Hill|SC|-81.03|34.92|71,Rock Island|IL|-90.58|41.51|38,Rockford|IL|-89.09|42.27|148,Rocklin|CA|-121.24|38.79|61,Rockville|MD|-77.15|39.08|66,Rockwall|TX|-96.46|32.93|42,Rocky Mount|NC|-77.79|35.94|55,Rogers|AR|-94.12|36.33|63,Rogers Park|IL|-87.67|42.01|54,Rohnert Park|CA|-122.7|38.34|42,Rome|GA|-85.16|34.26|36,Rome|NY|-75.46|43.21|32,Romeoville|IL|-88.09|41.65|39,Rosarito|MX02|-117.05|32.36|100,Rosedale|NY|-73.74|40.66|25,Rosemead|CA|-118.07|34.08|54,Rosemont-La Petite-Patrie|QC|-73.61|45.54|146,Rosenberg|TX|-95.81|29.56|35,Roseville|CA|-121.29|38.75|130,Roseville|MI|-82.94|42.5|47,Roseville|MN|-93.16|45.01|35,Roslindale|MA|-71.12|42.29|27,Roswell|GA|-84.36|34.02|94,Roswell|NM|-104.52|33.39|48,Rouge|ON|-79.17|43.8|46,Round Lake Beach|IL|-88.09|42.37|27,Round Rock|TX|-97.68|30.51|115,Rowland Heights|CA|-117.91|33.98|48,Rowlett|TX|-96.56|32.9|60,Roy|UT|-112.03|41.16|37,Royal Oak|MI|-83.14|42.49|59,Royal Palm Beach|FL|-80.23|26.71|37,Rubidoux|CA|-117.41|34|34,Russellville|AR|-93.13|35.28|29,Rutland|BC|-119.39|49.9|34,Saanich|BC|-123.37|48.55|117,Sabinas|MX07|-101.12|27.86|54,Sacramento|CA|-121.49|38.58|524,Saginaw|MI|-83.95|43.42|49,Saguenay|QC|-71.07|48.42|148,Sahuarita|AZ|-110.96|31.96|25,Sahuayo de Morelos|MX16|-102.72|20.06|64,Saint Charles|MO|-90.48|38.78|65,Saint Charles|MD|-76.94|38.6|36,Saint Clair Shores|MI|-82.89|42.5|59,Saint Cloud|MN|-94.16|45.56|65,Saint Cloud|FL|-81.28|28.25|35,Saint-Constant|QC|-73.57|45.37|27,Saint-Eustache|QC|-73.91|45.56|42,Saint George|UT|-113.58|37.1|72,Saint-Georges|QC|-70.67|46.11|31,Saint-Hubert|QC|-73.42|45.5|82,Saint-Hyacinthe|QC|-72.96|45.63|50,Saint-Jean-sur-Richelieu|QC|-73.26|45.31|98,Saint-Jerome|QC|-74|45.78|54,Saint John|NB|-66.06|45.27|71,Saint Joseph|MO|-94.85|39.77|76,Saint-Laurent|QC|-73.67|45.5|98,Saint-Leonard|QC|-73.6|45.59|79,Saint-Louis-de-Terrebonne|QC|-73.79|45.7|119,Saint Louis Park|MN|-93.35|44.95|45,Saint-Michel|QC|-73.62|45.57|56,Saint Paul|MN|-93.09|44.94|303,Saint Peters|MO|-90.63|38.8|52,Sainte-Foy|QC|-71.29|46.78|111,Sainte-Julie|QC|-73.33|45.58|29,Sainte-Therese|QC|-73.83|45.64|25,Salaberry-de-Valleyfield|QC|-74.13|45.25|42,Salamanca|MX11|-101.2|20.57|160,Salem|OR|-123.04|44.94|175,Salem|MA|-70.9|42.52|42,Salem|NH|-71.2|42.79|29,Salem|VA|-80.05|37.29|25,Salina|KS|-97.61|38.84|47,Salina Cruz|MX20|-95.19|16.18|84,Salinas|CA|-121.66|36.68|157,Salisbury|NC|-80.47|35.67|34,Salisbury|MD|-75.6|38.36|32,Salt Lake City|UT|-111.89|40.76|215,Saltillo|MX07|-100.98|25.43|709,Salvatierra|MX11|-100.88|20.22|37,Sammamish|WA|-122.08|47.64|52,San Agustin|MX14|-103.47|20.55|30,San Andres Cholula|MX21|-98.3|19.05|39,San Andres Tuxtla|MX30|-95.21|18.45|61,San Angelo|TX|-100.44|31.46|99,San Antonio|TX|-98.49|29.42|1526,San Bernardino|CA|-117.29|34.11|216,San Bernardino Tlaxcalancingo|MX21|-98.28|19.03|54,San Bruno|CA|-122.41|37.63|43,San Buenaventura|MX15|-98.86|19.3|44,San Carlos|CA|-122.26|37.51|29,San Clemente|CA|-117.61|33.43|65,San Cristobal de las Casas|MX05|-92.64|16.73|215,San Diego|CA|-117.16|32.72|1404,San Dimas|CA|-117.81|34.11|34,San Felipe|MX11|-101.22|21.48|28,San Fernando|MX28|-98.15|24.85|29,San Francisco|CA|-122.42|37.77|827,San Francisco Acuautla|MX15|-98.86|19.35|27,San Francisco del Rincon|MX11|-101.86|21.02|71,San Francisco Tesistan|MX14|-103.48|20.8|62,San Gabriel|CA|-118.11|34.1|40,San Isidro|MX15|-98.95|19.34|33,San Jacinto|CA|-116.96|33.78|46,San Jeronimo|MX15|-99.59|19.28|26,San Jeronimo Cuatro Vientos|MX15|-98.84|19.29|36,San Jose|CA|-121.89|37.34|997,San Jose del Cabo|MX03|-109.7|23.05|136,San Jose del Castillo|MX14|-103.24|20.51|39,San Jose Guadalupe Otzacatipan|MX15|-99.59|19.34|31,San Juan|TX|-98.16|26.19|36,San Juan Capistrano|CA|-117.66|33.5|36,San Juan de los Lagos|MX14|-102.33|21.25|48,San Juan del Rio|MX22|-100|20.39|138,San Leandro|CA|-122.16|37.72|90,San Luis|AZ|-114.78|32.49|31,San Luis de la Paz|MX11|-100.51|21.3|49,San Luis Obispo|CA|-120.66|35.28|47,San Luis Potosi|MX24|-100.97|22.15|722,San Luis Rio Colorado|MX26|-114.77|32.46|176,San Marcos|CA|-117.17|33.14|92,San Marcos|TX|-97.94|29.88|60,San Martin Azcatepec|MX15|-98.97|19.69|35,San Martin Texmelucan de Labastida|MX21|-98.44|19.28|155,San Mateo|CA|-122.33|37.56|103,San Mateo Atenco|MX15|-99.53|19.27|67,San Miguel Ajusco|MX09|-99.2|19.22|29,San Miguel de Allende|MX11|-100.74|20.92|174,San Miguel Topilejo|MX09|-99.14|19.2|34,San Nicolas de los Garza|MX19|-100.3|25.74|412,San Pablo|CA|-122.35|37.96|30,San Pablo Autopan|MX15|-99.66|19.36|35,San Pablo de las Salinas|MX15|-99.09|19.67|156,San Pedro|CA|-118.29|33.74|83,San Pedro|MX07|-102.98|25.76|48,San Pedro|MX07|-103.22|25.43|41,San Pedro Garza Garcia|MX19|-100.4|25.66|132,San Rafael|CA|-122.53|37.97|59,San Ramon|CA|-121.98|37.78|76,San Salvador Tizatlalli|MX15|-99.59|19.26|61,San Sebastian el Grande|MX14|-103.43|20.53|28,San Tan Valley|AZ|-111.53|33.19|81,Sanctorum|MX21|-98.25|19.1|27,Sandusky|OH|-82.71|41.45|25,Sandy|UT|-111.88|40.59|87,Sandy Hills|UT|-111.85|40.58|89,Sandy Springs|GA|-84.38|33.92|105,Sanford|FL|-81.27|28.8|58,Sanford|NC|-79.18|35.48|29,Santa Ana|CA|-117.87|33.75|310,Santa Ana Chiautempan|MX29|-98.19|19.31|48,Santa Barbara|CA|-119.7|34.42|91,Santa Catarina|MX19|-100.46|25.67|304,Santa Clara|CA|-121.96|37.35|126,Santa Clarita|CA|-118.54|34.39|182,Santa Cruz|CA|-122.03|36.97|64,Santa Cruz Xoxocotlan|MX20|-96.74|17.03|67,Santa Fe|NM|-105.94|35.69|87,Santa Isabel|MX02|-115.57|32.63|29,Santa Maria|CA|-120.44|34.95|105,Santa Maria Chimalhuacan|MX15|-98.95|19.42|70,Santa Monica|CA|-118.49|34.02|93,Santa Paula|CA|-119.06|34.35|30,Santa Rosa|CA|-122.71|38.44|178,Santa Rosa Beach|FL|-86.23|30.4|32,Santa Rosalia de Camargo|MX06|-105.17|27.68|40,Santa Teresa|MX15|-99.23|19.84|36,Santee|CA|-116.97|32.84|57,Santiago|MX19|-100.15|25.43|36,Santiago de Queretaro|MX22|-100.39|20.59|1594,Santiago Papasquiaro|MX10|-105.42|25.04|26,Santiago Teyahualco|MX15|-99.12|19.66|53,Santo Domingo Tehuantepec|MX20|-95.24|16.32|67,Sarasota|FL|-82.53|27.34|55,Saratoga|CA|-122.02|37.26|30,Saratoga Springs|NY|-73.78|43.08|27,Saratoga Springs|UT|-111.9|40.35|25,Sarnia|ON|-82.4|42.98|72,Saskatoon|SK|-106.67|52.13|266,Saugus|MA|-71.01|42.46|26,Sault Ste. Marie|ON|-84.33|46.52|72,Savage|MN|-93.34|44.78|30,Savannah|GA|-81.1|32.08|147,Sawtelle|CA|-118.45|34.04|39,Sayreville|NJ|-74.36|40.46|44,Sayreville Junction|NJ|-74.33|40.47|42,Sayula|MX14|-103.6|19.88|26,Schaumburg|IL|-88.08|42.03|74,Schenectady|NY|-73.94|42.81|65,Schererville|IN|-87.45|41.48|28,Schertz|TX|-98.27|29.55|43,Scottsdale|AZ|-111.9|33.51|236,Scranton|PA|-75.66|41.41|77,Seaside|CA|-121.85|36.61|33,SeaTac|WA|-122.29|47.45|28,Seattle|WA|-122.33|47.61|780,Security-Widefield|CO|-104.71|38.75|32,Seguin|TX|-97.96|29.57|27,Sept-Iles|QC|-66.38|50.2|28,Severn|MD|-76.7|39.14|44,Severna Park|MD|-76.55|39.07|37,Sewell|NJ|-75.14|39.77|37,Shaker Heights|OH|-81.54|41.47|27,Shakopee|MN|-93.53|44.8|39,Shawinigan|QC|-72.75|46.57|38,Shawnee|KS|-94.72|39.04|65,Shawnee|OK|-96.93|35.33|31,Sheboygan|WI|-87.71|43.75|48,Sheepshead Bay|NY|-73.94|40.59|122,Shelby|MI|-83.03|42.67|74,Shelton|CT|-73.09|41.32|41,Sherbrooke|QC|-71.9|45.4|129,Sherman|TX|-96.61|33.64|40,Sherman Oaks|CA|-118.45|34.15|52,Sherwood|AR|-92.22|34.82|30,Sherwood Park|AB|-113.32|53.52|70,Shirley|NY|-72.87|40.8|27,Shoreline|WA|-122.34|47.76|55,Shoreview|MN|-93.15|45.08|26,Shreveport|LA|-93.75|32.53|187,Shrewsbury|MA|-71.71|42.3|33,Sicklerville|NJ|-74.97|39.72|42,Sierra Vista|AZ|-110.3|31.55|43,Silao de la Victoria|MX11|-101.43|20.94|74,Silver Lake|CA|-118.27|34.09|32,Silver Spring|MD|-77.03|38.99|71,Simi Valley|CA|-118.78|34.27|126,Sioux City|IA|-96.4|42.5|82,Sioux Falls|SD|-96.73|43.54|171,Skokie|IL|-87.73|42.03|64,Slidell|LA|-89.78|30.28|27,Smithtown|NY|-73.2|40.86|26,Smyrna|GA|-84.51|33.88|56,Smyrna|TN|-86.52|35.98|46,Snowdon|QC|-73.63|45.49|32,Socorro|TX|-106.3|31.65|33,Socorro Mission Number 1 Colonia|TX|-106.29|31.64|28,Soledad|CA|-121.33|36.42|25,Soledad de Graciano Sanchez|MX24|-100.94|22.19|332,Somerton|PA|-75.01|40.12|33,Somerville|MA|-71.1|42.39|80,Sorel-Tracy|QC|-73.11|46.04|41,South Bel Air|MD|-76.34|39.53|48,South Bend|IN|-86.25|41.68|101,South Boston|MA|-71.05|42.33|571,South Chicago|IL|-87.55|41.74|28,South Fulton|GA|-84.67|33.59|107,South Gate|CA|-118.21|33.95|96,South Gate|MD|-76.63|39.13|29,South Hill|WA|-122.27|47.14|52,South Jordan|UT|-111.93|40.56|66,South Jordan Heights|UT|-111.95|40.56|37,South Kingstown|RI|-71.52|41.45|30,South Laurel|MD|-76.85|39.07|26,South Lawndale|IL|-87.71|41.84|73,South Miami Heights|FL|-80.38|25.6|36,South Ozone Park|NY|-73.82|40.67|75,South Pasadena|CA|-118.15|34.12|26,South Peabody|MA|-70.95|42.51|50,South Portland|ME|-70.24|43.64|25,South Riverdale|ON|-79.34|43.65|27,South San Francisco|CA|-122.41|37.65|67,South Shore|IL|-87.58|41.76|51,South Suffolk|VA|-76.59|36.72|80,South Surrey|BC|-122.79|49.05|77,South Valley|NM|-106.68|35.01|40,South Vineland|NJ|-75.03|39.45|58,South Whittier|CA|-118.04|33.95|57,Southaven|MS|-90.01|34.99|52,Southfield|MI|-83.22|42.47|73,Southgate|MI|-83.19|42.21|29,Southglenn|CO|-104.95|39.59|42,Southington|CT|-72.88|41.6|43,Southlake|TX|-97.13|32.94|29,Spanaway|WA|-122.43|47.1|27,Spanish Fork|UT|-111.65|40.11|37,Sparks|NV|-119.75|39.53|96,Spartanburg|SC|-81.93|34.95|37,Spokane|WA|-117.43|47.66|229,Spokane Valley|WA|-117.24|47.67|94,Spring|TX|-95.42|30.08|54,Spring Hill|FL|-82.53|28.48|98,Spring Hill|TN|-86.93|35.75|36,Spring Valley|NV|-115.25|36.11|178,Spring Valley|NY|-74.04|41.11|32,Spring Valley|CA|-117|32.74|28,Springdale|AR|-94.13|36.19|77,Springfield|MO|-93.3|37.22|170,Springfield|MA|-72.59|42.1|154,Springfield|IL|-89.64|39.8|114,Springfield|OR|-123.02|44.05|60,Springfield|OH|-83.81|39.92|59,Springfield|VA|-77.19|38.79|30,Springfield Gardens|NY|-73.76|40.66|30,Springville|UT|-111.61|40.17|32,Spruce Grove|AB|-113.92|53.53|38,St. Albert|AB|-113.64|53.63|57,St. Catharines|ON|-79.24|43.17|136,St. Charles|MD|-76.92|38.61|33,St. Charles|IL|-88.31|41.91|32,St. James-Assiniboia East|MB|-97.23|49.89|27,St. John's|NL|-52.71|47.56|110,St. Johns|FL|-81.55|30.08|40,St. Louis|MO|-90.2|38.63|279,St. Petersburg|FL|-82.68|27.77|257,St. Thomas|ON|-81.18|42.77|38,Stamford|CT|-73.54|41.05|128,Stanton|CA|-117.99|33.8|38,Starkville|MS|-88.82|33.45|25,State College|PA|-77.86|40.79|42,Staten Island|NY|-74.14|40.56|468,Statesboro|GA|-81.78|32.45|30,Statesville|NC|-80.89|35.78|26,Sterling|VA|-77.43|39.01|27,Sterling Heights|MI|-83.03|42.58|132,Stevens Point|WI|-89.57|44.52|26,Steveston|BC|-123.18|49.13|25,Stillwater|OK|-97.06|36.12|48,Stittsville|ON|-75.92|45.25|40,Stockbridge|GA|-84.23|33.54|28,Stockton|CA|-121.29|37.96|305,Stonecrest|GA|-84.13|33.71|50,Stonegate-Queensway|ON|-79.5|43.64|25,Stoney Creek|ON|-79.77|43.22|76,Stouffville|ON|-79.25|43.97|36,Stoughton|MA|-71.1|42.13|26,Stow|OH|-81.44|41.16|34,Stratford|CT|-73.13|41.18|51,Stratford|ON|-80.95|43.37|31,Strawberry Hill|BC|-122.88|49.13|41,Streamwood|IL|-88.18|42.03|40,Strongsville|OH|-81.84|41.31|44,Studio City|CA|-118.4|34.15|34,Suffolk|VA|-76.58|36.73|88,Sugar Land|TX|-95.63|29.62|88,Suisun|CA|-122.04|38.24|28,Suitland|MD|-76.92|38.85|25,Suitland-Silver Hill|MD|-76.93|38.85|33,Summerville|SC|-80.18|33.02|48,Sumter|SC|-80.34|33.92|40,Sun City|AZ|-112.27|33.6|37,Sun Prairie|WI|-89.21|43.18|32,Sunnyside|NY|-73.94|40.74|49,Sunnyvale|CA|-122.04|37.37|155,Sunrise|FL|-80.11|26.13|84,Sunrise Manor|NV|-115.07|36.21|189,Sunset|BC|-123.1|49.22|36,Sunset Park|NY|-74.01|40.65|126,Superior|WI|-92.1|46.72|26,Surprise|AZ|-112.33|33.63|143,Surrey|BC|-122.83|49.11|568,Surrey City Centre|BC|-122.85|49.19|33,Sydney|NS|-60.18|46.14|105,Sylmar|CA|-118.45|34.31|79,Syracuse|NY|-76.15|43.05|144,Syracuse|UT|-112.06|41.09|27,Tacambaro de Codallos|MX16|-101.46|19.24|25,Tacoma|WA|-122.44|47.25|222,Tala|MX14|-103.7|20.65|35,Tallahassee|FL|-84.28|30.44|201,Tam O'Shanter-Sullivan|ON|-79.3|43.78|27,Tamarac|FL|-80.25|26.21|64,Tamiami|FL|-80.4|25.76|55,Tampa|FL|-82.46|27.95|414,Tampico|MX28|-97.88|22.29|309,Tantoyuca|MX30|-98.23|21.35|30,Tapachula|MX05|-92.26|14.91|353,Taunton|MA|-71.09|41.9|56,Taxco de Alarcon|MX12|-99.61|18.55|50,Taylor|MI|-83.27|42.24|61,Taylorsville|UT|-111.94|40.67|60,Teaneck|NJ|-74.02|40.9|40,Teapa|MX27|-92.95|17.56|26,Tecamachalco|MX21|-97.73|18.88|28,Tecate|MX02|-116.63|32.57|64,Tecax|MX31|-89.29|20.21|25,Tecoman|MX08|-103.88|18.92|85,Tehuacan|MX21|-97.4|18.46|248,Tejupilco de Hidalgo|MX15|-100.15|18.9|25,Temecula|CA|-117.15|33.49|110,Temixco|MX17|-99.23|18.85|97,Tempe|AZ|-111.91|33.41|175,Tempe Junction|AZ|-111.94|33.41|158,Temple|TX|-97.34|31.1|72,Temple City|CA|-118.06|34.11|36,Temple Terrace|FL|-82.39|28.04|25,Tenosique|MX27|-91.42|17.47|32,Teoloyucan|MX15|-99.18|19.74|51,Tepatitlan de Morelos|MX14|-102.76|20.82|91,Tepeaca|MX21|-97.9|18.97|27,Tepeji del Rio de Ocampo|MX13|-99.34|19.9|80,Tepexpan|MX15|-98.94|19.61|102,Tepic|MX18|-104.89|21.51|332,Tepotzotlan|MX15|-99.22|19.72|38,Tequila|MX14|-103.84|20.88|29,Tequisquiapan|MX22|-99.89|20.52|29,Terre Haute|IN|-87.41|39.47|60,Terrebonne|QC|-73.65|45.7|111,Tewksbury|MA|-71.23|42.61|29,Texarkana|TX|-94.05|33.43|37,Texarkana|AR|-94.04|33.44|30,Texas City|TX|-94.9|29.38|47,Texcoco de Mora|MX15|-98.88|19.51|105,Teziutlan|MX21|-97.36|19.82|103,The Acreage|FL|-80.27|26.79|38,The Bronx|NY|-73.87|40.85|1385,The Colony|TX|-96.89|33.09|41,The Hammocks|FL|-80.44|25.67|51,The Trails of Frisco|TX|-96.87|33.16|51,The Villages|FL|-81.96|28.93|51,The Woodlands|TX|-95.49|30.16|93,Thetford-Mines|QC|-71.31|46.09|25,Thomasville|NC|-80.08|35.88|27,Thornton|CO|-104.97|39.87|133,Thousand Oaks|CA|-118.84|34.17|129,Throgs Neck|NY|-73.82|40.82|33,Thunder Bay|ON|-89.25|48.38|108,Ticul|MX31|-89.53|20.4|32,Tierra Blanca|MX30|-96.36|18.45|47,Tigard|OR|-122.77|45.43|51,Tijuana|MX02|-117|32.5|1922,Timmins|ON|-81.33|48.47|41,Tinley Park|IL|-87.78|41.57|57,Titusville|FL|-80.81|28.61|45,Tizayuca|MX13|-98.98|19.84|43,Tizimin|MX31|-88.15|21.14|46,Tlahuac|MX09|-99.01|19.29|305,Tlajomulco de Zuniga|MX14|-103.45|20.47|30,Tlalnepantla|MX15|-99.2|19.54|653,Tlalpan|MX09|-99.16|19.3|574,Tlapa de Comonfort|MX12|-98.58|17.55|46,Tlapacoyan|MX30|-97.21|19.96|35,Tlaquepaque|MX14|-103.29|20.64|650,Tlaxcala|MX29|-98.24|19.32|84,Toledo|OH|-83.56|41.66|265,Toluca|MX15|-99.65|19.29|489,Toms River|NJ|-74.2|39.95|88,Tonala|MX14|-103.24|20.62|408,Tonala|MX05|-93.75|16.09|35,Tooele|UT|-112.3|40.53|33,Topeka|KS|-95.68|39.05|125,Toronto|ON|-79.4|43.71|2794,Torrance|CA|-118.34|33.84|143,Torreon|MX07|-103.42|25.54|735,Torrington|CT|-73.12|41.8|34,Town 'n' Country|FL|-82.58|28.01|78,Towson|MD|-76.6|39.4|55,Tracy|CA|-121.43|37.74|87,Trenton|NJ|-74.74|40.22|89,Tri-Cities|WA|-119.2|46.25|244,Trois-Rivieres|QC|-72.55|46.35|144,Troy|MI|-83.15|42.61|83,Troy|NY|-73.69|42.73|49,Troy|OH|-84.2|40.04|25,Trumbull|CT|-73.2|41.24|36,Tualatin|OR|-122.76|45.38|27,Tuckahoe|VA|-77.56|37.59|44,Tucker|GA|-84.22|33.85|27,Tucson|AZ|-110.93|32.22|542,Tujunga|CA|-118.29|34.25|26,Tula de Allende|MX13|-99.34|20.05|28,Tulancingo|MX13|-98.36|20.08|102,Tulare|CA|-119.35|36.21|62,Tulsa|OK|-95.99|36.15|413,Tultepec|MX15|-99.13|19.68|65,Tultitlan de Mariano Escobedo|MX15|-99.17|19.65|28,Tupelo|MS|-88.7|34.26|35,Turlock|CA|-120.85|37.49|72,Tuscaloosa|AL|-87.57|33.21|111,Tustin|CA|-117.83|33.75|80,Tuxpam de Rodriguez Cano|MX30|-97.41|20.96|84,Tuxpan|MX14|-103.38|19.56|27,Tuxtepec|MX20|-96.13|18.09|159,Tuxtla|MX05|-93.12|16.75|604,Twentynine Palms|CA|-116.05|34.14|26,Twin Falls|ID|-114.46|42.56|47,Tyler|TX|-95.3|32.35|103,Uman|MX31|-89.75|20.88|39,Union|NJ|-74.26|40.7|56,Union City|CA|-122.02|37.6|74,Union City|NJ|-74.02|40.78|69,Universal City|CA|-118.35|34.14|105,University|FL|-82.44|28.07|41,University City|MO|-90.31|38.66|35,University Heights|SK|-106.58|52.14|51,University Heights|NY|-73.91|40.86|27,University of Texas|TX|-97.74|30.29|53,University Park|FL|-80.37|25.75|26,University Place|WA|-122.55|47.24|32,Upland|CA|-117.65|34.1|76,Upper Alton|IL|-90.15|38.91|29,Upper Arlington|OH|-83.06|39.99|34,Upper West Side|NY|-73.98|40.79|226,Uptown|IL|-87.65|41.97|55,Urbana|IL|-88.21|40.11|42,Urbandale|IA|-93.71|41.63|44,Uriangato|MX11|-101.18|20.14|51,Uruapan|MX16|-102.06|19.42|299,Utica|NY|-75.23|43.1|61,Vacaville|CA|-121.99|38.36|96,Val-d'Or|QC|-77.8|48.1|25,Val-des-Arbres|QC|-73.68|45.6|40,Valdosta|GA|-83.28|30.83|55,Valencia|CA|-118.61|34.44|148,Valente Diaz|MX30|-96.22|19.16|25,Valladolid|MX31|-88.2|20.69|48,Valle de Bravo|MX15|-100.13|19.2|25,Valle de Santiago|MX11|-101.19|20.39|68,Valle Hermoso|MX28|-97.81|25.67|48,Vallejo|CA|-122.26|38.1|121,Valley Glen|CA|-118.42|34.19|60,Valley Stream|NY|-73.71|40.66|37,Valparaiso|IN|-87.06|41.47|32,Valrico|FL|-82.24|27.94|35,Van Nuys|CA|-118.45|34.19|136,Vancouver|BC|-123.12|49.25|662,Vancouver|WA|-122.66|45.64|196,Vaudreuil-Dorion|QC|-74.03|45.4|25,Vaughan|ON|-79.5|43.84|323,Venice|CA|-118.46|33.99|40,Ventura|CA|-119.29|34.28|96,Venustiano Carranza|MX09|-99.1|19.44|430,Veracruz|MX30|-96.14|19.18|428,Verdun|QC|-73.57|45.46|69,Vermont Square|CA|-118.3|34|47,Vernon|BC|-119.27|50.27|40,Vernon Hills|IL|-87.98|42.22|26,Vestal|NY|-76.05|42.09|28,Vestavia Hills|AL|-86.79|33.45|34,Victor Rosales|MX32|-102.7|22.95|32,Victoria|BC|-123.35|48.44|289,Victoria|TX|-97|28.81|67,Victoria de Durango|MX10|-104.66|24.02|518,Victoria-Downtown|BC|-123.36|48.43|46,Victoria-Fraserview|BC|-123.07|49.22|31,Victoriaville|QC|-71.97|46.05|34,Victorville|CA|-117.29|34.54|122,Villa Vicente Guerrero|MX29|-98.17|19.12|60,Villaflores|MX05|-93.27|16.23|37,Villagran|MX11|-101|20.51|27,Villahermosa|MX27|-92.94|17.99|353,Ville-Emard|QC|-73.6|45.45|30,Ville-Marie|QC|-73.57|45.5|104,Villeray-Saint-Michel-Parc-Extension|QC|-73.61|45.56|144,Vineland|NJ|-75.03|39.49|60,Virginia Beach|VA|-75.98|36.85|454,Visalia|CA|-119.29|36.33|130,Vista|CA|-117.24|33.2|100,Waco|TX|-97.15|31.55|132,Waiau-Pacific Palisades|HI|-157.95|21.4|47,Waipahu|HI|-158.01|21.39|38,Wake Forest|NC|-78.51|35.98|38,Wakefield|NY|-73.85|40.9|52,Waldorf|MD|-76.94|38.62|67,Walla Walla|WA|-118.34|46.06|32,Walnut|CA|-117.87|34.02|30,Walnut Creek|CA|-122.06|37.91|68,Walnut Grove|BC|-122.64|49.16|25,Waltham|MA|-71.24|42.38|63,Warner Robins|GA|-83.63|32.62|73,Warren|MI|-83.01|42.49|134,Warren|OH|-80.82|41.24|40,Warwick|RI|-71.42|41.7|81,Wasco|CA|-119.34|35.59|26,Washington|DC|-77.04|38.9|689,Washington Heights|NY|-73.94|40.85|152,Waterbury|CT|-73.05|41.56|108,Waterford|MI|-83.41|42.69|75,Waterfront Communities-The Island|ON|-79.38|43.63|65,Waterloo|ON|-80.52|43.47|104,Waterloo|IA|-92.34|42.49|68,Watertown|MA|-71.18|42.37|31,Watertown|NY|-75.91|43.97|26,Watsonville|CA|-121.76|36.91|53,Waukegan|IL|-87.84|42.36|88,Waukesha|WI|-88.23|43.01|71,Wausau|WI|-89.63|44.96|39,Wauwatosa|WI|-88.01|43.05|47,Waxahachie|TX|-96.85|32.39|33,Wayne|NJ|-74.28|40.93|57,Wayne|PA|-75.39|40.04|30,Weatherford|TX|-97.8|32.76|28,Welland|ON|-79.25|42.98|52,Wellesley|MA|-71.29|42.3|27,Wellington|FL|-80.24|26.66|62,Wenatchee|WA|-120.31|47.42|33,Wentzville|MO|-90.85|38.81|35,Weslaco|TX|-97.99|26.16|39,Wesley Chapel|FL|-82.33|28.24|44,West Albany|NY|-73.78|42.68|93,West Allis|WI|-88.01|43.02|60,West Babylon|NY|-73.35|40.72|43,West Bend|WI|-88.18|43.43|31,West Bloomfield Township|MI|-83.38|42.57|64,West Chicago|IL|-88.2|41.88|27,West Coon Rapids|MN|-93.35|45.16|62,West Covina|CA|-117.94|34.07|108,West Des Moines|IA|-93.71|41.58|64,West Elkridge|MD|-76.73|39.21|28,West End|BC|-123.13|49.28|47,West Englewood|IL|-87.67|41.78|32,West Falls Church|VA|-77.19|38.86|29,West Fargo|ND|-96.9|46.87|33,West Gulfport|MS|-89.09|30.4|71,West Hartford|CT|-72.74|41.76|63,West Haven|CT|-72.95|41.27|54,West Hill|ON|-79.18|43.77|27,West Hills|CA|-118.64|34.2|41,West Hollywood|FL|-80.18|26.02|60,West Hollywood|CA|-118.36|34.09|36,West Humber-Clairville|ON|-79.6|43.72|33,West Islip|NY|-73.31|40.71|28,West Jordan|UT|-111.94|40.61|111,West Kelowna|BC|-119.58|49.86|28,West Lafayette|IN|-86.91|40.43|45,West Lake Sammamish|WA|-122.1|47.58|33,West Lawn|IL|-87.72|41.77|32,West Linn|OR|-122.61|45.37|26,West Little River|FL|-80.24|25.86|34,West Lynchburg|VA|-79.18|37.4|65,West Memphis|AR|-90.18|35.15|25,West Milford|NJ|-74.37|41.13|26,West New York|NJ|-74.01|40.79|53,West Oak Lane|PA|-75.17|40.07|38,West Orange|NJ|-74.24|40.8|48,West Palm Beach|FL|-80.05|26.72|120,West Raleigh|NC|-78.66|35.79|338,West Ridge|IL|-87.69|42|72,West Roxbury|MA|-71.15|42.28|30,West Sacramento|CA|-121.53|38.58|52,West Scarborough|ME|-70.39|43.57|27,West Seneca|NY|-78.8|42.85|44,West Springfield|MA|-72.62|42.11|27,West Torrington|CT|-73.14|41.82|36,West Town|IL|-87.67|41.89|86,West Valley City|UT|-112|40.69|136,West Vancouver|BC|-123.16|49.33|45,West Village|NY|-74.01|40.73|32,West Warwick|RI|-71.52|41.7|30,West Whittier-Los Nietos|CA|-118.07|33.98|25,Westchester|FL|-80.33|25.75|29,Westerville|OH|-82.93|40.13|38,Westfield|MA|-72.75|42.13|41,Westfield|IN|-86.13|40.04|36,Westfield|NJ|-74.35|40.66|30,Westlake|OH|-81.92|41.46|32,Westland|MI|-83.4|42.32|82,Westminster|CO|-105.04|39.84|116,Westminster|CA|-118.01|33.76|92,Westminster-Branson|ON|-79.45|43.78|26,Westmont|CA|-118.3|33.94|31,Weston|FL|-80.4|26.1|69,Westport|CT|-73.36|41.14|26,Wethersfield|CT|-72.65|41.71|26,Wexford/Maryvale|ON|-79.3|43.75|27,Weymouth|MA|-70.94|42.22|54,Whalley|BC|-122.87|49.18|102,Wharton|PA|-75.16|39.93|49,Wheat Ridge|CO|-105.08|39.77|31,Wheaton|IL|-88.11|41.87|53,Wheaton|MD|-77.06|39.04|48,Wheeling|IL|-87.93|42.14|38,Wheeling|WV|-80.72|40.06|27,Whitby|ON|-78.93|43.88|138,Whitchurch-Stouffville|ON|-79.32|44|49,White Bear Lake|MN|-93.01|45.08|25,White Plains|NY|-73.76|41.03|58,Whitehorse|YT|-135.05|60.72|28,Whitestone|NY|-73.82|40.79|36,Whitman|PA|-75.16|39.92|49,Whitney|NV|-115.04|36.1|38,Whittier|CA|-118.03|33.98|87,Wichita|KS|-97.34|37.69|396,Wichita Falls|TX|-98.49|33.91|104,Wildomar|CA|-117.28|33.6|35,Wildwood|MO|-90.66|38.58|35,Wilkes-Barre|PA|-75.88|41.25|40,Williamsburg|NY|-73.95|40.71|33,Williamsport|PA|-77|41.24|29,Willingboro|NJ|-74.87|40.03|31,Williston|ND|-103.62|48.15|26,Willoughby|BC|-122.68|49.13|31,Willowbrook|CA|-118.26|33.92|35,Willowdale|ON|-79.4|43.77|79,Willowdale East|ON|-79.4|43.77|50,Wilmette|IL|-87.72|42.07|27,Wilmington|NC|-77.95|34.24|115,Wilmington|DE|-75.55|39.75|70,Wilmington|CA|-118.26|33.78|52,Wilson|NC|-77.92|35.72|49,Winchester|NV|-115.12|36.13|27,Winchester|VA|-78.16|39.19|27,Windsor|ON|-83.02|42.3|229,Windsor|CO|-104.9|40.48|32,Windsor|CT|-72.64|41.85|28,Windsor|CA|-122.82|38.55|27,Winnetka|CA|-118.57|34.21|47,Winnipeg|MB|-97.15|49.88|749,Winona|MN|-91.64|44.05|27,Winston-Salem|NC|-80.24|36.1|241,Winter Garden|FL|-81.59|28.57|40,Winter Haven|FL|-81.73|28.02|37,Winter Park|FL|-81.34|28.6|29,Winter Springs|FL|-81.31|28.7|34,Woburn|ON|-79.23|43.77|53,Woburn|MA|-71.15|42.48|39,Woodburn|OR|-122.86|45.14|25,Woodbury|MN|-92.96|44.92|67,Woodhaven|NY|-73.86|40.69|36,Woodland|CA|-121.77|38.68|58,Woodland Hills|CA|-118.61|34.17|70,Woodlawn|MD|-76.73|39.32|37,Woodridge|IL|-88.05|41.75|33,Woodside|NY|-73.91|40.75|41,Woodstock|ON|-80.75|43.13|40,Woodstock|GA|-84.52|34.1|29,Woodstock|IL|-88.45|42.31|25,Woonsocket|RI|-71.51|42|41,Wooster|OH|-81.94|40.81|26,Worcester|MA|-71.8|42.26|206,Wyandotte|MI|-83.15|42.21|25,Wylie|TX|-96.54|33.02|46,Wyoming|MI|-85.71|42.91|75,Xalapa de Enriquez|MX30|-96.92|19.53|424,Xalisco|MX18|-104.9|21.44|35,Xenia|OH|-83.93|39.68|25,Xico|MX15|-98.95|19.27|384,Xicotepec de Juarez|MX21|-97.96|20.28|39,Xochimilco|MX09|-99.1|19.25|442,Yakima|WA|-120.51|46.6|93,Yarmouth|MA|-70.23|41.71|25,Yautepec|MX17|-99.07|18.88|105,Yonkers|NY|-73.9|40.93|201,Yorba Linda|CA|-117.81|33.89|67,York|PA|-76.73|39.96|43,York University Heights|ON|-79.49|43.77|27,Youngstown|OH|-80.65|41.1|64,Yuba City|CA|-121.62|39.14|66,Yucaipa|CA|-117.04|34.03|53,Yukon|OK|-97.76|35.51|25,Yuma|AZ|-114.62|32.73|95,Yuriria|MX11|-101.13|20.21|25,Zacapu|MX16|-101.79|19.82|50,Zacatecas|MX32|-102.58|22.77|129,Zacatelco|MX29|-98.24|19.22|42,Zacatlan|MX21|-97.96|19.94|33,Zamora de Hidalgo|MX16|-102.29|19.98|186,Zanesville|OH|-82.01|39.94|25,Zapopan|MX14|-103.39|20.72|1476,Zapotlanejo|MX14|-103.07|20.62|32,Zinacantepec|MX15|-99.73|19.28|54,Zionsville|IN|-86.26|39.95|26,Zumpango|MX15|-99.1|19.8|280";function nr(t){return t.normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"").toLowerCase().replace(/[^\p{L}\p{N}\s]/gu," ").replace(/\s+/g," ").trim()}var or=null;function y_(){if(or)return or;let t=new Map;for(let e of m_.split(",")){let r=e.split("|");if(r.length<5)continue;let o=nr(r[0]);if(!o)continue;let n={a1:r[1],lon:+r[2],lat:+r[3],pop:+r[4]},i=t.get(o);i?i.push(n):t.set(o,[n])}for(let e of t.values())e.sort((r,o)=>o.pop-r.pop);return or=t,t}function Yl(t){return!!t&&y_().has(t)}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var h_="AD AND,AE ARE,AF AFG,AG ATG,AI AIA,AL ALB,AM ARM,AO AGO,AQ ATA,AR ARG,AS ASM,AT AUT,AU AUS,AW ABW,AX ALA,AZ AZE,BA BIH,BB BRB,BD BGD,BE BEL,BF BFA,BG BGR,BH BHR,BI BDI,BJ BEN,BL BLM,BM BMU,BN BRN,BO BOL,BQ BES,BR BRA,BS BHS,BT BTN,BV BVT,BW BWA,BY BLR,BZ BLZ,CA CAN,CC CCK,CD COD,CF CAF,CG COG,CH CHE,CI CIV,CK COK,CL CHL,CM CMR,CN CHN,CO COL,CR CRI,CU CUB,CV CPV,CW CUW,CX CXR,CY CYP,CZ CZE,DE DEU,DJ DJI,DK DNK,DM DMA,DO DOM,DZ DZA,EC ECU,EE EST,EG EGY,EH ESH,ER ERI,ES ESP,ET ETH,FI FIN,FJ FJI,FK FLK,FM FSM,FO FRO,FR FRA,GA GAB,GB GBR,GD GRD,GE GEO,GF GUF,GG GGY,GH GHA,GI GIB,GL GRL,GM GMB,GN GIN,GP GLP,GQ GNQ,GR GRC,GS SGS,GT GTM,GU GUM,GW GNB,GY GUY,HK HKG,HM HMD,HN HND,HR HRV,HT HTI,HU HUN,ID IDN,IE IRL,IL ISR,IM IMN,IN IND,IO IOT,IQ IRQ,IR IRN,IS ISL,IT ITA,JE JEY,JM JAM,JO JOR,JP JPN,KE KEN,KG KGZ,KH KHM,KI KIR,KM COM,KN KNA,KP PRK,KR KOR,KW KWT,KY CYM,KZ KAZ,LA LAO,LB LBN,LC LCA,LI LIE,LK LKA,LR LBR,LS LSO,LT LTU,LU LUX,LV LVA,LY LBY,MA MAR,MC MCO,MD MDA,ME MNE,MF MAF,MG MDG,MH MHL,MK MKD,ML MLI,MM MMR,MN MNG,MO MAC,MP MNP,MQ MTQ,MR MRT,MS MSR,MT MLT,MU MUS,MV MDV,MW MWI,MX MEX,MY MYS,MZ MOZ,NA NAM,NC NCL,NE NER,NF NFK,NG NGA,NI NIC,NL NLD,NO NOR,NP NPL,NR NRU,NU NIU,NZ NZL,OM OMN,PA PAN,PE PER,PF PYF,PG PNG,PH PHL,PK PAK,PL POL,PM SPM,PN PCN,PR PRI,PS PSE,PT PRT,PW PLW,PY PRY,QA QAT,RE REU,RO ROU,RS SRB,RU RUS,RW RWA,SA SAU,SB SLB,SC SYC,SD SDN,SE SWE,SG SGP,SH SHN,SI SVN,SJ SJM,SK SVK,SL SLE,SM SMR,SN SEN,SO SOM,SR SUR,SS SSD,ST STP,SV SLV,SX SXM,SY SYR,SZ SWZ,TC TCA,TD TCD,TF ATF,TG TGO,TH THA,TJ TJK,TK TKL,TL TLS,TM TKM,TN TUN,TO TON,TR TUR,TT TTO,TV TUV,TW TWN,TZ TZA,UA UKR,UG UGA,UM UMI,US USA,UY URY,UZ UZB,VA VAT,VC VCT,VE VEN,VG VGB,VI VIR,VN VNM,VU VUT,WF WLF,WS WSM,YE YEM,YT MYT,ZA ZAF,ZM ZMB,ZW ZWE",lr=(()=>{let t=new Map;for(let e of h_.split(",")){let[r,o]=e.split(" ");r&&o&&t.set(r,o)}return t})(),f_=new Set(lr.keys()),g_=new Set(lr.values()),M_=["en","fr","es","de","it","pt","ru","ja","zh","ko","ar","hi","tr","pl","he","nl","sv","fi","no","da","cs","el","uk","ro","id","vi","th"],C_={usa:"USA","u.s.":"USA","u.s.a.":"USA",us:"USA",america:"USA","united states of america":"USA","the united states":"USA",uk:"GBR","u.k.":"GBR","great britain":"GBR",britain:"GBR",england:"GBR","south korea":"KOR","north korea":"PRK",korea:"KOR","ivory coast":"CIV","cote d ivoire":"CIV",vietnam:"VNM",laos:"LAO",syria:"SYR",iran:"IRN",russia:"RUS",moldova:"MDA",tanzania:"TZA",bolivia:"BOL",venezuela:"VEN",brunei:"BRN","czech republic":"CZE",czechia:"CZE",slovakia:"SVK",uae:"ARE","united arab emirates":"ARE",drc:"COD","dr congo":"COD","democratic republic of the congo":"COD","republic of the congo":"COG",congo:"COG",swaziland:"SWZ",eswatini:"SWZ","cape verde":"CPV","cabo verde":"CPV",burma:"MMR",myanmar:"MMR",holland:"NLD","the netherlands":"NLD",netherlands:"NLD",vatican:"VAT","vatican city":"VAT",palestine:"PSE",macau:"MAC",macao:"MAC","hong kong":"HKG",taiwan:"TWN",turkey:"TUR",turkiye:"TUR",macedonia:"MKD","north macedonia":"MKD",gambia:"GMB","the gambia":"GMB",bahamas:"BHS","the bahamas":"BHS","east timor":"TLS","timor leste":"TLS"},Ql=[["AL","Alabama"],["AK","Alaska"],["AZ","Arizona"],["AR","Arkansas"],["CA","California"],["CO","Colorado"],["CT","Connecticut"],["DE","Delaware"],["FL","Florida"],["GA","Georgia"],["HI","Hawaii"],["ID","Idaho"],["IL","Illinois"],["IN","Indiana"],["IA","Iowa"],["KS","Kansas"],["KY","Kentucky"],["LA","Louisiana"],["ME","Maine"],["MD","Maryland"],["MA","Massachusetts"],["MI","Michigan"],["MN","Minnesota"],["MS","Mississippi"],["MO","Missouri"],["MT","Montana"],["NE","Nebraska"],["NV","Nevada"],["NH","New Hampshire"],["NJ","New Jersey"],["NM","New Mexico"],["NY","New York"],["NC","North Carolina"],["ND","North Dakota"],["OH","Ohio"],["OK","Oklahoma"],["OR","Oregon"],["PA","Pennsylvania"],["RI","Rhode Island"],["SC","South Carolina"],["SD","South Dakota"],["TN","Tennessee"],["TX","Texas"],["UT","Utah"],["VT","Vermont"],["VA","Virginia"],["WA","Washington"],["WV","West Virginia"],["WI","Wisconsin"],["WY","Wyoming"],["DC","District of Columbia"],["PR","Puerto Rico"],["GU","Guam"],["VI","U.S. Virgin Islands"],["AS","American Samoa"],["MP","Northern Mariana Islands"]],v_=new Set(Ql.map(t=>t[0])),__={"Ala.":"AL","Alab.":"AL","Ariz.":"AZ","Ark.":"AR","Calif.":"CA","Cal.":"CA","Colo.":"CO","Col.":"CO","Conn.":"CT","Del.":"DE","Fla.":"FL","Flor.":"FL","Ga.":"GA","Ill.":"IL","Ind.":"IN","Kan.":"KS","Kans.":"KS","Ky.":"KY","La.":"LA","Md.":"MD","Mass.":"MA","Mich.":"MI","Minn.":"MN","Miss.":"MS","Mo.":"MO","Mont.":"MT","Neb.":"NE","Nebr.":"NE","Nev.":"NV","N.H.":"NH","N.J.":"NJ","N.M.":"NM","N.Mex.":"NM","N. Mex.":"NM","N.Y.":"NY","N.C.":"NC","N.D.":"ND","N.Dak.":"ND","N. Dak.":"ND","Okla.":"OK","Ore.":"OR","Oreg.":"OR","Pa.":"PA","Penn.":"PA","Penna.":"PA","R.I.":"RI","S.C.":"SC","S.D.":"SD","S.Dak.":"SD","S. Dak.":"SD","Tenn.":"TN","Tex.":"TX","Vt.":"VT","Va.":"VA","Wash.":"WA","W.Va.":"WV","W. Va.":"WV","Wis.":"WI","Wisc.":"WI","Wyo.":"WY","D.C.":"DC","Wash. D.C.":"DC","Wash., D.C.":"DC","P.R.":"PR","V.I.":"VI"},P_=(()=>{let t=new Map;for(let[e,r]of Ql)t.set(Z4(r),e);t.set(Z4("Washington DC"),"DC"),t.set(Z4("Washington D.C."),"DC"),t.set(Z4("US Virgin Islands"),"VI");for(let[e,r]of Object.entries(__)){let o=Z4(e);o&&!t.has(o)&&t.set(o,r)}return t})(),A_=new Set(["01","02","04","05","06","08","09","10","11","12","13","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","44","45","46","47","48","49","50","51","53","54","55","56","60","66","69","72","78"]);function S_(t){return t.trim().toUpperCase()}function Z4(t){return nr(t)}var ir=null;function b_(){if(ir)return ir;let t=new Map,e=["en",...M_.filter(r=>r!=="en")];for(let r of e){let o=null;try{o=new Intl.DisplayNames([r],{type:"region"})}catch{continue}for(let[n,i]of lr){let a;try{a=o.of(n)}catch{a=void 0}if(!a||a===n)continue;let s=Z4(a);s&&!t.has(s)&&t.set(s,i)}}for(let[r,o]of Object.entries(C_)){let n=Z4(r);n&&t.set(n,o)}return ir=t,t}var ar=new Set(["country","countries","nation","nationality","iso","geo"]),sr=new Set(["state","province","st"]),Jl=new Set(["zip","zipcode","postal","postcode","plz"]),w_=new Set(["county","fips","borough","parish"]),N_=new Set(["city","cities","town","municipality","metro","location","place"]);function k_(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_\-./]+/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>0)}function H4(t,e){if(!t)return!1;for(let r of k_(t))if(e.has(r))return!0;return!1}var T_=85,z_=5,x_=6e4;function ec(t,e,r){if(!t||t.length===0)return null;let o=[],n=new Set;for(let k of t){if(k==null)continue;let x=String(k).trim();if(x.length===0)continue;let V=x.toLowerCase();if(!n.has(V)&&(n.add(V),o.push(x),o.length>x_))return null}let i=o.length;if(i<2)return null;let a=o.map(S_),s=o.map(Z4),l=b_(),c=0,p=0,u=0,m=0,y=0,d=0,h=0,f=0,C=0,M=0,_=0,S=H4(e,Jl);for(let k=0;k<i;++k){let x=a[k],V=s[k],H=o[k],D=f_.has(x),d3=v_.has(x);g_.has(x)&&c++,D&&p++,d3&&u++,D&&d3&&C++;let z3=l.has(V),L3=P_.has(V);z3&&m++,L3&&y++,z3&&L3&&M++,d3&&L3&&_++,(/^\d{5}(-\d{4})?$/.test(H)||S&&/^\d{3,4}$/.test(H))&&d++,/^\d{5}$/.test(H)&&A_.has(H.slice(0,2))&&h++,Yl(V)&&f++}let b=k=>k/i*100,F=[],$=(k,x,V,H=!1)=>{let D=b(x);D<T_||x<2||H&&x<z_&&!H4(e,k==="country-name"?ar:k==="city-name"?N_:sr)||F.push({kind:k,matched:x,spec:V,pct:D})};$("country-iso3",c,6),$("country-name",m,5,!0),$("us-state-name",y,5,!0),$("us-zip5",d,4),$("us-county-fips",h,4),$("country-iso2",p,3),$("us-state-code",u,3),$("city-name",f,2,!0);let o3=u-_,c3=y-_;if(o3>0&&c3>0&&$("us-state-name",u+y-_,5,!0),F.length===0)return null;F.sort((k,x)=>x.pct-k.pct||x.spec-k.spec);let Z=F[0],Y=!1,I={"country-iso2":"us-state-code","us-state-code":"country-iso2","us-zip5":"us-county-fips","us-county-fips":"us-zip5","country-name":"us-state-name","us-state-name":"country-name"}[Z.kind],g=F[1],v=I&&g&&g.kind===I&&Math.abs(Z.pct-g.pct)<=15;if(Z.kind==="country-iso2"||Z.kind==="us-state-code"){let k=Z.matched>0?C/Z.matched:0,x=H4(e,ar),V=H4(e,sr);if(v||k>=.5){if(x&&!V)return w("country-iso2",p,!1);if(V&&!x)return w("us-state-code",u,!1);Y=!0}}else if(Z.kind==="us-zip5"||Z.kind==="us-county-fips"){let k=h===d&&d===i,x=H4(e,Jl),V=H4(e,w_);return V&&!x?w("us-county-fips",h,!1):x&&!V?w("us-zip5",d,!1):k?w("us-zip5",d,!0):w("us-zip5",d,!1)}else if(v&&(Z.kind==="country-name"||Z.kind==="us-state-name")){let k=Z.matched>0?M/Z.matched:0,x=H4(e,ar),V=H4(e,sr);if(x&&!V)return w("country-name",m,!1);if(V&&!x)return w("us-state-name",y,!1);k>=.5&&(Y=!0)}return w(Z.kind,Z.matched,Y);function w(k,x,V){let H={geoKind:k,geoMatchPct:Math.round(b(x)*10)/10};return V&&(H.geoAmbiguous=!0),H}}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var nc=[{name:"likert7_agreement",minMatches:5,canonical:["strongly disagree","disagree","slightly disagree","neutral","slightly agree","agree","strongly agree"]},{name:"likert5_agreement",minMatches:3,canonical:["strongly disagree","disagree","neutral","agree","strongly agree"]},{name:"likert3_agreement",minMatches:2,canonical:["disagree","neutral","agree"]},{name:"likert5_satisfaction",minMatches:3,canonical:["very dissatisfied","dissatisfied","neutral","satisfied","very satisfied"]},{name:"likert3_satisfaction",minMatches:2,canonical:["dissatisfied","neutral","satisfied"]},{name:"likert5_quality",minMatches:3,canonical:["poor","fair","good","very good","excellent"]},{name:"likert3_quality",minMatches:2,canonical:["poor","fair","good"]},{name:"frequency5",minMatches:3,canonical:["never","rarely","sometimes","often","always"]},{name:"intensity5",minMatches:3,canonical:["not at all","slightly","moderately","very","extremely"]},{name:"importance5",minMatches:3,canonical:["not important","slightly important","moderately important","very important","extremely important"]},{name:"severity_low_critical",minMatches:3,canonical:["low","medium","high","critical"]},{name:"severity_low_urgent",minMatches:3,canonical:["low","medium","high","urgent"]},{name:"severity_none_critical",minMatches:3,canonical:["none","mild","moderate","severe","critical"]},{name:"priority_p4_p1",minMatches:3,canonical:["p4","p3","p2","p1","p0"]},{name:"severity_trivial_blocker",minMatches:3,canonical:["trivial","minor","major","critical","blocker"]},{name:"severity_minor_severe",minMatches:3,canonical:["minor","moderate","major","severe"]},{name:"magnitude5_medium",minMatches:3,canonical:["very low","low","medium","high","very high"]},{name:"magnitude5_moderate",minMatches:3,canonical:["very low","low","moderate","high","very high"]},{name:"speed5",minMatches:3,canonical:["very slow","slow","moderate","fast","very fast"]},{name:"temperature6",minMatches:3,canonical:["freezing","cold","cool","mild","warm","hot"]},{name:"experience6",minMatches:3,canonical:["novice","beginner","intermediate","advanced","expert","master"]},{name:"tier_metal",minMatches:3,canonical:["bronze","silver","gold","platinum","diamond"]},{name:"tshirt_letter_sizes",minMatches:4,canonical:["xxs","xs","s","m","l","xl","xxl","xxxl"]},{name:"tshirt_word_sizes",minMatches:3,canonical:["extra small","small","medium","large","extra large"]},{name:"nps_bands",minMatches:2,canonical:["detractor","passive","promoter"]},{name:"likelihood5",minMatches:3,canonical:["very unlikely","unlikely","neutral","likely","very likely"]},{name:"education",minMatches:3,canonical:["none","primary","secondary","bachelors","masters","doctoral"]},{name:"grades_a_to_f",minMatches:3,canonical:["a","b","c","d","f"]},{name:"grades_a_to_f_plusminus",minMatches:4,canonical:["a+","a","a-","b+","b","b-","c+","c","c-","d+","d","d-","f"]}],F_={seldom:"rarely",infrequently:"rarely","hardly ever":"rarely",occasionally:"sometimes",periodically:"sometimes","now and then":"sometimes",frequently:"often",frequent:"often",regularly:"often",commonly:"often",usually:"often",constantly:"always","every time":"always","all the time":"always",consistently:"always",continually:"always",bad:"poor",weak:"poor",subpar:"poor",mediocre:"fair",passable:"fair","so so":"fair",decent:"good",solid:"good",outstanding:"excellent",superb:"excellent",exceptional:"excellent",stellar:"excellent",unsatisfied:"dissatisfied",unhappy:"dissatisfied",displeased:"dissatisfied",happy:"satisfied",content:"satisfied",pleased:"satisfied",delighted:"very satisfied","highly satisfied":"very satisfied","extremely satisfied":"very satisfied","highly dissatisfied":"very dissatisfied","extremely dissatisfied":"very dissatisfied",neither:"neutral",undecided:"neutral","no opinion":"neutral","neither agree nor disagree":"neutral","completely agree":"strongly agree","totally agree":"strongly agree","completely disagree":"strongly disagree","totally disagree":"strongly disagree","highly unlikely":"very unlikely","extremely unlikely":"very unlikely","highly likely":"very likely","extremely likely":"very likely","almost certain":"very likely",bachelor:"bachelors","bachelor's":"bachelors",undergraduate:"bachelors","bachelor degree":"bachelors","master's":"masters",graduate:"masters","master degree":"masters",doctorate:"doctoral",phd:"doctoral"},I_=(()=>{let t=new Set;for(let e of nc)for(let r of e.canonical)t.add(g4(r));return t})(),L_=(()=>{let t=new Map;for(let[e,r]of Object.entries(F_)){let o=g4(e);I_.has(o)||t.has(o)||t.set(o,g4(r))}return t})();function tc(t){return L_.get(t)??t}var R_=new Set(["hour","hr","day","dow","dom","weekday","week","wk","woy","month","mth","quarter","qtr","year","yr","semester","trimester","decade","period","fiscal","fy","rank","level","lvl","tier","grade","band","decile","percentile","quartile","quintile","score","rating","stars","step","stage","phase","round","wave","episode","chapter","age","cohort","generation","seniority","position","sequence","seq","priority"]);function $_(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_\-./]+/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>0)}function ic(t){if(!t)return!1;for(let e of $_(t))if(R_.has(e))return!0;return!1}function g4(t){return t.toLowerCase().replace(/[-_]+/g," ").replace(/\s+/g," ").trim()}function cr(t){let e=new Map;for(let[r,o]of t)for(let n of r)e.set(g4(n),o);return e}var ac=[{name:"weekday_mon_sun",minMatches:4,dict:cr([[["monday","mon"],0],[["tuesday","tue","tues"],1],[["wednesday","wed","weds"],2],[["thursday","thu","thur","thurs","thr"],3],[["friday","fri"],4],[["saturday","sat"],5],[["sunday","sun"],6]])},{name:"month_jan_dec",minMatches:4,dict:cr([[["january","jan"],0],[["february","feb"],1],[["march","mar"],2],[["april","apr"],3],[["may"],4],[["june","jun"],5],[["july","jul"],6],[["august","aug"],7],[["september","sep","sept"],8],[["october","oct"],9],[["november","nov"],10],[["december","dec"],11]])},{name:"quarter_q1_q4",minMatches:3,dict:cr([[["q1","qtr 1","qtr1","quarter 1","q 1"],0],[["q2","qtr 2","qtr2","quarter 2","q 2"],1],[["q3","qtr 3","qtr3","quarter 3","q 3"],2],[["q4","qtr 4","qtr4","quarter 4","q 4"],3]])}],rc={};function O_(t){let e=t||"";if(!e)return{weekday:new Map,month:new Map};let r=rc[e];if(r)return r;let o=new Map,n=new Map,i=(s,l,c)=>{let p=g4(l);p&&s.set(p,c);let u=g4(l.replace(/\./g,""));u&&u!==p&&s.set(u,c)};try{let s=new Intl.DateTimeFormat(e,{weekday:"long"}),l=new Intl.DateTimeFormat(e,{weekday:"short"});for(let u=0;u<7;++u){let m=new Date(Date.UTC(2024,0,1+u));i(o,s.format(m),u),i(o,l.format(m),u)}let c=new Intl.DateTimeFormat(e,{month:"long"}),p=new Intl.DateTimeFormat(e,{month:"short"});for(let u=0;u<12;++u){let m=new Date(Date.UTC(2020,u,15));i(n,c.format(m),u),i(n,p.format(m),u)}}catch{}let a={weekday:o,month:n};return rc[e]=a,a}function oc(t,e){if(e.size===0)return t;let r=new Map(t);for(let[o,n]of e)r.has(o)||r.set(o,n);return r}function E_(t,e){let r=O_(e);for(let o of ac){let n=o.name==="weekday_mon_sun"?oc(o.dict,r.weekday):o.name==="month_jan_dec"?oc(o.dict,r.month):o.dict,i=!0,a=new Map;for(let[l,c]of t){let p=n.get(l);if(p===void 0){i=!1;break}a.has(p)||a.set(p,c)}if(!i||a.size<o.minMatches)continue;let s=[...a.entries()].sort((l,c)=>l[0]-c[0]).map(l=>l[1]);return{pattern:o.name,orderedDomain:s}}return null}function D_(t){let e=new Map;for(let r of t){if(r==null)continue;let o=String(r);if(o.length===0)continue;let n=g4(o);e.has(n)||e.set(n,o)}return e}var X_=15,B_=10,H_=(()=>{let t=["xxs","xs","s","sm","small","m","med","medium","l","lg","large","xl","xlarge","xxl","xxxl","2xl","3xl","4xl","y","n","yes","no","t","f","true","false","na","n/a","n a","none","null","unknown","other","all","both","low","medium","med","high","very low","very high","minimal","critical","urgent"],e=new Set(t.map(g4));for(let r of ac)for(let o of r.dict.keys())e.add(o);return e})();function Z_(t){let e=t.trim();return e.length===0||e.length>B_||(e.match(new RegExp("\\p{L}","gu"))||[]).length>1?!1:new RegExp("\\p{Nd}","u").test(e)}function sc(t){if(!t||t.length===0)return null;let e=new Set,r=[];for(let o of t){if(o==null)continue;let n=String(o);if(e.has(n))continue;let i=g4(n);if(!(i===""||H_.has(i)||Z_(n))||(e.add(n),r.push(n),r.length>X_))return null}return r.length>0?r:null}function lc(t,e){if(!t||t.length<2)return null;let r=D_(t);if(r.size<2)return null;let o=new Map;for(let[i,a]of r){let s=tc(i);o.has(s)||o.set(s,a)}let n=null;for(let i of nc){let a=[];for(let p of i.canonical){let u=o.get(p);u!==void 0&&a.push(u)}if(a.length<i.minMatches)continue;let s=new Set(i.canonical),l=!0;for(let p of r.keys())if(!s.has(tc(p))){l=!1;break}if(!l)continue;let c;n===null||a.length>n.matched||a.length===n.matched&&i.canonical.length<n.pattern.canonical.length?c=!0:c=!1,c&&(n={pattern:i,matched:a.length,orderedDomain:a})}return n?{pattern:n.pattern.name,orderedDomain:n.orderedDomain}:E_(r,e)}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */function j_(t){if(t==null)return null;let e=String(t);if(e.length===0)return null;let r=e.length;if(r===36&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e))return"UUID";if(/^[^\s@]+@[^\s@]+\.[A-Za-z]{2,}$/.test(e))return"EMAIL_LIKE";if(/^https?:\/\//i.test(e)||/^www\./i.test(e))return"URL_LIKE";if(/^[+\d][\d\s().\-]{5,17}\d$/.test(e)){let i=(e.match(/\d/g)||[]).length;if(i>=7&&i<=15)return"PHONE_LIKE"}if(/^\d{4}-\d{2}-\d{2}([T ]\d{2}:\d{2}(:\d{2})?(\.\d+)?Z?)?$/.test(e)||/^\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}$/.test(e))return"DATE_STR";if(/^(true|false|yes|no|t|f|y|n)$/i.test(e))return"BOOLEAN";if(/^\d+$/.test(e))return r>=6?"NUMERIC_ID":null;if(r>=8&&/^[0-9a-f]+$/i.test(e))return"HEX_ID";if(/^[A-Z][A-Z0-9]*$/.test(e)&&!/^\d+$/.test(e))return"ALL_UPPER";if(r>=6&&/^[A-Za-z0-9_-]+$/.test(e)&&/\d/.test(e)&&/[A-Za-z]/.test(e))return"OPAQUE_ID_ALPHANUMERIC";let o=e.trim().split(/\s+/).length,n=/[.!?,;:]/.test(e);return o>=2?n||/[a-z][A-Z]/.test(e)||e.length>40?"SENTENCE_TEXT":/^[A-Z]/.test(e)&&/\b[A-Z][a-z]+/.test(e)?"TITLE_CASE_WORDS":/^[a-z]/.test(e)&&!/[A-Z]/.test(e)?"LOWER_WORDS":"SENTENCE_TEXT":/^[A-Z][a-z]+$/.test(e)?"TITLE_CASE_WORDS":/^[a-z]+$/.test(e)?"LOWER_WORDS":null}function cc(t){if(!t||t.length===0)return"OTHER";let e=new Map,r=new Map,o=0;for(let a of t){let s=j_(a);s&&(o++,e.set(s,(e.get(s)||0)+1),r.has(s)||r.set(s,new Set),r.get(s).add(String(a).length))}if(o===0)return"OTHER";let n=null,i=0;for(let[a,s]of e.entries())s>i&&(i=s,n=a);if(!n)return"OTHER";if(i/t.length<.7)return"MIXED";if(n==="ALL_UPPER"){let a=r.get("ALL_UPPER");if(a.size===1)return`ALL_UPPER_FIXED_${a.values().next().value}`}return n}var dr=b7(tr(),1);/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var W_=12,V_=100,U_=.3,G_=.9,q_=120,K_=1900,Y_=2100,J_=0,Q_=20,eP=new Set(["id","ids","uuid","guid","key","zip","zipcode","postal","postalcode","ssn","code","codes","sku","isbn","msisdn","imei"]);function y5(t){if(!t)return!1;let e=t.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_\-./]+/g," ").toLowerCase().split(/\s+/).filter(r=>r.length>0);return e.length===0?!1:eP.has(e[e.length-1])}var tP=/\b(year|yr|fy|fiscal\s*year|calendar\s*year)\b/i,rP=/^(?:(?:19|20)\d{2}(?:[-/ ]?(?:q[1-4]|w(?:0?[1-9]|[1-4]\d|5[0-3])|(?:0?[1-9]|1[0-2])))?|q[1-4][-/ ](?:19|20)\d{2}|(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*[-/ ]?(?:19|20)?\d{2})$/i;function ur(t){if(!Number.isInteger(t)||t<190001||t>210012)return!1;let e=t%100;return e>=1&&e<=12}function pr(t){if(!Number.isInteger(t)||t<19000101||t>21001231)return!1;let e=Math.floor(t/100)%100,r=t%100;return e>=1&&e<=12&&r>=1&&r<=31}function oP(t,e){if(!e||!/\b(?:19|20)\d{2}\b/.test(t))return!1;let r=t.replace(/\b(?:19|20)\d{2}\b/g,"").replace(/[-/.,]/g," ").trim();if(!r)return!1;let o=m5(r);return o.length>0&&e[o]!==void 0}function uc(t){let{dataType:e,name:r,isMeasure:o,distinctCount:n}=t;if(e==="DateTime")return!0;if(o)return!1;if(e==="Integer"||e==="Decimal"){let i=t.minNum,a=t.maxNum;if(!(i!=null&&a!=null&&Number.isFinite(i)&&Number.isFinite(a)&&Number.isInteger(i)&&Number.isInteger(a)&&a>=i))return!1;let s=i>=1900&&a<=2100;if(s&&n>=2&&tP.test(r)||s&&n>=3&&n===a-i+1)return!0;let l=ur(i)&&ur(a),c=pr(i)&&pr(a);if(l||c){if(!t.sampleValues)return!0;let p=0,u=0;for(let m of t.sampleValues){if(m==null||m==="")continue;p++;let y=Number(String(m).trim());if(Number.isFinite(y)&&(l?ur(y):pr(y))&&u++,p>=60)break}if(p>=2&&u===p)return!0}return!1}if(t.sampleValues){let i=t.locale?Kl(t.locale):null,a=0,s=0;for(let l of t.sampleValues){if(l==null||l==="")continue;a++;let c=String(l).trim();if((rP.test(c)||oP(c,i))&&s++,a>=60)break}if(a>=2&&s/a>=.8)return!0}return!1}function pc(t){let e=(t||"").trim().toLowerCase();return e.startsWith("sum ")||e.startsWith("total ")?"sum":e.startsWith("average ")||e.startsWith("avg. ")?"avg":e.startsWith("count ")||e.startsWith("distinct count ")||e.startsWith("count (distinct) ")?"count":e.startsWith("min ")||e.startsWith("minimum ")?"min":e.startsWith("max ")||e.startsWith("maximum ")?"max":null}function dc(t){let{rows:e,measureColIdx:r,measureName:o,candidateDims:n,minNum:i,maxNum:a,discourageAgg:s}=t,l=100,c=.01,p="";for(let m of n){if(m.distinct<2||m.distinct>l)continue;let y=n.filter(M=>M.idx!==m.idx).map(M=>M.idx),d=new Map;for(let M of e){let _=M[r];if(typeof _!="number"||!Number.isFinite(_))continue;let S=y.length?y.map(F=>String(M[F])).join(p):"",b=d.get(S);b||(b={sum:0,cset:new Set},d.set(S,b)),b.sum+=_,b.cset.add(String(M[m.idx]))}let h=0,f=0,C=0;for(let M of d.values())M.cset.size<2||(C++,Math.abs(M.sum-100)<=100*c?h++:Math.abs(M.sum-1)<=1*c&&f++);if(C>=2&&(h/C>=.9||f/C>=.9))return{additivity:"part_of_whole",partOfWholeDim:m.name}}if(s)return{additivity:"intensive_rate"};let u=pc(o);return u==="avg"||u==="min"||u==="max"?{additivity:"intensive_rate"}:u==="sum"||u==="count"?{additivity:"additive"}:i!=null&&a!=null&&Number.isFinite(i)&&Number.isFinite(a)&&i>=0&&a<=1.0001&&a>0?{additivity:"intensive_rate"}:{additivity:"unknown"}}function mr(t){let{dataType:e,isMeasure:r,name:o,distinct:n,nonblank:i,prec:a,maxval:s,minval:l}=t,c=s-l+1,p=c>0?n/c:1,u=i>0?n/i:0,m=e==="Decimal"||a>0;return y5(o)?"Categorical":p>=G_&&(ic(o)&&n<=q_||l>=K_&&s<=Y_||l>=J_&&s<=Q_)?"Ordinal":r||n>W_&&(m||n>=V_||u>=U_)?"Continuous":"Categorical"}var yr=class{_computedStatsForLevel=null;_cols=[];_rows=[];_origIndices=[];_rowHashes=new Set;dedupRows=!0;STR(t){return t==null?"":t.toString()}getPrecision(t){if(!isFinite(t))return 0;let e=t.toString().split(".")[1];return e?e.length:0}getColumns(){return this._cols}hasTimeComponent(t){return!(t instanceof Date)||isNaN(t.getTime())?!1:t.getHours()!==0||t.getMinutes()!==0||t.getSeconds()!==0||t.getMilliseconds()!==0}getColumnsWithStats(t,e){if(this._computedStatsForLevel==t)return this._cols;let r=0,o=parseInt(t),n=[];for(let y of this._cols){let d=new Map,h=[],f=0,C=0,M=0,_=null,S=null,b=null,F=!1,$=!0,o3=!0,c3=null,Z=!1;for(let Y of this._rows){let I=Y[r],g=this.STR(I);if(g!=""){if(f+=g.length,d.set(g,(d.get(g)||0)+1),C++,y.dataType=="Integer"||y.dataType=="Decimal"||y.dataType=="DateTime")if((_===null||I<_)&&(_=I),(S===null||I>S)&&(S=I),y.dataType=="Integer"||y.dataType=="Decimal"){if(b===null?b=I:b+=I,y.dataType=="Decimal"){let v=this.getPrecision(I);v>M&&(M=v)}h.push(I)}else F=F||this.hasTimeComponent(I);Z&&(I<c3?$=!1:I>c3&&(o3=!1)),c3=I,Z=!0}}if(C>=3&&($&&!o3?y.sortedDirection="asc":o3&&!$?y.sortedDirection="desc":y.sortedDirection="none"),C>0&&d.size>0&&!y.isMeasure){let Y=0,I=Number.MAX_SAFE_INTEGER;for(let g of d.values())g>Y&&(Y=g),g<I&&(I=g);if(y.modalShare=Y/C,y.minGroupCount=I===Number.MAX_SAFE_INTEGER?null:I,d.size===2){let g=[...d.keys()].map(k=>rr(k).trim().toLowerCase()).sort(),v=[["false","true"],["no","yes"],["n","y"],["0","1"],["f","t"]].some(k=>g[0]===k[0]&&g[1]===k[1]),w=/^(is|has)[_a-z0-9]|(?:default|churn|fraud|approv|convert|active|cancel|delinquen|flag|paid|win|pass|fail)/i.test(y.name);(v||w)&&(y.isBinaryFlag=!0)}}y.dataType=="DateTime"&&(y.dateWithTime=F),y.isTemporal=uc({dataType:y.dataType,name:y.name,isMeasure:y.isMeasure,distinctCount:d.size,minNum:typeof _=="number"?_:null,maxNum:typeof S=="number"?S:null,sampleValues:d.keys(),locale:e}),this.updateColumnStats10(o,y,C,d,M,S,_),this.updateColumnStats20(o,h,C,b,y,f,F,_,S,M,d,e),!y.isMeasure&&(y.dataType==="Integer"||y.dataType==="Decimal")&&mr({dataType:y.dataType,isMeasure:!1,name:y.name,distinct:d.size,nonblank:C,prec:M,maxval:typeof S=="number"?S:0,minval:typeof _=="number"?_:0})==="Continuous"&&(y.isMeasure=!0),n[r]=y.isMeasure||d.size>2e3?null:new Set(d.keys()),r++}let i=[];this._cols.forEach((y,d)=>{y.isMeasure||i.push({idx:d,distinct:y.distinctCount??0,name:y.name})}),this._cols.forEach((y,d)=>{if(!y.isMeasure)return;let h=typeof y.lowValue=="number"?y.lowValue:null,f=typeof y.highValue=="number"?y.highValue:null,C=dc({rows:this._rows,measureColIdx:d,measureName:y.name,candidateDims:i,minNum:h,maxNum:f,discourageAgg:!!y.discourageAggregationAcrossGroups});y.additivity=C.additivity,C.partOfWholeDim&&(y.partOfWholeDim=C.partOfWholeDim)});let a=50,s=i.filter(y=>y.distinct>=2&&y.distinct<=a);this._cols.forEach((y,d)=>{if(!y.isMeasure)return;let h=[];for(let c3 of this._rows){let Z=c3[d];if(Z==null||Z==="")continue;let Y=typeof Z=="number"?Z:parseFloat(Z);isNaN(Y)||h.push(Y)}if(h.length===0)return;let f=[...h].sort((c3,Z)=>c3-Z),C=c3=>f[Math.min(f.length-1,Math.max(0,Math.floor(c3*(f.length-1))))],M=C(.5),_=C(.1),S=C(.9),b=Math.abs(M)>1e-9?Math.abs(M):Math.abs(f[f.length-1])>1e-9?Math.abs(f[f.length-1]):1;y.relativeDispersion=Math.round((S-_)/b*1e3)/1e3;let F=0;for(let c3 of h)F+=c3;F/=h.length;let $=0;for(let c3 of h)$+=(c3-F)*(c3-F);if($<=1e-12)return;let o3=[];for(let c3 of s){let Z=new Map;for(let I of this._rows){let g=I[d];if(g==null||g==="")continue;let v=typeof g=="number"?g:parseFloat(g);if(isNaN(v))continue;let w=this.STR(I[c3.idx])+"",k=Z.get(w);k?(k.s+=v,k.n++):Z.set(w,{s:v,n:1})}let Y=0;for(let I of Z.values()){let g=I.s/I.n;Y+=I.n*(g-F)*(g-F)}o3.push({otherColumn:c3.name,eta2:Math.round(Y/$*1e4)/1e4})}o3.length>0&&(y.groupDiscrimination=o3)});let l=.97,c=5,p=this._cols.map((y,d)=>({c:y,i:d})).filter(y=>y.c.isMeasure);for(let y=0;y<p.length;y++)for(let d=y+1;d<p.length;d++){let h=p[y].i,f=p[d].i,C=0,M=0,_=0,S=0,b=0,F=0;for(let Z of this._rows){let Y=Z[h],I=Z[f];if(Y==null||Y===""||I===null||I===void 0||I==="")continue;let g=typeof Y=="number"?Y:parseFloat(Y),v=typeof I=="number"?I:parseFloat(I);isNaN(g)||isNaN(v)||(C++,M+=g,_+=v,S+=g*g,b+=v*v,F+=g*v)}if(C<c)continue;let $=C*S-M*M,o3=C*b-_*_;if($<=1e-12||o3<=1e-12)continue;let c3=(C*F-M*_)/Math.sqrt($*o3);if(Math.abs(c3)>=l){let Z=p[y].c,Y=p[d].c;Z.collinearWithMeasures||(Z.collinearWithMeasures=[]),Y.collinearWithMeasures||(Y.collinearWithMeasures=[]),Z.collinearWithMeasures.push(Y.name),Y.collinearWithMeasures.push(Z.name)}}for(let y=0;y<this._cols.length;y++){let d=n[y];if(!d||d.size===0)continue;let h=[];for(let f=0;f<this._cols.length;f++){if(f===y)continue;let C=n[f];if(!C||C.size===0)continue;let M=0;for(let S of d)C.has(S)&&M++;let _=Math.round(M/d.size*100);_>0&&h.push({otherColumn:this._cols[f].name,percentShared:_})}h.length>0&&(this._cols[y].sharedValueRatioWithOthers=h)}let u=50,m=[];for(let y=0;y<this._cols.length;y++){let d=n[y];d&&d.size>=2&&d.size<=u&&m.push(y)}if(m.length>=2){let y=new Map,d=(f,C)=>f+":"+C;for(let f=0;f<m.length;f++)for(let C=f+1;C<m.length;C++)y.set(d(m[f],m[C]),new Map);for(let f of this._rows)for(let C=0;C<m.length;C++){let M=this.STR(f[m[C]])+"";for(let _=C+1;_<m.length;_++){let S=""+this.STR(f[m[_]]),b=y.get(d(m[C],m[_])),F=M+""+S;b.set(F,(b.get(F)??0)+1)}}let h=new Map;for(let f=0;f<m.length;f++)for(let C=f+1;C<m.length;C++){let M=m[f],_=m[C],S=n[M].size,b=n[_].size,F=y.get(d(M,_)),$=F.size,o3=0;for(let I of F.values())(o3===0||I<o3)&&(o3=I);let c3=Math.round($/(S*b)*100),Z=$===S,Y=$===b;if((this._cols[M].categoricalPairStats||=[]).push({otherColumn:this._cols[_].name,fillPct:c3,determinesOther:Z,minCellCount:o3,distinctCombinations:$}),(this._cols[_].categoricalPairStats||=[]).push({otherColumn:this._cols[M].name,fillPct:c3,determinesOther:Y,minCellCount:o3,distinctCombinations:$}),Z&&S>b){let I=h.get(M);(!I||b<I.card)&&h.set(M,{name:this._cols[_].name,card:b,ratio:b/S})}if(Y&&b>S){let I=h.get(_);(!I||S<I.card)&&h.set(_,{name:this._cols[M].name,card:S,ratio:S/b})}}for(let[f,C]of h)this._cols[f].primaryParentColumn=C.name,this._cols[f].nestingRatio=Math.round(C.ratio*100)/100}return this._computedStatsForLevel=t,this._cols}updateColumnStats20(t,e,r,o,n,i,a,s,l,c,p,u){if(t>=20){let m=[...e].sort((h,f)=>h-f),y=Math.floor(m.length/2);if(r>0&&o!=null?n.avgValue=n.dataType=="Integer"?Math.round(o/r):o/r:n.avgValue=null,r>0&&(n.avgLength=i/r),this._rows.length>0&&(n.dataType!="DateTime"||a||!s?n.lowValue=s:n.lowValue=new Date(s).toISOString().slice(0,10)+"T00:00:00.000Z",n.dataType!="DateTime"||a||!l?n.highValue=l:n.highValue=new Date(l).toISOString().slice(0,10)+"T00:00:00.000Z",n.medianValue=m.length===0?null:m.length%2===0?n.dataType=="Integer"?Math.round((m[y-1]+m[y])/2):(m[y-1]+m[y])/2:m[y],n.numericPrecision=c),m.length>0){let h=n.avgValue??0,f=m.length,C=0,M=0;for(let S of m){let b=S-h;C+=b*b,M+=b*b*b}let _=C/f;n.skewness=_===0?0:M/f/Math.pow(Math.sqrt(_),3),n.stdDev=Math.sqrt(_)}o!==null&&(n.sum=o);let d=Array.from(p.entries()).sort((h,f)=>f[1]-h[1]);if(n.topCategories=d.slice(0,10).map(h=>h[1]),!n.isMeasure&&d.length>0){if(n.dataType==="String"){let f=d.map(M=>M[0]);n.formatSignature=cc(f);let C=/^(UUID|EMAIL_LIKE|URL_LIKE|PHONE_LIKE|NUMERIC_ID|HEX_ID|OPAQUE_ID_ALPHANUMERIC|DATE_STR|BOOLEAN)$/;n.formatSignature&&!C.test(n.formatSignature)&&(n.avgLength===void 0||n.avgLength>=3)&&(n.isFreeText=!0)}else n.topCategoryValues=d.slice(0,5).map(f=>f[0]);if(t>=20){let f=d.map(M=>M[0]),C=lc(f,u);if(C!==null)n.ordinalPattern=C.pattern,n.orderedDomain=C.orderedDomain;else if(n.dataType==="String"){let M=sc(f);M!==null&&(n.safeDistinctValues=M)}}let h=ec(d.map(f=>f[0]),n.name,u);h!==null&&(n.geoKind=h.geoKind,n.geoMatchPct=h.geoMatchPct,h.geoAmbiguous&&(n.geoAmbiguous=!0))}if(m.length>=8&&(n.dataType==="Integer"||n.dataType==="Decimal")){let h=f=>m[Math.floor((m.length-1)*f)];n.quantiles={p05:h(.05),p25:h(.25),p75:h(.75),p95:h(.95)}}}}updateColumnStats10(t,e,r,o,n,i,a){t>=10&&(e.blankCount=this._rows.length-r,e.distinctCount=o.size+(e.blankCount!=0?1:0),e.valueNature="Categorical",r>0&&(e.dataType==="Integer"||e.dataType==="Decimal"?e.valueNature=mr({dataType:e.dataType,isMeasure:!!e.isMeasure,name:e.name,distinct:o.size,nonblank:r,prec:n,maxval:i,minval:a}):e.dataType==="DateTime"&&(e.valueNature=e.dateWithTime?"Continuous":"Ordinal")))}getRowCount(){return this._rows.length}getLeafCardinality(){if(this._leafCardinality!==null)return this._leafCardinality;let t=[];if(this._cols.forEach((r,o)=>{r.isMeasure||t.push(o)}),t.length===0)return this._leafCardinality=this._rows.length,this._leafCardinality;let e=new Set;for(let r of this._rows)e.add(JSON.stringify(t.map(o=>r[o])));return this._leafCardinality=e.size,this._leafCardinality}_leafCardinality=null;obfuscateString(t){let e="abcdefghijklmnopqrstuvwxyz",r=()=>e[Math.floor(k8()*e.length)],o=()=>r().toUpperCase(),n=()=>Math.floor(k8()*10).toString(),i=y=>/[A-Z]/.test(y)?o():/[a-z]/.test(y)?r():/[0-9]/.test(y)?n():y,a=t.includes("@")&&t.includes("."),s=a?t.split("@"):[t],l=a?s[1]:"",c=l.endsWith(".com"),p=c?".com":"",u=c?l.slice(0,-4):l,m=y=>{let d="";for(let h of y)d+=i(h),/[a-zA-Z0-9]/.test(h)&&k8()<.2&&(d+=i(h));if(d.length>6){let h=Math.floor(k8()*Math.min(3,d.length-6));for(let f=0;f<h;f++){let C=0;for(;C<5;){let M=Math.floor(k8()*d.length);if(/[a-zA-Z0-9]/.test(d[M])){d=d.slice(0,M)+d.slice(M+1);break}C++}}}return d};if(a){let y=m(s[0]),d=m(u);return`${y}@${d}${p}`}else return m(t)}toObjectArray(){return this._rows.map(t=>{let e={};return this._cols.forEach((r,o)=>{e[r.name]=t[o]}),e})}async getCSVAsync(t){let e=[],r=t?25:1e7,o=t?4e3:1e7,n=new Map;for(let i of this._rows){let a={};for(let s=0;s<this._cols.length;s++){let l=this._cols[s],c=i[s];if(this.STR(c)!=""){if(t&&l.dataType=="String")if(n.has(c))c=n.get(c);else{let p=this.obfuscateString(c);n.set(c,p),c=p}else l.dataType=="DateTime"&&!l.dateWithTime&&(c=new Date(c).toISOString().slice(0,10)+"T00:00:00.000Z");o-=this.STR(c).length}else c=null;a[s]=c,--o}if(e.push(a),--r,r<=0||o<=0)break}return await dr.default.unparse(e,{header:!1})}getCSVHeaderLine(){return dr.default.unparse([this._cols.map(t=>this.STR(t.name))])}addRow(t,e){if(this.dedupRows){let r="";for(let n of t)r+=this.STR(n)+"~";let o=m9(r);if(this._rowHashes.has(o))return!1;this._rowHashes.add(o)}return this._rows.push(t),this._origIndices.push(e??-1),!0}getOriginalRowIndex(t){return t<0||t>=this._origIndices.length?-1:this._origIndices[t]}reset(){this._cols=[],this._rows=[],this._origIndices=[],this._rowHashes=new Set,this._leafCardinality=null}setColumns(t){this._cols=t}};/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var nP=500,yc=/^[+-]?\d{1,15}$/,hc=/^[+-]?(\d{1,3}(,\d{3})*|\d+)(\.\d+)?([eE][+-]?\d+)?$/,iP=/^\d{4}-\d{2}-\d{2}([T ]\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:?\d{2})?)?$/,aP=/^\d{1,2}[\/\-.]\d{1,2}[\/\-.]\d{2,4}$/;function sP(t){let e=0,r=0,o=0,n=0;for(let i of t){if(i==null)continue;if(typeof i=="number"){n++,r++,Number.isInteger(i)&&e++;continue}if(i instanceof Date){n++,o++;continue}if(typeof i=="boolean"){n++;continue}let a=String(i).trim();if(a!==""){if(n++,yc.test(a)){e++,r++;continue}if(hc.test(a)){r++;continue}if((iP.test(a)||aP.test(a))&&!isNaN(Date.parse(a))){o++;continue}}}return n===0?"String":o/n>.9?"DateTime":e===n?"Integer":r===n?"Decimal":"String"}function lP(t,e){if(t==null)return null;if(typeof t=="number")return e==="String"?String(t):t;if(t instanceof Date)return e==="DateTime"?t:t.toISOString();if(typeof t=="boolean")return String(t);let r=String(t).trim();if(r==="")return null;switch(e){case"Integer":return yc.test(r)?parseInt(r,10):null;case"Decimal":return hc.test(r)?parseFloat(r.replace(/,/g,"")):null;case"DateTime":{let o=Date.parse(r);return isNaN(o)?null:new Date(o)}default:return r}}function fc(t,e,r={}){if(t.length===0)throw new Error("no columns provided");let o=t.length,n=t.map((m,y)=>m.dataType??sP(e.slice(0,nP).map(d=>d?.[y]))),i=new Set((r.measures??[]).map(m=>m.toLowerCase())),a=new Set((r.dimensions??[]).map(m=>m.toLowerCase())),s=new Set((r.nonAdditive??[]).map(m=>m.toLowerCase())),l=t.map((m,y)=>{let d=m.name.toLowerCase(),h=m.isMeasure??((n[y]==="Integer"||n[y]==="Decimal")&&!y5(m.name));i.has(d)&&(h=!0),a.has(d)&&(h=!1);let f={name:m.name,dataType:n[y],isMeasure:h};return h&&s.has(d)&&(f.discourageAggregationAcrossGroups=!0),f}),c=new yr;c.setColumns(l);for(let m=0;m<e.length;m++){let y=e[m];c.addRow(Array.from({length:o},(d,h)=>lP(y?.[h],n[h])),m)}let p=c.getColumnsWithStats(r.privacyLevel??"20",r.locale??"en"),u=new Map(p.map(m=>[m.name,m]));t.forEach(m=>{let y=u.get(m.name);y&&(m.format&&(y.modelFormat=m.format),m.description&&(y.modelDesc=m.description))});for(let[m,y]of Object.entries(r.formats??{})){let d=u.get(m);d&&(d.modelFormat=y)}for(let[m,y]of Object.entries(r.descriptions??{})){let d=u.get(m);d&&(d.modelDesc=y)}for(let m of r.groupBy??[]){let y=u.get(m);y&&(y.isGrouping=!0)}return{shape:p,totalRows:c.getRowCount(),sampleCsv:null,index:c}}function hr(t,e={}){let r=mc.default.parse(t,{skipEmptyLines:!0});if(r.errors?.length&&r.data.length===0)throw new Error(`CSV parse failed: ${r.errors[0].message}`);let o=r.data;if(o.length<2)throw new Error("CSV needs a header line plus at least one data row.");let n=o[0].map(i=>(i??"").trim());return fc(n.map(i=>({name:i})),o.slice(1),e)}function gc(t,e,r={}){if(!t||t.length===0)throw new Error("profileTabular: at least one column is required");if(!e||e.length===0)throw new Error("profileTabular: at least one row is required");let o=t.map(i=>i.name),n=e.map(i=>Array.isArray(i)?i:o.map(a=>i[a]));return fc(t,n,r)}async function Mc(t,e){return parseInt(e)>=30&&(t.sampleCsv=await t.index.getCSVAsync(!0)),t}import{gzipSync as cP}from"node:zlib";import{randomBytes as gr}from"node:crypto";import{readFileSync as uP}from"node:fs";import{homedir as pP}from"node:os";import{join as dP}from"node:path";/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var Cc="2Qy@Y\\{>",mP="2.1.0.0";function vc(t=process.env){let e=t.BIC_CREDENTIALS_FILE||dP(pP(),".bic","credentials.json");try{return JSON.parse(uP(e,"utf-8"))}catch{return{}}}function _c(t=process.env){let e=vc(t),r={licenseKey:t.BIC_LICENSE_KEY??e.licenseKey??"",licensee:t.BIC_LICENSEE??e.licensee??"",secretKey:t.BIC_SECRET_KEY??e.secretKey??""};if(!r.licenseKey||!r.licensee)throw new Error(`Missing BIC trial/paid credentials. Set BIC_LICENSE_KEY + BIC_LICENSEE (BIC_SECRET_KEY optional) in the MCP server's env, or put {"licenseKey":"\u2026","licensee":"\u2026"} in ~/.bic/credentials.json. MCP access requires a trial or paid account (no freemium).`);return r}function Pc(t=process.env){let e=vc(t);return(t.BIC_URL??e.url??"https://bizintelligencechampions.com").replace(/\/+$/,"")}function Ac(t){let e=Buffer.from(JSON.stringify(t),"utf-8");return cP(e,{level:6}).toString("base64").replace(/\//g,".")}function Sc(t,e,r=process.env){let o=gr(16).toString("hex"),n=t.shape.reduce((i,a)=>!a.isMeasure&&(a.distinctCount??0)>i?a.distinctCount:i,0);return{payload:{licenseKey:e.licenseKey,licensee:e.licensee,secretKey:e.secretKey,freemiumKey:"",clientVersion:r.BIC_MCP_CLIENT_VERSION??mP,host:"SDK",supportsStreaming:!0,height:t.height??600,width:t.width??800,totalRows:t.totalRows,cultureCode:t.cultureCode??"en-US",genNew:!0,version:0,identifier:"",temp:7,modifiers:[],backgroundColor:"#ffffff",palette:"",shape:t.shape,model:t.model??r.BIC_MCP_MODEL??"",renderer:t.renderer??"D3",language:t.language??"",sampleCsv:t.sampleCsv??null,clientId:"mcp",triesLeft:3,maxTries:3,rendererSpecificPayload:null,reasoningMode:t.reasoningMode||r.BIC_MCP_REASONING||"",supportsVega:!1,correlationId:o,compactness:"",clientHints:{viewportWidth:t.width??800,viewportHeight:t.height??600,rowCount:t.totalRows,leafCardinality:t.leafCardinality,maxNonMeasureCardinality:n,favorStyle:t.chartHint??"",userCommentary:t.prompt??""}},correlationId:o}}async function yP(t,e){let r=t.body?.getReader?.();if(!r){let l=await t.text();return fr(l.trim())}let o=new TextDecoder,n="",i=null,a=l=>l&&(l.code!==void 0||l.errorMessage!==void 0||l.Code!==void 0||l.ErrorMessage!==void 0);try{for(;;){let{done:l,value:c}=await r.read();if(l)break;n+=o.decode(c,{stream:!0});let p;for(;(p=n.indexOf(`
57
57
  `))>=0;){let u=n.slice(0,p).trim();if(n=n.slice(p+1),u==="")continue;let m=fr(u);if(m)if(m.type==="progress"){let y=String(m.stage??"").trim();y&&e&&e(y)}else m.type==="result"?i=m.result:i===null&&a(m)&&(i=m)}}}finally{try{r.releaseLock()}catch{}}let s=n.trim();if(s!==""){let l=fr(s);l&&(l.type==="result"?i=l.result:i===null&&a(l)&&(i=l))}if(i===null)throw new Error("stream ended without a result line");return i}function fr(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function bc(t,e=process.env){let r=_c(e),o=Pc(e),{payload:n,correlationId:i}=Sc(t,r,e),a=Ac(n),s=m9(a+Cc),l=gr(16).toString("hex"),c=Number(e.BIC_MCP_TIMEOUT_MS??9e5),p=Date.now(),u=h=>({ok:!1,code:"",language:"",version:0,errorMessage:h,isServiceError:!0,codeSummary:"",finalChartName:"",creditCost:null,geoColumn:"",geoKind:"",pointCityColumn:"",pointStateColumn:"",pointZipColumn:"",pointLatColumn:"",pointLonColumn:"",correlationId:i,raw:null}),m;try{m=await fetch(`${o}/api/LLMChart/?nocache=${l}`,{method:"POST",body:a,headers:{"Content-Type":"text/plain","X-Signature":String(s)},signal:AbortSignal.timeout(c)})}catch(h){let f=Math.round((Date.now()-p)/1e3),C=h?.name==="TimeoutError"||h?.name==="AbortError";return u(C?`Gave up waiting after ${f}s \u2014 this MCP client's own timeout (BIC_MCP_TIMEOUT_MS=${c}). The generation may still be running server-side and may be billed. Raise BIC_MCP_TIMEOUT_MS, or lower the cost of the request (simpler chart type, fewer rows, reasoning_mode "1P"). correlationId ${i}.`:`Could not reach the BIC backend after ${f}s: ${String(h?.message??h)}. correlationId ${i}.`)}if(!m.ok){let h=await m.text().catch(()=>""),f=(m.status===499||m.status===502||m.status===504)&&h.trim().length===0,C=Math.round((Date.now()-p)/1e3),M=f?`The connection was cut by an intermediary after ${C}s (HTTP ${m.status}, empty body) while the request was still in flight. The generation very likely COMPLETED server-side and MAY HAVE BEEN BILLED \u2014 it just could not be delivered. Raising this client's timeout will NOT help: the ceiling is a gateway between us, not your wait. Get under it by making the request cheaper \u2014 a simpler chart type, fewer rows, or reasoning_mode "1P" \u2014 and quote correlationId ${i} to BIC support to recover or refund this generation.`:`HTTP ${m.status}: ${h.slice(0,300)} (correlationId ${i})`;return u(M)}let y;try{y=await yP(m,t.onProgress)}catch(h){let f=Math.round((Date.now()-p)/1e3);return u(`The response stream ended after ${f}s without a result. The generation may have COMPLETED and BEEN BILLED \u2014 quote correlationId ${i} to BIC support to recover or refund it. (${String(h?.message??h)})`)}let d=(h,f)=>y?.[h]??y?.[f];return{ok:!!d("code","Code")&&!d("errorMessage","ErrorMessage"),code:d("code","Code")??"",language:d("language","Language")??"",version:Number(d("version","Version")??0),errorMessage:d("errorMessage","ErrorMessage")??"",isServiceError:!!d("isServiceError","IsServiceError"),codeSummary:d("codeSummary","CodeSummary")??"",finalChartName:d("finalChartName","FinalChartName")??"",creditCost:d("creditCost","CreditCost")??null,geoColumn:d("geoColumn","GeoColumn")??"",geoKind:d("geoKind","GeoKind")??"",pointCityColumn:d("pointCityColumn","PointCityColumn")??"",pointStateColumn:d("pointStateColumn","PointStateColumn")??"",pointZipColumn:d("pointZipColumn","PointZipColumn")??"",pointLatColumn:d("pointLatColumn","PointLatColumn")??"",pointLonColumn:d("pointLonColumn","PointLonColumn")??"",correlationId:i,raw:y}}async function wc(t,e=process.env){let r;try{r=_c(e)}catch{r={licenseKey:"",licensee:"",secretKey:""}}let o=Pc(e),{payload:n}=Sc({shape:t.shape,totalRows:t.totalRows,leafCardinality:t.leafCardinality,width:t.width,height:t.height,renderer:t.renderer??"",language:t.language??""},r,e),i=Ac(n),a=m9(i+Cc),s=await fetch(`${o}/api/LLMChart/qualify?nocache=${gr(8).toString("hex")}`,{method:"POST",body:i,headers:{"Content-Type":"text/plain","X-Signature":String(a)},signal:AbortSignal.timeout(Number(e.BIC_MCP_QUALIFY_TIMEOUT_MS??6e4))});if(!s.ok){let d=await s.text().catch(()=>"");return{ok:!1,charts:[],errorMessage:`HTTP ${s.status}: ${d.slice(0,200)}`}}let l=await s.json(),c=(d,h)=>l?.[d]??l?.[h],p=c("errorMessage","ErrorMessage");if(p)return{ok:!1,charts:[],errorMessage:String(p)};let u=c("charts","Charts")??[],m=d=>d==null?void 0:Number(d);return{ok:!0,charts:u.map(d=>({name:(d?.name??d?.Name??"").toString(),description:(d?.description??d?.Description??"").toString(),rank:m(d?.rank??d?.Rank),score:m(d?.score??d?.Score),renderer:(d?.renderer??d?.Renderer)||void 0,language:(d?.language??d?.Language)||void 0})).filter(d=>d.name),errorMessage:""}}/*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */var Nc=new Set(["USA","CAN","MEX","GTM","BLZ","SLV","HND","NIC","CRI","PAN","CUB","JAM","HTI","DOM","BHS","PRI","TTO"]),kc=75;function hP(t,e){let r=[],o=t.length;for(let n=0;n<o;n++){let i=t[n],a=t[(n+o-1)%o],s=i[1]<=e,l=a[1]<=e;if(s!==l){let c=i[1]-a[1],p=c===0?0:(e-a[1])/c;r.push([a[0]+p*(i[0]-a[0]),e])}s&&r.push(i)}return r.length&&(r[0][0]!==r[r.length-1][0]||r[0][1]!==r[r.length-1][1])&&r.push(r[0]),r}function Tc(t,e){let r=t&&t.geometry;if(!r)return null;let o=n=>{let i=n.map(a=>hP(a,e)).filter(a=>a.length>=4);return i.length&&i[0].length>=4?i:null};if(r.type==="Polygon"){let n=o(r.coordinates);return n?{...t,geometry:{type:"Polygon",coordinates:n}}:null}if(r.type==="MultiPolygon"){let n=r.coordinates.map(o).filter(i=>i!==null);return n.length?{...t,geometry:{type:"MultiPolygon",coordinates:n}}:null}return t}/*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */var T8="1.0.0";var j4="data-row-idx",z8="llm-xfilter-refresh",_7="__llmAnimStop",kr="__llmXfClear",Tr="__llmInitialXfMark";var P7=1e3,zr=250,xr=5e3,A7=60,Fr=3,Ir=500;/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var fP="Abasolo|MX11|-101.53|20.45|27,Abbotsford|BC|-122.25|49.06|141,Aberdeen|SD|-98.49|45.46|28,Abilene|TX|-99.73|32.45|125,Abington|PA|-75.12|40.12|55,Acambaro|MX11|-100.72|20.03|57,Acapulco de Juarez|MX12|-99.91|16.85|658,Acatzingo|MX21|-97.78|18.98|25,Acayucan|MX30|-94.91|17.95|50,Actopan|MX13|-98.94|20.27|32,Addison|IL|-87.99|41.93|37,Adelanto|CA|-117.41|34.58|33,Agawam|MA|-72.61|42.07|28,Agincourt North|ON|-79.28|43.8|29,Agua Caliente|CA|-122.49|38.32|27,Agua Dulce|MX30|-94.15|18.14|36,Agua Prieta|MX26|-109.54|31.32|77,Aguascalientes|MX01|-102.28|21.88|722,Ahuntsic-Cartierville|QC|-73.67|45.57|135,Ahwatukee Foothills|AZ|-111.98|33.34|83,Aiken|SC|-81.72|33.56|30,Airdrie|AB|-114.04|51.3|90,Airport|HI|-157.93|21.34|28,Ajalpan|MX21|-97.26|18.38|28,Ajax|ON|-79.03|43.85|119,Akron|OH|-81.52|41.08|197,Alabaster|AL|-86.82|33.24|32,Alafaya|FL|-81.21|28.56|78,Alameda|CA|-122.26|37.77|78,Alamo|MX30|-97.68|20.91|25,Alamogordo|NM|-105.96|32.9|30,Albany|NY|-73.76|42.65|101,Albany|GA|-84.16|31.58|74,Albany|OR|-123.11|44.64|52,Albany Park|IL|-87.72|41.97|52,Albuquerque|NM|-106.65|35.08|564,Alexandria|VA|-77.05|38.8|159,Alexandria|LA|-92.45|31.31|47,Algonquin|IL|-88.29|42.17|30,Alhambra|AZ|-112.13|33.5|127,Alhambra|CA|-118.13|34.1|85,Aliamanu / Salt Lakes / Foster Village|HI|-157.92|21.36|38,Alief|TX|-95.6|29.71|98,Aliso Viejo|CA|-117.73|33.57|50,Allapattah|FL|-80.22|25.81|54,Allen|TX|-96.67|33.1|98,Allen Park|MI|-83.21|42.26|27,Allentown|PA|-75.49|40.61|120,Allston|MA|-71.13|42.36|28,Alma|QC|-71.65|48.55|29,Aloha|OR|-122.87|45.49|49,Alpharetta|GA|-84.29|34.08|63,Altadena|CA|-118.13|34.19|42,Altamira|MX28|-97.94|22.39|59,Altamonte Springs|FL|-81.37|28.66|43,Alton|IL|-90.18|38.89|27,Altoona|PA|-78.39|40.52|45,Alvaro Obregon|MX09|-99.2|19.36|726,Alvin|TX|-95.24|29.42|25,Amarillo|TX|-101.83|35.22|198,Ameca|MX14|-104.05|20.55|36,Amecameca|MX15|-98.77|19.12|31,American Fork|UT|-111.8|40.38|28,Ames|IA|-93.62|42.03|65,Amherst|NY|-78.8|42.98|122,Amherst|MA|-72.52|42.37|39,Amozoc de Mota|MX21|-98.05|19.05|95,Anaheim|CA|-117.91|33.84|350,Ancaster|ON|-79.99|43.22|40,Anchorage|AK|-149.9|61.22|289,Anderson|IN|-85.68|40.11|55,Anderson|SC|-82.65|34.5|27,Andover|MN|-93.29|45.23|32,Ankeny|IA|-93.61|41.73|56,Ann Arbor|MI|-83.74|42.28|117,Annandale|VA|-77.2|38.83|41,Annapolis|MD|-76.49|38.98|40,Annex|ON|-79.4|43.67|30,Antelope|CA|-121.33|38.71|45,Antioch|CA|-121.81|38|110,Apache Junction|AZ|-111.55|33.42|38,Apan|MX13|-98.45|19.71|26,Apaseo el Alto|MX11|-100.62|20.46|27,Apaseo el Grande|MX11|-100.69|20.55|26,Apatzingan|MX16|-102.36|19.09|102,Apex|NC|-78.85|35.73|45,Apizaco|MX29|-98.14|19.41|49,Apopka|FL|-81.51|28.68|48,Apple Valley|CA|-117.19|34.5|72,Apple Valley|MN|-93.22|44.73|51,Appleton|WI|-88.42|44.26|74,Arandas|MX14|-102.35|20.71|52,Arcadia|CA|-118.04|34.14|58,Arcola East|SK|-104.54|50.43|33,Arden-Arcade|CA|-121.38|38.6|92,Ardmore|OK|-97.14|34.17|25,Arlington|TX|-97.11|32.74|388,Arlington|VA|-77.1|38.88|207,Arlington|MA|-71.16|42.42|42,Arlington Heights|IL|-87.98|42.09|75,Arvada|CO|-105.09|39.8|115,Ashburn|VA|-77.49|39.04|43,Ashburn|IL|-87.71|41.75|42,Asheboro|NC|-79.81|35.71|26,Asheville|NC|-82.55|35.6|95,Ashmont|MA|-71.07|42.28|30,Aspen Hill|MD|-77.07|39.08|48,Astoria|NY|-73.93|40.77|150,Atascadero|CA|-120.67|35.49|29,Atascocita|TX|-95.18|30|65,Athens|GA|-83.38|33.96|127,Athens|OH|-82.1|39.33|25,Atlanta|GA|-84.39|33.75|510,Atlantic City|NJ|-74.42|39.36|39,Atlixco|MX21|-98.44|18.91|86,Atotonilco el Alto|MX14|-102.51|20.55|26,Attleboro|MA|-71.29|41.94|44,Atwater|CA|-120.61|37.35|29,Auburn|WA|-122.23|47.31|77,Auburn|AL|-85.48|32.61|62,Auburn|NY|-76.57|42.93|26,Auburn Gresham|IL|-87.65|41.74|45,Augusta|GA|-81.97|33.47|43,Aurora|CO|-104.83|39.73|359,Aurora|IL|-88.32|41.76|200,Aurora|ON|-79.47|44|55,Austin|TX|-97.74|30.27|974,Austintown|OH|-80.76|41.1|29,Autlan de Navarro|MX14|-104.37|19.77|45,Aventura|FL|-80.14|25.96|37,Avondale|AZ|-112.35|33.44|80,Avondale|IL|-87.71|41.94|39,Aylmer|QC|-75.81|45.4|56,Azcapotzalco|MX09|-99.19|19.49|414,Azusa|CA|-117.91|34.13|49,Back Mountain|PA|-76|41.34|26,Bakersfield|CA|-119.02|35.37|373,Balch Springs|TX|-96.62|32.73|25,Baldwin Park|CA|-117.96|34.09|77,Ballwin|MO|-90.55|38.6|30,Baltimore|MD|-76.61|39.29|585,Banbury-Don Mills|ON|-79.35|43.74|27,Bangor|ME|-68.77|44.8|32,Banning|CA|-116.88|33.93|30,Barberton|OH|-81.61|41.01|26,Barnstable|MA|-70.3|41.7|47,Barrie|ON|-79.67|44.4|147,Bartlesville|OK|-95.98|36.75|36,Bartlett|TN|-89.87|35.2|58,Bartlett|IL|-88.19|42|41,Batavia|IL|-88.31|41.85|26,Bath Beach|NY|-74|40.6|33,Baton Rouge|LA|-91.19|30.44|227,Battle Creek|MI|-85.18|42.32|51,Bay City|MI|-83.89|43.59|33,Bay Shore|NY|-73.25|40.73|26,Bay Street Corridor|ON|-79.39|43.66|25,Bayonne|NJ|-74.11|40.67|66,Bayside|NY|-73.78|40.77|66,Baytown|TX|-94.98|29.74|76,Bayview-Hunters Point|CA|-122.38|37.73|34,Beaumont|TX|-94.1|30.09|115,Beaumont|CA|-116.98|33.93|43,Beauport|QC|-71.19|46.86|81,Beavercreek|OH|-84.06|39.71|46,Beaverton|OR|-122.8|45.49|96,Bedford|TX|-97.14|32.84|49,Bel Air North|MD|-76.37|39.55|30,Bel Air South|MD|-76.32|39.51|47,Bell|CA|-118.19|33.98|36,Bell Gardens|CA|-118.15|33.97|43,Bella Vista|AR|-94.27|36.48|27,Belleville|ON|-77.38|44.17|50,Belleville|IL|-89.98|38.52|42,Belleville|NJ|-74.15|40.79|36,Bellevue|WA|-122.2|47.61|139,Bellevue|NE|-95.89|41.14|55,Bellflower|CA|-118.12|33.88|78,Bellingham|WA|-122.49|48.76|85,Belmont|CA|-122.28|37.52|27,Belmont Cragin|IL|-87.77|41.93|79,Beloit|WI|-89.03|42.51|36,Beltline|AB|-114.07|51.04|25,Belvidere|IL|-88.84|42.26|25,Bend|OR|-121.32|44.06|87,Bendale|ON|-79.25|43.77|29,Benicia|CA|-122.16|38.05|28,Benito Juarez|MX09|-99.16|19.37|385,Benito Juarez|MX09|-99.16|19.4|355,Bensalem|PA|-74.95|40.1|60,Bensonhurst|NY|-73.99|40.6|60,Benton|AR|-92.59|34.56|34,Bentonville|AR|-94.21|36.37|44,Bergenfield|NJ|-74|40.93|27,Berkeley|CA|-122.27|37.87|120,Berriozabal|MX05|-93.27|16.8|28,Berwyn|IL|-87.79|41.85|56,Bessemer|AL|-86.95|33.4|26,Bethel Park|PA|-80.04|40.33|32,Bethesda|MD|-77.1|38.98|60,Bethlehem|PA|-75.37|40.63|74,Bettendorf|IA|-90.52|41.52|35,Beverly|MA|-70.88|42.56|41,Beverly Cove|MA|-70.85|42.55|40,Beverly Hills|CA|-118.4|34.07|34,Big Spring|TX|-101.48|32.25|28,Billerica|MA|-71.27|42.56|39,Billings|MT|-108.5|45.78|117,Biloxi|MS|-88.89|30.4|45,Binghamton|NY|-75.92|42.1|46,Birmingham|AL|-86.8|33.52|196,Bismarck|ND|-100.78|46.81|75,Blacksburg|VA|-80.41|37.23|44,Blaine|MN|-93.23|45.16|62,Blainville|QC|-73.88|45.67|46,Bloomfield|NJ|-74.19|40.81|49,Bloomington|MN|-93.3|44.84|86,Bloomington|IN|-86.53|39.17|84,Bloomington|IL|-88.99|40.48|78,Blue Springs|MO|-94.28|39.02|54,Boardman|OH|-80.66|41.02|35,Boca Raton|FL|-80.08|26.36|93,Boisbriand|QC|-73.83|45.62|26,Boise|ID|-116.2|43.61|235,Bolingbrook|IL|-88.07|41.7|74,Bolton|ON|-79.74|43.88|26,Bonita Springs|FL|-81.78|26.34|51,Borough Park|NY|-74|40.63|149,Bossier City|LA|-93.73|32.52|68,Boston|MA|-71.06|42.36|653,Bothell|WA|-122.21|47.76|42,Boucherville|QC|-73.44|45.59|39,Boulder|CO|-105.27|40.01|106,Bountiful|UT|-111.88|40.89|43,Bowie|MD|-76.73|38.94|58,Bowling Green|KY|-86.44|36.99|63,Bowling Green|OH|-83.65|41.37|31,Bowmanville|ON|-78.68|43.92|39,Boyle Heights|CA|-118.21|34.03|92,Boynton Beach|FL|-80.07|26.53|73,Bozeman|MT|-111.04|45.68|43,Bradenton|FL|-82.57|27.5|54,Braintree|MA|-71|42.2|37,Brampton|ON|-79.77|43.68|656,Brandon|FL|-82.29|27.94|103,Brandon|MB|-99.95|49.85|48,Branford|CT|-72.82|41.28|29,Brant|ON|-80.35|43.13|34,Brantford|ON|-80.27|43.13|104,Brawley|CA|-115.53|32.98|25,Brea|CA|-117.9|33.92|41,Bremerton|WA|-122.63|47.57|39,Brentwood|NY|-73.25|40.78|60,Brentwood|CA|-121.7|37.93|58,Brentwood|TN|-86.78|36.03|41,Brentwood|CA|-118.47|34.05|33,Brentwood Estates|TN|-86.78|36.03|31,Briarwood|NY|-73.82|40.71|53,Brick|NJ|-74.14|40.06|76,Bridgeport|CT|-73.19|41.18|147,Bridgeport|IL|-87.65|41.84|33,Bridgeton|NJ|-75.23|39.43|25,Bridgewater|NJ|-74.65|40.6|44,Brighouse-City Centre|BC|-123.13|49.17|62,Brighton|MA|-71.16|42.35|45,Brighton|CO|-104.82|39.99|37,Brighton|NY|-77.55|43.15|36,Brighton Beach|NY|-73.96|40.58|31,Brighton Park|IL|-87.7|41.82|44,Bristol|CT|-72.95|41.67|60,Bristol|TN|-82.19|36.6|26,Brockton|MA|-71.02|42.08|95,Broken Arrow|OK|-95.79|36.05|106,Brookfield|WI|-88.11|43.06|38,Brookhaven|GA|-84.34|33.86|51,Brooklin|ON|-78.96|43.96|25,Brookline|MA|-71.12|42.33|58,Brooklyn|NY|-73.95|40.65|2736,Brooklyn Center|MN|-93.33|45.08|30,Brooklyn Park|MN|-93.36|45.09|79,Broomfield|CO|-105.09|39.92|65,Brossard|QC|-73.47|45.45|69,Brownsville|TX|-97.5|25.9|186,Brownsville|NY|-73.92|40.66|74,Brunswick|OH|-81.84|41.24|34,Bryan|TX|-96.37|30.67|82,Buckeye|AZ|-112.58|33.37|50,Buena Park|CA|-118|33.87|83,Buenaventura Lakes|FL|-81.35|28.34|26,Buenavista|MX15|-99.17|19.61|216,Buffalo|NY|-78.88|42.89|258,Buffalo Grove|IL|-87.96|42.15|41,Bullhead City|AZ|-114.57|35.15|39,Burbank|CA|-118.31|34.18|105,Burbank|IL|-87.78|41.73|29,Burien|WA|-122.35|47.47|50,Burke|VA|-77.27|38.79|41,Burleson|TX|-97.32|32.54|43,Burlingame|CA|-122.37|37.58|30,Burlington|ON|-79.84|43.39|186,Burlington|NC|-79.44|36.1|52,Burlington|VT|-73.21|44.48|42,Burlington|IA|-91.11|40.81|25,Burnaby|BC|-122.95|49.27|249,Burnsville|MN|-93.28|44.77|61,Burton|MI|-83.62|43|28,Bushwick|NY|-73.92|40.69|112,Bustleton|PA|-75.03|40.08|32,Butte|MT|-112.53|46|34,Cabo San Lucas|MX03|-109.91|22.89|202,Cabot|AR|-92.02|34.97|25,Cadereyta|MX19|-99.98|25.58|67,Cadereyta Jimenez|MX19|-100|25.59|68,Caldwell|ID|-116.69|43.66|51,Caledon|ON|-79.99|43.87|76,Calexico|CA|-115.5|32.68|40,Calgary|AB|-114.09|51.05|1306,Calpulalpan|MX29|-98.57|19.59|33,Calumet City|IL|-87.53|41.62|37,Camarillo|CA|-119.04|34.22|67,Cambridge|ON|-80.31|43.36|129,Cambridge|MA|-71.11|42.38|110,Camden|NJ|-75.12|39.93|76,Campbell|CA|-121.95|37.29|41,Campbell River|BC|-125.24|50.02|33,Campeche|MX04|-90.52|19.84|220,Cananea|MX26|-110.3|30.98|31,Canarsie|NY|-73.9|40.64|87,Cancun|MX23|-86.85|21.17|888,Canoga Park|CA|-118.6|34.2|60,Canton|MI|-83.48|42.31|86,Canton|OH|-81.38|40.8|71,Canton|GA|-84.49|34.24|25,Cantonment|FL|-87.34|30.61|26,Canyon Country|CA|-118.47|34.42|59,Cape Coral|FL|-81.95|26.56|175,Cape Girardeau|MO|-89.52|37.31|39,Carbondale|IL|-89.22|37.73|26,Cardenas|MX27|-93.38|18|91,Carlsbad|CA|-117.35|33.16|114,Carlsbad|NM|-104.23|32.42|28,Carmel|IN|-86.12|39.98|88,Carmichael|CA|-121.33|38.62|61,Carney|MD|-76.52|39.39|29,Carol City|FL|-80.25|25.94|63,Carol Stream|IL|-88.13|41.91|40,Carpentersville|IL|-88.26|42.12|38,Carrollton|TX|-96.89|32.95|133,Carrollton|GA|-85.08|33.58|26,Carrollwood|FL|-82.49|28.05|33,Carrollwood Village|FL|-82.52|28.07|40,Carson|CA|-118.28|33.83|93,Carson City|NV|-119.77|39.16|58,Cartierville|QC|-73.7|45.53|34,Cary|NC|-78.78|35.79|159,Casa Grande|AZ|-111.76|32.88|51,Casas Adobes|AZ|-111|32.32|66,Casper|WY|-106.31|42.87|60,Casselberry|FL|-81.33|28.68|27,Castle Rock|CO|-104.86|39.37|55,Castlewood|CO|-104.9|39.58|25,Castro Valley|CA|-122.09|37.69|61,Catalina Foothills|AZ|-110.92|32.3|50,Catemaco|MX30|-95.11|18.42|27,Cathedral City|CA|-116.47|33.78|53,Catonsville|MD|-76.73|39.27|41,Cedar City|UT|-113.06|37.68|30,Cedar Falls|IA|-92.45|42.53|41,Cedar Hill|TX|-96.96|32.59|48,Cedar Park|TX|-97.82|30.51|65,Cedar Rapids|IA|-91.64|42.01|130,Celaya|MX11|-100.81|20.52|340,Celina|TX|-96.78|33.32|64,Centennial|CO|-104.88|39.58|109,Center City|PA|-75.16|39.95|57,Centereach|NY|-73.1|40.86|31,Central|LA|-91.04|30.55|28,Central 14th Street / Spring Road|DC|-77.03|38.94|25,Central City|AZ|-112.06|33.44|58,Central Islip|NY|-73.2|40.79|34,Centre City|AB|-114.07|51.05|41,Centretown|ON|-75.7|45.42|25,Centreville|VA|-77.43|38.84|71,Centro Familiar la Soledad|MX11|-101.75|21.14|32,Ceres|CA|-120.96|37.59|47,Cerritos|CA|-118.06|33.86|49,Chalco|MX15|-98.9|19.26|168,Chamblee|GA|-84.3|33.89|28,Champaign|IL|-88.24|40.12|86,Champoton|MX04|-90.72|19.34|30,Chandler|AZ|-111.84|33.31|260,Chanhassen|MN|-93.53|44.86|25,Channelview|TX|-95.11|29.78|38,Chapel Hill|NC|-79.06|35.91|59,Charlesbourg|QC|-71.31|46.9|82,Charleston|SC|-79.93|32.78|132,Charleston|WV|-81.63|38.35|46,Charlotte|NC|-80.84|35.23|911,Charlottesville|VA|-78.48|38.03|46,Charlottetown|PE|-63.13|46.23|38,Chaska|MN|-93.6|44.79|25,Chateauguay|QC|-73.75|45.38|42,Chatham|ON|-82.18|42.41|43,Chatham|IL|-87.61|41.74|31,Chatsworth|CA|-118.6|34.26|41,Chattanooga|TN|-85.31|35.05|181,Cheektowaga|NY|-78.75|42.9|75,Chelmsford|MA|-71.37|42.6|33,Chelsea|MA|-71.03|42.39|39,Cherry Hill|NJ|-75.03|39.93|70,Chesapeake|VA|-76.27|36.82|235,Cheshire|CT|-72.9|41.5|29,Chester|PA|-75.36|39.85|34,Chesterfield|MO|-90.58|38.66|47,Chestermere|AB|-113.82|51.03|32,Chetumal|MX23|-88.3|18.52|169,Cheyenne|WY|-104.82|41.14|65,Chiapa de Corzo|MX05|-93.01|16.71|45,Chicago|IL|-87.65|41.85|2664,Chicago Heights|IL|-87.64|41.51|30,Chicago Lawn|IL|-87.7|41.78|55,Chicago Loop|IL|-87.63|41.88|33,Chico|CA|-121.84|39.73|121,Chicoloapan|MX15|-98.9|19.42|172,Chicopee|MA|-72.61|42.15|56,Chicoutimi|QC|-71.06|48.42|69,Chihuahua|MX06|-106.09|28.64|925,Chilapa de Alvarez|MX12|-99.17|17.6|31,Chilliwack|BC|-121.95|49.17|101,Chilliwack-Downtown|BC|-121.96|49.16|31,Chillum|MD|-76.99|38.96|33,Chilpancingo|MX12|-99.5|17.55|187,Chinatown|CA|-122.41|37.8|100,Chinatown|NY|-74|40.72|90,Chino|CA|-117.69|34.01|85,Chino Hills|CA|-117.76|33.99|78,Cholula|MX21|-98.3|19.06|292,Chomedey|QC|-73.75|45.53|94,Chula Vista|CA|-117.08|32.64|265,Church-Yonge Corridor|ON|-79.38|43.66|31,Cibolo|TX|-98.23|29.56|33,Cicero|IL|-87.75|41.85|83,Cicero|NY|-76.12|43.18|31,Cihuatlan|MX14|-104.57|19.24|40,Cincinnati|OH|-84.51|39.13|311,Cintalapa de Figueroa|MX05|-93.72|16.68|42,Citrus Heights|CA|-121.28|38.71|87,City of Milford (balance)|CT|-73.06|41.22|51,City of Sammamish|WA|-122.04|47.6|45,Ciudad Acuna|MX07|-100.95|29.32|216,Ciudad Altamirano|MX12|-100.67|18.36|25,Ciudad Apodaca|MX19|-100.19|25.78|467,Ciudad Benito Juarez|MX19|-100.09|25.65|308,Ciudad Constitucion|MX03|-111.66|25.03|40,Ciudad de Allende|MX19|-100.02|25.28|26,Ciudad de Huajuapan de Leon|MX20|-97.78|17.81|53,Ciudad de Villa de Alvarez|MX08|-103.74|19.27|117,Ciudad del Carmen|MX04|-91.83|18.65|191,Ciudad Delicias|MX06|-105.47|28.19|148,Ciudad Fernandez|MX24|-100.01|21.94|32,Ciudad General Escobedo|MX19|-100.32|25.8|454,Ciudad Guzman|MX14|-103.46|19.7|111,Ciudad Hidalgo|MX16|-100.56|19.69|60,Ciudad Juarez|MX06|-106.46|31.72|1512,Ciudad Lazaro Cardenas|MX16|-102.2|17.96|196,Ciudad Lopez Mateos|MX15|-99.26|19.56|489,Ciudad Madero|MX28|-97.84|22.25|197,Ciudad Mante|MX28|-98.97|22.74|84,Ciudad Melchor Muzquiz|MX07|-101.52|27.88|35,Ciudad Mendoza|MX30|-97.18|18.81|35,Ciudad Nezahualcoyotl|MX15|-99.01|19.4|1077,Ciudad Obregon|MX26|-109.94|27.49|329,Ciudad Rio Bravo|MX28|-98.09|25.99|95,Ciudad Sabinas Hidalgo|MX19|-100.18|26.5|33,Ciudad Sahagun|MX13|-98.57|19.78|28,Ciudad Valles|MX24|-99.01|22|124,Ciudad Victoria|MX28|-99.14|23.74|332,Clairlea-Birchmount|ON|-79.28|43.71|26,Claremont|CA|-117.72|34.1|36,Clarksville|TN|-87.36|36.53|166,Clay|NY|-76.17|43.19|58,Clearfield|UT|-112.03|41.11|30,Clearwater|FL|-82.8|27.97|117,Cleburne|TX|-97.39|32.35|30,Clermont|FL|-81.77|28.55|32,Cleveland|OH|-81.7|41.5|365,Cleveland|TN|-84.88|35.16|43,Cleveland Heights|OH|-81.56|41.52|44,Clifton|NJ|-74.16|40.86|86,Clifton Park|NY|-73.77|42.87|36,Clinton|MD|-76.9|38.77|35,Clinton|IA|-90.19|41.84|26,Clinton|MS|-90.32|32.34|25,Clinton Township|MI|-82.92|42.59|99,Cloverdale|BC|-122.73|49.11|73,Clovis|CA|-119.7|36.83|104,Clovis|NM|-103.21|34.4|39,Coacalco|MX15|-99.11|19.63|277,Coachella|CA|-116.17|33.68|44,Coatepec|MX30|-96.96|19.45|53,Coatzacoalcos|MX30|-94.44|18.15|310,Coatzintla|MX30|-97.47|20.49|34,Cobbs Creek|PA|-75.24|39.95|33,Cochrane|AB|-114.47|51.18|32,Coconut Creek|FL|-80.18|26.25|59,Cocula|MX14|-103.82|20.37|29,Coeur d'Alene|ID|-116.78|47.68|49,Colima|MX08|-103.71|19.24|146,College Park|MD|-76.94|38.98|32,College Point|NY|-73.85|40.79|27,College Station|TX|-96.33|30.63|107,Colleyville|TX|-97.16|32.88|25,Collierville|TN|-89.66|35.04|48,Collinwood|OH|-81.57|41.56|34,Colonia del Sol|MX03|-109.93|22.91|48,Colonia del Valle|MX09|-99.16|19.39|250,Colonia Lindavista|MX15|-99.12|19.49|100,Colonia Nativitas|MX09|-99.14|19.38|60,Colorado Springs|CO|-104.82|38.83|456,Colton|CA|-117.31|34.07|54,Columbia|SC|-81.03|34|142,Columbia|MO|-92.33|38.95|129,Columbia|MD|-76.84|39.24|99,Columbia|TN|-87.04|35.62|36,Columbia Heights|DC|-77.03|38.93|38,Columbus|OH|-83|39.96|913,Columbus|GA|-84.99|32.46|206,Columbus|IN|-85.92|39.2|46,Comalcalco|MX27|-93.22|18.26|41,Comitan|MX05|-92.14|16.24|166,Commack|NY|-73.29|40.84|36,Commerce City|CO|-104.93|39.81|53,Compton|CA|-118.22|33.9|98,Conception Bay South|NL|-53|47.5|27,Concord|CA|-122.03|37.98|128,Concord|NC|-80.58|35.41|87,Concord|NH|-71.54|43.21|43,Coney Island|NY|-73.99|40.58|60,Confederation|SK|-106.7|52.14|70,Conroe|TX|-95.46|30.31|68,Contla|MX29|-98.17|19.33|27,Conway|AR|-92.44|35.09|64,Cookeville|TN|-85.5|36.16|32,Coon Rapids|MN|-93.29|45.12|62,Cooper City|FL|-80.27|26.06|35,Coppell|TX|-97.02|32.95|41,Copperas Cove|TX|-97.9|31.12|33,Coquitlam|BC|-122.78|49.28|148,Coquitlam West|BC|-122.88|49.26|25,Coral Gables|FL|-80.27|25.72|51,Coral Springs|FL|-80.27|26.27|129,Coram|NY|-73|40.87|39,Cordoba|MX30|-96.93|18.88|204,Cordova|TN|-89.78|35.16|68,Core Neighbourhoods|SK|-106.67|52.13|36,Cornelius|NC|-80.86|35.49|28,Cornwall|ON|-74.73|45.02|48,Corona|CA|-117.57|33.88|164,Corona|NY|-73.86|40.75|109,Corpus Christi|TX|-97.4|27.8|316,Cortazar|MX11|-100.96|20.48|61,Corvallis|OR|-123.26|44.56|55,Cosamaloapan|MX30|-95.8|18.37|30,Costa Mesa|CA|-117.92|33.64|113,Cote-Saint-Luc|QC|-73.67|45.47|31,Cottage Grove|MN|-92.94|44.83|35,Cottonwood Heights|UT|-111.81|40.62|34,Council Bluffs|IA|-95.86|41.26|62,Country Club|FL|-80.32|25.95|47,Courtenay|BC|-124.99|49.69|28,Coventry|RI|-71.68|41.7|35,Covina|CA|-117.89|34.09|48,Covington|KY|-84.51|39.08|40,Coyoacan|MX09|-99.16|19.35|614,Coyotepec|MX15|-99.21|19.78|35,Coyula|MX14|-103.23|20.66|29,Cozumel|MX23|-86.94|20.5|77,Cranberry Township|PA|-80.11|40.68|28,Cranston|RI|-71.44|41.78|81,Crofton|MD|-76.69|39|27,Crown Point|IN|-87.37|41.42|28,Crystal Lake|IL|-88.32|42.24|40,Cuauhtemoc|MX09|-99.15|19.45|531,Cuauhtemoc|MX06|-106.87|28.41|168,Cuautitlan|MX15|-99.18|19.67|178,Cuautitlan Izcalli|MX15|-99.22|19.64|555,Cuautla|MX17|-98.94|18.81|157,Cuautlancingo|MX21|-98.27|19.09|25,Cuernavaca|MX17|-99.23|18.93|338,Culiacan|MX25|-107.39|24.8|808,Culver City|CA|-118.4|34.02|39,Cumberland|RI|-71.43|41.97|34,Cupertino|CA|-122.03|37.32|60,Cutler Bay|FL|-80.34|25.58|45,Cutler Ridge|FL|-80.35|25.58|26,Cuyahoga Falls|OH|-81.48|41.13|49,Cypress|TX|-95.7|29.97|200,Cypress|CA|-118.04|33.82|49,Cypress Hills|NY|-73.89|40.68|54,Dakota Ridge|CO|-105.14|39.62|33,Dale City|VA|-77.31|38.64|65,Dallas|TX|-96.81|32.78|1326,Dalton|GA|-84.97|34.77|33,Daly City|CA|-122.46|37.71|106,Dana Point|CA|-117.7|33.47|34,Danbury|CT|-73.45|41.39|84,Dania Beach|FL|-80.14|26.05|31,Danvers|MA|-70.93|42.58|26,Danville|CA|-122|37.82|44,Danville|VA|-79.4|36.59|42,Danville|IL|-87.63|40.12|32,Dartmouth|NS|-63.58|44.67|101,Davenport|IA|-90.58|41.52|102,Davie|FL|-80.23|26.06|100,Davis|CA|-121.74|38.54|67,Dayton|OH|-84.19|39.76|135,Daytona Beach|FL|-81.02|29.21|72,Dearborn|MI|-83.18|42.32|95,Dearborn Heights|MI|-83.27|42.34|56,Decatur|IL|-88.95|39.84|73,Decatur|AL|-86.98|34.61|55,Deer Park|TX|-95.12|29.71|33,Deer Park|NY|-73.33|40.76|27,Deer Valley|AZ|-112.13|33.68|165,Deerfield Beach|FL|-80.1|26.32|79,DeKalb|IL|-88.75|41.93|43,Del Rio|TX|-100.9|29.36|36,DeLand|FL|-81.3|29.03|30,Delano|CA|-119.25|35.77|52,Delaware|OH|-83.07|40.3|37,Delegacion Cuajimalpa de Morelos|MX09|-99.29|19.37|160,Delray Beach|FL|-80.07|26.46|66,Delta|BC|-123.05|49.09|101,Deltona|FL|-81.26|28.9|88,Denton|TX|-97.13|33.21|131,Denver|CO|-104.98|39.74|729,Derry Village|NH|-71.31|42.89|34,Des Moines|IA|-93.61|41.6|214,Des Moines|WA|-122.32|47.4|31,Des Plaines|IL|-87.88|42.03|58,Desert Hot Springs|CA|-116.5|33.96|28,Desmarchais-Crawford|QC|-73.58|45.45|29,DeSoto|TX|-96.86|32.59|52,Detroit|MI|-83.05|42.33|645,Diamond Bar|CA|-117.81|34.03|56,Dieppe|NB|-64.69|46.08|27,Dix Hills|NY|-73.34|40.8|26,Dodge City|KS|-100.02|37.75|27,Dollard-Des Ormeaux|QC|-73.82|45.49|48,Dolores Hidalgo|MX11|-100.93|21.16|67,Don Valley Village|ON|-79.35|43.78|27,Doral|FL|-80.36|25.82|75,Dorchester|MA|-71.07|42.3|97,Dorset Park|ON|-79.28|43.75|25,Dothan|AL|-85.39|31.22|68,Douglasville|GA|-84.75|33.75|32,Dover|DE|-75.52|39.16|39,Dover|NH|-70.87|43.2|30,Dovercourt-Wallace Emerson-Junction|ON|-79.44|43.67|36,Downers Grove|IL|-88.01|41.81|49,Downey|CA|-118.13|33.94|114,Downsview-Roding-CFB|ON|-79.49|43.73|35,Downtown DC|DC|-77.02|38.89|52,Downtown Halifax|NS|-63.58|44.65|25,Downtown Vancouver|BC|-123.12|49.28|62,Dracut|MA|-71.3|42.67|28,Draper|UT|-111.86|40.52|46,Drexel Heights|AZ|-111.03|32.14|27,Drexel Hill|PA|-75.29|39.95|28,Drummondville|QC|-72.48|45.88|59,Dublin|CA|-121.94|37.7|57,Dublin|OH|-83.11|40.1|45,Dubuque|IA|-90.66|42.5|58,Duluth|MN|-92.11|46.78|86,Duluth|GA|-84.14|34|29,Duncanville|TX|-96.91|32.65|39,Dundalk|MD|-76.52|39.25|63,Dunedin|FL|-82.77|28.02|36,Dunwoody|GA|-84.33|33.95|48,Durham|NC|-78.9|35.99|257,Duvernay|QC|-73.67|45.58|37,Dyker Heights|NY|-74.01|40.62|34,Eagan|MN|-93.17|44.8|66,Eagle Mountain|UT|-112.01|40.31|27,Eagle Pass|TX|-100.5|28.71|28,East Boston|MA|-71.04|42.38|43,East Brunswick|NJ|-74.42|40.43|48,East Chattanooga|TN|-85.25|35.07|154,East Chicago|IN|-87.45|41.64|28,East Concord|NH|-71.54|43.24|42,East Flatbush|NY|-73.93|40.65|178,East Florence|AL|-87.65|34.81|35,East Hampton|VA|-76.33|37.04|147,East Harlem|NY|-73.94|40.79|115,East Hartford|CT|-72.61|41.78|51,East Hastings|BC|-123.06|49.27|80,East Haven|CT|-72.87|41.28|29,East Hill-Meridian|WA|-122.17|47.41|29,East Honolulu|HI|-157.72|21.29|49,East Independence|MO|-94.36|39.1|110,East Lake|FL|-82.69|28.11|30,East Lansing|MI|-84.48|42.74|48,East Los Angeles|CA|-118.17|34.02|126,East Meadow|NY|-73.56|40.71|38,East New York|NY|-73.88|40.67|173,East Norwalk|CT|-73.4|41.11|84,East Orange|NJ|-74.2|40.77|64,East Palo Alto|CA|-122.14|37.47|29,East Pensacola Heights|FL|-87.18|30.43|54,East Point|GA|-84.44|33.68|35,East Providence|RI|-71.37|41.81|47,East Saint Louis|IL|-90.15|38.62|27,East Village|NY|-73.99|40.73|62,Easton|PA|-75.22|40.69|26,Eastpointe|MI|-82.96|42.47|32,Eastvale|CA|-117.56|33.96|59,Eau Claire|WI|-91.5|44.81|67,Ecatepec de Morelos|MX15|-99.06|19.6|1645,Echo Park|CA|-118.26|34.08|43,Eden Prairie|MN|-93.47|44.85|63,Edgewater|IL|-87.66|41.98|54,Edgewood|MD|-76.29|39.42|25,Edina|MN|-93.35|44.89|50,Edinburg|TX|-98.16|26.3|84,Edison|NJ|-74.41|40.52|102,Edmond|OK|-97.48|35.65|90,Edmonds|WA|-122.38|47.81|41,Edmonton|AB|-113.47|53.55|1010,Egypt Lake-Leto|FL|-82.51|28.02|35,El Cajon|CA|-116.96|32.79|103,El Centro|CA|-115.56|32.79|43,El Dorado Hills|CA|-121.08|38.69|42,El Mirage|AZ|-112.32|33.61|33,El Monte|CA|-118.03|34.07|116,El Paso|TX|-106.49|31.76|678,El Pueblito|MX22|-100.44|20.54|71,Eldersburg|MD|-76.95|39.4|30,Elgin|IL|-88.28|42.04|112,Elizabeth|NJ|-74.21|40.66|129,Elizabethtown|KY|-85.86|37.69|29,Elk Grove|CA|-121.37|38.41|166,Elk Grove Village|IL|-87.97|42|33,Elkhart|IN|-85.98|41.68|52,Ellendale|TN|-89.83|35.23|25,Ellicott City|MD|-76.8|39.27|65,Elmhurst|NY|-73.88|40.74|113,Elmhurst|IL|-87.94|41.9|45,Elmira|NY|-76.81|42.09|28,Elmont|NY|-73.71|40.7|33,Elyria|OH|-82.11|41.37|53,Emiliano Zapata|MX17|-99.18|18.84|49,Emiliano Zapata|MX15|-98.97|19.34|25,Empalme|MX26|-110.81|27.96|42,Encanto|AZ|-112.08|33.48|54,Encarnacion de Diaz|MX14|-102.24|21.53|25,Enchanted Hills|NM|-106.59|35.34|87,Encinitas|CA|-117.29|33.04|62,Encino|CA|-118.5|34.16|44,Enfield|CT|-72.59|41.98|45,Englewood|CO|-104.99|39.65|33,Englewood|NJ|-73.97|40.89|28,Englewood|IL|-87.65|41.78|26,Enid|OK|-97.88|36.4|51,Ensenada|MX02|-116.6|31.87|443,Enterprise|NV|-115.24|36.03|108,Enterprise|AL|-85.86|31.32|27,Erie|PA|-80.09|42.13|99,Escarcega|MX04|-90.75|18.61|29,Escondido|CA|-117.09|33.12|151,Escuinapa de Hidalgo|MX25|-105.78|22.83|30,Esperanza|MX26|-109.93|27.58|38,Essex|MD|-76.47|39.31|39,Estero|FL|-81.81|26.44|30,Etobicoke|ON|-79.57|43.64|365,Euclid|OH|-81.53|41.59|47,Eugene|OR|-123.09|44.05|176,Euless|TX|-97.08|32.84|54,Eureka|CA|-124.16|40.8|27,Evans|GA|-82.13|33.53|29,Evanston|IL|-87.69|42.04|75,Evansville|IN|-87.56|37.97|119,Everett|WA|-122.2|47.98|108,Everett|MA|-71.05|42.41|46,'Ewa Gentry-West Loch|HI|-158.03|21.35|35,Ewing|NJ|-74.8|40.27|36,Fair Lawn|NJ|-74.13|40.94|33,Fair Oaks|CA|-121.27|38.64|30,Fairbanks|AK|-147.72|64.84|32,Fairborn|OH|-84.02|39.82|33,Fairfield|CA|-122.04|38.25|112,Fairfield|CT|-73.26|41.14|59,Fairfield|OH|-84.56|39.35|42,Fairview|BC|-123.13|49.26|33,Fall River|MA|-71.16|41.7|94,Fallbrook|CA|-117.25|33.38|30,Fallingbrook|ON|-75.48|45.48|25,Far Rockaway|NY|-73.76|40.61|39,Fargo|ND|-96.79|46.88|118,Farmers Branch|TX|-96.9|32.93|32,Farmington|NM|-108.22|36.73|42,Farmington|CT|-72.83|41.72|25,Farmington Hills|MI|-83.38|42.49|81,Fayetteville|NC|-78.88|35.05|201,Fayetteville|AR|-94.16|36.06|82,Federal Way|WA|-122.31|47.32|95,Felipe Carrillo Puerto|MX23|-88.05|19.58|25,Fenway/Kenmore|MA|-71.1|42.34|37,Ferry Pass|FL|-87.21|30.51|28,Financial District|NY|-74.01|40.71|60,Findlay|OH|-83.65|41.04|41,Fishers|IN|-86.01|39.96|76,Fitchburg|MA|-71.8|42.58|40,Fitchburg|WI|-89.47|42.96|27,Flagami|FL|-80.32|25.76|50,Flagstaff|AZ|-111.65|35.2|70,Flatbush|NY|-73.96|40.65|93,Flatlands|NY|-73.93|40.62|63,Fleetwood|BC|-122.8|49.17|65,Fleming Island|FL|-81.72|30.09|27,Flint|MI|-83.69|43.01|98,Florence|AL|-87.68|34.8|40,Florence|SC|-79.76|34.2|38,Florence|KY|-84.63|39|32,Florence|AZ|-111.39|33.03|31,Florence-Graham|CA|-118.24|33.97|63,Florin|CA|-121.41|38.5|47,Florissant|MO|-90.32|38.79|52,Flower Mound|TX|-97.1|33.01|71,Folsom|CA|-121.18|38.68|76,Fond du Lac|WI|-88.44|43.77|42,Fontana|CA|-117.44|34.09|212,Foothill Farms|CA|-121.35|38.68|33,Fordham|NY|-73.9|40.86|94,Forest Hills|NY|-73.85|40.72|67,Forest Hills|MI|-85.49|42.96|25,Fort Bragg|NC|-79.01|35.14|29,Fort Cavazos|TX|-97.78|31.13|29,Fort Collins|CO|-105.08|40.59|170,Fort Erie|ON|-78.93|42.9|30,Fort Garry South|MB|-97.16|49.79|65,Fort Hamilton|NY|-74.03|40.62|28,Fort Lauderdale|FL|-80.14|26.12|183,Fort Lee|NJ|-73.97|40.85|36,Fort McMurray|AB|-111.38|56.73|66,Fort Myers|FL|-81.84|26.62|74,Fort Pierce|FL|-80.33|27.45|44,Fort Smith|AR|-94.4|35.39|88,Fort Wayne|IN|-85.13|41.13|260,Fort Worth|TX|-97.32|32.73|1008,Fortuna Foothills|AZ|-114.41|32.66|26,Foster City|CA|-122.27|37.56|33,Fountain|CO|-104.7|38.68|27,Fountain Valley|CA|-117.95|33.71|56,Fountainebleau|FL|-80.35|25.77|59,Four Corners|FL|-81.65|28.33|26,Fraccionamiento Real Palmas|MX19|-100.16|25.9|34,Framingham|MA|-71.42|42.28|68,Framingham Center|MA|-71.44|42.3|65,Francisco I. Madero|MX07|-103.27|25.77|26,Frankfort|KY|-84.87|38.2|28,Franklin|TN|-86.87|35.93|72,Franklin|WI|-88.04|42.89|36,Franklin|MA|-71.4|42.08|30,Franklin Square|NY|-73.68|40.71|29,Fraser Heights|BC|-122.78|49.2|25,Frederick|MD|-77.41|39.41|69,Fredericksburg|VA|-77.46|38.3|28,Fredericton|NB|-66.67|45.95|63,Fredericton Northside|NB|-66.64|45.98|28,Freeport|NY|-73.58|40.66|43,Fremont|CA|-121.99|37.55|232,Fremont|NE|-96.5|41.43|26,Fresh Meadows|NY|-73.79|40.73|28,Fresnillo|MX32|-102.87|23.17|143,Fresno|CA|-119.77|36.75|542,Fridley|MN|-93.26|45.09|27,Friendswood|TX|-95.2|29.53|38,Frisco|TX|-96.82|33.15|154,Frontera|MX07|-101.45|26.93|69,Fruit Cove|FL|-81.64|30.11|29,Fuentes del Valle|MX15|-99.14|19.63|74,Fullerton|CA|-117.93|33.87|140,Gabriel Leyva Solano|MX25|-108.64|25.66|27,Gadsden|AL|-86.01|34.01|36,Gage Park|IL|-87.7|41.8|41,Gahanna|OH|-82.88|40.02|34,Gainesville|FL|-82.32|29.65|145,Gainesville|GA|-83.82|34.3|38,Gaithersburg|MD|-77.2|39.14|67,Galesburg|IL|-90.37|40.95|31,Gallatin|TN|-86.45|36.39|34,Galt|CA|-121.3|38.25|25,Galveston|TX|-94.8|29.3|50,Garcia|MX19|-100.59|25.8|93,Garden City|KS|-100.87|37.97|27,Garden City|MI|-83.33|42.33|26,Garden Grove|CA|-117.94|33.77|175,Gardena|CA|-118.31|33.89|60,Garfield|NJ|-74.11|40.88|31,Garfield Heights|OH|-81.61|41.42|28,Garland|TX|-96.64|32.91|236,Garner|NC|-78.61|35.71|28,Gary|IN|-87.35|41.59|77,Gastonia|NC|-81.19|35.26|74,Gatineau|QC|-75.7|45.48|300,Georgetown|TX|-97.68|30.63|63,Georgetown|ON|-79.92|43.65|44,Georgetown|KY|-84.56|38.21|32,Germantown|MD|-77.27|39.17|86,Germantown|TN|-89.81|35.09|39,Gilbert|AZ|-111.79|33.35|247,Gillette|WY|-105.5|44.29|32,Gilroy|CA|-121.57|37.01|53,Gladstone|MO|-94.55|39.2|26,Glastonbury|CT|-72.61|41.71|31,Glen Burnie|MD|-76.62|39.16|67,Glen Cove|NY|-73.63|40.86|27,Glen Ellyn|IL|-88.07|41.88|28,Glendale|AZ|-112.19|33.54|240,Glendale|CA|-118.26|34.14|201,Glendale|NY|-73.89|40.7|34,Glendale Heights|IL|-88.06|41.91|34,Glendora|CA|-117.87|34.14|52,Glenfield-Jane Heights|ON|-79.51|43.75|30,Glenview|IL|-87.79|42.07|47,Glenville|NY|-74.05|42.93|29,Gloucester|ON|-75.63|45.35|150,Gloucester|MA|-70.66|42.61|29,Golden Glades|FL|-80.2|25.91|33,Goldsboro|NC|-77.99|35.38|35,Goleta|CA|-119.83|34.44|30,Gomez Palacio|MX10|-103.5|25.57|257,Goodyear|AZ|-112.36|33.44|79,Goose Creek|SC|-80.03|32.98|40,Goshen|IN|-85.83|41.58|32,Gramercy Park|NY|-73.99|40.74|27,Granby|QC|-72.73|45.4|66,Grand Forks|ND|-97.03|47.93|57,Grand Island|NE|-98.34|40.93|51,Grand Junction|CO|-108.55|39.06|60,Grand Prairie|TX|-97|32.75|187,Grand Rapids|MI|-85.67|42.96|195,Grande Prairie|AB|-118.8|55.17|70,Grandview|MO|-94.53|38.89|25,Grandview-Woodlands|BC|-123.07|49.28|29,Granger|IN|-86.11|41.75|30,Granite City|IL|-90.15|38.7|29,Grants Pass|OR|-123.33|42.44|37,Grapevine|TX|-97.08|32.93|51,Gravesend|NY|-73.97|40.6|112,Great Falls|MT|-111.3|47.5|59,Greater Grand Crossing|IL|-87.61|41.76|32,Greater Sudbury|ON|-80.99|46.49|166,Greeley|CO|-104.71|40.42|108,Green|OH|-81.48|40.95|25,Green Bay|WI|-88.02|44.52|105,Greenacres City|FL|-80.13|26.62|32,Greenburgh|NY|-73.84|41.03|86,Greenfield|WI|-88.01|42.96|37,Greenpoint|NY|-73.95|40.72|34,Greensboro|NC|-79.79|36.07|285,Greenville|NC|-77.37|35.61|90,Greenville|SC|-82.39|34.85|64,Greenville|MS|-91.06|33.41|32,Greenville|TX|-96.11|33.14|26,Greenwood|IN|-86.11|39.61|55,Greer|SC|-82.23|34.94|28,Gresham|OR|-122.43|45.5|110,Grimsby|ON|-79.57|43.2|27,Grove City|OH|-83.09|39.88|39,Guadalajara|MX14|-103.35|20.68|1385,Guadalupe|MX19|-100.26|25.68|673,Guadalupe|MX32|-102.52|22.75|170,Guamuchil|MX25|-108.08|25.46|72,Guanajuato|MX11|-101.26|21.02|72,Guasave|MX25|-108.47|25.57|71,Guelph|ON|-80.26|43.55|143,Guildford|BC|-122.8|49.19|64,Gulfport|MS|-89.09|30.37|71,Gurnee|IL|-87.9|42.37|31,Gustavo Adolfo Madero|MX09|-99.11|19.49|1185,Gwynn Oak|MD|-76.69|39.33|47,Hacienda Heights|CA|-117.97|33.99|54,Hacienda Santa Fe|MX14|-103.38|20.52|86,Hackensack|NJ|-74.04|40.89|44,Hagerstown|MD|-77.72|39.64|40,Halifax|NS|-63.58|44.64|471,Hallandale Beach|FL|-80.15|25.98|39,Haltom City|TX|-97.27|32.8|44,Halton Hills|ON|-79.93|43.64|62,Hamden|CT|-72.9|41.4|59,Hamilton|ON|-79.85|43.25|569,Hamilton|OH|-84.56|39.4|62,Hammond|IN|-87.5|41.58|77,Hampton|VA|-76.35|37.03|137,Hanford|CA|-119.65|36.33|55,Hanover|MD|-76.72|39.19|38,Hanover Park|IL|-88.15|42|38,Harker Heights|TX|-97.66|31.08|29,Harlem|NY|-73.95|40.81|116,Harlingen|TX|-97.7|26.19|65,Harrisburg|PA|-76.88|40.27|50,Harrison|NY|-73.71|40.97|28,Harrisonburg|VA|-78.87|38.45|52,Hartford|CT|-72.69|41.76|121,Harvey|IL|-87.65|41.61|25,Hastings-Sunrise|BC|-123.03|49.28|34,Hattiesburg|MS|-89.29|31.33|46,Haverhill|MA|-71.08|42.78|62,Havertown|PA|-75.31|39.98|50,Hawai'i Kai|HI|-157.7|21.3|30,Hawthorne|CA|-118.35|33.92|88,Hayward|CA|-122.08|37.67|158,Hazelwood|MO|-90.37|38.77|25,Helena|MT|-112.04|46.59|32,Hell's Kitchen|NY|-73.99|40.76|45,Hemet|CA|-116.97|33.75|83,Hempstead|NY|-73.62|40.71|55,Henderson|NV|-114.98|36.04|285,Henderson|KY|-87.59|37.84|28,Hendersonville|TN|-86.62|36.3|56,Henrietta|NY|-77.61|43.06|42,Hercules|CA|-122.29|38.02|25,Hermitage|TN|-86.62|36.2|37,Hermosillo|MX26|-110.97|29.09|812,Heroica Caborca|MX26|-112.16|30.72|59,Heroica Ciudad de Juchitan de Zaragoza|MX20|-95.02|16.43|88,Heroica Guaymas|MX26|-110.9|27.92|117,Heroica Matamoros|MX28|-97.5|25.88|510,Heroica Zitacuaro|MX16|-100.36|19.44|84,Herriman|UT|-112.03|40.51|30,Hesperia|CA|-117.3|34.43|93,Hialeah|FL|-80.28|25.86|237,Hickory|NC|-81.34|35.73|40,Hicksville|NY|-73.53|40.77|41,Hidalgo del Parral|MX06|-105.67|26.93|104,High Point|NC|-80.01|35.96|110,Highland|CA|-117.21|34.13|54,Highland Park|IL|-87.8|42.18|29,Highlands Ranch|CO|-104.97|39.55|96,Hilliard|OH|-83.16|40.03|33,Hillsboro|OR|-122.99|45.52|102,Hillsborough|NJ|-74.63|40.48|38,Hilo|HI|-155.09|19.73|43,Hilton Head|SC|-80.75|32.22|37,Hilton Head Island|SC|-80.74|32.19|40,Hinesville|GA|-81.6|31.85|33,Hobart|IN|-87.26|41.53|28,Hobbs|NM|-103.14|32.7|38,Hoboken|NJ|-74.03|40.74|53,Hoffman Estates|IL|-88.08|42.04|52,Holbrook|NY|-73.08|40.81|27,Holladay|UT|-111.82|40.67|30,Holland|MI|-86.11|42.79|33,Hollister|CA|-121.4|36.85|37,Holly Springs|NC|-78.83|35.65|31,Hollywood|CA|-118.33|34.1|167,Hollywood|FL|-80.15|26.01|149,Holmesburg|PA|-75.03|40.04|28,Holyoke|MA|-72.62|42.2|40,Homestead|FL|-80.48|25.47|80,Homewood|AL|-86.8|33.47|25,Honolulu|HI|-157.86|21.31|350,Hoover|AL|-86.81|33.41|84,Hopkinsville|KY|-87.49|36.87|32,Horn Lake|MS|-90.03|34.96|26,Hot Springs|AR|-93.06|34.5|35,Houma|LA|-90.72|29.6|34,Houston|TX|-95.36|29.76|2314,Howard Beach|NY|-73.84|40.66|26,Huamantla|MX29|-97.93|19.31|51,Huatabampo|MX26|-109.64|26.83|30,Huatusco|MX30|-96.97|19.15|31,Huauchinango|MX21|-98.05|20.17|56,Huber Heights|OH|-84.12|39.84|38,Huejotzingo|MX21|-98.41|19.16|25,Huejutla de Reyes|MX13|-98.42|21.14|40,Huimanguillo|MX27|-93.39|17.83|27,Huixquilucan|MX15|-99.35|19.36|124,Huixtla|MX05|-92.46|15.14|32,Hull|QC|-75.71|45.43|63,Huntersville|NC|-80.84|35.41|52,Huntington|WV|-82.45|38.42|48,Huntington Beach|CA|-118|33.66|201,Huntington Park|CA|-118.23|33.98|59,Huntington Station|NY|-73.41|40.85|33,Huntley|IL|-88.43|42.17|26,Hunts Point|NY|-73.88|40.81|27,Huntsville|AL|-86.59|34.73|215,Huntsville|TX|-95.55|30.72|40,Hurst|TX|-97.17|32.82|39,Hutchinson|KS|-97.93|38.06|41,Hyde Park|MA|-71.12|42.26|31,Hyde Park|IL|-87.59|41.79|26,Idaho Falls|ID|-112.03|43.47|59,Iguala de la Independencia|MX12|-99.54|18.35|118,Imperial Beach|CA|-117.11|32.58|27,Independence|MO|-94.42|39.09|117,Independence|KY|-84.54|38.94|26,Indian Trail|NC|-80.67|35.08|37,Indianapolis|IN|-86.16|39.77|887,Indio|CA|-116.22|33.72|87,Inglewood|CA|-118.35|33.96|111,Innisfil|ON|-79.65|44.3|43,Inver Grove Heights|MN|-93.04|44.85|34,Iowa City|IA|-91.53|41.66|74,Irapuato|MX11|-101.36|20.67|380,Irondequoit|NY|-77.58|43.21|51,Irvine|CA|-117.82|33.67|256,Irving|TX|-96.95|32.81|236,Irving Park|IL|-87.74|41.95|56,Irvington|NJ|-74.23|40.73|61,Isla|MX30|-95.53|18.03|26,Islington-City Centre West|ON|-79.54|43.63|43,Issaquah|WA|-122.03|47.53|36,Ithaca|NY|-76.5|42.44|30,Ixmiquilpan|MX13|-99.22|20.48|34,Ixtaczoquitlan|MX30|-97.06|18.85|26,Ixtapa|MX14|-105.21|20.72|29,Ixtapa-Zihuatanejo|MX12|-101.55|17.64|67,Ixtapaluca|MX15|-98.88|19.32|322,Ixtepec|MX20|-95.1|16.56|25,Iztacalco|MX09|-99.1|19.4|384,Iztapalapa|MX09|-99.06|19.36|1835,Izucar de Matamoros|MX21|-98.46|18.6|42,Jackson|MS|-90.18|32.3|153,Jackson|TN|-88.81|35.61|66,Jackson|NJ|-74.86|39.78|54,Jackson|MI|-84.4|42.25|33,Jackson Heights|NY|-73.89|40.76|67,Jacksonville|FL|-81.66|30.33|1009,Jacksonville|NC|-77.43|34.75|67,Jacksonville|AR|-92.11|34.87|28,Jacona de Plancarte|MX16|-102.31|19.96|53,Jaltipan de Morelos|MX30|-94.71|17.97|32,Jamaica|NY|-73.81|40.69|216,Jamaica Plain|MA|-71.12|42.31|37,Jamestown|NY|-79.24|42.1|30,Janesville|WI|-89.02|42.68|64,Jardines de la Silla|MX19|-100.19|25.63|53,Jefferson City|MO|-92.17|38.58|42,Jeffersontown|KY|-85.56|38.19|26,Jeffersonville|IN|-85.74|38.28|46,Jerez de Garcia Salinas|MX32|-102.99|22.65|43,Jersey City|NJ|-74.08|40.73|264,Jesus Maria|MX01|-102.34|21.96|43,Jiutepec|MX17|-99.18|18.88|215,Johns Creek|GA|-84.2|34.03|83,Johnson City|TN|-82.35|36.31|66,Johnston|RI|-71.51|41.82|29,Joint Base Pearl Harbor Hickam|HI|-157.95|21.35|42,Joliet|IL|-88.08|41.53|147,Joliette|QC|-73.42|46.02|34,Jonesboro|AR|-90.7|35.84|73,Jonquiere|QC|-71.25|48.42|54,Joplin|MO|-94.51|37.08|51,Jose Mariano Jimenez|MX06|-104.92|27.13|34,Juneau|AK|-134.42|58.3|31,Jupiter|FL|-80.09|26.93|62,Juventino Rosas|MX11|-101|20.64|42,Kahului|HI|-156.47|20.89|26,Kailua|HI|-157.74|21.4|38,Kalamazoo|MI|-85.59|42.29|76,Kalihi-Palama|HI|-157.88|21.33|43,Kamloops|BC|-120.32|50.67|104,Kanasin|MX31|-89.56|20.93|77,Kanata|ON|-75.92|45.3|90,Kaneohe|HI|-157.8|21.4|34,Kankakee|IL|-87.86|41.12|26,Kannapolis|NC|-80.62|35.49|46,Kansas City|MO|-94.58|39.1|475,Kansas City|KS|-94.63|39.11|152,Kaysville|UT|-111.94|41.04|30,Kearney|NE|-99.08|40.7|33,Kearns|UT|-112|40.66|35,Kearny|NJ|-74.15|40.77|42,Keizer|OR|-123.03|44.99|37,Keller|TX|-97.25|32.93|45,Kelowna|BC|-119.49|49.88|144,Ken Caryl|CO|-105.11|39.58|32,Kendale Lakes|FL|-80.41|25.71|56,Kendall|FL|-80.32|25.68|80,Kendall West|FL|-80.44|25.71|36,Kenner|LA|-90.24|29.99|67,Kennesaw|GA|-84.62|34.02|33,Kennewick|WA|-119.14|46.21|78,Kenosha|WI|-87.82|42.58|99,Kensington|NY|-73.97|40.65|39,Kensington-Cedar Cottage|BC|-123.07|49.25|49,Kent|WA|-122.23|47.38|126,Kent|OH|-81.36|41.15|29,Kentwood|MI|-85.64|42.87|51,Kettering|OH|-84.17|39.69|55,Kew Gardens Hills|NY|-73.82|40.73|37,Key West|FL|-81.78|24.56|25,Killarney|BC|-123.04|49.23|29,Killeen|TX|-97.73|31.12|140,Kingman|AZ|-114.05|35.19|28,Kings Bridge|NY|-73.91|40.88|75,Kingsport|TN|-82.56|36.55|53,Kingston|ON|-76.48|44.23|132,Kingsville|TX|-97.86|27.52|26,Kirkland|WA|-122.21|47.68|87,Kirkwood|MO|-90.41|38.58|27,Kiryas Joel|NY|-74.17|41.34|32,Kissimmee|FL|-81.42|28.3|69,Kitchener|ON|-80.51|43.43|256,Kitsilano|BC|-123.17|49.27|43,Knoxville|TN|-83.92|35.96|190,Kokomo|IN|-86.13|40.49|57,Koreatown|CA|-118.3|34.06|124,Kyle|TX|-97.88|29.99|35,L'Amoreaux|ON|-79.31|43.8|43,La Barca|MX14|-102.54|20.29|35,La Cite-Limoilou|QC|-71.23|46.83|108,La Crosse|WI|-91.24|43.8|52,La Habra|CA|-117.95|33.93|62,La Haute-Saint-Charles|QC|-71.37|46.89|88,La Jolla|CA|-117.27|32.85|42,La Joya|MX02|-117|32.44|26,La Mesa|CA|-117.02|32.77|60,La Mirada|CA|-118.01|33.92|49,La Paz|MX03|-110.31|24.14|250,La Piedad de Cabadas|MX16|-102.02|20.34|83,La Porte|TX|-95.02|29.67|35,La Presa|CA|-117|32.71|34,La Puente|CA|-117.95|34.02|40,La Quinta|CA|-116.31|33.66|40,La Vergne|TN|-86.58|36.02|34,La Verne|CA|-117.77|34.1|32,Lacey|WA|-122.82|47.03|46,Lafayette|LA|-92.02|30.22|121,Lafayette|IN|-86.88|40.42|71,Lafayette|CO|-105.09|39.99|27,Lafayette|CA|-122.12|37.89|25,Lagos de Moreno|MX14|-101.93|21.36|98,LaGrange|GA|-85.03|33.04|29,Laguna|CA|-121.42|38.42|46,Laguna Hills|CA|-117.71|33.61|31,Laguna Niguel|CA|-117.71|33.52|65,Lake Charles|LA|-93.2|30.21|76,Lake Elsinore|CA|-117.33|33.67|61,Lake Forest|CA|-117.69|33.65|82,Lake Havasu City|AZ|-114.32|34.48|53,Lake in the Hills|IL|-88.33|42.18|29,Lake Jackson|TX|-95.43|29.03|27,Lake Magdalene|FL|-82.47|28.07|28,Lake Oswego|OR|-122.67|45.42|38,Lake Ridge|VA|-77.3|38.69|41,Lake Stevens|WA|-122.06|48.02|30,Lake Worth Beach|FL|-80.07|26.62|37,Lakeland|FL|-81.95|28.04|104,Lakeside|FL|-81.77|30.13|30,Lakeville|MN|-93.24|44.65|60,Lakewood|CO|-105.08|39.7|152,Lakewood|CA|-118.13|33.85|81,Lakewood|WA|-122.52|47.17|59,Lakewood|NJ|-74.22|40.1|53,Lakewood|SK|-106.59|52.11|51,Lakewood|OH|-81.8|41.48|50,Lancaster|CA|-118.14|34.7|161,Lancaster|PA|-76.31|40.04|59,Lancaster|OH|-82.6|39.71|39,Lancaster|TX|-96.76|32.59|38,Land O' Lakes|FL|-82.46|28.22|31,Langford|BC|-123.5|48.45|46,Langley|BC|-122.66|49.1|132,Lansing|MI|-84.56|42.73|112,Lansing|IL|-87.54|41.56|28,Laplace|LA|-90.48|30.07|29,Laramie|WY|-105.59|41.31|32,Laredo|TX|-99.51|27.51|256,Largo|FL|-82.79|27.91|81,Las Choapas|MX30|-94.1|17.91|42,Las Cruces|NM|-106.78|32.31|101,Las Guacamayas|MX16|-102.21|18.02|37,Las Pintitas|MX14|-103.3|20.56|26,Las Vegas|NV|-115.14|36.17|641,LaSalle|ON|-83.06|42.24|32,Lauderdale Lakes|FL|-80.21|26.17|34,Lauderhill|FL|-80.21|26.14|71,Laurel|MD|-76.85|39.1|26,Laval|QC|-73.69|45.57|438,Laval-des-Rapides|QC|-73.7|45.56|36,Lawndale|CA|-118.35|33.89|33,Lawrence|KS|-95.24|38.97|93,Lawrence|MA|-71.16|42.71|80,Lawrence|IN|-86.03|39.84|47,Lawrenceville|GA|-83.99|33.96|30,Lawson|SK|-106.64|52.16|34,Lawton|OK|-98.39|34.61|96,Layton|UT|-111.97|41.06|74,Le Plateau-Mont-Royal|QC|-73.58|45.53|105,Le Sud-Ouest|QC|-73.59|45.47|86,Le Vieux-Longueuil|QC|-73.51|45.54|135,League City|TX|-95.09|29.51|98,Leamington|ON|-82.6|42.05|35,Leander|TX|-97.85|30.58|59,Leavenworth|KS|-94.92|39.31|35,Leawood|KS|-94.62|38.97|34,Lebanon|TN|-86.29|36.21|30,Lebanon|PA|-76.41|40.34|25,Lee's Summit|MO|-94.38|38.91|95,Leesburg|VA|-77.56|39.12|51,Lehi|UT|-111.85|40.39|58,Lehigh Acres|FL|-81.62|26.63|86,Leisure City|FL|-80.43|25.5|26,Lemon Grove|CA|-117.03|32.74|26,Lemoore|CA|-119.78|36.3|25,Lenexa|KS|-94.73|38.95|52,Leominster|MA|-71.76|42.53|41,Leon de los Aldama|MX11|-101.68|21.12|1579,Lerdo|MX10|-103.52|25.54|79,Les Rivieres|QC|-71.27|46.82|77,Lethbridge|AB|-112.82|49.7|103,Levis|QC|-71.18|46.8|143,Levittown|PA|-74.83|40.16|52,Levittown|NY|-73.51|40.73|51,Lewiston|ME|-70.21|44.1|36,Lewiston|ID|-117.02|46.42|32,Lewiston Orchards|ID|-116.98|46.38|31,Lewisville|TX|-96.99|33.05|104,Lexington|KY|-84.48|37.99|320,Lexington|MA|-71.22|42.45|31,Lexington-Fayette|KY|-84.46|38.05|314,Liberty|MO|-94.42|39.25|30,Lima|OH|-84.11|40.74|37,Linares|MX19|-99.57|24.86|70,Lincoln|NE|-96.67|40.8|294,Lincoln|CA|-121.29|38.89|49,Lincoln Park|IL|-87.65|41.92|66,Lincoln Park|MI|-83.18|42.25|37,Lincoln Square|IL|-87.69|41.98|40,Linden|NJ|-74.24|40.62|42,Lindenhurst|NY|-73.37|40.69|27,Linton Hall|VA|-77.57|38.76|35,Little Elm|TX|-96.94|33.16|38,Little Havana|FL|-80.23|25.77|53,Little Rock|AR|-92.29|34.75|202,Littleton|CO|-105.02|39.61|46,Livermore|CA|-121.77|37.68|88,Livingston|NJ|-74.31|40.8|27,Livonia|MI|-83.35|42.37|94,Lloydminster|AB|-110.02|53.27|31,Lochearn|MD|-76.72|39.34|25,Lockport|IL|-88.06|41.59|25,Lodi|CA|-121.27|38.13|64,Logan|UT|-111.83|41.74|50,Logan Square|IL|-87.7|41.92|73,Loma Bonita|MX20|-95.88|18.11|40,Lombard|IL|-88.01|41.88|43,Lompoc|CA|-120.46|34.64|44,London|ON|-81.23|42.98|422,Long Beach|CA|-118.19|33.77|474,Long Beach|NY|-73.66|40.59|33,Long Branch|NJ|-73.99|40.3|30,Long Island City|NY|-73.95|40.74|25,Longfellow Community|MN|-93.23|44.94|29,Longmont|CO|-105.1|40.17|92,Longueuil|QC|-73.47|45.52|229,Longview|TX|-94.74|32.5|82,Longview|WA|-122.94|46.14|36,Lorain|OH|-82.18|41.45|63,Los Altos|CA|-122.11|37.39|30,Los Angeles|CA|-118.24|34.05|3820,Los Banos|CA|-120.85|37.06|37,Los Gatos|CA|-121.97|37.23|30,Los Mochis|MX25|-109|25.79|256,Los Reyes Acaquilpan|MX15|-98.98|19.36|85,Los Reyes de Salgado|MX16|-102.47|19.59|39,Louisville|KY|-85.76|38.25|624,Loveland|CO|-105.07|40.4|75,Lowell|MA|-71.32|42.63|110,Lower Sackville|NS|-63.68|44.78|51,Lower West Side|IL|-87.67|41.85|34,Lubbock|TX|-101.86|33.58|249,Lufkin|TX|-94.73|31.34|36,Lynchburg|VA|-79.14|37.41|79,Lynn|MA|-70.95|42.47|92,Lynnwood|WA|-122.32|47.82|36,Lynwood|CA|-118.21|33.93|71,Mableton|GA|-84.58|33.82|37,Macon|GA|-83.63|32.84|91,Macuspana|MX27|-92.6|17.76|32,Madera|CA|-120.06|36.96|64,Madison|WI|-89.4|43.07|280,Madison|AL|-86.75|34.7|46,Madison|MS|-90.12|32.46|25,Madison Heights|MI|-83.11|42.49|30,Magdalena Atlicpac|MX15|-98.95|19.37|26,Magdalena Contreras|MX09|-99.21|19.33|238,Magdalena de Kino|MX26|-110.96|30.63|26,Magna|UT|-112.1|40.71|26,Makakilo / Kapolei / Honokai Hale|HI|-158.1|21.34|46,Makiki / Lower Punchbowl / Tantalus|HI|-157.83|21.32|31,Malden|MA|-71.07|42.43|61,Malvern|ON|-79.22|43.81|43,Manassas|VA|-77.48|38.75|41,Manchester|NH|-71.45|43|110,Manchester|CT|-72.52|41.78|30,Manhattan|NY|-73.97|40.78|1487,Manhattan|KS|-96.57|39.18|56,Manhattan Beach|CA|-118.41|33.88|35,Manhattan Valley|NY|-73.97|40.79|38,Manitowoc|WI|-87.66|44.09|33,Mankato|MN|-94.01|44.16|41,Mansfield|TX|-97.14|32.56|64,Mansfield|OH|-82.52|40.76|46,Mansfield City|CT|-72.23|41.77|26,Manteca|CA|-121.22|37.8|75,Manzanillo|MX08|-104.34|19.12|159,Maple Grove|MN|-93.46|45.07|68,Maple Ridge|BC|-122.6|49.22|82,Maple Valley|WA|-122.05|47.39|25,Maplewood|MN|-93|44.95|40,Maplewood|NJ|-74.27|40.73|25,Marana|AZ|-111.23|32.44|41,Maravatio de Ocampo|MX16|-100.44|19.89|34,Marfil|MX11|-101.29|21|29,Margate|FL|-80.21|26.24|57,Maricopa|AZ|-112.05|33.06|48,Marietta|GA|-84.55|33.95|59,Marion|IA|-91.6|42.03|37,Marion|OH|-83.13|40.59|36,Marion|IN|-85.66|40.56|29,Markham|ON|-79.27|43.87|338,Marlboro|NJ|-74.25|40.32|40,Marlborough|MA|-71.55|42.35|39,Marpole|BC|-123.13|49.21|27,Marrero|LA|-90.1|29.9|33,Marshalltown|IA|-92.91|42.05|27,Martinez|CA|-122.13|38.02|38,Martinez|GA|-82.08|33.52|35,Martinez de la Torre|MX30|-97.06|20.07|60,Maryland Heights|MO|-90.43|38.71|27,Marysville|WA|-122.18|48.05|66,Maryvale|AZ|-112.18|33.5|208,Maryville|TN|-83.97|35.76|28,Mascouche|QC|-73.6|45.75|34,Mason|OH|-84.31|39.36|32,Mason City|IA|-93.2|43.15|27,Maspeth|NY|-73.91|40.72|48,Massillon|OH|-81.52|40.8|32,Matamoros|MX07|-103.23|25.53|52,Matehuala|MX24|-100.64|23.65|77,Mattapan|MA|-71.09|42.27|36,Matthews|NC|-80.72|35.12|30,Mauldin|SC|-82.31|34.78|25,Maywood|CA|-118.19|33.99|27,Mazatlan|MX25|-106.42|23.22|381,McAllen|TX|-98.23|26.2|140,McCully - Moiliili|HI|-157.83|21.29|28,McHenry|IL|-88.27|42.33|26,McKinney|TX|-96.62|33.2|162,McLean|VA|-77.18|38.93|48,McMinnville|OR|-123.2|45.21|33,Meadow Woods|FL|-81.37|28.39|25,Meads|KY|-82.71|38.41|288,Mechanicsville|VA|-77.37|37.61|36,Medford|OR|-122.88|42.33|79,Medford|MA|-71.11|42.42|57,Medicine Hat|AB|-110.68|50.04|63,Medina|OH|-81.86|41.14|26,Mehlville|MO|-90.32|38.51|28,Melbourne|FL|-80.61|28.08|84,Melchor Ocampo|MX15|-99.14|19.7|38,Melrose|MA|-71.07|42.46|27,Melrose Park|IL|-87.86|41.9|25,Memphis|TN|-90.05|35.15|633,Menifee|CA|-117.15|33.73|87,Menlo Park|CA|-122.18|37.45|33,Menomonee Falls|WI|-88.12|43.18|36,Mentor|OH|-81.34|41.67|46,Merced|CA|-120.48|37.3|82,Mercer Island|WA|-122.22|47.57|25,Mercerville-Hamilton Square|NJ|-74.67|40.23|26,Mercier-Hochelaga-Maisonneuve|QC|-73.55|45.57|142,Merida|MX31|-89.62|20.97|1201,Meriden|CT|-72.81|41.54|59,Meridian|ID|-116.39|43.61|90,Meridian|MS|-88.7|32.36|39,Merrillville|IN|-87.33|41.48|35,Merrimack|NH|-71.49|42.87|26,Merritt Island|FL|-80.69|28.36|34,Mesa|AZ|-111.82|33.42|471,Mesquite|TX|-96.6|32.77|144,Metairie|LA|-90.15|29.98|138,Metairie Terrace|LA|-90.16|29.98|142,Metepec|MX15|-99.6|19.26|28,Methuen|MA|-71.19|42.73|52,Metrotown|BC|-123|49.23|52,Mexicali|MX02|-115.45|32.63|1032,Mexico City|MX09|-99.13|19.43|12294,Miami|FL|-80.19|25.77|487,Miami Beach|FL|-80.13|25.79|92,Miami Gardens|FL|-80.25|25.94|113,Miami Lakes|FL|-80.31|25.91|30,Michigan City|IN|-86.9|41.71|31,Mid-City|CA|-118.36|34.04|83,Middle River|MD|-76.44|39.33|25,Middle Village|NY|-73.88|40.72|29,Middletown|NJ|-74.12|40.39|65,Middletown|OH|-84.4|39.52|48,Middletown|CT|-72.65|41.56|46,Middletown|NY|-74.42|41.45|27,Midland|TX|-102.08|32|132,Midland|MI|-84.25|43.62|42,Midvale|UT|-111.9|40.61|32,Midwest City|OK|-97.4|35.45|57,Miguel Aleman (La Doce)|MX26|-111.48|28.84|30,Miguel Hidalgo|MX09|-99.2|19.43|372,Milford|CT|-73.06|41.22|52,Milford|MA|-71.52|42.14|25,Milford Mill|MD|-76.77|39.35|29,Mililani Town|HI|-158.02|21.45|27,Millcreek|UT|-111.88|40.69|62,Milliken|ON|-79.3|43.82|26,Millville|NJ|-75.04|39.4|28,Milpitas|CA|-121.91|37.43|77,Milton|ON|-79.88|43.52|132,Milton|GA|-84.3|34.13|37,Milton|MA|-71.07|42.25|27,Milwaukee|WI|-87.91|43.04|563,Mimico|ON|-79.51|43.62|33,Minatitlan|MX30|-94.56|18|112,Minneapolis|MN|-93.26|44.98|410,Minnetonka|MN|-93.5|44.91|51,Minnetonka Mills|MN|-93.44|44.94|50,Minot|ND|-101.3|48.23|49,Mint Hill|NC|-80.65|35.18|25,Mira Mesa|CA|-117.14|32.92|70,Mirabel|QC|-74.08|45.65|34,Miramar|FL|-80.23|25.99|137,Miramar|MX28|-97.9|22.36|118,Misantla|MX30|-96.85|19.93|26,Mishawaka|IN|-86.16|41.66|48,Mission|TX|-98.33|26.22|83,Mission|BC|-122.3|49.13|41,Mission Bend|TX|-95.66|29.69|36,Mission District|CA|-122.42|37.76|47,Mission Viejo|CA|-117.67|33.6|97,Mississauga|ON|-79.66|43.58|717,Missoula|MT|-113.99|46.87|71,Missouri City|TX|-95.54|29.62|74,Mixquiahuala de Juarez|MX13|-99.21|20.23|25,Mobile|AL|-88.04|30.69|183,Modesto|CA|-121|37.64|211,Moline|IL|-90.52|41.51|42,Monclova|MX07|-101.42|26.91|215,Moncton|NB|-64.8|46.09|86,Monroe|LA|-92.12|32.51|49,Monroe|NC|-80.55|34.99|34,Monroeville|PA|-79.79|40.42|28,Monrovia|CA|-118|34.15|37,Montclair|NJ|-74.21|40.83|39,Montclair|CA|-117.69|34.08|38,Montebello|CA|-118.11|34.01|63,Montemorelos|MX19|-99.83|25.19|67,Monterey|CA|-121.89|36.6|28,Monterey Park|CA|-118.12|34.06|61,Monterrey|MX19|-100.32|25.68|1135,Montgomery|AL|-86.3|32.37|195,Montgomery Village|MD|-77.2|39.18|32,Montreal|QC|-73.59|45.51|1762,Montreal-Nord|QC|-73.63|45.6|86,Moore|OK|-97.49|35.34|60,Mooresville|NC|-80.81|35.58|36,Moorhead|MN|-96.77|46.87|42,Moorpark|CA|-118.88|34.29|36,Moose Jaw|SK|-105.53|50.4|33,Morelia|MX16|-101.18|19.7|743,Moreno Valley|CA|-117.23|33.94|204,Morgan Hill|CA|-121.65|37.13|42,Morgantown|WV|-79.96|39.63|30,Morningside Heights|NY|-73.96|40.81|55,Moroleon|MX11|-101.19|20.13|43,Morris Heights|NY|-73.92|40.85|40,Morristown|TN|-83.29|36.21|29,Moscow|ID|-117|46.73|25,Mott Haven|NY|-73.92|40.81|51,Mount Juliet|TN|-86.52|36.2|31,Mount Laurel|NJ|-74.89|39.93|41,Mount Lebanon|PA|-80.05|40.36|32,Mount Olive-Silverstone-Jamestown|ON|-79.59|43.75|32,Mount Pleasant|SC|-79.86|32.79|81,Mount Pleasant|DC|-77.04|38.93|35,Mount Pleasant|BC|-123.1|49.27|33,Mount Pleasant|WI|-87.86|42.7|26,Mount Pleasant|MI|-84.77|43.6|26,Mount Pleasant West|ON|-79.39|43.7|29,Mount Prospect|IL|-87.94|42.07|54,Mount Vernon|NY|-73.84|40.91|68,Mount Vernon|WA|-122.33|48.42|34,Mountain View|CA|-122.08|37.39|80,Moyotzingo|MX21|-98.4|19.25|27,Mt Pleasant|BC|-123.1|49.26|32,Muncie|IN|-85.39|40.19|70,Mundelein|IL|-88|42.26|31,Murfreesboro|TN|-86.39|35.85|165,Murray|UT|-111.89|40.67|49,Murrieta|CA|-117.21|33.55|109,Muskegon|MI|-86.25|43.23|38,Muskogee|OK|-95.37|35.75|38,Myrtle Beach|SC|-78.89|33.69|31,Nacogdoches|TX|-94.66|31.6|33,Nampa|ID|-116.56|43.54|89,Nanaimo|BC|-123.94|49.17|90,Nanchital de Lazaro Cardenas del Rio|MX30|-94.41|18.07|25,Napa|CA|-122.29|38.3|80,Naperville|IL|-88.15|41.79|147,Nashua|NH|-71.47|42.77|87,Nashville|TN|-86.78|36.17|689,Natick|MA|-71.35|42.28|32,National City|CA|-117.1|32.68|61,Naucalpan de Juarez|MX15|-99.24|19.48|834,Naugatuck|CT|-73.05|41.49|31,Navarre|FL|-86.86|30.4|31,Navojoa|MX26|-109.44|27.07|113,Navolato|MX25|-107.7|24.77|29,Near North Side|IL|-87.63|41.9|85,Needham|MA|-71.23|42.28|28,Neenah|WI|-88.46|44.19|25,Nepean|ON|-75.72|45.34|180,Neufchatel-Est-Lebourgneuf|QC|-71.34|46.85|37,New Albany|IN|-85.82|38.29|36,New Bedford|MA|-70.93|41.64|101,New Berlin|WI|-88.11|42.98|39,New Bern|NC|-77.04|35.11|30,New Braunfels|TX|-98.12|29.7|70,New Britain|CT|-72.78|41.66|72,New Brunswick|NJ|-74.45|40.49|57,New City|IL|-87.66|41.81|40,New City|NY|-73.99|41.15|33,New Haven|CT|-72.93|41.31|130,New Iberia|LA|-91.82|30|30,New Lenox|IL|-87.97|41.51|25,New London|CT|-72.1|41.36|27,New Orleans|LA|-90.08|29.95|362,New Rochelle|NY|-73.78|40.91|79,New South Memphis|TN|-90.06|35.09|641,New Westminster|BC|-122.91|49.21|78,New York City|NY|-74.01|40.71|8804,Newark|NJ|-74.17|40.74|281,Newark|OH|-82.4|40.06|47,Newark|CA|-122.04|37.53|45,Newark|DE|-75.75|39.68|33,Newburgh|NY|-74.01|41.5|28,Newington|CT|-72.72|41.7|30,Newmarket|ON|-79.47|44.05|91,Newnan|GA|-84.8|33.38|37,Newport Beach|CA|-117.93|33.62|87,Newport News|VA|-76.43|36.98|186,Newton|BC|-122.85|49.13|159,Newton|MA|-71.21|42.34|88,Niagara|ON|-79.41|43.64|31,Niagara Falls|ON|-79.07|43.1|99,Niagara Falls|NY|-79.06|43.09|48,Nicholasville|KY|-84.57|37.88|29,Nicolas Romero|MX15|-99.31|19.64|281,Niles|IL|-87.8|42.02|29,Noblesville|IN|-86.01|40.05|59,Nogales|MX26|-110.94|31.31|264,Norco|CA|-117.55|33.93|26,Norfolk|VA|-76.29|36.85|238,Norfolk County|ON|-80.38|42.83|60,Normal|IL|-88.99|40.51|54,Norman|OK|-97.44|35.22|128,Norristown|PA|-75.34|40.12|34,North Andover|MA|-71.14|42.7|28,North Bay|ON|-79.47|46.32|50,North Bel Air|MD|-76.35|39.54|33,North Bergen|NJ|-74.01|40.8|63,North Bethesda|MD|-77.12|39.04|43,North Brunswick|NJ|-74.48|40.45|43,North Center|IL|-87.68|41.95|34,North Charleston|SC|-79.97|32.85|108,North Chicago|IL|-87.84|42.33|29,North Chicopee|MA|-72.6|42.18|55,North Cowichan|BC|-123.69|48.84|29,North Creek|WA|-122.18|47.82|26,North Delta|BC|-122.92|49.17|60,North Fort Myers|FL|-81.88|26.67|39,North Highlands|CA|-121.37|38.69|42,North Hills|CA|-118.48|34.24|56,North Hollywood|CA|-118.38|34.17|64,North Kingstown|RI|-71.47|41.55|28,North La Crosse|WI|-91.25|43.85|50,North Las Vegas|NV|-115.12|36.2|234,North Lauderdale|FL|-80.23|26.22|43,North Lawndale|IL|-87.72|41.86|35,North Little Rock|AR|-92.27|34.77|66,North Miami|FL|-80.19|25.89|62,North Miami Beach|FL|-80.16|25.93|43,North Olmsted|OH|-81.92|41.42|32,North Peoria|IL|-89.58|40.72|113,North Port|FL|-82.24|27.04|62,North Providence|RI|-71.47|41.85|33,North Richland Hills|TX|-97.23|32.83|69,North Ridgeville|OH|-82.02|41.39|32,North Royalton|OH|-81.72|41.31|30,North Stamford|CT|-73.54|41.14|121,North Tonawanda|NY|-78.86|43.04|30,North Vancouver|BC|-123.07|49.32|88,Northampton|MA|-72.64|42.33|28,Northbrook|IL|-87.83|42.13|33,Northglenn|CO|-104.99|39.89|39,Northridge|CA|-118.54|34.23|68,Norwalk|CA|-118.08|33.9|107,Norwalk|CT|-73.41|41.12|88,Norwich|CT|-72.08|41.52|39,Norwood|MA|-71.2|42.19|28,Notre-Dame-de-Grace|QC|-73.61|45.48|68,Novato|CA|-122.57|38.11|55,Novi|MI|-83.48|42.48|58,Nueva Italia de Ruiz|MX16|-102.09|19.02|32,Nueva Rosita|MX07|-101.22|27.94|38,Nuevo Casas Grandes|MX06|-107.91|30.42|55,Nuevo Laredo|MX28|-99.52|27.48|416,Nuevo Mexico|MX14|-103.44|20.76|28,Nutana Sector|SK|-106.64|52.1|72,Nutley|NJ|-74.16|40.82|27,O'Fallon|MO|-90.7|38.81|85,O'Fallon|IL|-89.91|38.59|29,Oak Creek|WI|-87.86|42.89|35,Oak Forest|IL|-87.74|41.6|28,Oak Hill|VA|-77.4|38.93|33,Oak Lawn|IL|-87.76|41.71|56,Oak Park|IL|-87.78|41.89|52,Oak Park|MI|-83.18|42.46|29,Oak Ridge|TN|-84.27|36.01|29,Oakdale|MN|-92.96|44.96|28,Oakland|CA|-122.27|37.8|419,Oakland Park|FL|-80.13|26.17|44,Oakley|CA|-121.71|38|39,Oakton|VA|-77.3|38.88|34,Oakville|ON|-79.68|43.45|213,Oakville|MO|-90.3|38.47|36,Oaxaca|MX20|-96.73|17.06|255,Ocala|FL|-82.14|29.19|58,Oceanside|CA|-117.38|33.2|175,Oceanside|NY|-73.64|40.64|32,Ocoee|FL|-81.54|28.57|43,Ocosingo|MX05|-92.09|16.91|41,Ocotlan|MX14|-102.77|20.35|83,Ocoyoacac|MX15|-99.46|19.27|26,Ocozocoautla de Espinosa|MX05|-93.37|16.76|39,Odenton|MD|-76.7|39.08|37,Odessa|TX|-102.37|31.85|114,Ogden|UT|-111.97|41.22|85,Oildale|CA|-119.02|35.42|32,Ojinaga|MX06|-104.54|29.57|28,Ojo de Agua|MX15|-99.01|19.68|386,Okanagan Mission|BC|-119.48|49.82|38,Oklahoma City|OK|-97.52|35.47|681,Okotoks|AB|-113.98|50.73|30,Olathe|KS|-94.82|38.88|134,Olive Branch|MS|-89.83|34.96|36,Olney|PA|-75.12|40.04|39,Olney|MD|-77.07|39.15|33,Olympia|WA|-122.9|47.04|55,Omaha|NE|-95.94|41.26|486,Ontario|CA|-117.65|34.06|171,Opelika|AL|-85.38|32.65|29,Opportunity|WA|-117.24|47.65|25,Orange|CA|-117.85|33.79|140,Orange|NJ|-74.23|40.77|34,Orangevale|CA|-121.23|38.68|33,Orangeville|ON|-80.1|43.92|30,Orcutt|CA|-120.44|34.87|28,Oregon City|OR|-122.61|45.36|35,Orem|UT|-111.69|40.3|94,Orillia|ON|-79.42|44.61|31,Orizaba|MX30|-97.1|18.85|123,Orland Park|IL|-87.85|41.63|58,Orlando|FL|-81.38|28.54|334,Orleans|ON|-75.5|45.46|125,Ormond Beach|FL|-81.06|29.29|40,Oro Valley|AZ|-110.97|32.39|45,Oshawa|ON|-78.85|43.9|175,Oshkosh|WI|-88.54|44.02|66,Ossining|NY|-73.86|41.16|25,Oswego|IL|-88.35|41.68|33,Ottawa|ON|-75.7|45.41|1017,Ottawa South|ON|-75.69|45.39|125,Overbrook|PA|-75.24|39.99|32,Overland Park|KS|-94.67|38.98|186,Oviedo|FL|-81.21|28.67|38,Owasso|OK|-95.85|36.27|34,Owatonna|MN|-93.23|44.08|25,Owensboro|KY|-87.11|37.77|59,Owings Mills|MD|-76.78|39.42|30,Oxford Circle|PA|-75.07|40.05|48,Oxnard|CA|-119.18|34.2|207,Oxon Hill-Glassmanor|MD|-76.97|38.8|35,Ozone Park|NY|-73.84|40.68|53,Pabellon de Arteaga|MX01|-102.28|22.15|28,Pachuca de Soto|MX13|-98.73|20.12|256,Pacifica|CA|-122.49|37.61|39,Pahrump|NV|-115.98|36.21|36,Palatine|IL|-88.03|42.11|69,Palenque|MX05|-91.98|17.51|42,Palm Bay|FL|-80.59|28.03|119,Palm Beach Gardens|FL|-80.14|26.82|52,Palm Coast|FL|-81.21|29.58|82,Palm Desert|CA|-116.38|33.72|51,Palm Harbor|FL|-82.76|28.08|57,Palm Springs|CA|-116.55|33.83|47,Palmdale|CA|-118.12|34.58|158,Palo Alto|CA|-122.14|37.44|66,Panama City|FL|-85.66|30.16|38,Panorama Hills|AB|-114.08|51.15|25,Panuco|MX30|-98.18|22.05|40,Papantla de Olarte|MX30|-97.32|20.45|53,Paracho de Verduzco|MX16|-102.05|19.65|37,Paradise|NV|-115.15|36.1|223,Paradise|CA|-121.62|39.76|26,Paragould|AR|-90.5|36.06|27,Paraiso|MX27|-93.21|18.4|86,Paramount|CA|-118.16|33.89|55,Paramus|NJ|-74.08|40.94|26,Parc-Extension|QC|-73.63|45.53|33,Park Ridge|IL|-87.84|42.01|37,Park Slope|NY|-73.99|40.67|65,Parkchester|NY|-73.86|40.84|65,Parker|CO|-104.76|39.52|49,Parkersburg|WV|-81.56|39.27|30,Parkland|WA|-122.43|47.16|35,Parkland|FL|-80.24|26.31|30,Parkville|MD|-76.54|39.38|30,Parkwoods-Donalda|ON|-79.33|43.76|34,Parma|OH|-81.72|41.4|79,Parras de la Fuente|MX07|-102.18|25.44|33,Parsippany|NJ|-74.43|40.86|51,Pasadena|TX|-95.21|29.69|153,Pasadena|CA|-118.14|34.15|142,Pasco|WA|-119.1|46.24|69,Paso Robles|CA|-120.69|35.63|27,Passaic|NJ|-74.13|40.86|71,Paterson|NJ|-74.17|40.92|147,Patzcuaro|MX16|-101.61|19.51|55,Pawtucket|RI|-71.38|41.88|71,Peabody|MA|-70.93|42.53|52,Peachtree City|GA|-84.6|33.4|35,Peachtree Corners|GA|-84.22|33.97|40,Pearl|MS|-90.13|32.27|26,Pearl City|HI|-157.98|21.4|47,Pearland|TX|-95.29|29.56|108,Pekin|IL|-89.64|40.57|33,Pembroke Pines|FL|-80.22|26|166,Penjamo|MX11|-101.72|20.43|40,Penn Hills|PA|-79.84|40.5|44,Pennsauken|NJ|-75.06|39.96|36,Pennsport|PA|-75.15|39.93|26,Pensacola|FL|-87.22|30.42|53,Penticton|BC|-119.59|49.48|33,Peoria|AZ|-112.24|33.58|190,Peoria|IL|-89.59|40.69|115,Perote|MX30|-97.24|19.56|37,Perris|CA|-117.23|33.78|74,Perry Hall|MD|-76.46|39.41|28,Perth Amboy|NJ|-74.27|40.51|52,Petaluma|CA|-122.64|38.23|60,Peterborough|ON|-78.32|44.3|85,Petersburg|VA|-77.4|37.23|32,Pflugerville|TX|-97.62|30.44|57,Pharr|TX|-98.18|26.19|76,Phenix City|AL|-85|32.47|37,Philadelphia|PA|-75.16|39.95|1573,Phoenix|AZ|-112.07|33.45|1650,Pickering|ON|-79.13|43.9|91,Pico Rivera|CA|-118.1|33.98|64,Piedras Negras|MX07|-100.52|28.7|150,Pierrefonds|QC|-73.89|45.46|59,Pierrefonds-Roxboro|QC|-73.84|45.5|73,Pijijiapan|MX05|-93.21|15.69|50,Pikesville|MD|-76.72|39.37|30,Pine Bluff|AR|-92|34.23|44,Pine Hills|FL|-81.45|28.56|60,Pinellas Park|FL|-82.7|27.84|51,Pinotepa Nacional|MX20|-98.05|16.34|29,Piscataway|NJ|-74.4|40.5|56,Pittsburg|CA|-121.88|38.03|69,Pittsburgh|PA|-80|40.44|304,Pittsfield|MA|-73.25|42.45|43,Placentia|CA|-117.87|33.87|52,Plainfield|NJ|-74.41|40.63|51,Plainfield|IL|-88.2|41.63|42,Plainfield|IN|-86.4|39.7|30,Plainview|NY|-73.47|40.78|26,Plano|TX|-96.7|33.02|283,Plant City|FL|-82.11|28.02|37,Plantation|FL|-80.23|26.13|92,Playa del Carmen|MX23|-87.08|20.63|149,Pleasant Grove|UT|-111.74|40.36|38,Pleasant Hill|CA|-122.06|37.95|34,Pleasanton|CA|-121.87|37.66|79,Pleasure Ridge Park|KY|-85.86|38.15|25,Plum|PA|-79.75|40.5|27,Plymouth|MN|-93.46|45.01|75,Pocatello|ID|-112.45|42.87|54,Poinciana|FL|-81.46|28.14|53,Pointe-Claire|QC|-73.82|45.45|30,Polanco|MX09|-99.2|19.43|50,Pomona|CA|-117.75|34.06|153,Pompano Beach|FL|-80.12|26.24|107,Ponte Vedra Beach|FL|-81.39|30.24|35,Pontiac|MI|-83.29|42.64|59,Port Arthur|TX|-93.94|29.89|55,Port Charlotte|FL|-82.09|26.98|54,Port Chester|NY|-73.67|41|29,Port Coquitlam|BC|-122.77|49.27|58,Port Huron|MI|-82.42|42.97|29,Port Moody|BC|-122.82|49.28|27,Port Orange|FL|-81|29.14|59,Port Richmond|PA|-75.1|39.99|27,Port Saint Lucie|FL|-80.35|27.29|164,Portage|MI|-85.58|42.2|48,Portage|IN|-87.18|41.58|36,Portage Park|IL|-87.77|41.96|64,Porterville|CA|-119.02|36.07|56,Porticos de San Antonio|MX02|-117.03|32.44|34,Portland|OR|-122.68|45.52|652,Portland|ME|-70.26|43.66|66,Portsmouth|VA|-76.3|36.84|96,Portsmouth Heights|VA|-76.37|36.82|99,Post Falls|ID|-116.95|47.72|30,Potomac|MD|-77.21|39.02|44,Poughkeepsie|NY|-73.92|41.7|30,Poway|CA|-117.04|32.96|50,Poza Rica de Hidalgo|MX30|-97.46|20.53|185,Prairieville|LA|-90.97|30.3|26,Prattville|AL|-86.46|32.46|35,Prescott|AZ|-112.47|34.54|41,Prescott Valley|AZ|-112.32|34.61|42,Prince Albert|SK|-105.77|53.2|35,Prince Edward|ON|-77.25|44|25,Prince George|BC|-122.75|53.92|78,Princeton|FL|-80.41|25.54|39,Princeton|NJ|-74.66|40.35|29,Prior Lake|MN|-93.42|44.71|25,Progreso|MX31|-89.66|21.28|37,Providence|RI|-71.41|41.82|190,Provo|UT|-111.66|40.23|115,Puebla|MX21|-98.21|19.05|1692,Pueblo|CO|-104.61|38.25|109,Pueblo West|CO|-104.72|38.35|29,Puerto Escondido|MX20|-97.07|15.86|29,Puerto Penasco|MX26|-113.54|31.32|62,Puerto Vallarta|MX14|-105.23|20.62|224,Pullman|WA|-117.18|46.73|32,Purisima de Bustos|MX11|-101.88|21.03|43,Puruandiro|MX16|-101.52|20.09|30,Puyallup|WA|-122.29|47.19|39,Quebec|QC|-71.21|46.81|531,Queen Creek|AZ|-111.63|33.25|34,Queens|NY|-73.84|40.68|2316,Queens Village|NY|-73.74|40.73|51,Queensbury|NY|-73.61|43.38|27,Quincy|MA|-71|42.25|93,Quincy|IL|-91.41|39.94|40,Quinte West|ON|-77.57|44.18|43,Racine|WI|-87.78|42.73|77,Radnor|PA|-75.36|40.05|30,Rahway|NJ|-74.28|40.61|29,Raleigh|NC|-78.64|35.77|482,Ramos Arizpe|MX07|-100.95|25.54|66,Ramsey|MN|-93.45|45.26|25,Rancho Cordova|CA|-121.3|38.59|71,Rancho Cucamonga|CA|-117.59|34.11|175,Rancho Palos Verdes|CA|-118.39|33.74|42,Rancho Penasquitos|CA|-117.12|32.96|60,Rancho Santa Margarita|CA|-117.6|33.64|49,Randallstown|MD|-76.8|39.37|32,Randolph|MA|-71.04|42.16|32,Randolph|NJ|-74.58|40.85|25,Rapid City|SD|-103.23|44.08|73,Raytown|MO|-94.46|39.01|29,Reading|PA|-75.93|40.34|87,Red Deer|AB|-113.8|52.27|100,Redan|GA|-84.13|33.75|33,Redding|CA|-122.39|40.59|91,Redford|MI|-83.3|42.38|49,Redlands|CA|-117.18|34.06|71,Redmond|WA|-122.12|47.67|60,Redmond|OR|-121.17|44.27|28,Redondo Beach|CA|-118.39|33.85|68,Redwood City|CA|-122.24|37.49|85,Reedley|CA|-119.45|36.6|25,Reforma|MX05|-93.15|17.86|26,Regina|SK|-104.62|50.45|226,Rego Park|NY|-73.85|40.73|43,Reisterstown|MD|-76.83|39.47|25,Renfrew-Collingwood|BC|-123.04|49.24|51,Reno|NV|-119.81|39.53|264,Renton|WA|-122.22|47.48|100,Repentigny|QC|-73.45|45.74|84,Reseda|CA|-118.54|34.2|65,Reston|VA|-77.34|38.97|58,Revere|MA|-71.01|42.41|53,Rexburg|ID|-111.79|43.83|27,Reynoldsburg|OH|-82.81|39.95|37,Reynosa|MX28|-98.28|26.08|589,Rhawnhurst|PA|-75.06|40.06|25,Rialto|CA|-117.37|34.11|103,Richardson|TX|-96.73|32.95|110,Richfield|MN|-93.28|44.88|36,Richland|WA|-119.28|46.29|54,Richmond|VA|-77.46|37.55|226,Richmond|BC|-123.14|49.17|209,Richmond|CA|-122.35|37.94|109,Richmond|IN|-84.89|39.83|35,Richmond|KY|-84.29|37.75|33,Richmond Hill|ON|-79.44|43.87|202,Richmond Hill|NY|-73.83|40.7|98,Richmond West|FL|-80.43|25.61|35,Ridgecrest|CA|-117.67|35.62|28,Ridgewood|NY|-73.91|40.7|69,Ridgewood|NJ|-74.12|40.98|25,Rimouski|QC|-68.52|48.45|42,Rincon de Romos|MX01|-102.32|22.23|27,Rio Blanco|MX30|-97.16|18.83|40,Rio de Teapa|MX27|-92.9|17.77|26,Rio Grande|MX32|-103.03|23.83|32,Rio Rancho|NM|-106.66|35.23|87,Rioverde|MX24|-99.99|21.93|53,Riverside|CA|-117.4|33.95|317,Riverton|UT|-111.94|40.52|41,Riverview|FL|-82.33|27.87|71,Riviera Beach|FL|-80.06|26.78|34,Riviere-des-Prairies-Pointe-aux-Trembles|QC|-73.58|45.64|113,Roanoke|VA|-79.94|37.27|100,Rochester|NY|-77.62|43.15|209,Rochester|MN|-92.47|44.02|112,Rochester|NH|-70.98|43.3|30,Rochester Hills|MI|-83.15|42.66|73,Rock Forest|QC|-72|45.36|35,Rock Hill|SC|-81.03|34.92|71,Rock Island|IL|-90.58|41.51|38,Rockford|IL|-89.09|42.27|148,Rocklin|CA|-121.24|38.79|61,Rockville|MD|-77.15|39.08|66,Rockwall|TX|-96.46|32.93|42,Rocky Mount|NC|-77.79|35.94|55,Rogers|AR|-94.12|36.33|63,Rogers Park|IL|-87.67|42.01|54,Rohnert Park|CA|-122.7|38.34|42,Rome|GA|-85.16|34.26|36,Rome|NY|-75.46|43.21|32,Romeoville|IL|-88.09|41.65|39,Rosarito|MX02|-117.05|32.36|100,Rosedale|NY|-73.74|40.66|25,Rosemead|CA|-118.07|34.08|54,Rosemont-La Petite-Patrie|QC|-73.61|45.54|146,Rosenberg|TX|-95.81|29.56|35,Roseville|CA|-121.29|38.75|130,Roseville|MI|-82.94|42.5|47,Roseville|MN|-93.16|45.01|35,Roslindale|MA|-71.12|42.29|27,Roswell|GA|-84.36|34.02|94,Roswell|NM|-104.52|33.39|48,Rouge|ON|-79.17|43.8|46,Round Lake Beach|IL|-88.09|42.37|27,Round Rock|TX|-97.68|30.51|115,Rowland Heights|CA|-117.91|33.98|48,Rowlett|TX|-96.56|32.9|60,Roy|UT|-112.03|41.16|37,Royal Oak|MI|-83.14|42.49|59,Royal Palm Beach|FL|-80.23|26.71|37,Rubidoux|CA|-117.41|34|34,Russellville|AR|-93.13|35.28|29,Rutland|BC|-119.39|49.9|34,Saanich|BC|-123.37|48.55|117,Sabinas|MX07|-101.12|27.86|54,Sacramento|CA|-121.49|38.58|524,Saginaw|MI|-83.95|43.42|49,Saguenay|QC|-71.07|48.42|148,Sahuarita|AZ|-110.96|31.96|25,Sahuayo de Morelos|MX16|-102.72|20.06|64,Saint Charles|MO|-90.48|38.78|65,Saint Charles|MD|-76.94|38.6|36,Saint Clair Shores|MI|-82.89|42.5|59,Saint Cloud|MN|-94.16|45.56|65,Saint Cloud|FL|-81.28|28.25|35,Saint-Constant|QC|-73.57|45.37|27,Saint-Eustache|QC|-73.91|45.56|42,Saint George|UT|-113.58|37.1|72,Saint-Georges|QC|-70.67|46.11|31,Saint-Hubert|QC|-73.42|45.5|82,Saint-Hyacinthe|QC|-72.96|45.63|50,Saint-Jean-sur-Richelieu|QC|-73.26|45.31|98,Saint-Jerome|QC|-74|45.78|54,Saint John|NB|-66.06|45.27|71,Saint Joseph|MO|-94.85|39.77|76,Saint-Laurent|QC|-73.67|45.5|98,Saint-Leonard|QC|-73.6|45.59|79,Saint-Louis-de-Terrebonne|QC|-73.79|45.7|119,Saint Louis Park|MN|-93.35|44.95|45,Saint-Michel|QC|-73.62|45.57|56,Saint Paul|MN|-93.09|44.94|303,Saint Peters|MO|-90.63|38.8|52,Sainte-Foy|QC|-71.29|46.78|111,Sainte-Julie|QC|-73.33|45.58|29,Sainte-Therese|QC|-73.83|45.64|25,Salaberry-de-Valleyfield|QC|-74.13|45.25|42,Salamanca|MX11|-101.2|20.57|160,Salem|OR|-123.04|44.94|175,Salem|MA|-70.9|42.52|42,Salem|NH|-71.2|42.79|29,Salem|VA|-80.05|37.29|25,Salina|KS|-97.61|38.84|47,Salina Cruz|MX20|-95.19|16.18|84,Salinas|CA|-121.66|36.68|157,Salisbury|NC|-80.47|35.67|34,Salisbury|MD|-75.6|38.36|32,Salt Lake City|UT|-111.89|40.76|215,Saltillo|MX07|-100.98|25.43|709,Salvatierra|MX11|-100.88|20.22|37,Sammamish|WA|-122.08|47.64|52,San Agustin|MX14|-103.47|20.55|30,San Andres Cholula|MX21|-98.3|19.05|39,San Andres Tuxtla|MX30|-95.21|18.45|61,San Angelo|TX|-100.44|31.46|99,San Antonio|TX|-98.49|29.42|1526,San Bernardino|CA|-117.29|34.11|216,San Bernardino Tlaxcalancingo|MX21|-98.28|19.03|54,San Bruno|CA|-122.41|37.63|43,San Buenaventura|MX15|-98.86|19.3|44,San Carlos|CA|-122.26|37.51|29,San Clemente|CA|-117.61|33.43|65,San Cristobal de las Casas|MX05|-92.64|16.73|215,San Diego|CA|-117.16|32.72|1404,San Dimas|CA|-117.81|34.11|34,San Felipe|MX11|-101.22|21.48|28,San Fernando|MX28|-98.15|24.85|29,San Francisco|CA|-122.42|37.77|827,San Francisco Acuautla|MX15|-98.86|19.35|27,San Francisco del Rincon|MX11|-101.86|21.02|71,San Francisco Tesistan|MX14|-103.48|20.8|62,San Gabriel|CA|-118.11|34.1|40,San Isidro|MX15|-98.95|19.34|33,San Jacinto|CA|-116.96|33.78|46,San Jeronimo|MX15|-99.59|19.28|26,San Jeronimo Cuatro Vientos|MX15|-98.84|19.29|36,San Jose|CA|-121.89|37.34|997,San Jose del Cabo|MX03|-109.7|23.05|136,San Jose del Castillo|MX14|-103.24|20.51|39,San Jose Guadalupe Otzacatipan|MX15|-99.59|19.34|31,San Juan|TX|-98.16|26.19|36,San Juan Capistrano|CA|-117.66|33.5|36,San Juan de los Lagos|MX14|-102.33|21.25|48,San Juan del Rio|MX22|-100|20.39|138,San Leandro|CA|-122.16|37.72|90,San Luis|AZ|-114.78|32.49|31,San Luis de la Paz|MX11|-100.51|21.3|49,San Luis Obispo|CA|-120.66|35.28|47,San Luis Potosi|MX24|-100.97|22.15|722,San Luis Rio Colorado|MX26|-114.77|32.46|176,San Marcos|CA|-117.17|33.14|92,San Marcos|TX|-97.94|29.88|60,San Martin Azcatepec|MX15|-98.97|19.69|35,San Martin Texmelucan de Labastida|MX21|-98.44|19.28|155,San Mateo|CA|-122.33|37.56|103,San Mateo Atenco|MX15|-99.53|19.27|67,San Miguel Ajusco|MX09|-99.2|19.22|29,San Miguel de Allende|MX11|-100.74|20.92|174,San Miguel Topilejo|MX09|-99.14|19.2|34,San Nicolas de los Garza|MX19|-100.3|25.74|412,San Pablo|CA|-122.35|37.96|30,San Pablo Autopan|MX15|-99.66|19.36|35,San Pablo de las Salinas|MX15|-99.09|19.67|156,San Pedro|CA|-118.29|33.74|83,San Pedro|MX07|-102.98|25.76|48,San Pedro|MX07|-103.22|25.43|41,San Pedro Garza Garcia|MX19|-100.4|25.66|132,San Rafael|CA|-122.53|37.97|59,San Ramon|CA|-121.98|37.78|76,San Salvador Tizatlalli|MX15|-99.59|19.26|61,San Sebastian el Grande|MX14|-103.43|20.53|28,San Tan Valley|AZ|-111.53|33.19|81,Sanctorum|MX21|-98.25|19.1|27,Sandusky|OH|-82.71|41.45|25,Sandy|UT|-111.88|40.59|87,Sandy Hills|UT|-111.85|40.58|89,Sandy Springs|GA|-84.38|33.92|105,Sanford|FL|-81.27|28.8|58,Sanford|NC|-79.18|35.48|29,Santa Ana|CA|-117.87|33.75|310,Santa Ana Chiautempan|MX29|-98.19|19.31|48,Santa Barbara|CA|-119.7|34.42|91,Santa Catarina|MX19|-100.46|25.67|304,Santa Clara|CA|-121.96|37.35|126,Santa Clarita|CA|-118.54|34.39|182,Santa Cruz|CA|-122.03|36.97|64,Santa Cruz Xoxocotlan|MX20|-96.74|17.03|67,Santa Fe|NM|-105.94|35.69|87,Santa Isabel|MX02|-115.57|32.63|29,Santa Maria|CA|-120.44|34.95|105,Santa Maria Chimalhuacan|MX15|-98.95|19.42|70,Santa Monica|CA|-118.49|34.02|93,Santa Paula|CA|-119.06|34.35|30,Santa Rosa|CA|-122.71|38.44|178,Santa Rosa Beach|FL|-86.23|30.4|32,Santa Rosalia de Camargo|MX06|-105.17|27.68|40,Santa Teresa|MX15|-99.23|19.84|36,Santee|CA|-116.97|32.84|57,Santiago|MX19|-100.15|25.43|36,Santiago de Queretaro|MX22|-100.39|20.59|1594,Santiago Papasquiaro|MX10|-105.42|25.04|26,Santiago Teyahualco|MX15|-99.12|19.66|53,Santo Domingo Tehuantepec|MX20|-95.24|16.32|67,Sarasota|FL|-82.53|27.34|55,Saratoga|CA|-122.02|37.26|30,Saratoga Springs|NY|-73.78|43.08|27,Saratoga Springs|UT|-111.9|40.35|25,Sarnia|ON|-82.4|42.98|72,Saskatoon|SK|-106.67|52.13|266,Saugus|MA|-71.01|42.46|26,Sault Ste. Marie|ON|-84.33|46.52|72,Savage|MN|-93.34|44.78|30,Savannah|GA|-81.1|32.08|147,Sawtelle|CA|-118.45|34.04|39,Sayreville|NJ|-74.36|40.46|44,Sayreville Junction|NJ|-74.33|40.47|42,Sayula|MX14|-103.6|19.88|26,Schaumburg|IL|-88.08|42.03|74,Schenectady|NY|-73.94|42.81|65,Schererville|IN|-87.45|41.48|28,Schertz|TX|-98.27|29.55|43,Scottsdale|AZ|-111.9|33.51|236,Scranton|PA|-75.66|41.41|77,Seaside|CA|-121.85|36.61|33,SeaTac|WA|-122.29|47.45|28,Seattle|WA|-122.33|47.61|780,Security-Widefield|CO|-104.71|38.75|32,Seguin|TX|-97.96|29.57|27,Sept-Iles|QC|-66.38|50.2|28,Severn|MD|-76.7|39.14|44,Severna Park|MD|-76.55|39.07|37,Sewell|NJ|-75.14|39.77|37,Shaker Heights|OH|-81.54|41.47|27,Shakopee|MN|-93.53|44.8|39,Shawinigan|QC|-72.75|46.57|38,Shawnee|KS|-94.72|39.04|65,Shawnee|OK|-96.93|35.33|31,Sheboygan|WI|-87.71|43.75|48,Sheepshead Bay|NY|-73.94|40.59|122,Shelby|MI|-83.03|42.67|74,Shelton|CT|-73.09|41.32|41,Sherbrooke|QC|-71.9|45.4|129,Sherman|TX|-96.61|33.64|40,Sherman Oaks|CA|-118.45|34.15|52,Sherwood|AR|-92.22|34.82|30,Sherwood Park|AB|-113.32|53.52|70,Shirley|NY|-72.87|40.8|27,Shoreline|WA|-122.34|47.76|55,Shoreview|MN|-93.15|45.08|26,Shreveport|LA|-93.75|32.53|187,Shrewsbury|MA|-71.71|42.3|33,Sicklerville|NJ|-74.97|39.72|42,Sierra Vista|AZ|-110.3|31.55|43,Silao de la Victoria|MX11|-101.43|20.94|74,Silver Lake|CA|-118.27|34.09|32,Silver Spring|MD|-77.03|38.99|71,Simi Valley|CA|-118.78|34.27|126,Sioux City|IA|-96.4|42.5|82,Sioux Falls|SD|-96.73|43.54|171,Skokie|IL|-87.73|42.03|64,Slidell|LA|-89.78|30.28|27,Smithtown|NY|-73.2|40.86|26,Smyrna|GA|-84.51|33.88|56,Smyrna|TN|-86.52|35.98|46,Snowdon|QC|-73.63|45.49|32,Socorro|TX|-106.3|31.65|33,Socorro Mission Number 1 Colonia|TX|-106.29|31.64|28,Soledad|CA|-121.33|36.42|25,Soledad de Graciano Sanchez|MX24|-100.94|22.19|332,Somerton|PA|-75.01|40.12|33,Somerville|MA|-71.1|42.39|80,Sorel-Tracy|QC|-73.11|46.04|41,South Bel Air|MD|-76.34|39.53|48,South Bend|IN|-86.25|41.68|101,South Boston|MA|-71.05|42.33|571,South Chicago|IL|-87.55|41.74|28,South Fulton|GA|-84.67|33.59|107,South Gate|CA|-118.21|33.95|96,South Gate|MD|-76.63|39.13|29,South Hill|WA|-122.27|47.14|52,South Jordan|UT|-111.93|40.56|66,South Jordan Heights|UT|-111.95|40.56|37,South Kingstown|RI|-71.52|41.45|30,South Laurel|MD|-76.85|39.07|26,South Lawndale|IL|-87.71|41.84|73,South Miami Heights|FL|-80.38|25.6|36,South Ozone Park|NY|-73.82|40.67|75,South Pasadena|CA|-118.15|34.12|26,South Peabody|MA|-70.95|42.51|50,South Portland|ME|-70.24|43.64|25,South Riverdale|ON|-79.34|43.65|27,South San Francisco|CA|-122.41|37.65|67,South Shore|IL|-87.58|41.76|51,South Suffolk|VA|-76.59|36.72|80,South Surrey|BC|-122.79|49.05|77,South Valley|NM|-106.68|35.01|40,South Vineland|NJ|-75.03|39.45|58,South Whittier|CA|-118.04|33.95|57,Southaven|MS|-90.01|34.99|52,Southfield|MI|-83.22|42.47|73,Southgate|MI|-83.19|42.21|29,Southglenn|CO|-104.95|39.59|42,Southington|CT|-72.88|41.6|43,Southlake|TX|-97.13|32.94|29,Spanaway|WA|-122.43|47.1|27,Spanish Fork|UT|-111.65|40.11|37,Sparks|NV|-119.75|39.53|96,Spartanburg|SC|-81.93|34.95|37,Spokane|WA|-117.43|47.66|229,Spokane Valley|WA|-117.24|47.67|94,Spring|TX|-95.42|30.08|54,Spring Hill|FL|-82.53|28.48|98,Spring Hill|TN|-86.93|35.75|36,Spring Valley|NV|-115.25|36.11|178,Spring Valley|NY|-74.04|41.11|32,Spring Valley|CA|-117|32.74|28,Springdale|AR|-94.13|36.19|77,Springfield|MO|-93.3|37.22|170,Springfield|MA|-72.59|42.1|154,Springfield|IL|-89.64|39.8|114,Springfield|OR|-123.02|44.05|60,Springfield|OH|-83.81|39.92|59,Springfield|VA|-77.19|38.79|30,Springfield Gardens|NY|-73.76|40.66|30,Springville|UT|-111.61|40.17|32,Spruce Grove|AB|-113.92|53.53|38,St. Albert|AB|-113.64|53.63|57,St. Catharines|ON|-79.24|43.17|136,St. Charles|MD|-76.92|38.61|33,St. Charles|IL|-88.31|41.91|32,St. James-Assiniboia East|MB|-97.23|49.89|27,St. John's|NL|-52.71|47.56|110,St. Johns|FL|-81.55|30.08|40,St. Louis|MO|-90.2|38.63|279,St. Petersburg|FL|-82.68|27.77|257,St. Thomas|ON|-81.18|42.77|38,Stamford|CT|-73.54|41.05|128,Stanton|CA|-117.99|33.8|38,Starkville|MS|-88.82|33.45|25,State College|PA|-77.86|40.79|42,Staten Island|NY|-74.14|40.56|468,Statesboro|GA|-81.78|32.45|30,Statesville|NC|-80.89|35.78|26,Sterling|VA|-77.43|39.01|27,Sterling Heights|MI|-83.03|42.58|132,Stevens Point|WI|-89.57|44.52|26,Steveston|BC|-123.18|49.13|25,Stillwater|OK|-97.06|36.12|48,Stittsville|ON|-75.92|45.25|40,Stockbridge|GA|-84.23|33.54|28,Stockton|CA|-121.29|37.96|305,Stonecrest|GA|-84.13|33.71|50,Stonegate-Queensway|ON|-79.5|43.64|25,Stoney Creek|ON|-79.77|43.22|76,Stouffville|ON|-79.25|43.97|36,Stoughton|MA|-71.1|42.13|26,Stow|OH|-81.44|41.16|34,Stratford|CT|-73.13|41.18|51,Stratford|ON|-80.95|43.37|31,Strawberry Hill|BC|-122.88|49.13|41,Streamwood|IL|-88.18|42.03|40,Strongsville|OH|-81.84|41.31|44,Studio City|CA|-118.4|34.15|34,Suffolk|VA|-76.58|36.73|88,Sugar Land|TX|-95.63|29.62|88,Suisun|CA|-122.04|38.24|28,Suitland|MD|-76.92|38.85|25,Suitland-Silver Hill|MD|-76.93|38.85|33,Summerville|SC|-80.18|33.02|48,Sumter|SC|-80.34|33.92|40,Sun City|AZ|-112.27|33.6|37,Sun Prairie|WI|-89.21|43.18|32,Sunnyside|NY|-73.94|40.74|49,Sunnyvale|CA|-122.04|37.37|155,Sunrise|FL|-80.11|26.13|84,Sunrise Manor|NV|-115.07|36.21|189,Sunset|BC|-123.1|49.22|36,Sunset Park|NY|-74.01|40.65|126,Superior|WI|-92.1|46.72|26,Surprise|AZ|-112.33|33.63|143,Surrey|BC|-122.83|49.11|568,Surrey City Centre|BC|-122.85|49.19|33,Sydney|NS|-60.18|46.14|105,Sylmar|CA|-118.45|34.31|79,Syracuse|NY|-76.15|43.05|144,Syracuse|UT|-112.06|41.09|27,Tacambaro de Codallos|MX16|-101.46|19.24|25,Tacoma|WA|-122.44|47.25|222,Tala|MX14|-103.7|20.65|35,Tallahassee|FL|-84.28|30.44|201,Tam O'Shanter-Sullivan|ON|-79.3|43.78|27,Tamarac|FL|-80.25|26.21|64,Tamiami|FL|-80.4|25.76|55,Tampa|FL|-82.46|27.95|414,Tampico|MX28|-97.88|22.29|309,Tantoyuca|MX30|-98.23|21.35|30,Tapachula|MX05|-92.26|14.91|353,Taunton|MA|-71.09|41.9|56,Taxco de Alarcon|MX12|-99.61|18.55|50,Taylor|MI|-83.27|42.24|61,Taylorsville|UT|-111.94|40.67|60,Teaneck|NJ|-74.02|40.9|40,Teapa|MX27|-92.95|17.56|26,Tecamachalco|MX21|-97.73|18.88|28,Tecate|MX02|-116.63|32.57|64,Tecax|MX31|-89.29|20.21|25,Tecoman|MX08|-103.88|18.92|85,Tehuacan|MX21|-97.4|18.46|248,Tejupilco de Hidalgo|MX15|-100.15|18.9|25,Temecula|CA|-117.15|33.49|110,Temixco|MX17|-99.23|18.85|97,Tempe|AZ|-111.91|33.41|175,Tempe Junction|AZ|-111.94|33.41|158,Temple|TX|-97.34|31.1|72,Temple City|CA|-118.06|34.11|36,Temple Terrace|FL|-82.39|28.04|25,Tenosique|MX27|-91.42|17.47|32,Teoloyucan|MX15|-99.18|19.74|51,Tepatitlan de Morelos|MX14|-102.76|20.82|91,Tepeaca|MX21|-97.9|18.97|27,Tepeji del Rio de Ocampo|MX13|-99.34|19.9|80,Tepexpan|MX15|-98.94|19.61|102,Tepic|MX18|-104.89|21.51|332,Tepotzotlan|MX15|-99.22|19.72|38,Tequila|MX14|-103.84|20.88|29,Tequisquiapan|MX22|-99.89|20.52|29,Terre Haute|IN|-87.41|39.47|60,Terrebonne|QC|-73.65|45.7|111,Tewksbury|MA|-71.23|42.61|29,Texarkana|TX|-94.05|33.43|37,Texarkana|AR|-94.04|33.44|30,Texas City|TX|-94.9|29.38|47,Texcoco de Mora|MX15|-98.88|19.51|105,Teziutlan|MX21|-97.36|19.82|103,The Acreage|FL|-80.27|26.79|38,The Bronx|NY|-73.87|40.85|1385,The Colony|TX|-96.89|33.09|41,The Hammocks|FL|-80.44|25.67|51,The Trails of Frisco|TX|-96.87|33.16|51,The Villages|FL|-81.96|28.93|51,The Woodlands|TX|-95.49|30.16|93,Thetford-Mines|QC|-71.31|46.09|25,Thomasville|NC|-80.08|35.88|27,Thornton|CO|-104.97|39.87|133,Thousand Oaks|CA|-118.84|34.17|129,Throgs Neck|NY|-73.82|40.82|33,Thunder Bay|ON|-89.25|48.38|108,Ticul|MX31|-89.53|20.4|32,Tierra Blanca|MX30|-96.36|18.45|47,Tigard|OR|-122.77|45.43|51,Tijuana|MX02|-117|32.5|1922,Timmins|ON|-81.33|48.47|41,Tinley Park|IL|-87.78|41.57|57,Titusville|FL|-80.81|28.61|45,Tizayuca|MX13|-98.98|19.84|43,Tizimin|MX31|-88.15|21.14|46,Tlahuac|MX09|-99.01|19.29|305,Tlajomulco de Zuniga|MX14|-103.45|20.47|30,Tlalnepantla|MX15|-99.2|19.54|653,Tlalpan|MX09|-99.16|19.3|574,Tlapa de Comonfort|MX12|-98.58|17.55|46,Tlapacoyan|MX30|-97.21|19.96|35,Tlaquepaque|MX14|-103.29|20.64|650,Tlaxcala|MX29|-98.24|19.32|84,Toledo|OH|-83.56|41.66|265,Toluca|MX15|-99.65|19.29|489,Toms River|NJ|-74.2|39.95|88,Tonala|MX14|-103.24|20.62|408,Tonala|MX05|-93.75|16.09|35,Tooele|UT|-112.3|40.53|33,Topeka|KS|-95.68|39.05|125,Toronto|ON|-79.4|43.71|2794,Torrance|CA|-118.34|33.84|143,Torreon|MX07|-103.42|25.54|735,Torrington|CT|-73.12|41.8|34,Town 'n' Country|FL|-82.58|28.01|78,Towson|MD|-76.6|39.4|55,Tracy|CA|-121.43|37.74|87,Trenton|NJ|-74.74|40.22|89,Tri-Cities|WA|-119.2|46.25|244,Trois-Rivieres|QC|-72.55|46.35|144,Troy|MI|-83.15|42.61|83,Troy|NY|-73.69|42.73|49,Troy|OH|-84.2|40.04|25,Trumbull|CT|-73.2|41.24|36,Tualatin|OR|-122.76|45.38|27,Tuckahoe|VA|-77.56|37.59|44,Tucker|GA|-84.22|33.85|27,Tucson|AZ|-110.93|32.22|542,Tujunga|CA|-118.29|34.25|26,Tula de Allende|MX13|-99.34|20.05|28,Tulancingo|MX13|-98.36|20.08|102,Tulare|CA|-119.35|36.21|62,Tulsa|OK|-95.99|36.15|413,Tultepec|MX15|-99.13|19.68|65,Tultitlan de Mariano Escobedo|MX15|-99.17|19.65|28,Tupelo|MS|-88.7|34.26|35,Turlock|CA|-120.85|37.49|72,Tuscaloosa|AL|-87.57|33.21|111,Tustin|CA|-117.83|33.75|80,Tuxpam de Rodriguez Cano|MX30|-97.41|20.96|84,Tuxpan|MX14|-103.38|19.56|27,Tuxtepec|MX20|-96.13|18.09|159,Tuxtla|MX05|-93.12|16.75|604,Twentynine Palms|CA|-116.05|34.14|26,Twin Falls|ID|-114.46|42.56|47,Tyler|TX|-95.3|32.35|103,Uman|MX31|-89.75|20.88|39,Union|NJ|-74.26|40.7|56,Union City|CA|-122.02|37.6|74,Union City|NJ|-74.02|40.78|69,Universal City|CA|-118.35|34.14|105,University|FL|-82.44|28.07|41,University City|MO|-90.31|38.66|35,University Heights|SK|-106.58|52.14|51,University Heights|NY|-73.91|40.86|27,University of Texas|TX|-97.74|30.29|53,University Park|FL|-80.37|25.75|26,University Place|WA|-122.55|47.24|32,Upland|CA|-117.65|34.1|76,Upper Alton|IL|-90.15|38.91|29,Upper Arlington|OH|-83.06|39.99|34,Upper West Side|NY|-73.98|40.79|226,Uptown|IL|-87.65|41.97|55,Urbana|IL|-88.21|40.11|42,Urbandale|IA|-93.71|41.63|44,Uriangato|MX11|-101.18|20.14|51,Uruapan|MX16|-102.06|19.42|299,Utica|NY|-75.23|43.1|61,Vacaville|CA|-121.99|38.36|96,Val-d'Or|QC|-77.8|48.1|25,Val-des-Arbres|QC|-73.68|45.6|40,Valdosta|GA|-83.28|30.83|55,Valencia|CA|-118.61|34.44|148,Valente Diaz|MX30|-96.22|19.16|25,Valladolid|MX31|-88.2|20.69|48,Valle de Bravo|MX15|-100.13|19.2|25,Valle de Santiago|MX11|-101.19|20.39|68,Valle Hermoso|MX28|-97.81|25.67|48,Vallejo|CA|-122.26|38.1|121,Valley Glen|CA|-118.42|34.19|60,Valley Stream|NY|-73.71|40.66|37,Valparaiso|IN|-87.06|41.47|32,Valrico|FL|-82.24|27.94|35,Van Nuys|CA|-118.45|34.19|136,Vancouver|BC|-123.12|49.25|662,Vancouver|WA|-122.66|45.64|196,Vaudreuil-Dorion|QC|-74.03|45.4|25,Vaughan|ON|-79.5|43.84|323,Venice|CA|-118.46|33.99|40,Ventura|CA|-119.29|34.28|96,Venustiano Carranza|MX09|-99.1|19.44|430,Veracruz|MX30|-96.14|19.18|428,Verdun|QC|-73.57|45.46|69,Vermont Square|CA|-118.3|34|47,Vernon|BC|-119.27|50.27|40,Vernon Hills|IL|-87.98|42.22|26,Vestal|NY|-76.05|42.09|28,Vestavia Hills|AL|-86.79|33.45|34,Victor Rosales|MX32|-102.7|22.95|32,Victoria|BC|-123.35|48.44|289,Victoria|TX|-97|28.81|67,Victoria de Durango|MX10|-104.66|24.02|518,Victoria-Downtown|BC|-123.36|48.43|46,Victoria-Fraserview|BC|-123.07|49.22|31,Victoriaville|QC|-71.97|46.05|34,Victorville|CA|-117.29|34.54|122,Villa Vicente Guerrero|MX29|-98.17|19.12|60,Villaflores|MX05|-93.27|16.23|37,Villagran|MX11|-101|20.51|27,Villahermosa|MX27|-92.94|17.99|353,Ville-Emard|QC|-73.6|45.45|30,Ville-Marie|QC|-73.57|45.5|104,Villeray-Saint-Michel-Parc-Extension|QC|-73.61|45.56|144,Vineland|NJ|-75.03|39.49|60,Virginia Beach|VA|-75.98|36.85|454,Visalia|CA|-119.29|36.33|130,Vista|CA|-117.24|33.2|100,Waco|TX|-97.15|31.55|132,Waiau-Pacific Palisades|HI|-157.95|21.4|47,Waipahu|HI|-158.01|21.39|38,Wake Forest|NC|-78.51|35.98|38,Wakefield|NY|-73.85|40.9|52,Waldorf|MD|-76.94|38.62|67,Walla Walla|WA|-118.34|46.06|32,Walnut|CA|-117.87|34.02|30,Walnut Creek|CA|-122.06|37.91|68,Walnut Grove|BC|-122.64|49.16|25,Waltham|MA|-71.24|42.38|63,Warner Robins|GA|-83.63|32.62|73,Warren|MI|-83.01|42.49|134,Warren|OH|-80.82|41.24|40,Warwick|RI|-71.42|41.7|81,Wasco|CA|-119.34|35.59|26,Washington|DC|-77.04|38.9|689,Washington Heights|NY|-73.94|40.85|152,Waterbury|CT|-73.05|41.56|108,Waterford|MI|-83.41|42.69|75,Waterfront Communities-The Island|ON|-79.38|43.63|65,Waterloo|ON|-80.52|43.47|104,Waterloo|IA|-92.34|42.49|68,Watertown|MA|-71.18|42.37|31,Watertown|NY|-75.91|43.97|26,Watsonville|CA|-121.76|36.91|53,Waukegan|IL|-87.84|42.36|88,Waukesha|WI|-88.23|43.01|71,Wausau|WI|-89.63|44.96|39,Wauwatosa|WI|-88.01|43.05|47,Waxahachie|TX|-96.85|32.39|33,Wayne|NJ|-74.28|40.93|57,Wayne|PA|-75.39|40.04|30,Weatherford|TX|-97.8|32.76|28,Welland|ON|-79.25|42.98|52,Wellesley|MA|-71.29|42.3|27,Wellington|FL|-80.24|26.66|62,Wenatchee|WA|-120.31|47.42|33,Wentzville|MO|-90.85|38.81|35,Weslaco|TX|-97.99|26.16|39,Wesley Chapel|FL|-82.33|28.24|44,West Albany|NY|-73.78|42.68|93,West Allis|WI|-88.01|43.02|60,West Babylon|NY|-73.35|40.72|43,West Bend|WI|-88.18|43.43|31,West Bloomfield Township|MI|-83.38|42.57|64,West Chicago|IL|-88.2|41.88|27,West Coon Rapids|MN|-93.35|45.16|62,West Covina|CA|-117.94|34.07|108,West Des Moines|IA|-93.71|41.58|64,West Elkridge|MD|-76.73|39.21|28,West End|BC|-123.13|49.28|47,West Englewood|IL|-87.67|41.78|32,West Falls Church|VA|-77.19|38.86|29,West Fargo|ND|-96.9|46.87|33,West Gulfport|MS|-89.09|30.4|71,West Hartford|CT|-72.74|41.76|63,West Haven|CT|-72.95|41.27|54,West Hill|ON|-79.18|43.77|27,West Hills|CA|-118.64|34.2|41,West Hollywood|FL|-80.18|26.02|60,West Hollywood|CA|-118.36|34.09|36,West Humber-Clairville|ON|-79.6|43.72|33,West Islip|NY|-73.31|40.71|28,West Jordan|UT|-111.94|40.61|111,West Kelowna|BC|-119.58|49.86|28,West Lafayette|IN|-86.91|40.43|45,West Lake Sammamish|WA|-122.1|47.58|33,West Lawn|IL|-87.72|41.77|32,West Linn|OR|-122.61|45.37|26,West Little River|FL|-80.24|25.86|34,West Lynchburg|VA|-79.18|37.4|65,West Memphis|AR|-90.18|35.15|25,West Milford|NJ|-74.37|41.13|26,West New York|NJ|-74.01|40.79|53,West Oak Lane|PA|-75.17|40.07|38,West Orange|NJ|-74.24|40.8|48,West Palm Beach|FL|-80.05|26.72|120,West Raleigh|NC|-78.66|35.79|338,West Ridge|IL|-87.69|42|72,West Roxbury|MA|-71.15|42.28|30,West Sacramento|CA|-121.53|38.58|52,West Scarborough|ME|-70.39|43.57|27,West Seneca|NY|-78.8|42.85|44,West Springfield|MA|-72.62|42.11|27,West Torrington|CT|-73.14|41.82|36,West Town|IL|-87.67|41.89|86,West Valley City|UT|-112|40.69|136,West Vancouver|BC|-123.16|49.33|45,West Village|NY|-74.01|40.73|32,West Warwick|RI|-71.52|41.7|30,West Whittier-Los Nietos|CA|-118.07|33.98|25,Westchester|FL|-80.33|25.75|29,Westerville|OH|-82.93|40.13|38,Westfield|MA|-72.75|42.13|41,Westfield|IN|-86.13|40.04|36,Westfield|NJ|-74.35|40.66|30,Westlake|OH|-81.92|41.46|32,Westland|MI|-83.4|42.32|82,Westminster|CO|-105.04|39.84|116,Westminster|CA|-118.01|33.76|92,Westminster-Branson|ON|-79.45|43.78|26,Westmont|CA|-118.3|33.94|31,Weston|FL|-80.4|26.1|69,Westport|CT|-73.36|41.14|26,Wethersfield|CT|-72.65|41.71|26,Wexford/Maryvale|ON|-79.3|43.75|27,Weymouth|MA|-70.94|42.22|54,Whalley|BC|-122.87|49.18|102,Wharton|PA|-75.16|39.93|49,Wheat Ridge|CO|-105.08|39.77|31,Wheaton|IL|-88.11|41.87|53,Wheaton|MD|-77.06|39.04|48,Wheeling|IL|-87.93|42.14|38,Wheeling|WV|-80.72|40.06|27,Whitby|ON|-78.93|43.88|138,Whitchurch-Stouffville|ON|-79.32|44|49,White Bear Lake|MN|-93.01|45.08|25,White Plains|NY|-73.76|41.03|58,Whitehorse|YT|-135.05|60.72|28,Whitestone|NY|-73.82|40.79|36,Whitman|PA|-75.16|39.92|49,Whitney|NV|-115.04|36.1|38,Whittier|CA|-118.03|33.98|87,Wichita|KS|-97.34|37.69|396,Wichita Falls|TX|-98.49|33.91|104,Wildomar|CA|-117.28|33.6|35,Wildwood|MO|-90.66|38.58|35,Wilkes-Barre|PA|-75.88|41.25|40,Williamsburg|NY|-73.95|40.71|33,Williamsport|PA|-77|41.24|29,Willingboro|NJ|-74.87|40.03|31,Williston|ND|-103.62|48.15|26,Willoughby|BC|-122.68|49.13|31,Willowbrook|CA|-118.26|33.92|35,Willowdale|ON|-79.4|43.77|79,Willowdale East|ON|-79.4|43.77|50,Wilmette|IL|-87.72|42.07|27,Wilmington|NC|-77.95|34.24|115,Wilmington|DE|-75.55|39.75|70,Wilmington|CA|-118.26|33.78|52,Wilson|NC|-77.92|35.72|49,Winchester|NV|-115.12|36.13|27,Winchester|VA|-78.16|39.19|27,Windsor|ON|-83.02|42.3|229,Windsor|CO|-104.9|40.48|32,Windsor|CT|-72.64|41.85|28,Windsor|CA|-122.82|38.55|27,Winnetka|CA|-118.57|34.21|47,Winnipeg|MB|-97.15|49.88|749,Winona|MN|-91.64|44.05|27,Winston-Salem|NC|-80.24|36.1|241,Winter Garden|FL|-81.59|28.57|40,Winter Haven|FL|-81.73|28.02|37,Winter Park|FL|-81.34|28.6|29,Winter Springs|FL|-81.31|28.7|34,Woburn|ON|-79.23|43.77|53,Woburn|MA|-71.15|42.48|39,Woodburn|OR|-122.86|45.14|25,Woodbury|MN|-92.96|44.92|67,Woodhaven|NY|-73.86|40.69|36,Woodland|CA|-121.77|38.68|58,Woodland Hills|CA|-118.61|34.17|70,Woodlawn|MD|-76.73|39.32|37,Woodridge|IL|-88.05|41.75|33,Woodside|NY|-73.91|40.75|41,Woodstock|ON|-80.75|43.13|40,Woodstock|GA|-84.52|34.1|29,Woodstock|IL|-88.45|42.31|25,Woonsocket|RI|-71.51|42|41,Wooster|OH|-81.94|40.81|26,Worcester|MA|-71.8|42.26|206,Wyandotte|MI|-83.15|42.21|25,Wylie|TX|-96.54|33.02|46,Wyoming|MI|-85.71|42.91|75,Xalapa de Enriquez|MX30|-96.92|19.53|424,Xalisco|MX18|-104.9|21.44|35,Xenia|OH|-83.93|39.68|25,Xico|MX15|-98.95|19.27|384,Xicotepec de Juarez|MX21|-97.96|20.28|39,Xochimilco|MX09|-99.1|19.25|442,Yakima|WA|-120.51|46.6|93,Yarmouth|MA|-70.23|41.71|25,Yautepec|MX17|-99.07|18.88|105,Yonkers|NY|-73.9|40.93|201,Yorba Linda|CA|-117.81|33.89|67,York|PA|-76.73|39.96|43,York University Heights|ON|-79.49|43.77|27,Youngstown|OH|-80.65|41.1|64,Yuba City|CA|-121.62|39.14|66,Yucaipa|CA|-117.04|34.03|53,Yukon|OK|-97.76|35.51|25,Yuma|AZ|-114.62|32.73|95,Yuriria|MX11|-101.13|20.21|25,Zacapu|MX16|-101.79|19.82|50,Zacatecas|MX32|-102.58|22.77|129,Zacatelco|MX29|-98.24|19.22|42,Zacatlan|MX21|-97.96|19.94|33,Zamora de Hidalgo|MX16|-102.29|19.98|186,Zanesville|OH|-82.01|39.94|25,Zapopan|MX14|-103.39|20.72|1476,Zapotlanejo|MX14|-103.07|20.62|32,Zinacantepec|MX15|-99.73|19.28|54,Zionsville|IN|-86.26|39.95|26,Zumpango|MX15|-99.1|19.8|280",gP="AB|CA|Alberta|-113.75|52.18,AK|US|Alaska|-148.32|61.29,AL|US|Alabama|-86.73|33.08,AR|US|Arkansas|-92.85|35.29,AZ|US|Arizona|-111.99|33.32,BC|CA|British Columbia|-122.73|49.27,CA|US|California|-119.21|35.2,CO|US|Colorado|-105|39.63,CT|US|Connecticut|-73.01|41.42,DC|US|District of Columbia|-77.04|38.9,DE|US|Delaware|-75.59|39.57,FL|US|Florida|-81.29|27.53,GA|US|Georgia|-84.02|33.43,HI|US|Hawaii|-157.73|21.26,IA|US|Iowa|-92.79|41.88,ID|US|Idaho|-115.65|44.2,IL|US|Illinois|-88.05|41.67,IN|US|Indiana|-86.27|40.23,KS|US|Kansas|-96|38.59,KY|US|Kentucky|-84.91|38.13,LA|US|Louisiana|-91.28|30.57,MA|US|Massachusetts|-71.28|42.32,MB|CA|Manitoba|-97.3|49.88,MD|US|Maryland|-76.79|39.18,ME|US|Maine|-70.01|43.92,MI|US|Michigan|-83.69|42.56,MN|US|Minnesota|-93.26|44.98,MO|US|Missouri|-92.66|38.73,MS|US|Mississippi|-89.62|32.36,MT|US|Montana|-111.07|46.37,MX01|MX|Aguascalientes|-102.29|21.91,MX02|MX|Baja California|-116.5|32.46,MX03|MX|Baja California Sur|-110.12|23.52,MX04|MX|Campeche|-91.08|19.25,MX05|MX|Chiapas|-92.77|16.28,MX06|MX|Chihuahua|-106.27|30.1,MX07|MX|Coahuila|-101.9|26.31,MX08|MX|Colima|-103.94|19.15,MX09|MX|Mexico City|-99.13|19.41,MX10|MX|Durango|-104.24|24.64,MX11|MX|Guanajuato|-101.37|20.87,MX12|MX|Guerrero|-99.83|17.31,MX13|MX|Hidalgo|-98.81|20.13,MX14|MX|Jalisco|-103.39|20.64,MX15|MX|M\xE9xico|-99.14|19.51,MX16|MX|Michoac\xE1n|-101.68|19.49,MX17|MX|Morelos|-99.15|18.88,MX18|MX|Nayarit|-104.89|21.5,MX19|MX|Nuevo Le\xF3n|-100.26|25.69,MX20|MX|Oaxaca|-96.23|17.05,MX21|MX|Puebla|-98.12|19.07,MX22|MX|Quer\xE9taro|-100.35|20.57,MX23|MX|Quintana Roo|-87.09|20.7,MX24|MX|San Luis Potos\xED|-100.7|22.22,MX25|MX|Sinaloa|-107.49|24.63,MX26|MX|Sonora|-111.05|29.37,MX27|MX|Tabasco|-92.98|17.99,MX28|MX|Tamaulipas|-98.33|24.92,MX29|MX|Tlaxcala|-98.19|19.31,MX30|MX|Veracruz|-96.31|19.2,MX31|MX|Yucat\xE1n|-89.52|20.94,MX32|MX|Zacatecas|-102.7|22.93,NB|CA|New Brunswick|-65.73|45.83,NC|US|North Carolina|-79.61|35.57,ND|US|North Dakota|-98.8|47.31,NE|US|Nebraska|-96.42|41.07,NH|US|New Hampshire|-71.37|43,NJ|US|New Jersey|-74.34|40.51,NL|CA|Newfoundland and Labrador|-52.77|47.55,NM|US|New Mexico|-106.28|34.69,NS|CA|Nova Scotia|-63.11|44.86,NV|US|Nevada|-115.95|36.72,NY|US|New York|-74.13|40.89,OH|US|Ohio|-82.75|40.53,OK|US|Oklahoma|-97.01|35.66,ON|CA|Ontario|-79.27|43.94,OR|US|Oregon|-122.75|44.96,PA|US|Pennsylvania|-76.12|40.23,PE|CA|Prince Edward Island|-63.13|46.23,QC|CA|Quebec|-73.14|45.89,RI|US|Rhode Island|-71.45|41.79,SC|US|South Carolina|-80.69|33.6,SD|US|South Dakota|-98.66|43.89,SK|CA|Saskatchewan|-105.99|51.63,TN|US|Tennessee|-87.53|35.63,TX|US|Texas|-97.51|31.01,UT|US|Utah|-111.96|40.5,VA|US|Virginia|-77.08|37.61,VT|US|Vermont|-73.21|44.48,WA|US|Washington|-121.46|47.29,WI|US|Wisconsin|-88.6|43.36,WV|US|West Virginia|-81.42|38.99,WY|US|Wyoming|-105.54|42.26,YT|CA|Yukon|-135.05|60.72",MP="006|-66.84|18.26,007|-66.15|18.15,008|-64.74|17.74,009|-66.12|18.37,010|-72.6|42.26,011|-72.53|42.07,012|-73.21|42.37,013|-72.51|42.58,014|-71.81|42.59,015|-71.85|42.23,016|-71.84|42.28,017|-71.44|42.33,018|-71.21|42.64,019|-70.89|42.66,020|-71.28|42.12,021|-71.05|42.31,022|-71.04|42.35,023|-70.86|41.98,024|-71.22|42.37,025|-70.6|41.71,026|-70.2|41.73,027|-71.07|41.77,028|-71.62|41.69,029|-71.47|41.82,030|-71.51|42.9,031|-71.48|43,032|-71.65|43.57,033|-71.58|43.26,034|-72.19|42.91,035|-71.31|44.69,036|-72.32|43.17,037|-72.13|43.69,038|-71.1|43.56,039|-70.76|43.24,040|-70.6|43.78,041|-70.27|43.7,042|-70.49|44.38,043|-69.75|44.3,044|-68.83|45.45,045|-69.57|43.99,046|-67.8|44.79,047|-68.34|46.55,048|-69.17|44.2,049|-69.97|44.99,050|-72.43|43.85,051|-72.65|43.28,052|-73.14|43.03,053|-72.77|42.94,054|-72.98|44.58,056|-72.6|44.35,057|-73.04|43.69,058|-72.12|44.68,059|-71.7|44.79,060|-72.81|41.88,061|-72.69|41.74,062|-72.12|41.81,063|-72.03|41.5,064|-72.61|41.46,065|-72.94|41.36,066|-73.22|41.24,067|-73.24|41.68,068|-73.42|41.28,069|-73.57|41.14,070|-74.28|40.76,071|-74.2|40.74,072|-74.2|40.68,073|-74.08|40.71,074|-74.4|41.09,075|-74.17|40.92,076|-74.01|40.94,077|-74.17|40.28,078|-74.81|40.97,079|-74.55|40.74,080|-74.98|39.78,081|-75.07|39.94,082|-74.68|39.32,083|-75.04|39.45,084|-74.48|39.35,085|-74.62|40.25,086|-74.68|40.23,087|-74.22|39.96,088|-74.72|40.54,089|-74.48|40.45,100|-73.96|40.77,101|-73.95|40.78,102|-74.02|40.72,103|-74.15|40.58,104|-73.85|40.9,105|-73.75|41.27,106|-73.74|41.02,107|-73.84|40.96,108|-73.8|40.95,109|-74.27|41.3,110|-73.69|40.74,111|-73.93|40.76,112|-73.94|40.66,113|-73.84|40.73,114|-73.77|40.69,115|-73.62|40.71,116|-73.88|40.57,117|-73.23|40.82,118|-73.5|40.77,119|-72.53|40.95,120|-74.22|42.92,121|-74.4|43.46,122|-73.81|42.7,123|-73.96|42.82,124|-74.27|42.09,125|-73.7|41.89,126|-73.88|41.69,127|-74.75|41.74,128|-73.91|43.61,129|-74.03|44.53,130|-76.16|43.08,131|-76.46|43.27,132|-76.2|43.03,133|-75.07|43.45,134|-75.35|43.03,135|-75.15|43.14,136|-75.39|44.33,137|-75.2|42.21,138|-75.46|42.43,139|-75.88|42.12,140|-78.48|43.01,141|-78.7|42.49,142|-78.8|42.91,143|-78.96|43.12,144|-77.71|42.96,145|-77.17|43.14,146|-77.65|43.17,147|-78.84|42.21,148|-77.18|42.29,149|-76.78|42.09,150|-80.23|40.56,151|-80.18|40.53,152|-79.97|40.46,153|-80.24|40.01,154|-79.65|39.92,155|-78.8|39.95,156|-79.47|40.33,157|-79.02|40.71,158|-78.66|41.32,159|-78.84|40.35,160|-79.88|40.93,161|-80.3|41.19,162|-79.35|41.08,163|-79.58|41.59,164|-80|41.87,165|-80.04|42.1,166|-78.28|40.48,167|-78.47|41.76,168|-78|40.97,169|-77.37|41.8,170|-77.29|40.44,171|-76.78|40.33,172|-77.81|39.98,173|-76.93|39.89,174|-76.72|39.97,175|-76.24|40.05,176|-76.34|40.05,177|-77.22|41.34,178|-76.77|40.93,179|-76.27|40.69,180|-75.45|40.67,181|-75.47|40.6,182|-75.88|40.9,183|-75.19|41.12,184|-75.38|41.53,185|-75.68|41.37,186|-76.17|41.4,187|-75.86|41.22,188|-76.12|41.82,189|-75.14|40.36,190|-75.37|39.97,191|-75.15|40.01,193|-75.78|39.92,194|-75.46|40.19,195|-75.9|40.42,196|-75.95|40.34,197|-75.68|39.53,198|-75.58|39.77,199|-75.46|38.83,200|-77.02|38.9,201|-77.68|38.9,202|-77.03|38.89,203|-77.01|38.86,204|-77.05|38.89,205|-77.01|38.87,206|-76.76|38.45,207|-76.78|38.88,208|-77.23|39.15,209|-76.99|39.05,210|-76.32|39.53,211|-76.73|39.58,212|-76.58|39.31,214|-76.55|39,215|-79.08|39.56,216|-76.02|38.86,217|-77.5|39.52,218|-75.57|38.27,219|-75.94|39.57,220|-77.25|38.78,221|-77.25|38.92,222|-77.11|38.88,223|-77.13|38.79,224|-77.25|38.22,225|-77.51|38.09,226|-78.25|39.03,227|-78.05|38.49,228|-78.79|38.57,229|-78.55|38.02,230|-78.09|37.66,231|-76.96|37.55,232|-77.46|37.51,233|-76.3|36.68,234|-76.66|36.77,235|-76.26|36.87,236|-76.44|37.12,237|-76.38|36.85,238|-77.41|36.94,239|-78.39|37.03,240|-80.1|37.23,241|-79.89|36.9,242|-82.49|36.83,243|-81.13|36.86,244|-79.51|38.05,245|-79.11|37.15,246|-81.8|37.19,247|-81.14|37.39,248|-81.64|37.47,249|-80.32|37.95,250|-81.45|38.27,251|-81.89|38.64,252|-81.45|38.77,253|-81.64|38.42,254|-78.11|39.45,255|-82.19|38.25,256|-82.08|37.76,257|-82.41|38.4,258|-81.21|37.72,259|-80.89|37.83,260|-80.63|40.05,261|-81.27|39.2,262|-80.02|38.75,263|-80.23|39.27,264|-80.65|39.21,265|-80.05|39.59,266|-80.8|38.48,267|-78.98|39.33,268|-79.12|38.88,270|-80.45|36.24,271|-80.24|36.06,272|-79.82|35.86,273|-79.52|35.55,274|-79.81|36.09,275|-78.54|35.93,276|-78.65|35.81,277|-78.9|35.99,278|-77.32|35.88,279|-76.5|36.19,280|-81.2|35.4,281|-80.41|35.21,282|-80.83|35.22,283|-78.94|34.96,284|-78.23|34.39,285|-77.23|35.06,286|-81.36|36.06,287|-82.78|35.51,288|-82.55|35.6,289|-83.97|35.11,290|-80.88|34.19,291|-80.62|33.71,292|-80.96|34.04,293|-81.86|34.78,294|-80.08|33.05,295|-79.49|34.07,296|-82.57|34.61,297|-80.92|34.83,298|-81.74|33.51,299|-80.96|32.55,300|-84.08|33.85,301|-84.91|34.04,302|-84.55|33.25,303|-84.42|33.77,304|-82.11|32.48,305|-83.81|34.58,306|-83.14|33.86,307|-85.1|34.71,308|-82.34|33.35,309|-82.01|33.4,310|-83.42|32.64,312|-83.64|32.83,313|-81.49|31.68,314|-81.15|32.03,315|-82.21|31.4,316|-83.21|31.02,317|-83.87|31.48,318|-84.69|32.45,319|-84.95|32.47,320|-82.58|30.27,321|-81.48|29.39,322|-81.69|30.3,323|-84.25|30.29,324|-85.58|30.55,325|-87.03|30.76,326|-82.6|29.58,327|-81.28|28.79,328|-81.32|28.47,329|-80.67|27.96,330|-80.58|25.31,331|-80.38|25.74,333|-80.25|26.13,334|-81.01|26.64,335|-82.22|28.19,336|-82.47|28.01,337|-82.73|27.85,338|-81.64|27.72,339|-81.71|26.77,341|-81.32|26.11,342|-82.16|27.29,344|-82.35|29.01,346|-82.52|28.41,347|-81.4|28.29,349|-80.72|27.34,350|-86.8|34.05,351|-86.38|33.43,352|-86.77|33.5,354|-87.86|33.07,355|-87.71|33.96,356|-87.4|34.67,357|-86.26|34.75,358|-86.59|34.69,359|-85.94|34.27,360|-86.09|32.09,361|-86.27|32.31,362|-85.65|33.53,363|-85.56|31.34,364|-86.97|31.38,365|-88.14|31.32,366|-88.19|30.68,367|-87.34|32.33,368|-85.41|32.61,369|-88.25|32.12,370|-87.02|36.12,371|-86.23|35.75,372|-86.83|36.15,373|-85.36|35.32,374|-85.33|35.06,376|-82.3|36.36,377|-84.31|36.27,378|-83.35|36.3,379|-83.97|35.97,380|-89.43|35.55,381|-89.96|35.1,382|-88.68|36.29,383|-88.5|35.61,384|-87.36|35.34,385|-85.34|36.18,386|-89.76|34.57,387|-90.81|33.54,388|-88.63|34.36,389|-89.9|33.77,390|-90|32.53,391|-90.67|32.51,392|-90.22|32.32,393|-88.8|32.42,394|-89.26|31.23,395|-89|30.59,396|-90.67|31.32,397|-88.87|33.53,398|-84.67|31.32,400|-85.29|38.07,401|-86.2|37.85,402|-85.66|38.19,403|-84.2|38.06,404|-84.42|37.53,405|-84.45|38.04,406|-84.87|38.22,407|-84.12|36.95,408|-83.26|36.9,409|-83.74|36.95,410|-84.32|38.64,411|-83.06|38.38,412|-82.67|37.89,413|-83.48|37.58,414|-83.15|37.84,415|-82.39|37.46,416|-82.78|37.54,417|-83.25|37.23,418|-82.88|37.21,420|-88.57|36.9,421|-86.09|36.89,422|-87.11|36.95,423|-87.02|37.52,424|-87.7|37.47,425|-84.71|37.15,426|-84.82|36.81,427|-85.73|37.32,430|-82.9|40.21,431|-82.99|39.69,432|-82.97|39.98,433|-83.38|40.55,434|-83.3|41.42,435|-84.22|41.46,436|-83.54|41.67,437|-81.66|39.85,438|-81.88|40.27,439|-80.9|40.25,440|-80.97|41.64,441|-81.66|41.42,442|-81.6|41.13,443|-81.54|41.07,444|-80.77|41.09,445|-80.64|41.05,446|-81.53|40.65,447|-81.39|40.83,448|-82.77|41.02,449|-82.55|40.74,450|-84.48|39.43,451|-83.84|39.16,452|-84.48|39.18,453|-84.3|39.97,454|-84.18|39.74,455|-83.81|39.94,456|-82.86|38.99,457|-81.78|39.35,458|-84.23|40.83,460|-86.13|40.17,461|-86.18|39.62,462|-86.14|39.79,463|-87.05|41.41,464|-87.34|41.55,465|-86.08|41.44,466|-86.28|41.66,467|-85.21|41.17,468|-85.17|41.09,469|-86.14|40.76,470|-85.08|39.16,471|-86.02|38.43,472|-85.74|39.05,473|-85.15|40.09,474|-86.63|38.99,475|-87.03|38.46,476|-87.53|38.13,477|-87.58|38.03,478|-87.29|39.45,479|-87.11|40.5,480|-82.79|42.83,481|-83.62|42.2,482|-83.1|42.38,483|-83.35|42.66,484|-83.22|43.29,485|-83.69|43.03,486|-84.36|43.99,487|-83.67|44.45,488|-84.67|43.02,489|-84.59|42.74,490|-85.54|42.2,491|-86.36|41.87,492|-84.36|42.06,493|-85.57|43.33,494|-86.14|43.39,495|-85.66|42.96,496|-85.52|44.44,497|-84.37|45.17,498|-86.94|46.17,499|-88.93|46.6,500|-94.77|41.63,501|-92.79|41.84,502|-93.67|42.12,503|-93.63|41.59,504|-93.37|43.17,505|-94.45|42.77,506|-92.45|42.65,507|-92.31|42.49,508|-94.56|40.96,510|-95.91|42.6,511|-96.39|42.52,512|-96.06|43.28,513|-95.16|43.27,514|-95.08|42.11,515|-95.55|41.44,516|-95.37|40.74,520|-90.98|42.46,521|-91.73|43.2,522|-92.31|41.9,523|-91.66|41.87,524|-91.69|41.96,525|-92.46|40.95,526|-91.44|40.88,527|-90.88|41.64,528|-90.61|41.56,530|-88.24|43.51,531|-88.33|42.75,532|-87.98|43.06,534|-87.86|42.74,535|-89.66|42.95,537|-89.38|43.08,538|-90.73|42.88,539|-89.55|43.64,540|-92.46|45.08,541|-88.23|45.09,542|-87.6|44.52,543|-88.01|44.53,544|-89.85|44.93,545|-89.86|45.89,546|-90.87|43.93,547|-91.52|44.85,548|-91.63|46.04,549|-88.96|44.19,550|-92.98|45.17,551|-93.08|44.96,553|-94.06|44.99,554|-93.31|45.01,556|-91.03|47.67,557|-92.68|47.39,558|-92.08|46.96,559|-92.28|43.89,560|-94.04|44.02,561|-95.65|43.92,562|-95.75|45.08,563|-94.59|45.83,564|-94.5|46.63,565|-96.08|46.86,566|-94.31|47.88,567|-96.22|48.39,570|-97.07|43.48,571|-96.76|43.54,572|-97.18|45.04,573|-98.53|43.91,574|-98.93|45.36,575|-100.61|43.86,576|-101.59|45.43,577|-103.11|44.26,580|-97.39|46.66,581|-96.83|46.86,582|-97.72|48.25,583|-99.34|48.32,584|-99.12|46.88,585|-100.98|46.76,586|-102.99|46.75,587|-101.7|48.34,588|-103.48|48.2,590|-108.62|45.98,591|-108.45|45.69,592|-105.6|48.2,593|-105.58|46.4,594|-111.24|47.79,595|-109.12|48.38,596|-111.74|46.65,597|-112.31|45.48,598|-114.25|46.97,599|-114.57|48.37,600|-88.15|42.29,601|-88.47|42.01,602|-87.69|42.04,603|-87.79|41.89,604|-88.09|41.39,605|-88.55|41.69,606|-87.69|41.83,607|-87.82|42.03,608|-87.76|41.84,609|-87.92|40.8,610|-89.56|42.18,611|-89.08|42.28,612|-90.29|41.5,613|-89.16|41.34,614|-90.43|40.82,615|-89.68|40.71,616|-89.61|40.72,617|-88.89|40.52,618|-88.15|40.11,619|-88.19|39.66,620|-90.01|39.13,622|-89.72|38.41,623|-91.02|39.99,624|-88.19|39.04,625|-89.21|39.63,626|-90|39.86,627|-89.66|39.8,628|-88.65|38.35,629|-88.89|37.55,630|-90.83|38.35,631|-90.32|38.64,633|-91.11|39.02,634|-91.78|39.93,635|-92.61|40.2,636|-90.64|37.61,637|-89.81|37.37,638|-89.73|36.55,639|-90.62|36.84,640|-94.1|39.07,641|-94.58|39.14,644|-94.69|40.13,645|-94.83|39.75,646|-93.55|39.89,647|-94.15|38.06,648|-94.35|36.93,650|-92.23|38.45,651|-92.19|38.51,652|-92.38|39.21,653|-93.26|38.71,654|-92.03|37.93,655|-91.92|37.67,656|-93.08|36.76,657|-92.43|37.03,658|-93.3|37.22,660|-95.12|38.84,661|-94.73|39.11,662|-94.72|38.95,664|-96.15|39.64,665|-96.34|39.4,666|-95.76|39.06,667|-95.23|37.64,668|-96.39|38.36,669|-97.86|39.77,670|-98.49|37.33,671|-98.4|37.44,672|-97.33|37.7,673|-95.81|37.23,674|-97.79|38.98,675|-98.99|38.25,676|-99.47|39.34,677|-101.15|39.35,678|-100.82|37.91,679|-101.43|37.18,680|-96.46|41.55,681|-96.05|41.24,683|-96.93|40.39,684|-97.26|40.89,685|-96.69|40.82,686|-97.68|41.55,687|-98.16|42.43,688|-99.15|41.34,689|-98.9|40.34,690|-100.99|40.37,691|-101.59|41.42,692|-100.64|42.67,693|-102.84|42.29,700|-89.93|29.63,701|-89.93|30.02,703|-90.65|29.62,704|-90.27|30.66,705|-92.25|30.2,706|-93.21|30.34,707|-91.2|30.57,708|-91.1|30.45,710|-93.4|32.45,711|-93.75|32.47,712|-91.95|32.56,713|-91.86|31.43,714|-92.84|31.57,716|-91.75|33.61,717|-92.79|33.48,718|-93.84|33.66,719|-93.61|34.4,720|-91.9|34.92,721|-92.56|34.93,722|-92.37|34.7,723|-90.59|35.07,724|-90.76|36.04,725|-91.81|36.01,726|-92.93|36.15,727|-94.05|36.11,728|-93.33|35.3,729|-94.08|35.29,730|-97.83|35.31,731|-97.5|35.43,734|-97.14|34.21,735|-98.81|34.53,736|-99.33|35.52,737|-98.2|36.42,738|-99.54|36.5,739|-101.67|36.74,740|-96.19|36.34,741|-95.96|36.15,743|-95.02|36.55,744|-95.44|35.64,745|-95.65|34.66,746|-97.05|36.71,747|-95.41|34.02,748|-96.66|35.17,749|-94.69|35.23,750|-96.76|33.06,751|-96.32|32.48,752|-96.78|32.79,753|-96.84|32.81,754|-95.67|33.37,755|-94.45|33.3,756|-94.58|32.49,757|-95.37|32.24,758|-95.68|31.44,759|-94.29|31.29,760|-97.54|32.59,761|-97.38|32.77,762|-97.44|33.52,763|-98.87|33.73,764|-98.59|32.61,765|-97.62|31.11,766|-97.06|31.7,767|-97.15|31.57,768|-99.37|31.23,769|-100.88|31.03,770|-95.39|29.79,772|-95.37|29.77,773|-95.24|30.48,774|-96.02|29.38,775|-94.98|29.68,776|-94.16|30.27,777|-94.19|29.96,778|-96.32|30.67,779|-96.95|28.92,780|-99.01|28.67,781|-97.93|29.08,782|-98.53|29.47,783|-98.14|27.63,784|-97.44|27.73,785|-98.19|26.39,786|-98.1|30.27,787|-97.78|30.3,788|-100.26|29.44,789|-96.87|29.92,790|-101.63|35.48,791|-101.85|35.21,792|-100.57|34.25,793|-102.15|33.37,794|-101.88|33.58,795|-100.31|32.7,796|-99.72|32.46,797|-102.22|31.57,798|-104.17|30.53,799|-106.16|31.8,800|-105.11|39.91,801|-104.47|39.51,802|-104.93|39.78,803|-105.31|40.04,804|-106.16|39.98,805|-105.35|40.57,806|-104.49|40.38,807|-103.09|40.4,808|-103.16|39.12,809|-104.67|38.79,810|-103.58|37.77,811|-106.39|37.54,812|-106.39|38.46,813|-108.42|37.49,814|-108.02|38.43,815|-108.7|38.92,816|-107.86|39.99,820|-105.27|41.31,821|-110.51|44.57,822|-104.67|42.39,823|-107.03|41.75,824|-108.65|44.32,825|-108.91|43.14,826|-106.43|43.1,827|-105|44.2,828|-106.71|44.55,829|-109.71|42.82,830|-110.51|43.7,831|-110.53|42.6,832|-112.17|42.66,833|-114.23|42.81,834|-111.63|43.86,835|-115.77|46.07,836|-115.99|44,837|-116.04|43.58,838|-116.47|47.77,840|-110.86|40.53,841|-111.81|40.71,843|-112.18|41.67,844|-112.01|41.23,845|-109.72|38.09,846|-111.68|39.63,847|-112.82|37.61,850|-112.09|33.63,851|-111.41|33,852|-111.69|33.6,853|-113.44|33.49,855|-110.3|33.43,856|-110.59|32,857|-111.09|32.18,859|-109.81|34.23,860|-111.15|35.89,863|-112.57|34.85,864|-113.79|35.66,865|-109.55|36.03,870|-106.9|35.22,871|-106.72|35.12,873|-108.56|35.44,874|-108.23|36.59,875|-106.04|36.27,877|-104.68|36.06,878|-107.94|34,879|-107.48|33.2,880|-108.03|32.37,881|-103.81|34.26,882|-104.07|32.87,883|-105.48|33.62,884|-103.79|35.74,890|-114.84|37,891|-115.42|36.33,893|-116.96|39.5,894|-118.06|41.29,895|-119.72|39.9,897|-119.8|39.18,898|-115.71|40.95,900|-118.32|34.04,902|-118.76|34.07,903|-118.34|33.95,904|-118.48|34.02,905|-118.33|33.83,906|-118.03|33.93,907|-118.45|33.39,908|-118.18|33.8,910|-118.25|34.28,911|-118.13|34.15,912|-118.25|34.19,913|-118.55|34.36,914|-118.47|34.18,915|-118.33|34.19,916|-118.38|34.18,917|-117.78|34.14,918|-118.13|34.09,919|-116.62|32.73,920|-116.7|33.16,921|-117.14|32.85,922|-115.5|33.59,923|-117.14|34.66,924|-117.33|34.17,925|-117.06|33.68,926|-117.73|33.63,927|-117.85|33.74,928|-117.71|33.85,930|-119.12|34.39,931|-119.97|34.48,932|-119.07|35.98,933|-119.01|35.35,934|-120.5|35.38,935|-118.36|37.37,936|-119.72|36.95,937|-119.85|36.71,939|-121.42|36.34,940|-122.31|37.41,941|-122.44|37.77,943|-122.13|37.44,944|-122.32|37.53,945|-122.05|38.09,946|-122.19|37.78,947|-122.26|37.89,948|-122.3|37.97,949|-122.74|38.14,950|-121.42|36.85,951|-121.76|37.33,952|-120.79|38.14,953|-120.56|37.62,954|-123.15|39.08,955|-123.75|40.5,956|-121.34|38.62,957|-120.86|39.13,958|-121.44|38.58,959|-121.73|39.47,960|-122.42|41.06,961|-120.33|40.52,967|-155.53|19.6,968|-157.83|21.34,969|144.77|13.45,970|-121.45|45.3,971|-123.79|45.64,972|-122.74|45.57,973|-123.26|44.68,974|-123.46|43.61,975|-123.06|42.34,976|-120.4|42.67,977|-120.77|44.32,978|-118.59|45.21,979|-117.63|43.34,980|-121.78|47.42,981|-122.32|47.6,982|-121.79|48.39,983|-123.87|47.96,984|-122.46|47.18,985|-123.27|46.94,986|-122.15|45.99,988|-119.91|48,989|-120.57|46.71,990|-117.56|47.62,991|-118.13|47.91,992|-117.4|47.67,993|-118.82|46.4,994|-117.21|46.2,995|-156.93|60.89,996|-151.66|60.82,997|-146.69|65.19,998|-136.2|58.94,999|-131.24|55.86";function s4(t){return t.normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"").toLowerCase().replace(/[^\p{L}\p{N}\s]/gu," ").replace(/\s+/g," ").trim()}var Mr=null;function Ic(){if(Mr)return Mr;let t=new Map;for(let e of fP.split(",")){let r=e.split("|");if(r.length<5)continue;let o=s4(r[0]);if(!o)continue;let n={a1:r[1],lon:+r[2],lat:+r[3],pop:+r[4]},i=t.get(o);i?i.push(n):t.set(o,[n])}for(let e of t.values())e.sort((r,o)=>o.pop-r.pop);return Mr=t,t}var Cr=null;function Lr(){if(Cr)return Cr;let t=new Map;for(let e of gP.split(",")){let r=e.split("|");if(r.length<5)continue;let o={key:r[0],cc:r[1],name:r[2],lon:+r[3],lat:+r[4]};t.set(s4(o.key),o);let n=s4(o.name);n==="mexico"&&o.cc==="MX"?(t.set("estado de mexico",o),t.set("edomex",o)):t.set(n,o)}return Cr=t,t}var vr=null;function CP(){if(vr)return vr;let t=new Map;for(let e of MP.split(",")){let r=e.split("|");r.length<3||t.set(r[0],{lon:+r[1],lat:+r[2]})}return vr=t,t}function y9(t){if(t==null)return null;let e=s4(String(t));return e?Lr().get(e)?.key??null:null}var vP={us:"US",usa:"US","u s":"US","u s a":"US",america:"US","united states":"US","united states of america":"US",ca:"CA",can:"CA",canada:"CA",mx:"MX",mex:"MX",mexico:"MX","estados unidos mexicanos":"MX"};function _P(t){if(t==null)return null;let e=s4(String(t));return e?vP[e]??null:null}function zc(t){return Lr().get(s4(t))?.cc??null}function Rr(t){if(t==null)return[];let e=String(t).trim().replace(/\.0+$/,"");if(!e)return[];let r=/^(\d{5})(-\d{4})?$/.exec(e);if(r)return[r[1].slice(0,3)];if(/^\d{4}$/.test(e))return[e.padStart(5,"0").slice(0,3)];if(/^\d{3}$/.test(e)){let o=e.padStart(5,"0").slice(0,3);return o===e?[e]:[e,o]}return[]}function PP(t){let e=null,r=typeof t.lat=="string"?t.lat.trim():t.lat,o=typeof t.lon=="string"?t.lon.trim():t.lon;if(r!=null&&r!==""&&o!==void 0&&o!==null&&o!==""){let a=+r,s=+o;if(isFinite(a)&&isFinite(s)&&a>=-90&&a<=90&&s>=-180&&s<=180)if(a===0&&s===0)e={lat:0,lon:0,precision:"latlon"};else return{lat:a,lon:s,precision:"latlon"}}let n=_P(t.country),i=y9(t.state);if(i&&n&&zc(i)!==n&&(i=null),t.city!==void 0&&t.city!==null){let a=s4(String(t.city)),s=a?Ic().get(a):void 0;if(s&&n&&(s=s.filter(l=>zc(l.a1)===n)),s&&s.length>0)if(i){let l=s.find(c=>c.a1===i);if(l)return{lat:l.lat,lon:l.lon,precision:"city"}}else return s.length===1?{lat:s[0].lat,lon:s[0].lon,precision:"city"}:{lat:s[0].lat,lon:s[0].lon,precision:"city",ambiguous:!0}}for(let a of Rr(t.zip)){let s=CP().get(a);if(s)return{lat:s.lat,lon:s.lon,precision:"zip3"}}if(i){let a=Lr().get(s4(i));if(a)return{lat:a.lat,lon:a.lon,precision:"state"}}return e}var xc={latlon:0,city:1,zip3:2,state:3};function AP(t){let e=new Array(t.length),r=new Array(t.length),o=new Set,n=[],i=0,a=0,s=null;for(let l=0;l<t.length;++l){let c=t[l],p=PP(c);if(p)e[l]=p.lat,r[l]=p.lon,i++,p.ambiguous&&a++,(s===null||xc[p.precision]>xc[s])&&(s=p.precision);else{e[l]=null,r[l]=null;let u=[c.city,c.state,c.zip].filter(m=>m!=null&&String(m).trim()!=="").map(m=>String(m).trim()).join(", ");u&&!o.has(u.toLowerCase())&&(o.add(u.toLowerCase()),n.push(u))}}return{lat:e,lon:r,precision:s,unmatched:n,ambiguousRows:a,matchedRows:i,totalRows:t.length}}function Lc(t){return!!t&&Ic().has(t)}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var SP="AD AND,AE ARE,AF AFG,AG ATG,AI AIA,AL ALB,AM ARM,AO AGO,AQ ATA,AR ARG,AS ASM,AT AUT,AU AUS,AW ABW,AX ALA,AZ AZE,BA BIH,BB BRB,BD BGD,BE BEL,BF BFA,BG BGR,BH BHR,BI BDI,BJ BEN,BL BLM,BM BMU,BN BRN,BO BOL,BQ BES,BR BRA,BS BHS,BT BTN,BV BVT,BW BWA,BY BLR,BZ BLZ,CA CAN,CC CCK,CD COD,CF CAF,CG COG,CH CHE,CI CIV,CK COK,CL CHL,CM CMR,CN CHN,CO COL,CR CRI,CU CUB,CV CPV,CW CUW,CX CXR,CY CYP,CZ CZE,DE DEU,DJ DJI,DK DNK,DM DMA,DO DOM,DZ DZA,EC ECU,EE EST,EG EGY,EH ESH,ER ERI,ES ESP,ET ETH,FI FIN,FJ FJI,FK FLK,FM FSM,FO FRO,FR FRA,GA GAB,GB GBR,GD GRD,GE GEO,GF GUF,GG GGY,GH GHA,GI GIB,GL GRL,GM GMB,GN GIN,GP GLP,GQ GNQ,GR GRC,GS SGS,GT GTM,GU GUM,GW GNB,GY GUY,HK HKG,HM HMD,HN HND,HR HRV,HT HTI,HU HUN,ID IDN,IE IRL,IL ISR,IM IMN,IN IND,IO IOT,IQ IRQ,IR IRN,IS ISL,IT ITA,JE JEY,JM JAM,JO JOR,JP JPN,KE KEN,KG KGZ,KH KHM,KI KIR,KM COM,KN KNA,KP PRK,KR KOR,KW KWT,KY CYM,KZ KAZ,LA LAO,LB LBN,LC LCA,LI LIE,LK LKA,LR LBR,LS LSO,LT LTU,LU LUX,LV LVA,LY LBY,MA MAR,MC MCO,MD MDA,ME MNE,MF MAF,MG MDG,MH MHL,MK MKD,ML MLI,MM MMR,MN MNG,MO MAC,MP MNP,MQ MTQ,MR MRT,MS MSR,MT MLT,MU MUS,MV MDV,MW MWI,MX MEX,MY MYS,MZ MOZ,NA NAM,NC NCL,NE NER,NF NFK,NG NGA,NI NIC,NL NLD,NO NOR,NP NPL,NR NRU,NU NIU,NZ NZL,OM OMN,PA PAN,PE PER,PF PYF,PG PNG,PH PHL,PK PAK,PL POL,PM SPM,PN PCN,PR PRI,PS PSE,PT PRT,PW PLW,PY PRY,QA QAT,RE REU,RO ROU,RS SRB,RU RUS,RW RWA,SA SAU,SB SLB,SC SYC,SD SDN,SE SWE,SG SGP,SH SHN,SI SVN,SJ SJM,SK SVK,SL SLE,SM SMR,SN SEN,SO SOM,SR SUR,SS SSD,ST STP,SV SLV,SX SXM,SY SYR,SZ SWZ,TC TCA,TD TCD,TF ATF,TG TGO,TH THA,TJ TJK,TK TKL,TL TLS,TM TKM,TN TUN,TO TON,TR TUR,TT TTO,TV TUV,TW TWN,TZ TZA,UA UKR,UG UGA,UM UMI,US USA,UY URY,UZ UZB,VA VAT,VC VCT,VE VEN,VG VGB,VI VIR,VN VNM,VU VUT,WF WLF,WS WSM,YE YEM,YT MYT,ZA ZAF,ZM ZMB,ZW ZWE",h5=(()=>{let t=new Map;for(let e of SP.split(",")){let[r,o]=e.split(" ");r&&o&&t.set(r,o)}return t})(),Tz=new Set(h5.keys()),bP=new Set(h5.values()),wP=["en","fr","es","de","it","pt","ru","ja","zh","ko","ar","hi","tr","pl","he","nl","sv","fi","no","da","cs","el","uk","ro","id","vi","th"],NP={usa:"USA","u.s.":"USA","u.s.a.":"USA",us:"USA",america:"USA","united states of america":"USA","the united states":"USA",uk:"GBR","u.k.":"GBR","great britain":"GBR",britain:"GBR",england:"GBR","south korea":"KOR","north korea":"PRK",korea:"KOR","ivory coast":"CIV","cote d ivoire":"CIV",vietnam:"VNM",laos:"LAO",syria:"SYR",iran:"IRN",russia:"RUS",moldova:"MDA",tanzania:"TZA",bolivia:"BOL",venezuela:"VEN",brunei:"BRN","czech republic":"CZE",czechia:"CZE",slovakia:"SVK",uae:"ARE","united arab emirates":"ARE",drc:"COD","dr congo":"COD","democratic republic of the congo":"COD","republic of the congo":"COG",congo:"COG",swaziland:"SWZ",eswatini:"SWZ","cape verde":"CPV","cabo verde":"CPV",burma:"MMR",myanmar:"MMR",holland:"NLD","the netherlands":"NLD",netherlands:"NLD",vatican:"VAT","vatican city":"VAT",palestine:"PSE",macau:"MAC",macao:"MAC","hong kong":"HKG",taiwan:"TWN",turkey:"TUR",turkiye:"TUR",macedonia:"MKD","north macedonia":"MKD",gambia:"GMB","the gambia":"GMB",bahamas:"BHS","the bahamas":"BHS","east timor":"TLS","timor leste":"TLS"},Rc=[["AL","Alabama"],["AK","Alaska"],["AZ","Arizona"],["AR","Arkansas"],["CA","California"],["CO","Colorado"],["CT","Connecticut"],["DE","Delaware"],["FL","Florida"],["GA","Georgia"],["HI","Hawaii"],["ID","Idaho"],["IL","Illinois"],["IN","Indiana"],["IA","Iowa"],["KS","Kansas"],["KY","Kentucky"],["LA","Louisiana"],["ME","Maine"],["MD","Maryland"],["MA","Massachusetts"],["MI","Michigan"],["MN","Minnesota"],["MS","Mississippi"],["MO","Missouri"],["MT","Montana"],["NE","Nebraska"],["NV","Nevada"],["NH","New Hampshire"],["NJ","New Jersey"],["NM","New Mexico"],["NY","New York"],["NC","North Carolina"],["ND","North Dakota"],["OH","Ohio"],["OK","Oklahoma"],["OR","Oregon"],["PA","Pennsylvania"],["RI","Rhode Island"],["SC","South Carolina"],["SD","South Dakota"],["TN","Tennessee"],["TX","Texas"],["UT","Utah"],["VT","Vermont"],["VA","Virginia"],["WA","Washington"],["WV","West Virginia"],["WI","Wisconsin"],["WY","Wyoming"],["DC","District of Columbia"],["PR","Puerto Rico"],["GU","Guam"],["VI","U.S. Virgin Islands"],["AS","American Samoa"],["MP","Northern Mariana Islands"]],kP=new Set(Rc.map(t=>t[0])),TP={"Ala.":"AL","Alab.":"AL","Ariz.":"AZ","Ark.":"AR","Calif.":"CA","Cal.":"CA","Colo.":"CO","Col.":"CO","Conn.":"CT","Del.":"DE","Fla.":"FL","Flor.":"FL","Ga.":"GA","Ill.":"IL","Ind.":"IN","Kan.":"KS","Kans.":"KS","Ky.":"KY","La.":"LA","Md.":"MD","Mass.":"MA","Mich.":"MI","Minn.":"MN","Miss.":"MS","Mo.":"MO","Mont.":"MT","Neb.":"NE","Nebr.":"NE","Nev.":"NV","N.H.":"NH","N.J.":"NJ","N.M.":"NM","N.Mex.":"NM","N. Mex.":"NM","N.Y.":"NY","N.C.":"NC","N.D.":"ND","N.Dak.":"ND","N. Dak.":"ND","Okla.":"OK","Ore.":"OR","Oreg.":"OR","Pa.":"PA","Penn.":"PA","Penna.":"PA","R.I.":"RI","S.C.":"SC","S.D.":"SD","S.Dak.":"SD","S. Dak.":"SD","Tenn.":"TN","Tex.":"TX","Vt.":"VT","Va.":"VA","Wash.":"WA","W.Va.":"WV","W. Va.":"WV","Wis.":"WI","Wisc.":"WI","Wyo.":"WY","D.C.":"DC","Wash. D.C.":"DC","Wash., D.C.":"DC","P.R.":"PR","V.I.":"VI"},zP=(()=>{let t=new Map;for(let[e,r]of Rc)t.set(M4(r),e);t.set(M4("Washington DC"),"DC"),t.set(M4("Washington D.C."),"DC"),t.set(M4("US Virgin Islands"),"VI");for(let[e,r]of Object.entries(TP)){let o=M4(e);o&&!t.has(o)&&t.set(o,r)}return t})(),xP=new Set(["01","02","04","05","06","08","09","10","11","12","13","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","44","45","46","47","48","49","50","51","53","54","55","56","60","66","69","72","78"]);function _r(t){return t.trim().toUpperCase()}function M4(t){return s4(t)}var Pr=null;function FP(){if(Pr)return Pr;let t=new Map,e=["en",...wP.filter(r=>r!=="en")];for(let r of e){let o=null;try{o=new Intl.DisplayNames([r],{type:"region"})}catch{continue}for(let[n,i]of h5){let a;try{a=o.of(n)}catch{a=void 0}if(!a||a===n)continue;let s=M4(a);s&&!t.has(s)&&t.set(s,i)}}for(let[r,o]of Object.entries(NP)){let n=M4(r);n&&t.set(n,o)}return Pr=t,t}function IP(t,e){if(t==null)return null;let r=String(t).trim();if(r.length===0)return null;switch(e){case"country-iso3":{let o=_r(r);return bP.has(o)?o:null}case"country-iso2":return h5.get(_r(r))??null;case"country-name":return FP().get(M4(r))??null;case"us-state-code":case"us-state-name":{let o=_r(r);return kP.has(o)?o:zP.get(M4(r))??null}case"us-zip5":{let o=/^(\d{5})(-\d{4})?$/.exec(r);return o?o[1]:/^\d{3,4}$/.test(r)?r.padStart(5,"0"):null}case"us-county-fips":return/^\d{5}$/.test(r)&&xP.has(r.slice(0,2))?r:null;default:return null}}function LP(t){switch(t){case"country-iso3":case"country-iso2":case"country-name":case"us-state-code":case"us-state-name":case"us-zip5":case"us-county-fips":return!0;default:return!1}}function RP(t,e){let r=new Array(t.length),o=new Set,n=[],i=0;for(let a=0;a<t.length;++a){let s=IP(t[a],e);if(r[a]=s,s!==null)i++;else{let l=t[a];if(l!=null){let c=String(l).trim();if(c.length>0){let p=c.toLowerCase();o.has(p)||(o.add(p),n.push(c))}}}}return{iso:r,unmatched:n,matchedRows:i,totalRows:t.length}}/*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */var Ar=85,Sr=2,$P=100,$c=400,Oc=new Set(["us","usa","u s","u s a","united states","united states of america","america","ca","can","canada","mx","mex","mexico","estados unidos mexicanos"]);function S7(t){let e=new Set;for(let r of t){if(r==null)continue;let o=s4(String(r));if(o&&!e.has(o)&&(e.add(o),e.size>=$c))break}return Array.from(e)}function br(t){let e=S7(t);return e.length===0||!e.every(r=>Oc.has(r))?!1:e.some(r=>!y9(r))}function Fc(t){return Oc.has(t)&&!!y9(t)}function wr(t){let e=S7(t);if(e.length===0)return 0;let r=0;for(let o of e)y9(o)&&r++;return Math.round(r/e.length*1e3)/10}function Ec(t){let e=new Set;for(let r of t){if(r==null)continue;let o=String(r).trim();if(o&&!e.has(o)&&(e.add(o),e.size>=$c))break}return Array.from(e)}function OP(t){let e=Ec(t);if(e.length===0)return 0;let r=0;for(let o of e)Rr(o).length>0&&r++;return Math.round(r/e.length*1e3)/10}function EP(t){let e=S7(t);if(e.length===0)return 0;let r=0;for(let o of e)Lc(o)&&r++;return Math.round(r/e.length*1e3)/10}function Nr(t,e){let r=0;for(let o of S7(t))e(o)&&r++;return r}function DP(t,e){let r=0;for(let o of Ec(t))e(o)&&r++;return r}function XP(t,e,r){let o=[],n=[],i={},a=new Set(t),s=u=>e.map(m=>m[u]);for(let u of["city","zip","lat","lon","country"]){let m=r?.[u];m&&a.has(m)&&(i[u]=m)}let l=r?.state;if(l&&a.has(l)){let u=s(l),m=S7(u);m.length>0&&m.every(Fc)?n.push(`state=${l} (every value is "CA", which is both Canada and California)`):br(u)?(n.push(`state=${l} (every value is a country, not a state)`),i.country||(i.country=l)):wr(u)<Ar?n.push(`state=${l} (only ${wr(u)}% of values are states/provinces)`):i.state=l}let c=new Set(Object.values(i).filter(Boolean)),p=t.filter(u=>!c.has(u)&&!u.startsWith("__"));if(!i.state){let u=null;for(let m of p){let y=s(m);if(br(y))continue;let d=wr(y);if(d<Ar)continue;let h=Nr(y,C=>!!y9(C)),f=Nr(y,C=>!!y9(C)&&!Fc(C));h<Sr&&f<1||(!u||d>u.pct)&&(u={name:m,pct:d})}u&&(i.state=u.name,c.add(u.name),o.push(`state=${u.name} (${u.pct}% states/provinces)`))}if(!i.zip)for(let u of p){if(c.has(u))continue;let m=s(u),y=OP(m);if(!(y<$P)&&!(DP(m,d=>Rr(d).length>0)<Sr)){i.zip=u,c.add(u),o.push(`zip=${u} (${y}% ZIP codes)`);break}}if(!i.country){for(let u of p)if(!c.has(u)&&br(s(u))){i.country=u,c.add(u),o.push(`country=${u}`);break}}if(!i.city){let u=null;for(let m of p){if(c.has(m))continue;let y=s(m),d=EP(y);d<Ar||Nr(y,h=>Lc(h))<Sr||(!u||d>u.pct)&&(u={name:m,pct:d})}u&&(i.city=u.name,o.push(`city=${u.name} (${u.pct}% known cities)`))}return{bind:i.city||i.state||i.zip||i.lat&&i.lon?i:null,backfilled:o,refused:n}}function $r(t,e,r,o){let n=t.map(M=>M.name),i=null,a=null,s,l=o??null,c=[],p=[];if(l){let M=t.filter(S=>!S.isMeasure).map(S=>S.name),_=XP(M,e,l);l=_.bind,c=_.backfilled,p=_.refused}if(!!l&&!!(l.city||l.state||l.zip||l.lat&&l.lon)){let M=l,_=AP(e.map(S=>({lat:M.lat?S[M.lat]:null,lon:M.lon?S[M.lon]:null,city:M.city?S[M.city]:null,state:M.state?S[M.state]:null,zip:M.zip?S[M.zip]:null,country:M.country?S[M.country]:null})));i=_.lat,a=_.lon,s={precision:_.precision,unplaced:_.totalRows-_.matchedRows,unplacedExamples:_.unmatched.slice(0,8),ambiguousRows:_.ambiguousRows,...c.length?{rolesBackfilled:c}:{},...p.length?{rolesRefused:p}:{}}}let m=null,y,d;if(r&&r.column&&r.kind&&LP(r.kind)){let M=RP(e.map(_=>_[r.column]),r.kind);m=M.iso,y={count:M.totalRows-M.matchedRows,examples:M.unmatched.slice(0,8)},d=M.unmatched.length}let h=1+(m?1:0)+(i?2:0),f=new Array(e.length);for(let M=0;M<e.length;M++){let _=e[M],S=new Array(t.length+h);for(let F=0;F<t.length;F++){let $=_[n[F]];$ instanceof Date?S[F]=$.toISOString():S[F]=$??null}let b=t.length;S[b++]=M,m&&(S[b++]=m[M]),i&&a&&(S[b++]=i[M],S[b++]=a[M]),f[M]=S}let C=[...t,{name:"__rowIdx__",dataType:"Integer",isMeasure:!1,modelDesc:""}];return m&&C.push({name:"__geoIso__",dataType:"String",isMeasure:!1,modelDesc:""}),i&&C.push({name:"__geoLat__",dataType:"Double",isMeasure:!1,modelDesc:""},{name:"__geoLon__",dataType:"Double",isMeasure:!1,modelDesc:""}),{columns:C,rows:f,geoUnmatched:y,geoUnmatchedDistinct:d,geoPoint:s}}var BP={sankey:"d3-sankey",sankeyLinkHorizontal:"d3-sankey",sankeyJustify:"d3-sankey",sankeyCenter:"d3-sankey",sankeyLeft:"d3-sankey",sankeyRight:"d3-sankey",hexbin:"d3-hexbin",voronoiTreemap:"d3-voronoi-treemap",voronoiMap:"d3-voronoi-map",weightedVoronoi:"d3-weighted-voronoi"};function Or(t){let e=new Set;for(let r of String(t||"").matchAll(/\bd3\s*\.\s*(\w+)\s*\(/g)){let o=BP[r[1]];o&&e.add(o)}return[...e].sort()}/*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */function Dc(t){let e=t.width??800,r=t.height??600;return`<!DOCTYPE html>
58
58
  <html>
59
59
  <head>
@@ -118,7 +118,7 @@ try {
118
118
  attention to the ROW INDEX HAZARD and the HOST PAGE PREREQUISITES.`;function Bc(t){let e=t.language.toUpperCase(),r=t.data.columns.map(F=>` - ${F.name} (${F.dataType}${F.isMeasure?", measure":""})`).join(`
119
119
  `);if(e!=="D3")return["INTEGRATION CONTRACT",` Language: ${t.language} (not D3 \u2014 no drop-in render() function).`," This code targets the visual's Plotly/Python runtime; embedding it outside"," Power BI needs that runtime. For a mergeable web function, request renderer 'D3'."].join(`
120
120
  `);let o=t.code||"",n=F=>F.test(o),i=!!t.geoKind||n(/options\.geo\b|__geoIso__/),a=n(/__geoIso__/),s=o.includes(_7)||n(/animPlaySpeedMs|animMaxIdealFrames|animTimelineStyle|animAutoPlay/),l=o.includes(z8),c=o.includes(j4),p=n(/\boptions\.onSelect\b|\bonSelect\b/),u=n(/colorScaleLow|colorScaleHigh/),m=n(/options\.aggregation\b/),y=n(/themeFg|themeAccent/),d=n(/__geoLat__|__geoLon__/),h=[{re:/d3\.sankey|sankeyLinkHorizontal|sankeyJustify|sankeyCenter/,spec:"d3-sankey@0.12.3",named:"sankey, sankeyLinkHorizontal, sankeyLeft, sankeyRight, sankeyCenter, sankeyJustify"},{re:/d3\.hexbin|hexbin\(/,spec:"d3-hexbin@0.2.2",named:"hexbin"},{re:/weightedVoronoi/,spec:"d3-weighted-voronoi@1.1.3",named:"weightedVoronoi"},{re:/voronoiMap\b/,spec:"d3-voronoi-map@2.1.1",named:"voronoiMap",deps:["d3-weighted-voronoi@1.1.3"]},{re:/voronoiTreemap/,spec:"d3-voronoi-treemap@1.1.2",named:"voronoiTreemap",deps:["d3-weighted-voronoi@1.1.3","d3-voronoi-map@2.1.1"]}],f=h.filter(F=>n(F.re)),C=Array.from(new Set(f.flatMap(F=>[...F.deps??[],F.spec]))),M=C.map(F=>{let $=F.split("@")[0],o3=h.find(c3=>c3.spec===F)?.named??$.replace(/^d3-/,"").replace(/-([a-z])/g,(c3,Z)=>Z.toUpperCase());return{pkg:$,named:o3}}),_=n(/maxMapPoints/),S=n(/geoLandColor|geoNoDataColor/),b=[`INTEGRATION CONTRACT (D3 \u2014 a portable function, merge it anywhere) [host contract v${T8}]`,""," BEFORE YOU HAND-ROLL: @bicharts/chart-host is the reference host implementation."," It does everything in this document \u2014 compiles the code, applies the option"," defaults, resolves mark clicks (including through tooltip overlays), owns the"," selection affordance, translates row indices between cross-filtered charts, and"," handles teardown. React bindings: <BicChart> / <BicChartGroup>.",jP," Everything below is the FULL HAND-ROLL SPEC \u2014 what to build if you are not using"," it, and what it is doing for you if you are.",""," Entry point: function render(container, data, options)"," \u2022 container \u2014 a DOM element to draw into (the function owns its contents)."," It MUST have a resolved width/height BEFORE you call render: the chart draws"," once at whatever size it is handed and does not re-measure. A container inside"," a display:none tab, or measured before layout, yields a 0px chart forever."," \u2022 Requires D3 v7. The code reads a bare `d3` identifier, so it needs d3 either as"," a global (`window.d3 = d3`) OR injected as a parameter by whatever compiles it"," \u2014 @bicharts/chart-host's compileRenderFn injects it, so in a bundled app there is"," NO global and you pass your imported d3 in.",' npm install d3@7 // then: import * as d3 from "d3";',...f.length?[` \u2022 D3 PLUGINS \u2014 this chart calls ${M.map(F=>F.pkg).join(", ")}.`," These are SEPARATE packages that attach onto the d3 object; the generated"," code just calls d3.<plugin>(). Install them, then augment the same d3 you"," hand to the chart:",` npm install ${C.join(" ")}`,...f.some(F=>F.deps?.length)?[" (install order above is also the ATTACH order \u2014 the dependency packages"," must augment d3 before the one that builds on them)"]:[],' import * as d3 from "d3";',...M.map(F=>` import { ${F.named} } from "${F.pkg}";`),` Object.assign(d3, { ${M.map(F=>F.named).join(", ")} });`]:[]," \u2022 It is a plain function \u2014 drop it into any app; call render() yourself.",""," data = { columns, rows } (build it in THIS exact shape from YOUR data):"," \u2022 columns: array of { name, dataType, isMeasure } in fixed order:",r," (trailing __rowIdx__ = HOST METADATA, the row's index"+(a?"; __geoIso__ = the ISO/USPS join key this tool computed, null = unmatched).":d?"; __geoLat__/__geoLon__ = coordinates this tool resolved, null = unplaceable).":").")," \u2022 rows: array of POSITIONAL arrays aligned to columns:",a?" [ v0, v1, \u2026, vN, rowIndex, isoCode ] // last two = __rowIdx__, __geoIso__":d?" [ v0, v1, \u2026, vN, rowIndex, lat, lon ] // last three = __rowIdx__, __geoLat__, __geoLon__":" [ v0, v1, \u2026, vN, rowIndex ] // last cell = that row's __rowIdx__"," DateTime cells are ISO-8601 strings. Missing values are null.",""," options = {"," width, height, // px"," palette: string[], // hex colors; [] = the code's own defaults"," backgroundColor, cultureCode, // '' acceptable"];return y&&b.push(" themeFg, themeAccent, // foreground / accent hex (label + play-position color)"),b.push(" allowTooltips: boolean,"),u&&b.push(" colorScaleLow, colorScaleHigh, // force the sequential scale endpoints (live restyle)"),m&&b.push(" aggregation, // '' | sum|average|median|min|max|count|distinct (live restyle)"),a&&b.push(" geo: FeatureCollection, // REQUIRED \u2014 the geometry (feature.id = join code);"," // supplied by this tool (data.geo.json / preview)"," geoUnmatched: { count, examples }, // drives the 'N regions unmatched' annotation"),d&&b.push(" geo: FeatureCollection, // REQUIRED \u2014 the BASEMAP (context land, no join);"," // supplied by this tool (data.geo.json / preview)"," geoPoint: { // what the geocoding actually achieved \u2014 pass it"," precision, // 'latlon'|'zip'|'city'|'state': COARSEST tier used"," unplaced, unplacedExamples, // rows with no resolvable coordinate"," ambiguousRows }, // placed by a largest-match tie-break"," // The chart annotates these; omitting it makes a"," // sparse/approximate map LOOK exact."),S&&b.push(" geoLandColor, geoNoDataColor, // basemap fills ('' = the code's own defaults)"),_&&b.push(" maxMapPoints, // cap on plotted points (default 1000). Over it, the"," // chart keeps the LARGEST N and says so on-chart."),s&&b.push(` animMaxIdealFrames, // ${Fr}..${Ir} (default ${A7}): target keyframe count \u2014 the`," // code re-grains dates to the finest grain <= this,"," // LIVE (see 'Animation' below)",` animPlaySpeedMs, // ${zr}..${xr} (default ${P7}): ms per period`," animTimelineStyle, // '' auto | 'line' | 'boxes'"," animAutoPlay, animStopAtEnd, filtersDuringPlay, // booleans"),b.push(" uiState, setUiState, // optional persisted view-state; {} + no-op is fine"," }",""),(c||l||p)&&(b.push(" Interactivity / cross-filter (what the bridge must do \u2014 chart-host does it):"),c&&b.push(" \u2022 Every selectable mark carries a data-row-idx attribute = the comma-joined"," __rowIdx__ values it represents. On a mark click, read data-row-idx, map the"," indices back to your rows, and update your filter/state, then re-render other"," panels with the filtered rows."," \u2022 ROW INDEX HAZARD \u2014 the one thing hand-rolled integrations get wrong."," __rowIdx__ is a position WITHIN THE PAYLOAD THAT CHART RECEIVED, not an id in"," your source table. The moment you re-render a chart with filtered rows, its"," payload renumbers from zero \u2014 so the SAME integer now denotes a DIFFERENT"," record, and comparing indices across two charts silently selects the wrong"," rows. It does not throw; it just quietly filters to the wrong thing."," Keep ONE source table plus a payload-row -> source-row map per chart, and"," translate on every hop. (<BicChartGroup> exists precisely to own this.)"," \u2022 Marks are MANY-TO-MANY with rows: a legend swatch, an aggregated bar or an"," axis-group label carries every row it covers, so treat a mark as selected"," when ANY of its rows is selected \u2014 that is what makes a legend click light up"," its swatch and its bars together."," \u2022 Clicks can be SWALLOWED by the chart's own tooltip/crosshair overlay: an"," overlay painted over the marks with a transparent (not `none`) fill still"," hit-tests, so event.target is the overlay and a naive closest('[data-row-idx]')"," finds nothing and reads as 'empty canvas'. Resolve a miss through"," document.elementsFromPoint before concluding the user clicked nothing."),l&&b.push(` \u2022 This chart also DISPATCHES a bubbling \`${z8}\` CustomEvent on the`," container when its selection changes (e.g. a scrubber period). Listen for it:",` container.addEventListener('${z8}', e => {`," if (e.detail.clear) { /* selection cleared */ }",` else { const idx = e.detail.mark.getAttribute('${j4}'); /* filter */ }`," });"," \u2022 Lifecycle slots the code sets on the container (call/read them from your host):",` container.${kr}() // call to clear the chart's own selection`,` container.${Tr} // a mark to apply as the initial filter (may be set)`,` container.${_7}() // CALL THIS before unmount / before re-rendering`),p?b.push(" \u2022 options.onSelect(rowIdxs:number[]) is also invoked when provided \u2014 wire it to"," your cross-filter if you prefer a callback over the DOM event."):b.push(" \u2022 NOTE: this code does NOT call options.onSelect \u2014 use data-row-idx"+(l?" + the event above.":".")),b.push("")),s&&b.push(" Animation (keyframe playback + LIVE re-grain):"," \u2022 The chart draws its own play/pause control + period scrubber. It reads the anim"," options above; sensible defaults apply if you omit them."," \u2022 DYNAMIC KEYFRAMES: the code chooses the time grain AT RENDER from"," options.animMaxIdealFrames \u2014 it truncates dates to the finest calendar grain"," (day/week/month/quarter/year/decade) whose bucket count <= that value and"," aggregates rows within each bucket. To change the granularity LIVE, just call"," render(container, data, {...options, animMaxIdealFrames: N}) again \u2014 NO new"," generation needed. (This is what the Power BI 'Max Ideal Frames' slider does.)",` \u2022 Call container.${_7}() before you re-render or unmount, to stop its timer.`,""),d&&b.push(" Geography (POINT MAP):"," \u2022 Coordinates are HOST-RESOLVED. This tool geocoded your place columns"," (city / state / zip, or lat+lon when present) and appended __geoLat__ and"," __geoLon__ to every row \u2014 the chart plots those columns directly and does NOT"," geocode anything itself. Build them the same way if you re-derive the data, or"," the map draws nothing: the code bails when it can't find the two columns."," \u2022 options.geo is the BASEMAP (grey context land), NOT a join target \u2014 there is no"," __geoIso__ and no feature.id lookup. Without it you get points on a blank field."," \u2022 Pass options.geoPoint through. It is how the chart tells the truth about"," precision (city-centroid vs exact) and about rows it could not place.",""),a&&b.push(" Geography:"," \u2022 This is a choropleth: it REQUIRES options.geo (a GeoJSON FeatureCollection whose"," feature.id is the join code) and the __geoIso__ column in data (both provided by"," this tool \u2014 see data.geo.json when out_dir is set). Without options.geo it renders"," an empty map. Do NOT fetch or invent geometry; pass what the tool supplied.",""),b.push(" HOST PAGE PREREQUISITES (@bicharts/chart-host does all of these for you):"," \u2022 SIZE THE CONTAINER FIRST. Measure synchronously (getBoundingClientRect in a"," layout effect) and pass width/height explicitly \u2014 they have NO defaults, and a"," chart handed undefined/0 draws once at nothing and never recovers. Use a"," ResizeObserver for LATER resizes only: gating the FIRST paint on it costs"," seconds in a headless/background tab, where frames are barely produced."," \u2022 PIN TYPOGRAPHY AT THE BOUNDARY. Charts set font-size but almost never"," line-height or letter-spacing, so they inherit YOURS. A page with"," `:root { font: 18px/145% }` \u2014 the stock Vite template does exactly this \u2014 hands"," an 11px chart label a 26px line box and slices it through the middle, on a chart"," that renders perfectly elsewhere. Set `line-height: normal; letter-spacing:"," normal` on the chart container (a chart that sets its own still wins)."," \u2022 SELECTION STYLING IS YOURS. Generated code emits marks and data-row-idx; it"," never styles 'selected', because only the host knows what is selected. Add"," `lch-has-selection` to the container and `lch-mark-selected` to selected marks,"," and dim the rest via the `--lch-dim-opacity` custom property (default 0.25)."," Re-apply after EVERY render or a restyle silently drops the highlight."," \u2022 TEAR DOWN ON UNMOUNT. Call container.__llmAnimStop__() if present before you"," re-render or unmount. Under React StrictMode effects double-mount, so without"," this every animated chart leaks a running timer per mount, on every hot reload.",""," To re-render with filtered/updated data or changed options: call"," render(container, newData, newOptions) again (it repaints the container)."),b.join(`
121
- `)}function Hc(t,e){return e?Or(t):[]}var Er={chartName:z.string().describe("The chart type the backend produced."),language:z.string().describe("Renderer/language of the code (D3, PYTHON, \u2026)."),version:z.number().describe("Server-side version number of this generation."),creditCost:z.number().nullable().describe("Credits billed, when the server reported them."),correlationId:z.string().describe("Ties this generation to the server-side log \u2014 quote it in any support request."),codeSummary:z.string().optional().describe("The backend's own one-line description of what it built."),code:z.string().optional().describe("The render() source. Omitted when include_code is false."),requiredD3Plugins:z.array(z.string()).describe('D3 plugin PACKAGES this code calls (e.g. ["d3-sankey"]) \u2014 install and Object.assign onto the same d3 you pass the host, or the chart throws mid-render. Empty for core-only d3 and for non-D3 languages.'),geo:z.object({column:z.string().nullable().describe("Column joined to the geometry; null for a basemap-only point map."),kind:z.string().describe("Geometry asset kind \u2014 pass the matching geometry as options.geo."),hasGeometry:z.boolean().describe("False means no bundled geometry matched this kind: the map will draw no land."),unmatched:z.number().describe("Regions in the data with no geometry match."),unmatchedExamples:z.array(z.string())}).nullable().describe("Region/basemap wiring; null for non-geo charts."),geoPoint:z.object({placed:z.number(),total:z.number(),precision:z.string().nullable(),unplaced:z.number(),unplacedExamples:z.array(z.string()),ambiguousRows:z.number().describe("Rows placed by a largest-match tie-break rather than an exact one.")}).nullable().describe("Point-geocoding outcome; null when the chart geocodes no points."),data:z.any().optional().describe("The render payload {columns, rows, \u2026} to hand render() \u2014 INCLUDING any __geoIso__/__geoLat__/__geoLon__ columns the caller cannot reconstruct. Present only when out_dir was NOT given; otherwise read files.data."),files:z.object({code:z.string().optional(),data:z.string().optional(),geo:z.string().optional(),preview:z.string().optional()}).optional().describe("Absolute paths written, when out_dir was given."),hostContract:z.string().describe("Host contract version the code targets; a host on a different MAJOR may not interoperate."),build:z.string().describe("MCP server build stamp \u2014 the bundle actually serving this call.")},dx=z.object(Er);function Zc(t){let e=t.renderData.geoPoint,r=t.renderData.geoUnmatched;return{chartName:t.res.finalChartName||"",language:t.res.language,version:t.res.version,creditCost:t.res.creditCost??null,correlationId:t.res.correlationId,...t.res.codeSummary?{codeSummary:t.res.codeSummary}:{},...t.withCode?{code:t.code}:{},requiredD3Plugins:t.plugins,geo:t.res.geoKind?{column:t.res.geoColumn||null,kind:t.res.geoKind,hasGeometry:t.hasGeometry,unmatched:r?.count??0,unmatchedExamples:r?.examples??[]}:null,geoPoint:e?{placed:t.renderData.rows.length-(e.unplaced??0),total:t.renderData.rows.length,precision:e.precision??null,unplaced:e.unplaced??0,unplacedExamples:e.unplacedExamples??[],ambiguousRows:e.ambiguousRows??0}:null,...t.files?{files:t.files}:{data:t.renderData},hostContract:t.hostContract,build:t.build}}jc();Vc();Gc();/*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */function qc(t){if(!t)return;let e=t.toLowerCase();if(/^country/.test(e))return Dr;if(e==="us-state-code"||e==="us-state-name")return Wc;if(e==="us-zip5")return Uc;if(e==="north-america")return WP()}var Xr;function WP(){return Xr||(Xr={type:"FeatureCollection",features:Dr.features.filter(t=>Nc.has(t?.id)&&t?.geometry&&t.geometry.type!=="Point").map(t=>Tc(t,kc)).filter(t=>t!==null)}),Xr}import{readdirSync as VP,existsSync as UP,statSync as Kc}from"node:fs";import{join as Br}from"node:path";var GP=["package.json","tsconfig.json","jsconfig.json","deno.json","deno.jsonc","angular.json","svelte.config.js","vite.config.ts","vite.config.js","pnpm-lock.yaml","yarn.lock","package-lock.json"],qP=["pyproject.toml","requirements.txt","setup.py","setup.cfg","Pipfile","poetry.lock","environment.yml","environment.yaml","conda.yaml","tox.ini"],KP=new Set([".js",".jsx",".mjs",".cjs",".ts",".tsx"]),YP=new Set([".py",".pyi"]);function Yc(t,e){return e.some(r=>UP(Br(t,r)))}function JP(t){let e=0,r=0,o=i=>{let a;try{a=VP(i)}catch{return}for(let s of a){if(s==="node_modules"||s===".git"||s.startsWith("."))continue;let l=Br(i,s),c=!1;try{c=Kc(l).isFile()}catch{continue}if(!c)continue;let p=s.lastIndexOf(".");if(p<0)continue;let u=s.slice(p).toLowerCase();KP.has(u)?e++:YP.has(u)&&r++}};o(t);let n=Br(t,"src");try{Kc(n).isDirectory()&&o(n)}catch{}return{js:e,py:r}}function Hr(t=process.cwd()){let e=Yc(t,GP),r=Yc(t,qP);if(e&&!r)return{language:"javascript",reason:`found a JS/TS project marker in ${t}`};if(r&&!e)return{language:"python",reason:`found a Python project marker in ${t}`};let{js:o,py:n}=JP(t);return o>0&&n===0?{language:"javascript",reason:`found ${o} JS/TS source file(s) and no Python in ${t}`}:n>0&&o===0?{language:"python",reason:`found ${n} Python source file(s) and no JS/TS in ${t}`}:o>0&&n>0?o>=n*3?{language:"javascript",reason:`JS/TS files dominate (${o} vs ${n} Python) in ${t}`}:n>=o*3?{language:"python",reason:`Python files dominate (${n} vs ${o} JS/TS) in ${t}`}:{language:null,reason:`mixed JS/TS (${o}) and Python (${n}) in ${t}`}:e&&r?{language:null,reason:`both JS and Python project markers present in ${t}`}:{language:null,reason:`no JS or Python markers or source files found in ${t}`}}var M5=new u5({name:"bic-chart",version:"0.1.0"}),jr="2026-07-31T16:12:29Z src:349de573aef8 (8 files)",tA=z.object({columns:z.array(z.object({name:z.string(),dataType:z.enum(["String","Integer","Decimal","DateTime"]).optional().describe("Known type (DAX/semantic-model callers have it); omit to infer from values."),isMeasure:z.boolean().optional().describe("Known measure/dimension role; omit to apply the numeric-non-identifier heuristic. A semantic-model caller should set this."),format:z.string().optional().describe('Format string from the model (e.g. "$#,##0") \u2192 modelFormat.'),description:z.string().optional().describe("Column description from the model \u2192 modelDesc.")})).min(1),rows:z.array(z.union([z.array(z.any()),z.record(z.string(),z.any())])).min(1).describe("Rows as positional arrays aligned to columns, OR objects keyed by column name.")}).describe("A pre-typed {columns, rows} table (DAX query results, dataframe, arrow). Use INSTEAD of csv_path/csv_text."),Wr={csv_path:z.string().optional().describe("Path to a CSV file (header row required)."),csv_text:z.string().optional().describe("Inline CSV text (alternative to csv_path)."),data:tA.optional().describe("A pre-typed {columns, rows} table \u2014 the shape a Fabric DAX query / dataframe already has. Alternative to csv_path/csv_text; when columns carry isMeasure/format/description the shape matches PBI fidelity with no guessing."),measures:z.array(z.string()).optional().describe("Columns to treat as MEASURES (the PBI 'Values' well \u2014 fields the chart aggregates). Numeric non-identifier columns are measures by default."),dimensions:z.array(z.string()).optional().describe("Columns to treat as DIMENSIONS (a PBI category/axis well \u2014 fields to group/break by). Use for numeric codes/years that should NOT be aggregated."),formats:z.record(z.string(),z.string()).optional().describe(`Per-column number/date FORMAT STRING (e.g. {"Revenue":"$#,##0","Margin":"0.0%"}). PBI supplies these from its model; a CSV can't, so provide them to steer number formatting.`),descriptions:z.record(z.string(),z.string()).optional().describe("Per-column human DESCRIPTION \u2014 gives the model semantic context the bare column name lacks."),group_by:z.array(z.string()).optional().describe("Columns that are the PRIMARY series/breakdown (the PBI 'Group by' well); the backend leads the visualization with these."),non_additive:z.array(z.string()).optional().describe("MEASURE columns that must NOT be summed (a ratio/average/rate \u2014 use mean, never stack). Usually auto-detected; this is an authoritative override."),privacy_level:z.enum(["0","10","20","30"]).optional().describe("How much detail to compute/share: 0 names only, 10 +counts, 20 +detailed stats (default), 30 +obfuscated sample rows.")};function Zr(t){return{measures:t.measures,dimensions:t.dimensions,formats:t.formats,descriptions:t.descriptions,groupBy:t.group_by,nonAdditive:t.non_additive,privacyLevel:t.privacy_level??"20"}}function Vr(t){if(t.data)return gc(t.data.columns,t.data.rows,Zr(t));if(t.csv_text)return hr(t.csv_text,Zr(t));if(t.csv_path)return hr(QP(Jc(t.csv_path),"utf-8"),Zr(t));throw new Error("Provide one of: data ({columns, rows}), csv_text, or csv_path.")}M5.registerTool("assess_data_shape",{title:"Assess data shape",description:"Profile a dataset locally (no data leaves the machine): per-column types, cardinality, ranges, measure/dimension roles, temporal/ordinal detection, and cross-column signals (nesting, shared values, association). This is the same measurement engine the BIC Power BI visual uses before generating a chart.",inputSchema:Wr},async t=>{let e=Vr(t),r={totalRows:e.totalRows,leafCardinality:e.index.getLeafCardinality(),columns:e.shape};return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}});M5.registerTool("list_eligible_charts",{title:"List eligible chart types",description:"The AUTHORITATIVE list of chart types that can render this dataset \u2014 the server's own eligibility engine (ChartFilter.GetCharts), NOT a local guess. Profiles the data locally, then calls the backend's zero-credit /qualify endpoint. NO LLM, NO credit. By default the tool DETECTS the project's language (JS/TS vs Python from the working dir) and returns the charts for THAT language, SCOPED + RANKED by the picker's chart-type\xD7renderer weights (best first), each tagged with its source language and renderer. Pass `language` ('javascript'|'python') to force it, or `renderer` ('D3'/'PLOTLY'/\u2026) to rank one specific renderer, or renderer '' for the full renderer-agnostic eligibility across ALL renderers (unranked). If the language can't be auto-detected and none is given, the tool asks you to specify one. Credentials optional (a license only unlocks draft chart types).",inputSchema:{...Wr,language:z.enum(["javascript","typescript","python",""]).optional().describe("Project source language \u2192 the server ranks across that language's renderers (javascript/typescript = D3/Vega, python = Plotly/matplotlib). Omit to AUTO-DETECT from the working dir; `renderer` (if given) overrides this."),project_dir:z.string().optional().describe("Directory to auto-detect the project language from (default: the MCP server's working directory)."),renderer:z.enum(["D3","PLOTLY","PYMATPLOT","VEGA",""]).optional().describe("Force a specific renderer (overrides `language`): a concrete renderer ranks that renderer's charts; '' = the full renderer-agnostic eligibility (all renderers, unranked). Omit to use `language`/auto-detection."),top:z.number().optional().describe("Show only the top-N ranked results (scoped mode only). Omit for all."),width:z.number().optional().describe("Viewport width px (default 800) \u2014 affects small-viewport / facet-budget gates."),height:z.number().optional().describe("Viewport height px (default 600).")}},async t=>{let e=Vr(t),r="",o="",n="";if(t.renderer!==void 0)r=t.renderer;else if(t.language)o=t.language;else{let u=Hr(t.project_dir);if(u.language)o=u.language,n=` (auto-detected language: ${u.language} \u2014 ${u.reason})`;else return{content:[{type:"text",text:`Couldn't determine the project language: ${u.reason}. Re-run with language: "javascript" or "python" (or renderer: "D3"/"PLOTLY"/\u2026 for a specific renderer, or renderer: "" for the full renderer-agnostic list).`}]}}let i=await wc({shape:e.shape,totalRows:e.totalRows,leafCardinality:e.index.getLeafCardinality(),width:t.width,height:t.height,renderer:r,language:o});if(!i.ok)return{isError:!0,content:[{type:"text",text:`Could not list eligible charts: ${i.errorMessage}`}]};let a=i.charts.length>0&&i.charts[0].rank!==void 0,s=o?`${o}`:r,l=i.charts,c;a?(t.top&&t.top>0&&(l=l.slice(0,t.top)),c=`Top ${l.length} chart type(s) for this data in ${s}, ranked by the picker's weights (authoritative \u2014 server ChartFilter + ScoreChartTypes, no credits)${n}:`):c=`${l.length} chart type(s) can render this data \u2014 renderer-agnostic eligibility (authoritative \u2014 ChartFilter.GetCharts, no credits):`;let p=l.map(u=>{if(u.rank!==void 0){let m=u.language?` [${u.language}]`:"",y=u.score!==void 0?` (${u.score})`:"";return`${u.rank}. ${u.name}${m}${y}${u.description?` \u2014 ${u.description}`:""}`}return`\u2022 ${u.name}${u.description?` \u2014 ${u.description}`:""}`});return{content:[{type:"text",text:[c,"",...p].join(`
121
+ `)}function Hc(t,e){return e?Or(t):[]}var Er={chartName:z.string().describe("The chart type the backend produced."),language:z.string().describe("Renderer/language of the code (D3, PYTHON, \u2026)."),version:z.number().describe("Server-side version number of this generation."),creditCost:z.number().nullable().describe("Credits billed, when the server reported them."),correlationId:z.string().describe("Ties this generation to the server-side log \u2014 quote it in any support request."),codeSummary:z.string().optional().describe("The backend's own one-line description of what it built."),code:z.string().optional().describe("The render() source. Omitted when include_code is false."),requiredD3Plugins:z.array(z.string()).describe('D3 plugin PACKAGES this code calls (e.g. ["d3-sankey"]) \u2014 install and Object.assign onto the same d3 you pass the host, or the chart throws mid-render. Empty for core-only d3 and for non-D3 languages.'),geo:z.object({column:z.string().nullable().describe("Column joined to the geometry; null for a basemap-only point map."),kind:z.string().describe("Geometry asset kind \u2014 pass the matching geometry as options.geo."),hasGeometry:z.boolean().describe("False means no bundled geometry matched this kind: the map will draw no land."),unmatched:z.number().describe("Regions in the data with no geometry match."),unmatchedExamples:z.array(z.string())}).nullable().describe("Region/basemap wiring; null for non-geo charts."),geoPoint:z.object({placed:z.number(),total:z.number(),precision:z.string().nullable(),unplaced:z.number(),unplacedExamples:z.array(z.string()),ambiguousRows:z.number().describe("Rows placed by a largest-match tie-break rather than an exact one.")}).nullable().describe("Point-geocoding outcome; null when the chart geocodes no points."),data:z.any().optional().describe("The render payload {columns, rows, \u2026} to hand render() \u2014 INCLUDING any __geoIso__/__geoLat__/__geoLon__ columns the caller cannot reconstruct. Present only when out_dir was NOT given; otherwise read files.data."),files:z.object({code:z.string().optional(),data:z.string().optional(),geo:z.string().optional(),preview:z.string().optional()}).optional().describe("Absolute paths written, when out_dir was given."),hostContract:z.string().describe("Host contract version the code targets; a host on a different MAJOR may not interoperate."),build:z.string().describe("MCP server build stamp \u2014 the bundle actually serving this call.")},dx=z.object(Er);function Zc(t){let e=t.renderData.geoPoint,r=t.renderData.geoUnmatched;return{chartName:t.res.finalChartName||"",language:t.res.language,version:t.res.version,creditCost:t.res.creditCost??null,correlationId:t.res.correlationId,...t.res.codeSummary?{codeSummary:t.res.codeSummary}:{},...t.withCode?{code:t.code}:{},requiredD3Plugins:t.plugins,geo:t.res.geoKind?{column:t.res.geoColumn||null,kind:t.res.geoKind,hasGeometry:t.hasGeometry,unmatched:r?.count??0,unmatchedExamples:r?.examples??[]}:null,geoPoint:e?{placed:t.renderData.rows.length-(e.unplaced??0),total:t.renderData.rows.length,precision:e.precision??null,unplaced:e.unplaced??0,unplacedExamples:e.unplacedExamples??[],ambiguousRows:e.ambiguousRows??0}:null,...t.files?{files:t.files}:{data:t.renderData},hostContract:t.hostContract,build:t.build}}jc();Vc();Gc();/*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */function qc(t){if(!t)return;let e=t.toLowerCase();if(/^country/.test(e))return Dr;if(e==="us-state-code"||e==="us-state-name")return Wc;if(e==="us-zip5")return Uc;if(e==="north-america")return WP()}var Xr;function WP(){return Xr||(Xr={type:"FeatureCollection",features:Dr.features.filter(t=>Nc.has(t?.id)&&t?.geometry&&t.geometry.type!=="Point").map(t=>Tc(t,kc)).filter(t=>t!==null)}),Xr}import{readdirSync as VP,existsSync as UP,statSync as Kc}from"node:fs";import{join as Br}from"node:path";var GP=["package.json","tsconfig.json","jsconfig.json","deno.json","deno.jsonc","angular.json","svelte.config.js","vite.config.ts","vite.config.js","pnpm-lock.yaml","yarn.lock","package-lock.json"],qP=["pyproject.toml","requirements.txt","setup.py","setup.cfg","Pipfile","poetry.lock","environment.yml","environment.yaml","conda.yaml","tox.ini"],KP=new Set([".js",".jsx",".mjs",".cjs",".ts",".tsx"]),YP=new Set([".py",".pyi"]);function Yc(t,e){return e.some(r=>UP(Br(t,r)))}function JP(t){let e=0,r=0,o=i=>{let a;try{a=VP(i)}catch{return}for(let s of a){if(s==="node_modules"||s===".git"||s.startsWith("."))continue;let l=Br(i,s),c=!1;try{c=Kc(l).isFile()}catch{continue}if(!c)continue;let p=s.lastIndexOf(".");if(p<0)continue;let u=s.slice(p).toLowerCase();KP.has(u)?e++:YP.has(u)&&r++}};o(t);let n=Br(t,"src");try{Kc(n).isDirectory()&&o(n)}catch{}return{js:e,py:r}}function Hr(t=process.cwd()){let e=Yc(t,GP),r=Yc(t,qP);if(e&&!r)return{language:"javascript",reason:`found a JS/TS project marker in ${t}`};if(r&&!e)return{language:"python",reason:`found a Python project marker in ${t}`};let{js:o,py:n}=JP(t);return o>0&&n===0?{language:"javascript",reason:`found ${o} JS/TS source file(s) and no Python in ${t}`}:n>0&&o===0?{language:"python",reason:`found ${n} Python source file(s) and no JS/TS in ${t}`}:o>0&&n>0?o>=n*3?{language:"javascript",reason:`JS/TS files dominate (${o} vs ${n} Python) in ${t}`}:n>=o*3?{language:"python",reason:`Python files dominate (${n} vs ${o} JS/TS) in ${t}`}:{language:null,reason:`mixed JS/TS (${o}) and Python (${n}) in ${t}`}:e&&r?{language:null,reason:`both JS and Python project markers present in ${t}`}:{language:null,reason:`no JS or Python markers or source files found in ${t}`}}var M5=new u5({name:"bic-chart",version:"0.1.0"}),jr="2026-07-31T23:27:37Z src:1358bdfe070d (8 files)",tA=z.object({columns:z.array(z.object({name:z.string(),dataType:z.enum(["String","Integer","Decimal","DateTime"]).optional().describe("Known type (DAX/semantic-model callers have it); omit to infer from values."),isMeasure:z.boolean().optional().describe("Known measure/dimension role; omit to apply the numeric-non-identifier heuristic. A semantic-model caller should set this."),format:z.string().optional().describe('Format string from the model (e.g. "$#,##0") \u2192 modelFormat.'),description:z.string().optional().describe("Column description from the model \u2192 modelDesc.")})).min(1),rows:z.array(z.union([z.array(z.any()),z.record(z.string(),z.any())])).min(1).describe("Rows as positional arrays aligned to columns, OR objects keyed by column name.")}).describe("A pre-typed {columns, rows} table (DAX query results, dataframe, arrow). Use INSTEAD of csv_path/csv_text."),Wr={csv_path:z.string().optional().describe("Path to a CSV file (header row required)."),csv_text:z.string().optional().describe("Inline CSV text (alternative to csv_path)."),data:tA.optional().describe("A pre-typed {columns, rows} table \u2014 the shape a Fabric DAX query / dataframe already has. Alternative to csv_path/csv_text; when columns carry isMeasure/format/description the shape matches PBI fidelity with no guessing."),measures:z.array(z.string()).optional().describe("Columns to treat as MEASURES (the PBI 'Values' well \u2014 fields the chart aggregates). Numeric non-identifier columns are measures by default."),dimensions:z.array(z.string()).optional().describe("Columns to treat as DIMENSIONS (a PBI category/axis well \u2014 fields to group/break by). Use for numeric codes/years that should NOT be aggregated."),formats:z.record(z.string(),z.string()).optional().describe(`Per-column number/date FORMAT STRING (e.g. {"Revenue":"$#,##0","Margin":"0.0%"}). PBI supplies these from its model; a CSV can't, so provide them to steer number formatting.`),descriptions:z.record(z.string(),z.string()).optional().describe("Per-column human DESCRIPTION \u2014 gives the model semantic context the bare column name lacks."),group_by:z.array(z.string()).optional().describe("Columns that are the PRIMARY series/breakdown (the PBI 'Group by' well); the backend leads the visualization with these."),non_additive:z.array(z.string()).optional().describe("MEASURE columns that must NOT be summed (a ratio/average/rate \u2014 use mean, never stack). Usually auto-detected; this is an authoritative override."),privacy_level:z.enum(["0","10","20","30"]).optional().describe("How much detail to compute/share: 0 names only, 10 +counts, 20 +detailed stats (default), 30 +obfuscated sample rows.")};function Zr(t){return{measures:t.measures,dimensions:t.dimensions,formats:t.formats,descriptions:t.descriptions,groupBy:t.group_by,nonAdditive:t.non_additive,privacyLevel:t.privacy_level??"20"}}function Vr(t){if(t.data)return gc(t.data.columns,t.data.rows,Zr(t));if(t.csv_text)return hr(t.csv_text,Zr(t));if(t.csv_path)return hr(QP(Jc(t.csv_path),"utf-8"),Zr(t));throw new Error("Provide one of: data ({columns, rows}), csv_text, or csv_path.")}M5.registerTool("assess_data_shape",{title:"Assess data shape",description:"Profile a dataset locally (no data leaves the machine): per-column types, cardinality, ranges, measure/dimension roles, temporal/ordinal detection, and cross-column signals (nesting, shared values, association). This is the same measurement engine the BIC Power BI visual uses before generating a chart.",inputSchema:Wr},async t=>{let e=Vr(t),r={totalRows:e.totalRows,leafCardinality:e.index.getLeafCardinality(),columns:e.shape};return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}});M5.registerTool("list_eligible_charts",{title:"List eligible chart types",description:"The AUTHORITATIVE list of chart types that can render this dataset \u2014 the server's own eligibility engine (ChartFilter.GetCharts), NOT a local guess. Profiles the data locally, then calls the backend's zero-credit /qualify endpoint. NO LLM, NO credit. By default the tool DETECTS the project's language (JS/TS vs Python from the working dir) and returns the charts for THAT language, SCOPED + RANKED by the picker's chart-type\xD7renderer weights (best first), each tagged with its source language and renderer. Pass `language` ('javascript'|'python') to force it, or `renderer` ('D3'/'PLOTLY'/\u2026) to rank one specific renderer, or renderer '' for the full renderer-agnostic eligibility across ALL renderers (unranked). If the language can't be auto-detected and none is given, the tool asks you to specify one. Credentials optional (a license only unlocks draft chart types).",inputSchema:{...Wr,language:z.enum(["javascript","typescript","python",""]).optional().describe("Project source language \u2192 the server ranks across that language's renderers (javascript/typescript = D3/Vega, python = Plotly/matplotlib). Omit to AUTO-DETECT from the working dir; `renderer` (if given) overrides this."),project_dir:z.string().optional().describe("Directory to auto-detect the project language from (default: the MCP server's working directory)."),renderer:z.enum(["D3","PLOTLY","PYMATPLOT","VEGA",""]).optional().describe("Force a specific renderer (overrides `language`): a concrete renderer ranks that renderer's charts; '' = the full renderer-agnostic eligibility (all renderers, unranked). Omit to use `language`/auto-detection."),top:z.number().optional().describe("Show only the top-N ranked results (scoped mode only). Omit for all."),width:z.number().optional().describe("Viewport width px (default 800) \u2014 affects small-viewport / facet-budget gates."),height:z.number().optional().describe("Viewport height px (default 600).")}},async t=>{let e=Vr(t),r="",o="",n="";if(t.renderer!==void 0)r=t.renderer;else if(t.language)o=t.language;else{let u=Hr(t.project_dir);if(u.language)o=u.language,n=` (auto-detected language: ${u.language} \u2014 ${u.reason})`;else return{content:[{type:"text",text:`Couldn't determine the project language: ${u.reason}. Re-run with language: "javascript" or "python" (or renderer: "D3"/"PLOTLY"/\u2026 for a specific renderer, or renderer: "" for the full renderer-agnostic list).`}]}}let i=await wc({shape:e.shape,totalRows:e.totalRows,leafCardinality:e.index.getLeafCardinality(),width:t.width,height:t.height,renderer:r,language:o});if(!i.ok)return{isError:!0,content:[{type:"text",text:`Could not list eligible charts: ${i.errorMessage}`}]};let a=i.charts.length>0&&i.charts[0].rank!==void 0,s=o?`${o}`:r,l=i.charts,c;a?(t.top&&t.top>0&&(l=l.slice(0,t.top)),c=`Top ${l.length} chart type(s) for this data in ${s}, ranked by the picker's weights (authoritative \u2014 server ChartFilter + ScoreChartTypes, no credits)${n}:`):c=`${l.length} chart type(s) can render this data \u2014 renderer-agnostic eligibility (authoritative \u2014 ChartFilter.GetCharts, no credits):`;let p=l.map(u=>{if(u.rank!==void 0){let m=u.language?` [${u.language}]`:"",y=u.score!==void 0?` (${u.score})`:"";return`${u.rank}. ${u.name}${m}${y}${u.description?` \u2014 ${u.description}`:""}`}return`\u2022 ${u.name}${u.description?` \u2014 ${u.description}`:""}`});return{content:[{type:"text",text:[c,"",...p].join(`
122
122
  `)}]}});M5.registerTool("generate_chart",{title:"Generate chart code",description:"Generate ready-to-render chart code for a dataset via the BIC backend: the data shape is profiled locally, the backend picks a suitable chart type (or honors chart_type), and returns code that has passed the backend's eligibility gates and quality checks. Requires a trial or paid BIC account (license env vars / credentials file). The returned D3 code is a portable render(container, data, options) function meant to be MERGED into your own app; an integration contract describes exactly how to call it. A standalone HTML preview and file output are optional.",inputSchema:{...Wr,prompt:z.string().optional().describe("Freeform guidance for the generation \u2014 the same 'user commentary' lane the Power BI visual uses. Steer encoding/axes/emphasis in plain language, e.g. 'put Year on the x-axis, color by Division', 'render citations as a chord diagram', 'log scale on revenue', 'annotate the peak'."),chart_type:z.string().optional().describe("Preferred chart type by name (honored unless the data shape disqualifies it)."),renderer:z.enum(["D3","PLOTLY","PYMATPLOT","VISUAL",""]).optional().describe("Force a specific renderer (overrides `language`). Omit to use `language`/auto-detection; 'VISUAL'/'' = let the backend choose."),language:z.enum(["javascript","typescript","python",""]).optional().describe("Project source language: with no concrete `renderer`, the backend auto-picks a renderer WITHIN this language (javascript/typescript \u2192 D3/Vega, python \u2192 Plotly/matplotlib). Omit to AUTO-DETECT from the working dir."),project_dir:z.string().optional().describe("Directory to auto-detect the project language from (default: the MCP server's working directory)."),model:z.string().optional().describe("Model code; empty = backend default."),reasoning_mode:z.enum(["","1P","2P","3P","CP"]).optional().describe("LLM pass structure; empty = backend heuristic."),width:z.number().optional(),height:z.number().optional(),wrap:z.enum(["none","esm"]).optional().describe("Code form: 'none' (default) = the raw render() function to merge; 'esm' = same code plus `export { render };` for ES-module import."),include_code:z.boolean().optional().describe("Include the full code in the response (default true) \u2014 governs BOTH the text block and structuredContent.code. Set false when you only want it written to out_dir."),preview_html:z.boolean().optional().describe("Also emit a standalone D3 preview (needs out_dir). Default false \u2014 the code is meant to be merged, not run as an index.html."),out_dir:z.string().optional().describe("Optional directory to write chart.js/py, a data.sample.json, and (if preview_html) preview.html.")},outputSchema:Er},async(t,e)=>{let r=t.privacy_level??"20",o=await Mc(Vr(t),r),n=t.renderer,i=t.language??"",a="";if(t.renderer===void 0&&!i){let $=Hr(t.project_dir);$.language&&(i=$.language,a=` (auto-detected language: ${$.language})`)}n===""||n==="VISUAL"?n="VISUAL":n||(n=i?"VISUAL":"D3");let s=e?._meta?.progressToken,l=0,c="",p=$=>{s!==void 0&&e.sendNotification({method:"notifications/progress",params:{progressToken:s,progress:++l,message:$}}).catch(()=>{})},u=s===void 0?null:setInterval(()=>{p(c?`${c}\u2026`:"generating chart (multi-pass \u2014 can take a few minutes)\u2026")},1e4),m;try{m=await bc({shape:o.shape,totalRows:o.totalRows,leafCardinality:o.index.getLeafCardinality(),sampleCsv:o.sampleCsv,prompt:t.prompt,chartHint:t.chart_type,renderer:n,language:i,model:t.model,reasoningMode:t.reasoning_mode,width:t.width,height:t.height,onProgress:$=>{c=$,p(`${$}\u2026`)}})}finally{u&&clearInterval(u)}if(!m.ok)return{isError:!0,content:[{type:"text",text:`Generation failed (correlationId ${m.correlationId}): ${m.errorMessage||"no code returned"}`}]};let y=m.language.toUpperCase()==="D3",d=m.geoColumn&&m.geoKind?{column:m.geoColumn,kind:m.geoKind}:void 0,h=m.geoKind?qc(m.geoKind):void 0,f=m.pointCityColumn||m.pointStateColumn||m.pointZipColumn||m.pointLatColumn&&m.pointLonColumn?{city:m.pointCityColumn||void 0,state:m.pointStateColumn||void 0,zip:m.pointZipColumn||void 0,lat:m.pointLatColumn||void 0,lon:m.pointLonColumn||void 0}:null,C=Xc(o.index,o.shape,d,f),M=t.wrap==="esm"&&y?`${m.code}
123
123
  export { render };
124
124
  `:m.code,_=[`Chart: ${m.finalChartName||"(backend pick)"} | language: ${m.language} | version: ${m.version}`+(m.creditCost!=null?` | credits: ${m.creditCost}`:"")+a];if(m.codeSummary&&_.push(`Summary: ${m.codeSummary}`),d){let $=C.geoUnmatched;_.push(`Geo: joined '${d.column}' as ${d.kind}`+(h?"":" (WARNING: no bundled geometry for this kind)")+($&&$.count>0?` \u2014 ${$.count} region(s) unmatched: ${$.examples.join(", ")}`:""))}else m.geoKind&&_.push(`Geo: ${m.geoKind} basemap attached as options.geo`+(h?"":" (WARNING: no bundled geometry for this kind \u2014 the map will draw no land)"));if(f){let $=[f.city&&"city",f.state&&"state",f.zip&&"zip",f.lat&&f.lon&&"lat/lon"].filter(Boolean).join("+"),o3=C.geoPoint,c3=C.rows.length-(o3?.unplaced??0);_.push(`Points: geocoded ${c3}/${C.rows.length} from ${$}`+(o3?.precision?` at ${o3.precision} precision`:"")+(o3&&o3.unplaced>0?` \u2014 ${o3.unplaced} unplaced: ${o3.unplacedExamples.join(", ")}`:"")+(o3&&o3.ambiguousRows>0?` \u2014 ${o3.ambiguousRows} placed by largest-match tie-break`:""))}_.push("",Bc({language:m.language,data:C,finalChartName:m.finalChartName,code:m.code,geoKind:m.geoKind}));let S={};if(t.out_dir){let $=Jc(t.out_dir);eA($,{recursive:!0});let o3=m.language.toUpperCase()==="PYTHON"?"py":"js",c3=g5($,`chart.${o3}`),Z=o3==="py"?"#":"//",Y=`${Z} BIC generated chart \u2014 ${m.finalChartName||"chart"} [${m.language}]