普通文本  |  3575行  |  96.59 KB

// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/search_engines/template_url_prepopulate_data.h"

#if defined(OS_POSIX) && !defined(OS_MACOSX)
#include <locale.h>
#endif

#include "base/command_line.h"
#include "base/memory/scoped_vector.h"
#include "base/string16.h"
#include "base/string_util.h"
#include "base/stl_util-inl.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/search_engines/search_engine_type.h"
#include "chrome/browser/search_engines/search_terms_data.h"
#include "chrome/browser/search_engines/template_url.h"
#include "chrome/browser/search_engines/template_url_model.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
#include "googleurl/src/gurl.h"
#include "grit/theme_resources.h"

#if defined(OS_WIN)
#undef IN  // On Windows, windef.h defines this, which screws up "India" cases.
#elif defined(OS_MACOSX)
#include "base/mac/scoped_cftyperef.h"
#endif

using base::Time;

namespace {

// NOTE: See comments in GetDataVersion() below!  You should probably not change
// the data in this file without changing the result of that function!

// Engine definitions //////////////////////////////////////////////////////////

struct PrepopulatedEngine {
  const wchar_t* const name;
  // If NULL, we'll autogenerate a keyword based on the search_url every time
  // someone asks.  Only entries which need keywords to auto-track a dynamically
  // generated search URL should use this.
  // If the empty string, the engine has no keyword.
  const wchar_t* const keyword;
  const char* const favicon_url;  // If NULL, there is no favicon.
  const wchar_t* const search_url;
  const char* const encoding;
  const wchar_t* const suggest_url;  // If NULL, this engine does not support
                                     // suggestions.
  const wchar_t* const instant_url;  // If NULL, this engine does not support
                                     // instant.
  // SEARCH_ENGINE_OTHER if no logo is available.
  const SearchEngineType search_engine_type;
  const int logo_id;  // Id for logo image in search engine dialog.
  // Unique id for this prepopulate engine (corresponds to
  // TemplateURL::prepopulate_id). This ID must be greater than zero and must
  // remain the same for a particular site regardless of how the url changes;
  // the ID is used when modifying engine data in subsequent versions, so that
  // we can find the "old" entry to update even when the name or URL changes.
  //
  // This ID must be "unique" within one country's prepopulated data, but two
  // entries can share an ID if they represent the "same" engine (e.g. Yahoo! US
  // vs. Yahoo! UK) and will not appear in the same user-visible data set.  This
  // facilitates changes like adding more specific per-country data in the
  // future; in such a case the localized engines will transparently replace the
  // previous, non-localized versions.  For engines where we need two instances
  // to appear for one country (e.g. Bing Search U.S. English and Spanish), we
  // must use two different unique IDs (and different keywords).
  //
  // The following unique IDs are available:
  //    33, 34, 36, 39, 42, 43, 47, 48, 49, 50, 52, 53, 56, 58, 60, 61, 64, 65,
  //    66, 70, 74, 78, 79, 80, 81, 84, 86, 88, 91, 92, 93, 94, 95, 96, 97, 98,
  //    102+
  //
  // IDs > 1000 are reserved for distribution custom engines.
  //
  // NOTE: CHANGE THE ABOVE NUMBERS IF YOU ADD A NEW ENGINE; ID conflicts = bad!
  const int id;
};

const PrepopulatedEngine abcsok = {
  L"ABC S\x00f8k",
  L"abcsok.no",
  "http://abcsok.no/favicon.ico",
  L"http://abcsok.no/index.html?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_ABCSOK,
  IDR_SEARCH_ENGINE_LOGO_ABCSOK,
  72,
};

const PrepopulatedEngine altavista = {
  L"AltaVista",
  L"altavista.com",
  "http://www.altavista.com/favicon.ico",
  L"http://www.altavista.com/web/results?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_ALTAVISTA,
  IDR_SEARCH_ENGINE_LOGO_ALTAVISTA,
  89,
};

const PrepopulatedEngine altavista_ar = {
  L"AltaVista",
  L"ar.altavista.com",
  "http://ar.altavista.com/favicon.ico",
  L"http://ar.altavista.com/web/results?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_ALTAVISTA,
  IDR_SEARCH_ENGINE_LOGO_ALTAVISTA,
  89,
};

const PrepopulatedEngine altavista_se = {
  L"AltaVista",
  L"se.altavista.com",
  "http://se.altavista.com/favicon.ico",
  L"http://se.altavista.com/web/results?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_ALTAVISTA,
  IDR_SEARCH_ENGINE_LOGO_ALTAVISTA,
  89,
};

const PrepopulatedEngine aol = {
  L"AOL",
  L"aol.com",
  "http://search.aol.com/favicon.ico",
  L"http://search.aol.com/aol/search?query={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  IDR_SEARCH_ENGINE_LOGO_AOL,
  35,
};

const PrepopulatedEngine araby = {
  L"\x0639\x0631\x0628\x064a",
  L"araby.com",
  "http://araby.com/favicon.ico",
  L"http://araby.com/?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  12,
};

const PrepopulatedEngine ask = {
  L"Ask",
  L"ask.com",
  "http://www.ask.com/favicon.ico",
  L"http://www.ask.com/web?q={searchTerms}",
  "UTF-8",
  L"http://ss.ask.com/query?q={searchTerms}&li=ff",
  NULL,
  SEARCH_ENGINE_ASK,
  IDR_SEARCH_ENGINE_LOGO_ASK,
  4,
};

const PrepopulatedEngine ask_de = {
  L"Ask.com Deutschland",
  L"de.ask.com",
  "http://de.ask.com/favicon.ico",
  L"http://de.ask.com/web?q={searchTerms}",
  "UTF-8",
  L"http://ss.de.ask.com/query?q={searchTerms}&li=ff",
  NULL,
  SEARCH_ENGINE_ASK,
  IDR_SEARCH_ENGINE_LOGO_ASK,
  4,
};

const PrepopulatedEngine ask_es = {
  L"Ask.com Espa" L"\x00f1" L"a",
  L"es.ask.com",
  "http://es.ask.com/favicon.ico",
  L"http://es.ask.com/web?q={searchTerms}",
  "UTF-8",
  L"http://ss.es.ask.com/query?q={searchTerms}&li=ff",
  NULL,
  SEARCH_ENGINE_ASK,
  IDR_SEARCH_ENGINE_LOGO_ASK,
  4,
};

const PrepopulatedEngine ask_it = {
  L"Ask.com Italia",
  L"it.ask.com",
  "http://it.ask.com/favicon.ico",
  L"http://it.ask.com/web?q={searchTerms}",
  "UTF-8",
  L"http://ss.it.ask.com/query?q={searchTerms}&li=ff",
  NULL,
  SEARCH_ENGINE_ASK,
  IDR_SEARCH_ENGINE_LOGO_ASK,
  4,
};

const PrepopulatedEngine ask_nl = {
  L"Ask.com Nederland",
  L"nl.ask.com",
  "http://nl.ask.com/favicon.ico",
  L"http://nl.ask.com/web?q={searchTerms}",
  "UTF-8",
  L"http://ss.nl.ask.com/query?q={searchTerms}&li=ff",
  NULL,
  SEARCH_ENGINE_ASK,
  IDR_SEARCH_ENGINE_LOGO_ASK,
  4,
};

const PrepopulatedEngine ask_uk = {
  L"Ask Jeeves",
  L"uk.ask.com",
  "http://uk.ask.com/favicon.ico",
  L"http://uk.ask.com/web?q={searchTerms}",
  "UTF-8",
  L"http://ss.uk.ask.com/query?q={searchTerms}&li=ff",
  NULL,
  SEARCH_ENGINE_ASK,
  IDR_SEARCH_ENGINE_LOGO_ASK,
  4,
};

const PrepopulatedEngine atlas_cz = {
  L"Atlas",
  L"atlas.cz",
  "http://img.atlas.cz/favicon.ico",
  L"http://search.atlas.cz/?q={searchTerms}",
  "windows-1250",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  27,
};

const PrepopulatedEngine atlas_sk = {
  L"ATLAS.SK",
  L"atlas.sk",
  "http://www.atlas.sk/images/favicon.ico",
  L"http://hladaj.atlas.sk/fulltext/?phrase={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  27,
};

const PrepopulatedEngine baidu = {
  L"\x767e\x5ea6",
  L"baidu.com",
  "http://www.baidu.com/favicon.ico",
  L"http://www.baidu.com/s?wd={searchTerms}",
  "GB2312",
  NULL,
  NULL,
  SEARCH_ENGINE_BAIDU,
  IDR_SEARCH_ENGINE_LOGO_BAIDU,
  21,
};

const PrepopulatedEngine bing = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_ar_XA = {
  L"Bing",
  L"",  // bing.com is taken by bing_en_XA.
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=ar-XA&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  7,  // Can't be 3 as this has to appear in the Arabian countries' lists
      // alongside bing_en_XA.
};

const PrepopulatedEngine bing_bg_BG = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=bg-BG&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_cs_CZ = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=cs-CZ&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_da_DK = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=da-DK&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_de_AT = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=de-AT&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_de_CH = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=de-CH&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_de_DE = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=de-DE&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_el_GR = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=el-GR&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_AU = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-AU&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_CA = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-CA&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_GB = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-GB&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_ID = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-ID&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_IE = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-IE&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_IN = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-IN&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_MY = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-MY&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_NZ = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-NZ&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_PH = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-PH&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_SG = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-SG&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_US = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-US&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_XA = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-XA&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_en_ZA = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=en-ZA&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_es_AR = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=es-AR&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_es_CL = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=es-CL&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_es_ES = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=es-ES&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_es_MX = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=es-MX&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_es_XL = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=es-XL&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_et_EE = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=et-EE&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_fi_FI = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=fi-FI&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_fr_BE = {
  L"Bing",
  L"",  // bing.com is taken by bing_nl_BE.
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=fr-BE&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  7,
};

const PrepopulatedEngine bing_fr_CA = {
  L"Bing",
  L"",  // bing.com is taken by bing_en_CA.
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=fr-CA&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  7,
};

const PrepopulatedEngine bing_fr_CH = {
  L"Bing",
  L"",  // bing.com is taken by bing_de_CH.
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=fr-CH&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  7,
};

const PrepopulatedEngine bing_fr_FR = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=fr-FR&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_he_IL = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=he-IL&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_hr_HR = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=hr-HR&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_hu_HU = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=hu-HU&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_it_IT = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=it-IT&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_ja_JP = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=ja-JP&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_ko_KR = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=ko-KR&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_lt_LT = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=lt-LT&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_lv_LV = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=lv-LV&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_nb_NO = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=nb-NO&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_nl_BE = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=nl-BE&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_nl_NL = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=nl-NL&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_pl_PL = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=pl-PL&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_pt_BR = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=pt-BR&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_pt_PT = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=pt-PT&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_ro_RO = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=ro-RO&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_ru_RU = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=ru-RU&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_sl_SI = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=sl-SI&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_sk_SK = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=sk-SK&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_sv_SE = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=sv-SE&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_th_TH = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=th-TH&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_tr_TR = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=tr-TR&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_uk_UA = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=uk-UA&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_zh_CN = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=zh-CN&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_zh_HK = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=zh-HK&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine bing_zh_TW = {
  L"Bing",
  L"bing.com",
  "http://www.bing.com/s/wlflag.ico",
  L"http://www.bing.com/search?setmkt=zh-TW&q={searchTerms}",
  "UTF-8",
  L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
  NULL,
  SEARCH_ENGINE_BING,
  IDR_SEARCH_ENGINE_LOGO_BING,
  3,
};

const PrepopulatedEngine centrum_cz = {
  L"Centrum.cz",
  L"centrum.cz",
  "http://img.centrum.cz/6/vy2/o/favicon.ico",
  L"http://search.centrum.cz/index.php?charset={inputEncoding}&q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_CENTRUM,
  IDR_SEARCH_ENGINE_LOGO_CENTRUM,
  26,
};

const PrepopulatedEngine centrum_sk = {
  L"Centrum.sk",
  L"centrum.sk",
  "http://img.centrum.sk/4/favicon.ico",
  L"http://search.centrum.sk/index.php?charset={inputEncoding}&q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_CENTRUM,
  IDR_SEARCH_ENGINE_LOGO_CENTRUM,
  26,
};

const PrepopulatedEngine daum = {
  L"Daum",
  L"daum.net",
  "http://search.daum.net/favicon.ico",
  L"http://search.daum.net/search?q={searchTerms}",
  "EUC-KR",
  L"http://sug.search.daum.net/search_nsuggest?mod=fxjson&q={searchTerms}",
  NULL,
  SEARCH_ENGINE_DAUM,
  IDR_SEARCH_ENGINE_LOGO_DAUM,
  68,
};

const PrepopulatedEngine delfi_lt = {
  L"DELFI",
  L"delfi.lt",
  "http://search.delfi.lt/img/favicon.png",
  L"http://search.delfi.lt/search.php?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_DELFI,
  IDR_SEARCH_ENGINE_LOGO_DELFI,
  45,
};

const PrepopulatedEngine delfi_lv = {
  L"DELFI",
  L"delfi.lv",
  "http://smart.delfi.lv/img/smart_search.png",
  L"http://smart.delfi.lv/i.php?enc={inputEncoding}&q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_DELFI,
  IDR_SEARCH_ENGINE_LOGO_DELFI,
  45,
};

const PrepopulatedEngine diri = {
  L"diri",
  L"diri.bg",
  "http://i.dir.bg/diri/images/favicon.ico",
  L"http://diri.bg/search.php?textfield={searchTerms}",
  "windows-1251",
  NULL,
  NULL,
  SEARCH_ENGINE_DIRI,
  IDR_SEARCH_ENGINE_LOGO_DIRI,
  32,
};

const PrepopulatedEngine eniro_fi = {
  L"Eniro",
  L"eniro.fi",
  "http://eniro.fi/favicon.ico",
  L"http://eniro.fi/query?search_word={searchTerms}&what=web_local",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  29,
};

const PrepopulatedEngine eniro_se = {
  L"Eniro",
  L"eniro.se",
  "http://eniro.se/favicon.ico",
  L"http://eniro.se/query?search_word={searchTerms}&what=web_local",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  29,
};

const PrepopulatedEngine fonecta_02_fi = {
  L"Fonecta 02.fi",
  L"www.fi",
  "http://www.02.fi/img/favicon.ico",
  L"http://www.02.fi/haku/{searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  46,
};

const PrepopulatedEngine go = {
  L"GO.com",
  L"go.com",
  "http://search.yahoo.com/favicon.ico",
  L"http://search.yahoo.com/search?ei={inputEncoding}&p={searchTerms}&"
      L"fr=hsusgo1",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  40,
};

const PrepopulatedEngine goo = {
  L"goo",
  L"search.goo.ne.jp",
  "http://goo.ne.jp/favicon.ico",
  L"http://search.goo.ne.jp/web.jsp?MT={searchTerms}&IE={inputEncoding}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_GOO,
  IDR_SEARCH_ENGINE_LOGO_GOO,
  23,
};

const PrepopulatedEngine google = {
  L"Google",
  NULL,
  "http://www.google.com/favicon.ico",
  L"{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}"
      L"{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}&"
      L"q={searchTerms}",
  "UTF-8",
  L"{google:baseSuggestURL}search?client=chrome&hl={language}&q={searchTerms}",
  L"{google:baseURL}webhp?{google:RLZ}sourceid=chrome-instant"
      L"&ie={inputEncoding}&ion=1{searchTerms}&nord=1",
  SEARCH_ENGINE_GOOGLE,
  IDR_SEARCH_ENGINE_LOGO_GOOGLE,
  1,
};

const PrepopulatedEngine guruji = {
  L"guruji",
  L"guruji.com",
  "http://guruji.com/favicon.ico",
  L"http://guruji.com/search?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  38,
};

const PrepopulatedEngine hispavista = {
  L"hispavista",
  L"hispavista.com",
  "http://buscar.hispavista.com/favicon.ico",
  L"http://buscar.hispavista.com/?cadena={searchTerms}",
  "iso-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  18,
};

const PrepopulatedEngine in = {
  L"in.gr",
  L"in.gr",
  "http://www.in.gr/favicon.ico",
  L"http://find.in.gr/?qs={searchTerms}",
  "ISO-8859-7",
  NULL,
  NULL,
  SEARCH_ENGINE_IN,
  IDR_SEARCH_ENGINE_LOGO_IN,
  54,
};

const PrepopulatedEngine jabse = {
  L"Jabse",
  L"jabse.com",
  "http://www.jabse.com/favicon.ico",
  L"http://www.jabse.com/searchmachine.php?query={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  19,
};

const PrepopulatedEngine jubii = {
  L"Jubii",
  L"jubii.dk",
  "http://search.jubii.dk/favicon_jubii.ico",
  L"http://search.jubii.dk/cgi-bin/pursuit?query={searchTerms}",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  28,
};

const PrepopulatedEngine kvasir = {
  L"Kvasir",
  L"kvasir.no",
  "http://www.kvasir.no/img/favicon.ico",
  L"http://www.kvasir.no/nettsok/searchResult.html?searchExpr={searchTerms}",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  73,
};

const PrepopulatedEngine latne = {
  L"LATNE",
  L"latne.lv",
  "http://latne.lv/favicon.ico",
  L"http://latne.lv/siets.php?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  71,
};

const PrepopulatedEngine leit = {
  L"leit.is",
  L"leit.is",
  "http://leit.is/leit.ico",
  L"http://leit.is/query.aspx?qt={searchTerms}",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  59,
};

const PrepopulatedEngine libero = {
  L"Libero",
  L"libero.it",
  "http://arianna.libero.it/favicon.ico",
  L"http://arianna.libero.it/search/abin/integrata.cgi?query={searchTerms}",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  63,
};

const PrepopulatedEngine mail_ru = {
  L"@MAIL.RU",
  L"mail.ru",
  "http://img.go.mail.ru/favicon.ico",
  L"http://go.mail.ru/search?q={searchTerms}",
  "windows-1251",
  NULL,
  NULL,
  SEARCH_ENGINE_MAILRU,
  IDR_SEARCH_ENGINE_LOGO_MAILRU,
  83,
};

const PrepopulatedEngine maktoob = {
  L"\x0645\x0643\x062a\x0648\x0628",
  L"maktoob.com",
  "http://www.maktoob.com/favicon.ico",
  L"http://www.maktoob.com/searchResult.php?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  13,
};

const PrepopulatedEngine masrawy = {
  L"\x0645\x0635\x0631\x0627\x0648\x064a",
  L"masrawy.com",
  "http://www.masrawy.com/new/images/masrawy.ico",
  L"http://masrawy.com/new/search.aspx?sr={searchTerms}",
  "windows-1256",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  14,
};

const PrepopulatedEngine mynet = {
  L"MYNET",
  L"mynet.com",
  "http://img.mynet.com/mynetfavori.ico",
  L"http://arama.mynet.com/search.aspx?q={searchTerms}&pg=q",
  "windows-1254",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  101,
};

const PrepopulatedEngine najdi = {
  L"Najdi.si",
  L"najdi.si",
  "http://www.najdi.si/master/favicon.ico",
  L"http://www.najdi.si/search.jsp?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_NAJDI,
  IDR_SEARCH_ENGINE_LOGO_NAJDI,
  87,
};

const PrepopulatedEngine nate = {
  L"\xb124\xc774\xd2b8\xb2f7\xcef4",
  L"nate.com",
  "http://nate.search.empas.com/favicon.ico",
  L"http://nate.search.empas.com/search/all.html?q={searchTerms}",
  "EUC-KR",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  69,
};

const PrepopulatedEngine naver = {
  L"\xb124\xc774\xbc84",
  L"naver.com",
  "http://search.naver.com/favicon.ico",
  L"http://search.naver.com/search.naver?ie={inputEncoding}"
      L"&query={searchTerms}",
  "UTF-8",
  L"http://ac.search.naver.com/autocompl?m=s&ie={inputEncoding}&oe=utf-8&"
      L"q={searchTerms}",
  NULL,
  SEARCH_ENGINE_NAVER,
  IDR_SEARCH_ENGINE_LOGO_NAVER,
  67,
};

const PrepopulatedEngine neti = {
  L"NETI",
  L"neti.ee",
  "http://www.neti.ee/favicon.ico",
  L"http://www.neti.ee/cgi-bin/otsing?query={searchTerms}",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_NETI,
  IDR_SEARCH_ENGINE_LOGO_NETI,
  44,
};

const PrepopulatedEngine netsprint = {
  L"NetSprint",
  L"netsprint.pl",
  "http://netsprint.pl/favicon.ico",
  L"http://www.netsprint.pl/serwis/search?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_NETSPRINT,
  IDR_SEARCH_ENGINE_LOGO_NETSPRINT,
  30,
};

const PrepopulatedEngine nur_kz = {
  L"NUR.KZ",
  L"nur.kz",
  "http://www.nur.kz/favicon_kz.ico",
  L"http://search.nur.kz/?encoding={inputEncoding}&query={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  20,
};

const PrepopulatedEngine ok = {
  L"OK.hu",
  L"ok.hu",
  "http://ok.hu/gfx/favicon.ico",
  L"http://ok.hu/katalogus?q={searchTerms}",
  "ISO-8859-2",
  NULL,
  NULL,
  SEARCH_ENGINE_OK,
  IDR_SEARCH_ENGINE_LOGO_OK,
  6,
};

const PrepopulatedEngine onet = {
  L"Onet.pl",
  L"onet.pl",
  "http://szukaj.onet.pl/favicon.ico",
  L"http://szukaj.onet.pl/query.html?qt={searchTerms}",
  "ISO-8859-2",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  75,
};

const PrepopulatedEngine pogodak_ba = {
  L"Pogodak!",
  L"pogodak.ba",
  "http://www.pogodak.ba/favicon.ico",
  L"http://www.pogodak.ba/search.jsp?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_POGODAK,
  IDR_SEARCH_ENGINE_LOGO_POGODAK,
  24,
};

const PrepopulatedEngine pogodak_hr = {
  L"Pogodak!",
  L"pogodak.hr",
  "http://www.pogodak.hr/favicon.ico",
  L"http://www.pogodak.hr/search.jsp?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_POGODAK,
  IDR_SEARCH_ENGINE_LOGO_POGODAK,
  24,
};

const PrepopulatedEngine pogodak_rs = {
  L"Pogodak!",
  L"pogodak.rs",
  "http://www.pogodak.rs/favicon.ico",
  L"http://www.pogodak.rs/search.jsp?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_POGODAK,
  IDR_SEARCH_ENGINE_LOGO_POGODAK,
  24,
};

const PrepopulatedEngine pogodok = {
  L"\x041f\x043e\x0433\x043e\x0434\x043e\x043a!",
  L"pogodok.com.mk",
  "http://www.pogodok.com.mk/favicon.ico",
  L"http://www.pogodok.com.mk/search.jsp?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_POGODOK_MK,
  IDR_SEARCH_ENGINE_LOGO_POGODOK_MK,
  24,  // Really the same engine as Pogodak, just has a small name change.
};

const PrepopulatedEngine rambler = {
  L"Rambler",
  L"rambler.ru",
  "http://www.rambler.ru/favicon.ico",
  L"http://www.rambler.ru/srch?words={searchTerms}",
  "windows-1251",
  NULL,
  NULL,
  SEARCH_ENGINE_RAMBLER,
  IDR_SEARCH_ENGINE_LOGO_RAMBLER,
  16,
};

const PrepopulatedEngine rediff = {
  L"Rediff",
  L"rediff.com",
  "http://search1.rediff.com/favicon.ico",
  L"http://search1.rediff.com/dirsrch/default.asp?MT={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  37,
};

const PrepopulatedEngine rednano = {
  L"Rednano",
  L"rednano.sg",
  "http://rednano.sg/favicon.ico",
  L"http://rednano.sg/sfe/lwi.action?querystring={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  41,
};

const PrepopulatedEngine sanook = {
  L"\x0e2a\x0e19\x0e38\x0e01!",
  L"sanook.com",
  "http://search.sanook.com/favicon.ico",
  L"http://search.sanook.com/search.php?q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_SANOOK,
  IDR_SEARCH_ENGINE_LOGO_SANOOK,
  100,
};

const PrepopulatedEngine sapo = {
  L"SAPO",
  L"sapo.pt",
  "http://imgs.sapo.pt/images/sapo.ico",
  L"http://pesquisa.sapo.pt/?q={searchTerms}",
  "UTF-8",
  L"http://pesquisa.sapo.pt/livesapo?q={searchTerms}",
  NULL,
  SEARCH_ENGINE_SAPO,
  IDR_SEARCH_ENGINE_LOGO_SAPO,
  77,
};

const PrepopulatedEngine search_de_CH = {
  L"search.ch",
  L"search.ch",
  "http://www.search.ch/favicon.ico",
  L"http://www.search.ch/index.de.html?q={searchTerms}",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  51,
};

const PrepopulatedEngine search_fr_CH = {
  L"search.ch",
  L"",  // search.ch is taken by search_de_CH.
  "http://www.search.ch/favicon.ico",
  L"http://www.search.ch/index.fr.html?q={searchTerms}",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  22,
};

const PrepopulatedEngine seznam = {
  L"Seznam",
  L"seznam.cz",
  "http://1.im.cz/szn/img/favicon.ico",
  L"http://search.seznam.cz/?q={searchTerms}",
  "UTF-8",
  L"http:///suggest.fulltext.seznam.cz/?dict=fulltext_ff&phrase={searchTerms}&"
      L"encoding={inputEncoding}&response_encoding=utf-8",
  NULL,
  SEARCH_ENGINE_SEZNAM,
  IDR_SEARCH_ENGINE_LOGO_SEZNAM,
  25,
};

const PrepopulatedEngine spray = {
  L"Spray",
  L"spray.se",
  "http://www.eniro.se/favicon.ico",
  L"http://www.eniro.se/query?ax=spray&search_word={searchTerms}&what=web",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  99,
};

const PrepopulatedEngine terra_ar = {
  L"Terra Argentina",
  L"terra.com.ar",
  "http://buscar.terra.com.ar/favicon.ico",
  L"http://buscar.terra.com.ar/Default.aspx?query={searchTerms}&source=Search",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  90,
};

const PrepopulatedEngine terra_es = {
  L"Terra",
  L"terra.es",
  "http://buscador.terra.es/favicon.ico",
  L"http://buscador.terra.es/Default.aspx?query={searchTerms}&source=Search",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  90,
};

const PrepopulatedEngine tut = {
  L"TUT.BY",
  L"tut.by",
  "http://www.tut.by/favicon.ico",
  L"http://search.tut.by/?query={searchTerms}",
  "windows-1251",
  NULL,
  NULL,
  SEARCH_ENGINE_TUT,
  IDR_SEARCH_ENGINE_LOGO_TUT,
  17,
};

const PrepopulatedEngine uol = {
  L"UOL Busca",
  L"busca.uol.com.br",
  "http://busca.uol.com.br/favicon.ico",
  L"http://busca.uol.com.br/www/index.html?q={searchTerms}",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  82,
};

const PrepopulatedEngine virgilio = {
  L"Virgilio",
  L"virgilio.it",
  "http://ricerca.alice.it/favicon.ico",
  L"http://ricerca.alice.it/ricerca?qs={searchTerms}",
  "ISO-8859-1",
  NULL,
  NULL,
  SEARCH_ENGINE_VIRGILIO,
  IDR_SEARCH_ENGINE_LOGO_VIRGILIO,
  62,
};

const PrepopulatedEngine walla = {
  L"\x05d5\x05d5\x05d0\x05dc\x05d4!",
  L"walla.co.il",
  "http://www.walla.co.il/favicon.ico",
  L"http://search.walla.co.il/?e=hew&q={searchTerms}",
  "windows-1255",
  NULL,
  NULL,
  SEARCH_ENGINE_WALLA,
  IDR_SEARCH_ENGINE_LOGO_WALLA,
  55,
};

const PrepopulatedEngine wp = {
  L"Wirtualna Polska",
  L"wp.pl",
  "http://szukaj.wp.pl/favicon.ico",
  L"http://szukaj.wp.pl/szukaj.html?szukaj={searchTerms}",
  "ISO-8859-2",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  76,
};

const PrepopulatedEngine yahoo = {
  L"Yahoo!",
  L"yahoo.com",
  "http://search.yahoo.com/favicon.ico",
  L"http://search.yahoo.com/search?ei={inputEncoding}&fr=crmas&p={searchTerms}",
  "UTF-8",
  L"http://ff.search.yahoo.com/gossip?output=fxjson&command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

// For regional Yahoo variants without region-specific suggestion service,
// suggestion is disabled. For some of them, we might consider
// using a fallback (e.g. de for at/ch, ca or fr for qc, en for nl, no, hk).
const PrepopulatedEngine yahoo_ar = {
  L"Yahoo! Argentina",
  L"ar.yahoo.com",
  "http://ar.search.yahoo.com/favicon.ico",
  L"http://ar.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://ar-sayt.ff.search.yahoo.com/gossip-ar-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_at = {
  L"Yahoo! Suche",
  L"at.yahoo.com",
  "http://at.search.yahoo.com/favicon.ico",
  L"http://at.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_au = {
  L"Yahoo!7",
  L"au.yahoo.com",
  "http://au.search.yahoo.com/favicon.ico",
  L"http://au.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://aue-sayt.ff.search.yahoo.com/gossip-au-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_br = {
  L"Yahoo! Brasil",
  L"br.yahoo.com",
  "http://br.search.yahoo.com/favicon.ico",
  L"http://br.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://br-sayt.ff.search.yahoo.com/gossip-br-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_ca = {
  L"Yahoo! Canada",
  L"ca.yahoo.com",
  "http://ca.search.yahoo.com/favicon.ico",
  L"http://ca.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://gossip.ca.yahoo.com/gossip-ca-sayt?output=fxjsonp&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_ch = {
  L"Yahoo! Suche",
  L"ch.yahoo.com",
  "http://ch.search.yahoo.com/favicon.ico",
  L"http://ch.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_cl = {
  L"Yahoo! Chile",
  L"cl.yahoo.com",
  "http://cl.search.yahoo.com/favicon.ico",
  L"http://cl.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_cn = {
  L"\x4e2d\x56fd\x96c5\x864e",
  L"cn.yahoo.com",
  "http://search.cn.yahoo.com/favicon.ico",
  L"http://search.cn.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "GB2312",
  // http://cn.yahoo.com/cnsuggestion/suggestion.inc.php?of=fxjson&query=
  // returns in a proprietary format ('|' delimeted word list).
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_co = {
  L"Yahoo! Colombia",
  L"co.yahoo.com",
  "http://co.search.yahoo.com/favicon.ico",
  L"http://co.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_de = {
  L"Yahoo! Deutschland",
  L"de.yahoo.com",
  "http://de.search.yahoo.com/favicon.ico",
  L"http://de.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://de-sayt.ff.search.yahoo.com/gossip-de-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_dk = {
  L"Yahoo! Danmark",
  L"dk.yahoo.com",
  "http://dk.search.yahoo.com/favicon.ico",
  L"http://dk.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_es = {
  L"Yahoo! Espa" L"\x00f1" L"a",
  L"es.yahoo.com",
  "http://es.search.yahoo.com/favicon.ico",
  L"http://es.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://es-sayt.ff.search.yahoo.com/gossip-es-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_fi = {
  L"Yahoo!-haku",
  L"fi.yahoo.com",
  "http://fi.search.yahoo.com/favicon.ico",
  L"http://fi.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_fr = {
  L"Yahoo! France",
  L"fr.yahoo.com",
  "http://fr.search.yahoo.com/favicon.ico",
  L"http://fr.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://fr-sayt.ff.search.yahoo.com/gossip-fr-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_hk = {
  L"Yahoo! Hong Kong",
  L"hk.yahoo.com",
  "http://hk.search.yahoo.com/favicon.ico",
  L"http://hk.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  // http://history.hk.search.yahoo.com/ac/ac_msearch.php?query={searchTerms}
  // returns a JSON with key-value pairs. Setting parameters (ot, of, output)
  // to fxjson, json, or js doesn't help.
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_id = {
  L"Yahoo! Indonesia",
  L"id.yahoo.com",
  "http://id.search.yahoo.com/favicon.ico",
  L"http://id.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://id-sayt.ff.search.yahoo.com/gossip-id-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_in = {
  L"Yahoo! India",
  L"in.yahoo.com",
  "http://in.search.yahoo.com/favicon.ico",
  L"http://in.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://in-sayt.ff.search.yahoo.com/gossip-in-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_it = {
  L"Yahoo! Italia",
  L"it.yahoo.com",
  "http://it.search.yahoo.com/favicon.ico",
  L"http://it.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://it-sayt.ff.search.yahoo.com/gossip-it-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_jp = {
  L"Yahoo! JAPAN",
  L"yahoo.co.jp",
  "http://search.yahoo.co.jp/favicon.ico",
  L"http://search.yahoo.co.jp/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOOJP,
  IDR_SEARCH_ENGINE_LOGO_YAHOOJP,
  2,
};

const PrepopulatedEngine yahoo_kr = {
  L"\xc57c\xd6c4! \xcf54\xb9ac\xc544",
  L"kr.yahoo.com",
  "http://kr.search.yahoo.com/favicon.ico",
  L"http://kr.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://kr.atc.search.yahoo.com/atcx.php?property=main&ot=fxjson&"
     L"ei=utf8&eo=utf8&command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_malaysia = {
  L"Yahoo! Malaysia",
  L"malaysia.yahoo.com",
  "http://malaysia.search.yahoo.com/favicon.ico",
  L"http://malaysia.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://my-sayt.ff.search.yahoo.com/gossip-my-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_mx = {
  L"Yahoo! M\x00e9xico",
  L"mx.yahoo.com",
  "http://mx.search.yahoo.com/favicon.ico",
  L"http://mx.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://gossip.mx.yahoo.com/gossip-mx-sayt?output=fxjsonp&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_nl = {
  L"Yahoo! Nederland",
  L"nl.yahoo.com",
  "http://nl.search.yahoo.com/favicon.ico",
  L"http://nl.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_no = {
  L"Yahoo! Norge",
  L"no.yahoo.com",
  "http://no.search.yahoo.com/favicon.ico",
  L"http://no.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_nz = {
  L"Yahoo!Xtra",
  L"nz.yahoo.com",
  "http://nz.search.yahoo.com/favicon.ico",
  L"http://nz.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://aue-sayt.ff.search.yahoo.com/gossip-nz-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_pe = {
  L"Yahoo! Per\x00fa",
  L"pe.yahoo.com",
  "http://pe.search.yahoo.com/favicon.ico",
  L"http://pe.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_ph = {
  L"Yahoo! Philippines",
  L"ph.yahoo.com",
  "http://ph.search.yahoo.com/favicon.ico",
  L"http://ph.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://ph-sayt.ff.search.yahoo.com/gossip-ph-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_qc = {
  L"Yahoo! Qu" L"\x00e9" L"bec",
  L"qc.yahoo.com",
  "http://qc.search.yahoo.com/favicon.ico",
  L"http://qc.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOOQC,
  IDR_SEARCH_ENGINE_LOGO_YAHOOQC,
  5,  // Can't be 2 as this has to appear in the Canada list alongside yahoo_ca.
};

const PrepopulatedEngine yahoo_ru = {
  L"Yahoo! \x043f\x043e-\x0440\x0443\x0441\x0441\x043a\x0438",
  L"ru.yahoo.com",
  "http://ru.search.yahoo.com/favicon.ico",
  L"http://ru.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_se = {
  L"Yahoo! Sverige",
  L"se.yahoo.com",
  "http://se.search.yahoo.com/favicon.ico",
  L"http://se.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_sg = {
  L"Yahoo! Singapore",
  L"sg.yahoo.com",
  "http://sg.search.yahoo.com/favicon.ico",
  L"http://sg.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://sg-sayt.ff.search.yahoo.com/gossip-sg-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_th = {
  L"Yahoo! \x0e1b\x0e23\x0e30\x0e40\x0e17\x0e28\x0e44\x0e17\x0e22",
  L"th.yahoo.com",
  "http://th.search.yahoo.com/favicon.ico",
  L"http://th.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://th-sayt.ff.search.yahoo.com/gossip-th-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_tw = {
  L"Yahoo!\x5947\x6469",
  L"tw.yahoo.com",
  "http://tw.search.yahoo.com/favicon.ico",
  L"http://tw.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  // "http://tw.yahoo.com/ac/ac_search.php?eo=utf8&of=js&prop=web&query="
  // returns a JSON file prepended with 'fxsearch=('.
  NULL,
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_uk = {
  L"Yahoo! UK & Ireland",
  L"uk.yahoo.com",
  "http://uk.search.yahoo.com/favicon.ico",
  L"http://uk.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://uk-sayt.ff.search.yahoo.com/gossip-uk-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_ve = {
  L"Yahoo! Venezuela",
  L"ve.yahoo.com",
  "http://ve.search.yahoo.com/favicon.ico",
  L"http://ve.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yahoo_vn = {
  L"Yahoo! Vi\x1ec7t Nam",
  L"vn.yahoo.com",
  "http://vn.search.yahoo.com/favicon.ico",
  L"http://vn.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
      L"p={searchTerms}",
  "UTF-8",
  L"http://vn-sayt.ff.search.yahoo.com/gossip-vn-sayt?output=fxjson&"
      L"command={searchTerms}",
  NULL,
  SEARCH_ENGINE_YAHOO,
  IDR_SEARCH_ENGINE_LOGO_YAHOO,
  2,
};

const PrepopulatedEngine yamli = {
  L"Yamli",
  L"yamli.com",
  "http://www.yamli.com/favicon.ico",
  L"http://www.yamli.com/#q={searchTerms}",
  "UTF-8",
  NULL,
  NULL,
  SEARCH_ENGINE_OTHER,
  kNoSearchEngineLogo,
  11,
};

const PrepopulatedEngine yandex_ru = {
  L"\x042f\x043d\x0434\x0435\x043a\x0441",
  L"yandex.ru",
  "http://yandex.ru/favicon.ico",
  L"http://yandex.ru/yandsearch?text={searchTerms}",
  "UTF-8",
  L"http://suggest.yandex.net/suggest-ff.cgi?part={searchTerms}",
  NULL,
  SEARCH_ENGINE_YANDEX,
  IDR_SEARCH_ENGINE_LOGO_YANDEX,
  15,
};

const PrepopulatedEngine yandex_ua = {
  L"\x042f\x043d\x0434\x0435\x043a\x0441",
  L"yandex.ua",
  "http://yandex.ua/favicon.ico",
  L"http://yandex.ua/yandsearch?text={searchTerms}",
  "UTF-8",
  L"http://suggest.yandex.net/suggest-ff.cgi?part={searchTerms}",
  NULL,
  SEARCH_ENGINE_YANDEX,
  IDR_SEARCH_ENGINE_LOGO_YANDEX,
  15,
};

const PrepopulatedEngine zoznam = {
  L"Zoznam",
  L"zoznam.sk",
  "http://zoznam.sk/favicon.ico",
  L"http://zoznam.sk/hladaj.fcgi?s={searchTerms}",
  "windows-1250",
  NULL,
  NULL,
  SEARCH_ENGINE_ZOZNAM,
  IDR_SEARCH_ENGINE_LOGO_ZOZNAM,
  85,
};

// Lists of engines per country ////////////////////////////////////////////////

// Put these in order with most interesting/important first.  The default will
// be the first engine.

// Default (for countries with no better engine set)
const PrepopulatedEngine* engines_default[] =
    { &google, &yahoo, &bing, };

// United Arab Emirates
const PrepopulatedEngine* engines_AE[] =
    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &araby, &maktoob, };

// Albania
const PrepopulatedEngine* engines_AL[] =
    { &google, &yahoo, &bing_en_XA, };

// Argentina
const PrepopulatedEngine* engines_AR[] =
    { &google, &yahoo_ar, &bing_es_AR, &terra_ar, &altavista_ar, };

// Austria
const PrepopulatedEngine* engines_AT[] =
    { &google, &yahoo_at, &bing_de_AT, };

// Australia
const PrepopulatedEngine* engines_AU[] =
    { &google, &bing_en_AU, &yahoo_au, };

// Bosnia and Herzegovina
const PrepopulatedEngine* engines_BA[] =
    { &google, &pogodak_ba, &yahoo, &bing, };

// Belgium
const PrepopulatedEngine* engines_BE[] =
    { &google, &bing_nl_BE, &yahoo, &bing_fr_BE, };

// Bulgaria
const PrepopulatedEngine* engines_BG[] =
    { &google, &bing_bg_BG, &yahoo, &diri, &jabse, };

// Bahrain
const PrepopulatedEngine* engines_BH[] =
    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, };

// Burundi
const PrepopulatedEngine* engines_BI[] =
    { &google, &yahoo, &bing, };

// Brunei
const PrepopulatedEngine* engines_BN[] =
    { &google, &yahoo_malaysia, &bing_en_MY, };

// Bolivia
const PrepopulatedEngine* engines_BO[] =
    { &google, &altavista, &bing_es_XL, &yahoo, };

// Brazil
const PrepopulatedEngine* engines_BR[] =
    { &google, &bing_pt_BR, &yahoo_br, &uol, };

// Belarus
const PrepopulatedEngine* engines_BY[] =
    { &google, &tut, &yandex_ru, &rambler, &yahoo, };

// Belize
const PrepopulatedEngine* engines_BZ[] =
    { &google, &yahoo, &bing, &aol, };

// Canada
const PrepopulatedEngine* engines_CA[] =
    { &google, &yahoo_ca, &yahoo_qc, &bing_en_CA, &bing_fr_CA, };

// Switzerland
const PrepopulatedEngine* engines_CH[] =
    { &google, &yahoo_ch, &bing_de_CH, &bing_fr_CH, &search_de_CH,
      &search_fr_CH, };

// Chile
const PrepopulatedEngine* engines_CL[] =
    { &google, &yahoo_cl, &bing_es_CL, };

// China
const PrepopulatedEngine* engines_CN[] =
    { &google, &baidu, &yahoo_cn, &bing_zh_CN, };

// Colombia
const PrepopulatedEngine* engines_CO[] =
    { &google, &bing_es_XL, &yahoo_co, };

// Costa Rica
const PrepopulatedEngine* engines_CR[] =
    { &google, &bing_es_XL, &yahoo, };

// Czech Republic
const PrepopulatedEngine* engines_CZ[] =
    { &google, &seznam, &bing_cs_CZ, &centrum_cz, &atlas_cz, };

// Germany
const PrepopulatedEngine* engines_DE[] =
    { &google, &ask_de, &bing_de_DE, &yahoo_de };

// Denmark
const PrepopulatedEngine* engines_DK[] =
    { &google, &bing_da_DK, &yahoo_dk, };

// Dominican Republic
const PrepopulatedEngine* engines_DO[] =
    { &google, &bing_es_XL, &yahoo, };

// Algeria
const PrepopulatedEngine* engines_DZ[] =
    { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, };

// Ecuador
const PrepopulatedEngine* engines_EC[] =
    { &google, &bing_es_XL, &yahoo, };

// Estonia
const PrepopulatedEngine* engines_EE[] =
    { &google, &bing_et_EE, &neti, &yahoo, };

// Egypt
const PrepopulatedEngine* engines_EG[] =
    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &masrawy, };

// Spain
const PrepopulatedEngine* engines_ES[] =
    { &google, &ask_es, &bing_es_ES, &yahoo_es, &terra_es, &hispavista, };

// Faroe Islands
const PrepopulatedEngine* engines_FO[] =
    { &google, &bing_da_DK, &yahoo_dk, &jubii };

// Finland
const PrepopulatedEngine* engines_FI[] =
    { &google, &bing_fi_FI, &yahoo_fi, &eniro_fi, &fonecta_02_fi, };

// France
const PrepopulatedEngine* engines_FR[] =
    { &google, &yahoo_fr, &bing_fr_FR, };

// United Kingdom
const PrepopulatedEngine* engines_GB[] =
    { &google, &ask_uk, &yahoo_uk, &bing_en_GB, };

// Greece
const PrepopulatedEngine* engines_GR[] =
    { &google, &yahoo, &in, &bing_el_GR };

// Guatemala
const PrepopulatedEngine* engines_GT[] =
    { &google, &bing_es_XL, &yahoo, &ask_es, };

// Hong Kong
const PrepopulatedEngine* engines_HK[] =
    { &google, &yahoo_hk, &bing_zh_HK, &baidu, };

// Honduras
const PrepopulatedEngine* engines_HN[] =
    { &google, &bing_es_XL, &yahoo, &ask_es, };

// Croatia
const PrepopulatedEngine* engines_HR[] =
    { &google, &yahoo, &pogodak_hr, &bing_hr_HR, };

// Hungary
const PrepopulatedEngine* engines_HU[] =
    { &google, &ok, &bing_hu_HU, };

// Indonesia
const PrepopulatedEngine* engines_ID[] =
    { &google, &yahoo_id, &bing_en_ID, };

// Ireland
const PrepopulatedEngine* engines_IE[] =
    { &google, &yahoo_uk, &bing_en_IE, };

// Israel
const PrepopulatedEngine* engines_IL[] =
    { &google, &walla, &bing_he_IL, };

// India
const PrepopulatedEngine* engines_IN[] =
    { &google, &yahoo_in, &bing_en_IN, &rediff, &guruji, };

// Iraq
const PrepopulatedEngine* engines_IQ[] =
    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &ask, };

// Iran
const PrepopulatedEngine* engines_IR[] =
    { &google, &yahoo, };

// Iceland
const PrepopulatedEngine* engines_IS[] =
    { &google, &yahoo, &bing, &leit, };

// Italy
const PrepopulatedEngine* engines_IT[] =
    { &google, &ask_it, &virgilio, &bing_it_IT, &yahoo_it, &libero, };

// Jamaica
const PrepopulatedEngine* engines_JM[] =
    { &google, &yahoo, &bing, &go, };

// Jordan
const PrepopulatedEngine* engines_JO[] =
    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby, };

// Japan
const PrepopulatedEngine* engines_JP[] =
    { &google, &yahoo_jp, &bing_ja_JP, &goo, };

// Kenya
const PrepopulatedEngine* engines_KE[] =
    { &google, &yahoo, &bing, };

// Kuwait
const PrepopulatedEngine* engines_KW[] =
    { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, &araby, };

// South Korea
const PrepopulatedEngine* engines_KR[] =
    { &google, &naver, &daum, &yahoo_kr, &nate, };

// Kazakhstan
const PrepopulatedEngine* engines_KZ[] =
    { &google, &rambler, &yandex_ru, &nur_kz, };

// Lebanon
const PrepopulatedEngine* engines_LB[] =
    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby, };

// Liechtenstein
const PrepopulatedEngine* engines_LI[] =
    { &google, &bing_de_DE, &yahoo_de, };

// Lithuania
const PrepopulatedEngine* engines_LT[] =
    { &google, &delfi_lt, &yahoo, &bing_lt_LT, };

// Luxembourg
const PrepopulatedEngine* engines_LU[] =
    { &google, &bing_fr_FR, &yahoo_fr, };

// Latvia
const PrepopulatedEngine* engines_LV[] =
    { &google, &bing, &yandex_ru, &yahoo, &latne, };

// Libya
const PrepopulatedEngine* engines_LY[] =
    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &ask, };

// Morocco
const PrepopulatedEngine* engines_MA[] =
    { &google, &bing_en_XA, &yahoo, &bing_ar_XA, };

// Monaco
const PrepopulatedEngine* engines_MC[] =
    { &google, &bing_fr_FR, &yahoo_fr, };

// Moldova
const PrepopulatedEngine* engines_MD[] =
    { &google, &yandex_ru, &yahoo, &bing, };

// Montenegro
const PrepopulatedEngine* engines_ME[] =
    { &google, &yahoo, &bing };

// Macedonia
const PrepopulatedEngine* engines_MK[] =
    { &google, &pogodok, &yahoo, &bing, };

// Mexico
const PrepopulatedEngine* engines_MX[] =
    { &google, &bing_es_MX, &yahoo_mx, };

// Malaysia
const PrepopulatedEngine* engines_MY[] =
    { &google, &yahoo_malaysia, &bing_en_MY, };

// Nicaragua
const PrepopulatedEngine* engines_NI[] =
    { &google, &bing_es_XL, &yahoo, &ask_es, };

// Netherlands
const PrepopulatedEngine* engines_NL[] =
    { &google, &bing_nl_NL, &yahoo_nl, &ask_nl, };

// Norway
const PrepopulatedEngine* engines_NO[] =
    { &google, &bing_nb_NO, &abcsok, &yahoo_no, &kvasir, };

// New Zealand
const PrepopulatedEngine* engines_NZ[] =
    { &google, &yahoo_nz, &bing_en_NZ, };

// Oman
const PrepopulatedEngine* engines_OM[] =
    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, };

// Panama
const PrepopulatedEngine* engines_PA[] =
    { &google, &bing_es_XL, &yahoo, &ask_es, };

// Peru
const PrepopulatedEngine* engines_PE[] =
    { &google, &bing_es_XL, &yahoo_pe, };

// Philippines
const PrepopulatedEngine* engines_PH[] =
    { &google, &yahoo_ph, &bing_en_PH, };

// Pakistan
const PrepopulatedEngine* engines_PK[] =
    { &google, &yahoo, &bing, };

// Puerto Rico
const PrepopulatedEngine* engines_PR[] =
    { &google, &bing_es_XL, &yahoo, &ask_es, };

// Poland
const PrepopulatedEngine* engines_PL[] =
    { &google, &bing_pl_PL, &netsprint, &yahoo_uk, &onet, &wp,  };

// Portugal
const PrepopulatedEngine* engines_PT[] =
    { &google, &sapo, &bing_pt_PT, &yahoo, };

// Paraguay
const PrepopulatedEngine* engines_PY[] =
    { &google, &bing_es_XL, &yahoo, };

// Qatar
const PrepopulatedEngine* engines_QA[] =
    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby };

// Romania
const PrepopulatedEngine* engines_RO[] =
    { &google, &yahoo_uk, &bing_ro_RO, };

// Serbia
const PrepopulatedEngine* engines_RS[] =
    { &google, &pogodak_rs, &bing, };

// Russia
const PrepopulatedEngine* engines_RU[] =
    { &google, &yandex_ru, &mail_ru, &tut, &rambler, &bing_ru_RU, };

// Rwanda
const PrepopulatedEngine* engines_RW[] =
    { &google, &yahoo, &bing, };

// Saudi Arabia
const PrepopulatedEngine* engines_SA[] =
    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, };

// Sweden
const PrepopulatedEngine* engines_SE[] =
    { &google, &bing_sv_SE, &yahoo_se, &altavista_se, &spray, &eniro_se };

// Singapore
const PrepopulatedEngine* engines_SG[] =
    { &google, &yahoo_sg, &bing_en_SG, &rednano, };

// Slovenia
const PrepopulatedEngine* engines_SI[] =
    { &google, &najdi, &yahoo, &bing_sl_SI, };

// Slovakia
const PrepopulatedEngine* engines_SK[] =
    { &google, &zoznam, &bing_sk_SK, &atlas_sk, &centrum_sk };

// El Salvador
const PrepopulatedEngine* engines_SV[] =
    { &google, &bing_es_XL, &yahoo, };

// Syria
const PrepopulatedEngine* engines_SY[] =
    { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, &yamli, };

// Thailand
const PrepopulatedEngine* engines_TH[] =
    { &google, &sanook, &yahoo_th, &bing_th_TH, };

// Tunisia
const PrepopulatedEngine* engines_TN[] =
    { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, &yamli };

// Turkey
const PrepopulatedEngine* engines_TR[] =
    { &google, &bing_tr_TR, &yahoo, &mynet, };

// Trinidad and Tobago
const PrepopulatedEngine* engines_TT[] =
    { &google, &bing, &yahoo, &aol, };

// Taiwan
const PrepopulatedEngine* engines_TW[] =
    { &google, &yahoo_tw, &bing_zh_TW, };

// Tanzania
const PrepopulatedEngine* engines_TZ[] =
    { &google, &yahoo, &bing, };

// Ukraine
const PrepopulatedEngine* engines_UA[] =
    { &google, &yandex_ua, &mail_ru, &rambler, };

// United States
const PrepopulatedEngine* engines_US[] =
    { &google, &yahoo, &bing_en_US, };

// Uruguay
const PrepopulatedEngine* engines_UY[] =
    { &google, &bing_es_XL, &yahoo, };

// Venezuela
const PrepopulatedEngine* engines_VE[] =
    { &google, &bing_es_XL, &yahoo_ve, };

// Vietnam
const PrepopulatedEngine* engines_VN[] =
    { &google, &yahoo_vn, };

// Yemen
const PrepopulatedEngine* engines_YE[] =
    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby, };

// South Africa
const PrepopulatedEngine* engines_ZA[] =
    { &google, &yahoo, &bing_en_ZA, };

// Zimbabwe
const PrepopulatedEngine* engines_ZW[] =
    { &google, &yahoo, &bing, };


// A list of all the engines that we know about.
const PrepopulatedEngine* kAllEngines[] =
    { &abcsok, &altavista, &altavista_ar, &altavista_se, &aol, &araby, &ask,
      &ask_de, &ask_es, &ask_it, &ask_nl, &ask_uk, &atlas_cz, &atlas_sk, &baidu,
      &bing, &bing_ar_XA, &bing_bg_BG, &bing_cs_CZ, &bing_da_DK, &bing_de_AT,
      &bing_de_CH, &bing_de_DE, &bing_el_GR, &bing_en_AU, &bing_en_CA,
      &bing_en_GB, &bing_en_ID, &bing_en_IE, &bing_en_IN, &bing_en_MY,
      &bing_en_NZ, &bing_en_PH, &bing_en_SG, &bing_en_US, &bing_en_XA,
      &bing_en_ZA, &bing_es_AR, &bing_es_CL, &bing_es_ES, &bing_es_MX,
      &bing_es_XL, &bing_et_EE, &bing_fi_FI, &bing_fr_BE, &bing_fr_CA,
      &bing_fr_CH, &bing_fr_FR, &bing_he_IL, &bing_hr_HR, &bing_hu_HU,
      &bing_it_IT, &bing_ja_JP, &bing_ko_KR, &bing_lt_LT, &bing_lv_LV,
      &bing_nb_NO, &bing_nl_BE, &bing_nl_NL, &bing_pl_PL, &bing_pt_BR,
      &bing_pt_PT, &bing_ro_RO, &bing_ru_RU, &bing_sl_SI, &bing_sk_SK,
      &bing_sv_SE, &bing_th_TH, &bing_tr_TR, &bing_uk_UA, &bing_zh_CN,
      &bing_zh_HK, &bing_zh_TW, &centrum_cz, &centrum_sk, &daum, &delfi_lt,
      &delfi_lv, &diri, &eniro_fi, &eniro_se, &fonecta_02_fi, &go, &goo,
      &google, &guruji, &hispavista, &in, &jabse, &jubii, &kvasir, &latne,
      &leit, &libero, &mail_ru, &maktoob, &masrawy, &mynet, &najdi, &nate,
      &naver, &neti, &netsprint, &nur_kz, &ok, &onet, &pogodak_ba, &pogodak_hr,
      &pogodak_rs, &pogodok, &rambler, &rediff, &rednano, &sanook, &sapo,
      &search_de_CH, &search_fr_CH, &seznam, &spray, &terra_ar, &terra_es, &tut,
      &uol, &virgilio, &walla, &wp, &yahoo, &yahoo_ar, &yahoo_at, &yahoo_au,
      &yahoo_br, &yahoo_ca, &yahoo_ch, &yahoo_cl, &yahoo_cn, &yahoo_co,
      &yahoo_de, &yahoo_dk, &yahoo_es, &yahoo_fi, &yahoo_fr, &yahoo_hk,
      &yahoo_id, &yahoo_in, &yahoo_it, &yahoo_jp, &yahoo_kr, &yahoo_malaysia,
      &yahoo_mx, &yahoo_nl, &yahoo_no, &yahoo_nz, &yahoo_pe, &yahoo_ph,
      &yahoo_qc, &yahoo_ru, &yahoo_se, &yahoo_sg, &yahoo_th, &yahoo_tw,
      &yahoo_uk, &yahoo_ve, &yahoo_vn, &yamli, &yandex_ru, &yandex_ua,
      &zoznam };


// Geographic mappings /////////////////////////////////////////////////////////

// Please refer to ISO 3166-1 for information about the two-character country
// codes; http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 is useful. In the
// following (C++) code, we pack the two letters of the country code into an int
// value we call the CountryID.

const int kCountryIDUnknown = -1;

inline int CountryCharsToCountryID(char c1, char c2) {
  return c1 << 8 | c2;
}

int CountryCharsToCountryIDWithUpdate(char c1, char c2) {
  // SPECIAL CASE: In 2003, Yugoslavia renamed itself to Serbia and Montenegro.
  // Serbia and Montenegro dissolved their union in June 2006. Yugoslavia was
  // ISO 'YU' and Serbia and Montenegro were ISO 'CS'. Serbia was subsequently
  // issued 'RS' and Montenegro 'ME'. Windows XP and Mac OS X Leopard still use
  // the value 'YU'. If we get a value of 'YU' or 'CS' we will map it to 'RS'.
  if ((c1 == 'Y' && c2 == 'U') ||
      (c1 == 'C' && c2 == 'S')) {
    c1 = 'R';
    c2 = 'S';
  }

  // SPECIAL CASE: Timor-Leste changed from 'TP' to 'TL' in 2002. Windows XP
  // predates this; we therefore map this value.
  if (c1 == 'T' && c2 == 'P')
    c2 = 'L';

  return CountryCharsToCountryID(c1, c2);
}

#if defined(OS_WIN)

// For reference, a list of GeoIDs can be found at
// http://msdn.microsoft.com/en-us/library/dd374073.aspx .
int GeoIDToCountryID(GEOID geo_id) {
  const int kISOBufferSize = 3;  // Two plus one for the terminator.
  wchar_t isobuf[kISOBufferSize] = { 0 };
  int retval = GetGeoInfo(geo_id, GEO_ISO2, isobuf, kISOBufferSize, 0);

  if (retval == kISOBufferSize &&
      !(isobuf[0] == L'X' && isobuf[1] == L'X'))
    return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]),
                                             static_cast<char>(isobuf[1]));

  // Various locations have ISO codes that Windows does not return.
  switch (geo_id) {
    case 0x144:   // Guernsey
      return CountryCharsToCountryID('G', 'G');
    case 0x148:   // Jersey
      return CountryCharsToCountryID('J', 'E');
    case 0x3B16:  // Isle of Man
      return CountryCharsToCountryID('I', 'M');

    // 'UM' (U.S. Minor Outlying Islands)
    case 0x7F:    // Johnston Atoll
    case 0x102:   // Wake Island
    case 0x131:   // Baker Island
    case 0x146:   // Howland Island
    case 0x147:   // Jarvis Island
    case 0x149:   // Kingman Reef
    case 0x152:   // Palmyra Atoll
    case 0x52FA:  // Midway Islands
      return CountryCharsToCountryID('U', 'M');

    // 'SH' (Saint Helena)
    case 0x12F:  // Ascension Island
    case 0x15C:  // Tristan da Cunha
      return CountryCharsToCountryID('S', 'H');

    // 'IO' (British Indian Ocean Territory)
    case 0x13A:  // Diego Garcia
      return CountryCharsToCountryID('I', 'O');

    // Other cases where there is no ISO country code; we assign countries that
    // can serve as reasonable defaults.
    case 0x154:  // Rota Island
    case 0x155:  // Saipan
    case 0x15A:  // Tinian Island
      return CountryCharsToCountryID('U', 'S');
    case 0x134:  // Channel Islands
      return CountryCharsToCountryID('G', 'B');
    case 0x143:  // Guantanamo Bay
    default:
      return kCountryIDUnknown;
  }
}

int GetCurrentCountryID() {
  GEOID geo_id = GetUserGeoID(GEOCLASS_NATION);

  return GeoIDToCountryID(geo_id);
}

#elif defined(OS_MACOSX)

int GetCurrentCountryID() {
  base::mac::ScopedCFTypeRef<CFLocaleRef> locale(CFLocaleCopyCurrent());
  CFStringRef country = (CFStringRef)CFLocaleGetValue(locale.get(),
                                                      kCFLocaleCountryCode);
  if (!country)
    return kCountryIDUnknown;

  UniChar isobuf[2];
  CFRange char_range = CFRangeMake(0, 2);
  CFStringGetCharacters(country, char_range, isobuf);

  return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]),
                                           static_cast<char>(isobuf[1]));
}

#elif defined(OS_POSIX)

int GetCurrentCountryID() {
  const char* locale = setlocale(LC_MESSAGES, NULL);

  if (!locale)
    return kCountryIDUnknown;

  // The format of a locale name is:
  // language[_territory][.codeset][@modifier], where territory is an ISO 3166
  // country code, which is what we want.
  std::string locale_str(locale);
  size_t begin = locale_str.find('_');
  if (begin == std::string::npos || locale_str.size() - begin < 3)
    return kCountryIDUnknown;

  ++begin;
  size_t end = locale_str.find_first_of(".@", begin);
  if (end == std::string::npos)
    end = locale_str.size();

  // The territory part must contain exactly two characters.
  if (end - begin == 2) {
    return CountryCharsToCountryIDWithUpdate(
        base::ToUpperASCII(locale_str[begin]),
        base::ToUpperASCII(locale_str[begin + 1]));
  }

  return kCountryIDUnknown;
}

#endif  // OS_*

int GetCountryIDFromPrefs(PrefService* prefs) {
  // See if the user overrode the country on the command line.
  const std::string country(
      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
          switches::kCountry));
  if (country.length() == 2)
    return CountryCharsToCountryIDWithUpdate(country[0], country[1]);

  // Cache first run Country ID value in prefs, and use it afterwards.  This
  // ensures that just because the user moves around, we won't automatically
  // make major changes to their available search providers, which would feel
  // surprising.
  if (!prefs)
    return GetCurrentCountryID();

  int new_country_id = GetCurrentCountryID();
#if defined(OS_WIN)
  // Migrate the old platform-specific value if it's present.
  if (prefs->HasPrefPath(prefs::kGeoIDAtInstall)) {
    int geo_id = prefs->GetInteger(prefs::kGeoIDAtInstall);
    prefs->ClearPref(prefs::kGeoIDAtInstall);
    new_country_id = GeoIDToCountryID(geo_id);
  }
#endif

  if (!prefs->HasPrefPath(prefs::kCountryIDAtInstall))
    prefs->SetInteger(prefs::kCountryIDAtInstall, new_country_id);

  return prefs->GetInteger(prefs::kCountryIDAtInstall);
}

void GetPrepopulationSetFromCountryID(PrefService* prefs,
                                      const PrepopulatedEngine*** engines,
                                      size_t* num_engines) {
  // NOTE: This function should ALWAYS set its outparams.

  // If you add a new country make sure to update the unit test for coverage.
  switch (GetCountryIDFromPrefs(prefs)) {

#define CHAR_A 'A'
#define CHAR_B 'B'
#define CHAR_C 'C'
#define CHAR_D 'D'
#define CHAR_E 'E'
#define CHAR_F 'F'
#define CHAR_G 'G'
#define CHAR_H 'H'
#define CHAR_I 'I'
#define CHAR_J 'J'
#define CHAR_K 'K'
#define CHAR_L 'L'
#define CHAR_M 'M'
#define CHAR_N 'N'
#define CHAR_O 'O'
#define CHAR_P 'P'
#define CHAR_Q 'Q'
#define CHAR_R 'R'
#define CHAR_S 'S'
#define CHAR_T 'T'
#define CHAR_U 'U'
#define CHAR_V 'V'
#define CHAR_W 'W'
#define CHAR_X 'X'
#define CHAR_Y 'Y'
#define CHAR_Z 'Z'
#define CHAR(ch) CHAR_##ch
#define CODE_TO_ID(code1, code2)\
    (CHAR(code1) << 8 | CHAR(code2))

#define UNHANDLED_COUNTRY(code1, code2)\
    case CODE_TO_ID(code1, code2):
#define END_UNHANDLED_COUNTRIES(code1, code2)\
      *engines = engines_##code1##code2;\
      *num_engines = arraysize(engines_##code1##code2);\
      return;
#define DECLARE_COUNTRY(code1, code2)\
    UNHANDLED_COUNTRY(code1, code2)\
    END_UNHANDLED_COUNTRIES(code1, code2)

    // Countries with their own, dedicated engine set.
    DECLARE_COUNTRY(A, E)  // United Arab Emirates
    DECLARE_COUNTRY(A, L)  // Albania
    DECLARE_COUNTRY(A, R)  // Argentina
    DECLARE_COUNTRY(A, T)  // Austria
    DECLARE_COUNTRY(A, U)  // Australia
    DECLARE_COUNTRY(B, A)  // Bosnia and Herzegovina
    DECLARE_COUNTRY(B, E)  // Belgium
    DECLARE_COUNTRY(B, G)  // Bulgaria
    DECLARE_COUNTRY(B, H)  // Bahrain
    DECLARE_COUNTRY(B, I)  // Burundi
    DECLARE_COUNTRY(B, N)  // Brunei
    DECLARE_COUNTRY(B, O)  // Bolivia
    DECLARE_COUNTRY(B, R)  // Brazil
    DECLARE_COUNTRY(B, Y)  // Belarus
    DECLARE_COUNTRY(B, Z)  // Belize
    DECLARE_COUNTRY(C, A)  // Canada
    DECLARE_COUNTRY(C, H)  // Switzerland
    DECLARE_COUNTRY(C, L)  // Chile
    DECLARE_COUNTRY(C, N)  // China
    DECLARE_COUNTRY(C, O)  // Colombia
    DECLARE_COUNTRY(C, R)  // Costa Rica
    DECLARE_COUNTRY(C, Z)  // Czech Republic
    DECLARE_COUNTRY(D, E)  // Germany
    DECLARE_COUNTRY(D, K)  // Denmark
    DECLARE_COUNTRY(D, O)  // Dominican Republic
    DECLARE_COUNTRY(D, Z)  // Algeria
    DECLARE_COUNTRY(E, C)  // Ecuador
    DECLARE_COUNTRY(E, E)  // Estonia
    DECLARE_COUNTRY(E, G)  // Egypt
    DECLARE_COUNTRY(E, S)  // Spain
    DECLARE_COUNTRY(F, I)  // Finland
    DECLARE_COUNTRY(F, O)  // Faroe Islands
    DECLARE_COUNTRY(F, R)  // France
    DECLARE_COUNTRY(G, B)  // United Kingdom
    DECLARE_COUNTRY(G, R)  // Greece
    DECLARE_COUNTRY(G, T)  // Guatemala
    DECLARE_COUNTRY(H, K)  // Hong Kong
    DECLARE_COUNTRY(H, N)  // Honduras
    DECLARE_COUNTRY(H, R)  // Croatia
    DECLARE_COUNTRY(H, U)  // Hungary
    DECLARE_COUNTRY(I, D)  // Indonesia
    DECLARE_COUNTRY(I, E)  // Ireland
    DECLARE_COUNTRY(I, L)  // Israel
    DECLARE_COUNTRY(I, N)  // India
    DECLARE_COUNTRY(I, Q)  // Iraq
    DECLARE_COUNTRY(I, R)  // Iran
    DECLARE_COUNTRY(I, S)  // Iceland
    DECLARE_COUNTRY(I, T)  // Italy
    DECLARE_COUNTRY(J, M)  // Jamaica
    DECLARE_COUNTRY(J, O)  // Jordan
    DECLARE_COUNTRY(J, P)  // Japan
    DECLARE_COUNTRY(K, E)  // Kenya
    DECLARE_COUNTRY(K, R)  // South Korea
    DECLARE_COUNTRY(K, W)  // Kuwait
    DECLARE_COUNTRY(K, Z)  // Kazakhstan
    DECLARE_COUNTRY(L, B)  // Lebanon
    DECLARE_COUNTRY(L, I)  // Liechtenstein
    DECLARE_COUNTRY(L, T)  // Lithuania
    DECLARE_COUNTRY(L, U)  // Luxembourg
    DECLARE_COUNTRY(L, V)  // Latvia
    DECLARE_COUNTRY(L, Y)  // Libya
    DECLARE_COUNTRY(M, A)  // Morocco
    DECLARE_COUNTRY(M, C)  // Monaco
    DECLARE_COUNTRY(M, D)  // Moldova
    DECLARE_COUNTRY(M, E)  // Montenegro
    DECLARE_COUNTRY(M, K)  // Macedonia
    DECLARE_COUNTRY(M, X)  // Mexico
    DECLARE_COUNTRY(M, Y)  // Malaysia
    DECLARE_COUNTRY(N, I)  // Nicaragua
    DECLARE_COUNTRY(N, L)  // Netherlands
    DECLARE_COUNTRY(N, O)  // Norway
    DECLARE_COUNTRY(N, Z)  // New Zealand
    DECLARE_COUNTRY(O, M)  // Oman
    DECLARE_COUNTRY(P, A)  // Panama
    DECLARE_COUNTRY(P, E)  // Peru
    DECLARE_COUNTRY(P, H)  // Philippines
    DECLARE_COUNTRY(P, K)  // Pakistan
    DECLARE_COUNTRY(P, L)  // Poland
    DECLARE_COUNTRY(P, R)  // Puerto Rico
    DECLARE_COUNTRY(P, T)  // Portugal
    DECLARE_COUNTRY(P, Y)  // Paraguay
    DECLARE_COUNTRY(Q, A)  // Qatar
    DECLARE_COUNTRY(R, O)  // Romania
    DECLARE_COUNTRY(R, S)  // Serbia
    DECLARE_COUNTRY(R, U)  // Russia
    DECLARE_COUNTRY(R, W)  // Rwanda
    DECLARE_COUNTRY(S, A)  // Saudi Arabia
    DECLARE_COUNTRY(S, E)  // Sweden
    DECLARE_COUNTRY(S, G)  // Singapore
    DECLARE_COUNTRY(S, I)  // Slovenia
    DECLARE_COUNTRY(S, K)  // Slovakia
    DECLARE_COUNTRY(S, V)  // El Salvador
    DECLARE_COUNTRY(S, Y)  // Syria
    DECLARE_COUNTRY(T, H)  // Thailand
    DECLARE_COUNTRY(T, N)  // Tunisia
    DECLARE_COUNTRY(T, R)  // Turkey
    DECLARE_COUNTRY(T, T)  // Trinidad and Tobago
    DECLARE_COUNTRY(T, W)  // Taiwan
    DECLARE_COUNTRY(T, Z)  // Tanzania
    DECLARE_COUNTRY(U, A)  // Ukraine
    DECLARE_COUNTRY(U, S)  // United States
    DECLARE_COUNTRY(U, Y)  // Uruguay
    DECLARE_COUNTRY(V, E)  // Venezuela
    DECLARE_COUNTRY(V, N)  // Vietnam
    DECLARE_COUNTRY(Y, E)  // Yemen
    DECLARE_COUNTRY(Z, A)  // South Africa
    DECLARE_COUNTRY(Z, W)  // Zimbabwe

    // Countries using the "Australia" engine set.
    UNHANDLED_COUNTRY(C, C)  // Cocos Islands
    UNHANDLED_COUNTRY(C, X)  // Christmas Island
    UNHANDLED_COUNTRY(H, M)  // Heard Island and McDonald Islands
    UNHANDLED_COUNTRY(N, F)  // Norfolk Island
    END_UNHANDLED_COUNTRIES(A, U)

    // Countries using the "China" engine set.
    UNHANDLED_COUNTRY(M, O)  // Macao
    END_UNHANDLED_COUNTRIES(C, N)

    // Countries using the "Denmark" engine set.
    UNHANDLED_COUNTRY(G, L)  // Greenland
    END_UNHANDLED_COUNTRIES(D, K)

    // Countries using the "Spain" engine set.
    UNHANDLED_COUNTRY(A, D)  // Andorra
    END_UNHANDLED_COUNTRIES(E, S)

    // Countries using the "Finland" engine set.
    UNHANDLED_COUNTRY(A, X)  // Aland Islands
    END_UNHANDLED_COUNTRIES(F, I)

    // Countries using the "France" engine set.
    UNHANDLED_COUNTRY(B, F)  // Burkina Faso
    UNHANDLED_COUNTRY(B, J)  // Benin
    UNHANDLED_COUNTRY(C, D)  // Congo - Kinshasa
    UNHANDLED_COUNTRY(C, F)  // Central African Republic
    UNHANDLED_COUNTRY(C, G)  // Congo - Brazzaville
    UNHANDLED_COUNTRY(C, I)  // Ivory Coast
    UNHANDLED_COUNTRY(C, M)  // Cameroon
    UNHANDLED_COUNTRY(D, J)  // Djibouti
    UNHANDLED_COUNTRY(G, A)  // Gabon
    UNHANDLED_COUNTRY(G, F)  // French Guiana
    UNHANDLED_COUNTRY(G, N)  // Guinea
    UNHANDLED_COUNTRY(G, P)  // Guadeloupe
    UNHANDLED_COUNTRY(H, T)  // Haiti
#if defined(OS_WIN)
    UNHANDLED_COUNTRY(I, P)  // Clipperton Island ('IP' is an WinXP-ism; ISO
                             //                    includes it with France)
#endif
    UNHANDLED_COUNTRY(M, L)  // Mali
    UNHANDLED_COUNTRY(M, Q)  // Martinique
    UNHANDLED_COUNTRY(N, C)  // New Caledonia
    UNHANDLED_COUNTRY(N, E)  // Niger
    UNHANDLED_COUNTRY(P, F)  // French Polynesia
    UNHANDLED_COUNTRY(P, M)  // Saint Pierre and Miquelon
    UNHANDLED_COUNTRY(R, E)  // Reunion
    UNHANDLED_COUNTRY(S, N)  // Senegal
    UNHANDLED_COUNTRY(T, D)  // Chad
    UNHANDLED_COUNTRY(T, F)  // French Southern Territories
    UNHANDLED_COUNTRY(T, G)  // Togo
    UNHANDLED_COUNTRY(W, F)  // Wallis and Futuna
    UNHANDLED_COUNTRY(Y, T)  // Mayotte
    END_UNHANDLED_COUNTRIES(F, R)

    // Countries using the "Greece" engine set.
    UNHANDLED_COUNTRY(C, Y)  // Cyprus
    END_UNHANDLED_COUNTRIES(G, R)

    // Countries using the "Italy" engine set.
    UNHANDLED_COUNTRY(S, M)  // San Marino
    UNHANDLED_COUNTRY(V, A)  // Vatican
    END_UNHANDLED_COUNTRIES(I, T)

    // Countries using the "Morocco" engine set.
    UNHANDLED_COUNTRY(E, H)  // Western Sahara
    END_UNHANDLED_COUNTRIES(M, A)

    // Countries using the "Netherlands" engine set.
    UNHANDLED_COUNTRY(A, N)  // Netherlands Antilles
    UNHANDLED_COUNTRY(A, W)  // Aruba
    END_UNHANDLED_COUNTRIES(N, L)

    // Countries using the "Norway" engine set.
    UNHANDLED_COUNTRY(B, V)  // Bouvet Island
    UNHANDLED_COUNTRY(S, J)  // Svalbard and Jan Mayen
    END_UNHANDLED_COUNTRIES(N, O)

    // Countries using the "New Zealand" engine set.
    UNHANDLED_COUNTRY(C, K)  // Cook Islands
    UNHANDLED_COUNTRY(N, U)  // Niue
    UNHANDLED_COUNTRY(T, K)  // Tokelau
    END_UNHANDLED_COUNTRIES(N, Z)

    // Countries using the "Portugal" engine set.
    UNHANDLED_COUNTRY(C, V)  // Cape Verde
    UNHANDLED_COUNTRY(G, W)  // Guinea-Bissau
    UNHANDLED_COUNTRY(M, Z)  // Mozambique
    UNHANDLED_COUNTRY(S, T)  // Sao Tome and Principe
    UNHANDLED_COUNTRY(T, L)  // Timor-Leste
    END_UNHANDLED_COUNTRIES(P, T)

    // Countries using the "Russia" engine set.
    UNHANDLED_COUNTRY(A, M)  // Armenia
    UNHANDLED_COUNTRY(A, Z)  // Azerbaijan
    UNHANDLED_COUNTRY(K, G)  // Kyrgyzstan
    UNHANDLED_COUNTRY(T, J)  // Tajikistan
    UNHANDLED_COUNTRY(T, M)  // Turkmenistan
    UNHANDLED_COUNTRY(U, Z)  // Uzbekistan
    END_UNHANDLED_COUNTRIES(R, U)

    // Countries using the "Saudi Arabia" engine set.
    UNHANDLED_COUNTRY(M, R)  // Mauritania
    UNHANDLED_COUNTRY(P, S)  // Palestinian Territory
    UNHANDLED_COUNTRY(S, D)  // Sudan
    END_UNHANDLED_COUNTRIES(S, A)

    // Countries using the "United Kingdom" engine set.
    UNHANDLED_COUNTRY(B, M)  // Bermuda
    UNHANDLED_COUNTRY(F, K)  // Falkland Islands
    UNHANDLED_COUNTRY(G, G)  // Guernsey
    UNHANDLED_COUNTRY(G, I)  // Gibraltar
    UNHANDLED_COUNTRY(G, S)  // South Georgia and the South Sandwich
                             //   Islands
    UNHANDLED_COUNTRY(I, M)  // Isle of Man
    UNHANDLED_COUNTRY(I, O)  // British Indian Ocean Territory
    UNHANDLED_COUNTRY(J, E)  // Jersey
    UNHANDLED_COUNTRY(K, Y)  // Cayman Islands
    UNHANDLED_COUNTRY(M, S)  // Montserrat
    UNHANDLED_COUNTRY(M, T)  // Malta
    UNHANDLED_COUNTRY(P, N)  // Pitcairn Islands
    UNHANDLED_COUNTRY(S, H)  // Saint Helena, Ascension Island, and Tristan da
                             //   Cunha
    UNHANDLED_COUNTRY(T, C)  // Turks and Caicos Islands
    UNHANDLED_COUNTRY(V, G)  // British Virgin Islands
    END_UNHANDLED_COUNTRIES(G, B)

    // Countries using the "United States" engine set.
    UNHANDLED_COUNTRY(A, S)  // American Samoa
    UNHANDLED_COUNTRY(G, U)  // Guam
    UNHANDLED_COUNTRY(M, P)  // Northern Mariana Islands
    UNHANDLED_COUNTRY(U, M)  // U.S. Minor Outlying Islands
    UNHANDLED_COUNTRY(V, I)  // U.S. Virgin Islands
    END_UNHANDLED_COUNTRIES(U, S)

    // Countries using the "default" engine set.
    UNHANDLED_COUNTRY(A, F)  // Afghanistan
    UNHANDLED_COUNTRY(A, G)  // Antigua and Barbuda
    UNHANDLED_COUNTRY(A, I)  // Anguilla
    UNHANDLED_COUNTRY(A, O)  // Angola
    UNHANDLED_COUNTRY(A, Q)  // Antarctica
    UNHANDLED_COUNTRY(B, B)  // Barbados
    UNHANDLED_COUNTRY(B, D)  // Bangladesh
    UNHANDLED_COUNTRY(B, S)  // Bahamas
    UNHANDLED_COUNTRY(B, T)  // Bhutan
    UNHANDLED_COUNTRY(B, W)  // Botswana
    UNHANDLED_COUNTRY(C, U)  // Cuba
    UNHANDLED_COUNTRY(D, M)  // Dominica
    UNHANDLED_COUNTRY(E, R)  // Eritrea
    UNHANDLED_COUNTRY(E, T)  // Ethiopia
    UNHANDLED_COUNTRY(F, J)  // Fiji
    UNHANDLED_COUNTRY(F, M)  // Micronesia
    UNHANDLED_COUNTRY(G, D)  // Grenada
    UNHANDLED_COUNTRY(G, E)  // Georgia
    UNHANDLED_COUNTRY(G, H)  // Ghana
    UNHANDLED_COUNTRY(G, M)  // Gambia
    UNHANDLED_COUNTRY(G, Q)  // Equatorial Guinea
    UNHANDLED_COUNTRY(G, Y)  // Guyana
    UNHANDLED_COUNTRY(K, H)  // Cambodia
    UNHANDLED_COUNTRY(K, I)  // Kiribati
    UNHANDLED_COUNTRY(K, M)  // Comoros
    UNHANDLED_COUNTRY(K, N)  // Saint Kitts and Nevis
    UNHANDLED_COUNTRY(K, P)  // North Korea
    UNHANDLED_COUNTRY(L, A)  // Laos
    UNHANDLED_COUNTRY(L, C)  // Saint Lucia
    UNHANDLED_COUNTRY(L, K)  // Sri Lanka
    UNHANDLED_COUNTRY(L, R)  // Liberia
    UNHANDLED_COUNTRY(L, S)  // Lesotho
    UNHANDLED_COUNTRY(M, G)  // Madagascar
    UNHANDLED_COUNTRY(M, H)  // Marshall Islands
    UNHANDLED_COUNTRY(M, M)  // Myanmar
    UNHANDLED_COUNTRY(M, N)  // Mongolia
    UNHANDLED_COUNTRY(M, U)  // Mauritius
    UNHANDLED_COUNTRY(M, V)  // Maldives
    UNHANDLED_COUNTRY(M, W)  // Malawi
    UNHANDLED_COUNTRY(N, A)  // Namibia
    UNHANDLED_COUNTRY(N, G)  // Nigeria
    UNHANDLED_COUNTRY(N, P)  // Nepal
    UNHANDLED_COUNTRY(N, R)  // Nauru
    UNHANDLED_COUNTRY(P, G)  // Papua New Guinea
    UNHANDLED_COUNTRY(P, W)  // Palau
    UNHANDLED_COUNTRY(S, B)  // Solomon Islands
    UNHANDLED_COUNTRY(S, C)  // Seychelles
    UNHANDLED_COUNTRY(S, L)  // Sierra Leone
    UNHANDLED_COUNTRY(S, O)  // Somalia
    UNHANDLED_COUNTRY(S, R)  // Suriname
    UNHANDLED_COUNTRY(S, Z)  // Swaziland
    UNHANDLED_COUNTRY(T, O)  // Tonga
    UNHANDLED_COUNTRY(T, V)  // Tuvalu
    UNHANDLED_COUNTRY(U, G)  // Uganda
    UNHANDLED_COUNTRY(V, C)  // Saint Vincent and the Grenadines
    UNHANDLED_COUNTRY(V, U)  // Vanuatu
    UNHANDLED_COUNTRY(W, S)  // Samoa
    UNHANDLED_COUNTRY(Z, M)  // Zambia
    case kCountryIDUnknown:
    default:                // Unhandled location
    END_UNHANDLED_COUNTRIES(def, ault)
  }
}

}  // namespace

namespace TemplateURLPrepopulateData {

void RegisterUserPrefs(PrefService* prefs) {
  prefs->RegisterIntegerPref(prefs::kCountryIDAtInstall, kCountryIDUnknown);
  prefs->RegisterListPref(prefs::kSearchProviderOverrides);
  prefs->RegisterIntegerPref(prefs::kSearchProviderOverridesVersion, -1);
  // Obsolete pref, for migration.
  prefs->RegisterIntegerPref(prefs::kGeoIDAtInstall, -1);
}

int GetDataVersion(PrefService* prefs) {
  // Increment this if you change the above data in ways that mean users with
  // existing data should get a new version.
  const int kCurrentDataVersion = 33;
  if (!prefs)
    return kCurrentDataVersion;
  // If a version number exist in the preferences file, it overrides the
  // version of the built-in data.
  int version =
    prefs->GetInteger(prefs::kSearchProviderOverridesVersion);
  return (version >= 0) ? version : kCurrentDataVersion;
}

TemplateURL* MakePrepopulatedTemplateURL(const wchar_t* name,
                                         const wchar_t* keyword,
                                         const wchar_t* search_url,
                                         const char* favicon_url,
                                         const wchar_t* suggest_url,
                                         const wchar_t* instant_url,
                                         const char* encoding,
                                         SearchEngineType search_engine_type,
                                         int logo_id,
                                         int id) {
  TemplateURL* new_turl = new TemplateURL();
  new_turl->SetURL(WideToUTF8(search_url), 0, 0);
  if (favicon_url)
    new_turl->SetFaviconURL(GURL(favicon_url));
  if (suggest_url)
    new_turl->SetSuggestionsURL(WideToUTF8(suggest_url), 0, 0);
  if (instant_url)
    new_turl->SetInstantURL(WideToUTF8(instant_url), 0, 0);
  new_turl->set_short_name(WideToUTF16Hack(name));
  if (keyword == NULL)
    new_turl->set_autogenerate_keyword(true);
  else
    new_turl->set_keyword(WideToUTF16Hack(keyword));
  new_turl->set_show_in_default_list(true);
  new_turl->set_safe_for_autoreplace(true);
  new_turl->set_date_created(Time());
  std::vector<std::string> turl_encodings;
  turl_encodings.push_back(encoding);
  new_turl->set_input_encodings(turl_encodings);
  new_turl->set_search_engine_type(search_engine_type);
  new_turl->set_logo_id(logo_id);
  new_turl->set_prepopulate_id(id);
  return new_turl;
}

void GetPrepopulatedTemplateFromPrefs(PrefService* prefs,
                                      std::vector<TemplateURL*>* t_urls) {
  if (!prefs)
    return;

  const ListValue* list =
      prefs->GetList(prefs::kSearchProviderOverrides);
  if (!list)
    return;

  string16 name;
  string16 keyword;
  std::string search_url;
  std::string suggest_url;
  std::string instant_url;
  std::string favicon_url;
  std::string encoding;
  int search_engine_type;
  int logo_id;
  int id;

  size_t num_engines = list->GetSize();
  for (size_t i = 0; i != num_engines; ++i) {
    Value* val;
    DictionaryValue* engine;
    list->GetDictionary(i, &engine);
    if (engine->Get("name", &val) && val->GetAsString(&name) &&
        engine->Get("keyword", &val) && val->GetAsString(&keyword) &&
        engine->Get("search_url", &val) && val->GetAsString(&search_url) &&
        engine->Get("suggest_url", &val) && val->GetAsString(&suggest_url) &&
        engine->Get("instant_url", &val) && val->GetAsString(&instant_url) &&
        engine->Get("favicon_url", &val) && val->GetAsString(&favicon_url) &&
        engine->Get("encoding", &val) && val->GetAsString(&encoding) &&
        engine->Get("search_engine_type", &val) && val->GetAsInteger(
            &search_engine_type) &&
        engine->Get("logo_id", &val) && val->GetAsInteger(&logo_id) &&
        engine->Get("id", &val) && val->GetAsInteger(&id)) {
      // These next fields are not allowed to be empty.
      if (search_url.empty() || favicon_url.empty() || encoding.empty())
        return;
    } else {
      // Got a parsing error. No big deal.
      continue;
    }
    // TODO(viettrungluu): convert |MakePrepopulatedTemplateURL()| and get rid
    // of conversions.
    t_urls->push_back(MakePrepopulatedTemplateURL(
        UTF16ToWideHack(name).c_str(),
        UTF16ToWideHack(keyword).c_str(),
        UTF8ToWide(search_url).c_str(),
        favicon_url.c_str(),
        UTF8ToWide(suggest_url).c_str(),
        UTF8ToWide(instant_url).c_str(),
        encoding.c_str(),
        static_cast<SearchEngineType>(search_engine_type),
        logo_id,
        id));
  }
}

// The caller owns the returned TemplateURL.
TemplateURL* MakePrepopulateTemplateURLFromPrepopulateEngine(
    const PrepopulatedEngine& engine) {
  return MakePrepopulatedTemplateURL(engine.name,
                                     engine.keyword,
                                     engine.search_url,
                                     engine.favicon_url,
                                     engine.suggest_url,
                                     engine.instant_url,
                                     engine.encoding,
                                     engine.search_engine_type,
                                     engine.logo_id,
                                     engine.id);
}

void GetPrepopulatedEngines(PrefService* prefs,
                            std::vector<TemplateURL*>* t_urls,
                            size_t* default_search_provider_index) {
  // If there is a set of search engines in the preferences file, it overrides
  // the built-in set.
  *default_search_provider_index = 0;
  GetPrepopulatedTemplateFromPrefs(prefs, t_urls);
  if (!t_urls->empty())
    return;

  const PrepopulatedEngine** engines;
  size_t num_engines;
  GetPrepopulationSetFromCountryID(prefs, &engines, &num_engines);
  for (size_t i = 0; i != num_engines; ++i) {
    t_urls->push_back(
        MakePrepopulateTemplateURLFromPrepopulateEngine(*engines[i]));
  }
}

TemplateURL* GetPrepopulatedDefaultSearch(PrefService* prefs) {
  TemplateURL* default_search_provider = NULL;
  ScopedVector<TemplateURL> loaded_urls;
  size_t default_search_index;
  // This could be more efficient.  We are loading all the URLs to only keep
  // the first one.
  GetPrepopulatedEngines(prefs, &loaded_urls.get(), &default_search_index);
  if (default_search_index < loaded_urls.size()) {
    default_search_provider = loaded_urls[default_search_index];
    loaded_urls.weak_erase(loaded_urls.begin() + default_search_index);
  }
  return default_search_provider;
}

// Helper function for the templated function GetOriginForSearchURL.
static const std::string& ToUTF8(const std::string& str) {
  return str;
}

// Helper function for the templated function GetOriginForSearchURL.
static std::string ToUTF8(const wchar_t* str) {
  return WideToUTF8(str);
}

template<typename STR>
static GURL GetOriginForSearchURL(const STR& url_string) {
  // It is much faster to parse the url without generating the search URL, so
  // try that first.  If it fails, fallback to the slow method.
  std::string url_utf8_string(ToUTF8(url_string));
  GURL url(url_utf8_string);
  if (!url.is_valid()) {
    TemplateURL turl;
    turl.SetURL(url_utf8_string, 0, 0);

    UIThreadSearchTermsData search_terms_data;
    url = TemplateURLModel::GenerateSearchURLUsingTermsData(
        &turl, search_terms_data);
  }
  return url.GetOrigin();
}

TemplateURL* GetEngineForOrigin(PrefService* prefs, const GURL& url_to_find) {
  GURL origin_to_find = url_to_find.GetOrigin();

  // Let's first try to find the url in the defaults. (In case the name
  // of logo is different for the current locale versus others.)
  ScopedVector<TemplateURL> loaded_urls;
  size_t default_search_index;
  GetPrepopulatedEngines(prefs, &loaded_urls.get(), &default_search_index);

  UIThreadSearchTermsData search_terms_data;
  for (std::vector<TemplateURL*>::iterator i = loaded_urls->begin();
       i != loaded_urls->end(); ++i) {
    TemplateURL* template_url = *i;
    GURL engine_origin(GetOriginForSearchURL((*i)->url()->url()));
    if (origin_to_find == engine_origin) {
      loaded_urls.weak_erase(i);
      return template_url;
    }
  }

  // Let's try all of known engines now.
  for (size_t i = 0; i < arraysize(kAllEngines); ++i) {
    GURL engine_origin(GetOriginForSearchURL(kAllEngines[i]->search_url));
    if (origin_to_find == engine_origin)
      return MakePrepopulateTemplateURLFromPrepopulateEngine(*kAllEngines[i]);
  }
  return NULL;
}

int GetSearchEngineLogo(const GURL& url_to_find) {
  GURL origin_to_find = url_to_find.GetOrigin();
  for (size_t i = 0; i < arraysize(kAllEngines); ++i) {
    std::string url_utf8_string(ToUTF8(kAllEngines[i]->search_url));
    GURL url(url_utf8_string);
    if (origin_to_find == url.GetOrigin())
      return kAllEngines[i]->logo_id;
  }
  return kNoSearchEngineLogo;
}

}  // namespace TemplateURLPrepopulateData