Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Narvaez <dwnarvaez@gmail.com>2013-02-06 14:30:36 (GMT)
committer Daniel Narvaez <dwnarvaez@gmail.com>2013-02-06 14:30:36 (GMT)
commitf5bac2f1e1a51b83d215a07f9d5d87db337873f3 (patch)
tree15c5f594b1e00c6272552cc5544a1bc757713e34
parentc301ead6bb9c201801400964427b517dafb6a03c (diff)
Get the build to work
-rw-r--r--.gitignore1
-rw-r--r--Makefile147
-rw-r--r--apps/system/camera/index.html66
-rw-r--r--apps/system/camera/js/camera.js982
-rw-r--r--apps/system/camera/js/filmstrip.js568
-rw-r--r--apps/system/camera/locales/camera.ar.properties19
-rw-r--r--apps/system/camera/locales/camera.en-US.properties19
-rw-r--r--apps/system/camera/locales/camera.fr.properties19
-rw-r--r--apps/system/camera/locales/camera.zh-TW.properties20
-rw-r--r--apps/system/camera/locales/locales.ini11
-rw-r--r--apps/system/camera/resources/sounds/shutter.oggbin15807 -> 0 bytes
-rw-r--r--apps/system/camera/style/VideoPlayer.css152
-rw-r--r--apps/system/camera/style/camera.css314
-rw-r--r--apps/system/camera/style/filmstrip.css187
-rw-r--r--apps/system/camera/style/icons/60/Camera.pngbin5909 -> 0 bytes
-rw-r--r--apps/system/camera/style/icons/Camera.pngbin5909 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/camera.pngbin1654 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/delete.pngbin472 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/flash_auto.pngbin1880 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/flash_off.pngbin1613 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/flash_on.pngbin1673 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/flash_torch.pngbin1880 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/hud_button_underlay.pngbin548 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/hud_button_underlay_focus.pngbin954 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/play_overlay.pngbin2498 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/share.pngbin855 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/stop.pngbin3233 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/toggle_back.pngbin2106 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/toggle_front.pngbin2249 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/video_pause_button.pngbin1722 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/video_play_button.pngbin3862 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/video_play_focus.pngbin1373 -> 0 bytes
-rw-r--r--apps/system/camera/style/images/video_play_normal.pngbin1361 -> 0 bytes
-rw-r--r--apps/system/camera/test/unit/_proxy.html49
-rw-r--r--apps/system/camera/test/unit/_sandbox.html28
-rw-r--r--build/applications-data.js158
-rw-r--r--build/utils.js12
-rw-r--r--build/webapp-manifests.js84
-rw-r--r--shared/js/async_storage.js187
-rw-r--r--shared/js/blobview.js412
-rw-r--r--shared/js/custom_dialog.js112
-rw-r--r--shared/js/desktop.js115
-rw-r--r--shared/js/gesture_detector.js891
-rw-r--r--shared/js/idletimer.js127
-rw-r--r--shared/js/l10n.js1014
-rw-r--r--shared/js/l10n_date.js141
-rw-r--r--shared/js/manifest_helper.js26
-rw-r--r--shared/js/media/README1
-rw-r--r--shared/js/media/get_video_rotation.js143
-rw-r--r--shared/js/media/jpeg_metadata_parser.js314
-rw-r--r--shared/js/media/media_frame.js537
-rw-r--r--shared/js/media/video_player.js313
-rw-r--r--shared/js/mediadb.js1532
-rw-r--r--shared/js/mobile_operator.js96
-rw-r--r--shared/js/mouse_event_shim.js282
-rw-r--r--shared/js/notification_helper.js68
-rw-r--r--shared/js/phoneNumberJS/PhoneNumber.js335
-rw-r--r--shared/js/phoneNumberJS/PhoneNumberMetaData.js218
-rw-r--r--shared/js/phoneNumberJS/mcc_iso3166_table.js242
-rw-r--r--shared/js/settings_listener.js69
-rw-r--r--shared/js/simple_phone_matcher.js366
-rw-r--r--shared/js/tz_select.js155
-rw-r--r--shared/js/visibility_monitor.js494
-rw-r--r--shared/resources/apn.json3175
-rw-r--r--shared/resources/apn/README.md20
-rw-r--r--shared/resources/apn/apns_conf.xml13517
-rw-r--r--shared/resources/apn/apns_conf_local.xml20
-rw-r--r--shared/resources/apn/index.html54
-rw-r--r--shared/resources/apn/operator_variant.xml499
-rw-r--r--shared/resources/apn/query.js288
-rw-r--r--shared/resources/apn/service_providers.xml11021
-rw-r--r--shared/resources/branding/official/Browser.pngbin0 -> 10252 bytes
-rw-r--r--shared/resources/branding/official/about_logo.pngbin0 -> 31474 bytes
-rw-r--r--shared/resources/branding/official/initlogo.pngbin0 -> 617754 bytes
-rw-r--r--shared/resources/branding/official/logosmall.pngbin0 -> 9320 bytes
-rw-r--r--shared/resources/branding/official/powered.pngbin0 -> 617754 bytes
-rw-r--r--shared/resources/branding/official/privacy_sprite.pngbin0 -> 9897 bytes
-rw-r--r--shared/resources/branding/official/splash_screen_generic.pngbin0 -> 99450 bytes
-rw-r--r--shared/resources/branding/unofficial/Browser.pngbin0 -> 5861 bytes
-rw-r--r--shared/resources/branding/unofficial/about_logo.pngbin0 -> 25567 bytes
-rw-r--r--shared/resources/branding/unofficial/initlogo.pngbin0 -> 95166 bytes
-rw-r--r--shared/resources/branding/unofficial/logosmall.pngbin0 -> 5122 bytes
-rw-r--r--shared/resources/branding/unofficial/powered.pngbin0 -> 138815 bytes
-rw-r--r--shared/resources/branding/unofficial/privacy_sprite.pngbin0 -> 9450 bytes
-rw-r--r--shared/resources/branding/unofficial/splash_screen_generic.pngbin0 -> 97918 bytes
-rw-r--r--shared/resources/keyboard_layouts.json46
-rw-r--r--shared/resources/languages.json6
-rw-r--r--shared/resources/media/alarms/ac_classic_clock_alarm.opusbin0 -> 7512 bytes
-rw-r--r--shared/resources/media/alarms/ac_classic_clock_alarm_prog.opusbin0 -> 163092 bytes
-rw-r--r--shared/resources/media/alarms/ac_classic_clock_radio.opusbin0 -> 4960 bytes
-rw-r--r--shared/resources/media/alarms/ac_normal_gem_echoes.opusbin0 -> 103177 bytes
-rw-r--r--shared/resources/media/alarms/ac_normal_ringing_strings.opusbin0 -> 83977 bytes
-rw-r--r--shared/resources/media/alarms/ac_soft_humming_waves.opusbin0 -> 246457 bytes
-rw-r--r--shared/resources/media/alarms/ac_soft_into_the_void.opusbin0 -> 104433 bytes
-rw-r--r--shared/resources/media/alarms/ac_soft_smooth_strings.opusbin0 -> 97654 bytes
-rw-r--r--shared/resources/media/notifications/list.json15
-rw-r--r--shared/resources/media/notifications/notifier_bap.opusbin0 -> 923 bytes
-rw-r--r--shared/resources/media/notifications/notifier_bell.opusbin0 -> 9790 bytes
-rw-r--r--shared/resources/media/notifications/notifier_bell_extd.opusbin0 -> 9754 bytes
-rw-r--r--shared/resources/media/notifications/notifier_boomer.opusbin0 -> 5543 bytes
-rw-r--r--shared/resources/media/notifications/notifier_bop.opusbin0 -> 880 bytes
-rw-r--r--shared/resources/media/notifications/notifier_dididi.opusbin0 -> 1784 bytes
-rw-r--r--shared/resources/media/notifications/notifier_exclamation.oggbin0 -> 14625 bytes
-rw-r--r--shared/resources/media/notifications/notifier_minimal_bands.oggbin0 -> 34604 bytes
-rw-r--r--shared/resources/media/notifications/notifier_rewind.oggbin0 -> 11265 bytes
-rw-r--r--shared/resources/media/notifications/notifier_ring.oggbin0 -> 11028 bytes
-rw-r--r--shared/resources/media/notifications/notifier_spring.oggbin0 -> 15475 bytes
-rw-r--r--shared/resources/media/notifications/notifier_ting.opusbin0 -> 3289 bytes
-rw-r--r--shared/resources/media/ringtones/list.json17
-rw-r--r--shared/resources/media/ringtones/ringer_bitbounce.opusbin0 -> 64069 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_classic_courier.opusbin0 -> 31194 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_classic_electric.oggbin0 -> 40822 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_classic_prism.oggbin0 -> 40427 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_classic_touchmatic.opusbin0 -> 15844 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_classic_wallphone.oggbin0 -> 45896 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_digital_dapple.opusbin0 -> 89909 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_digitalascent.opusbin0 -> 166171 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_loud_windchimes.opusbin0 -> 65252 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_low_bit_swing.opusbin0 -> 49118 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_progressive_dapple.opusbin0 -> 258206 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_rain_echoes.opusbin0 -> 34598 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_ringing_gems.opusbin0 -> 41378 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_soft_disco_drive.opusbin0 -> 190652 bytes
-rw-r--r--shared/resources/media/ringtones/ringer_vamos_la_elektro.opusbin0 -> 306026 bytes
-rw-r--r--shared/resources/tz.json484
-rw-r--r--shared/style/README.md118
-rw-r--r--shared/style/action_menu.css151
-rw-r--r--shared/style/action_menu/images/ui/alpha.pngbin0 -> 993 bytes
-rw-r--r--shared/style/action_menu/images/ui/default.pngbin0 -> 1014 bytes
-rw-r--r--shared/style/action_menu/images/ui/gradient.png (copied from apps/system/camera/style/images/ui/gradient.png)bin3713 -> 3713 bytes
-rw-r--r--shared/style/action_menu/images/ui/pattern.png (copied from apps/system/camera/style/images/ui/pattern.png)bin6851 -> 6851 bytes
-rw-r--r--shared/style/action_menu/index.html39
-rw-r--r--shared/style/buttons.css230
-rw-r--r--shared/style/buttons/images/icons/dialog.pngbin0 -> 1167 bytes
-rw-r--r--shared/style/buttons/images/icons/view.pngbin0 -> 1235 bytes
-rw-r--r--shared/style/buttons/images/ui/danger-disabled.pngbin0 -> 1020 bytes
-rw-r--r--shared/style/buttons/images/ui/danger-press.pngbin0 -> 1015 bytes
-rw-r--r--shared/style/buttons/images/ui/danger.pngbin0 -> 1031 bytes
-rw-r--r--shared/style/buttons/images/ui/default.pngbin0 -> 1014 bytes
-rw-r--r--shared/style/buttons/images/ui/disabled.pngbin0 -> 1013 bytes
-rw-r--r--shared/style/buttons/images/ui/recommend.pngbin0 -> 1020 bytes
-rw-r--r--shared/style/buttons/images/ui/shadow.pngbin0 -> 146 bytes
-rw-r--r--shared/style/buttons/index.html126
-rw-r--r--shared/style/confirm.css184
-rw-r--r--shared/style/confirm/content.html48
-rw-r--r--shared/style/confirm/images/ui/danger-disabled.pngbin0 -> 1020 bytes
-rw-r--r--shared/style/confirm/images/ui/danger-press.pngbin0 -> 1015 bytes
-rw-r--r--shared/style/confirm/images/ui/danger.pngbin0 -> 1031 bytes
-rw-r--r--shared/style/confirm/images/ui/default.pngbin0 -> 1014 bytes
-rw-r--r--shared/style/confirm/images/ui/disabled.pngbin0 -> 1013 bytes
-rw-r--r--shared/style/confirm/images/ui/gradient.png (copied from apps/system/camera/style/images/ui/gradient.png)bin3713 -> 3713 bytes
-rw-r--r--shared/style/confirm/images/ui/pattern.png (copied from apps/system/camera/style/images/ui/pattern.png)bin6851 -> 6851 bytes
-rw-r--r--shared/style/confirm/images/ui/recommend.pngbin0 -> 1020 bytes
-rw-r--r--shared/style/confirm/index.html43
-rw-r--r--shared/style/confirm/long_content.html43
-rw-r--r--shared/style/confirm/no_title.html42
-rw-r--r--shared/style/edit_mode.css238
-rw-r--r--shared/style/edit_mode/images/icons/close.pngbin0 -> 1434 bytes
-rw-r--r--shared/style/edit_mode/images/ui/alpha.pngbin0 -> 73 bytes
-rw-r--r--shared/style/edit_mode/images/ui/danger-disabled.pngbin0 -> 1020 bytes
-rw-r--r--shared/style/edit_mode/images/ui/danger-press.pngbin0 -> 1015 bytes
-rw-r--r--shared/style/edit_mode/images/ui/danger.pngbin0 -> 1031 bytes
-rw-r--r--shared/style/edit_mode/images/ui/default.pngbin0 -> 1014 bytes
-rw-r--r--shared/style/edit_mode/images/ui/disabled.pngbin0 -> 102 bytes
-rw-r--r--shared/style/edit_mode/images/ui/recommend.pngbin0 -> 1020 bytes
-rw-r--r--shared/style/edit_mode/images/ui/separator-large.pngbin0 -> 143 bytes
-rw-r--r--shared/style/edit_mode/images/ui/separator.pngbin0 -> 142 bytes
-rw-r--r--shared/style/edit_mode/images/ui/shadow.pngbin0 -> 76 bytes
-rw-r--r--shared/style/edit_mode/index.html48
-rw-r--r--shared/style/headers.css381
-rw-r--r--shared/style/headers/images/icons/add.png (copied from apps/system/camera/style/images/video.png)bin1360 -> 1335 bytes
-rw-r--r--shared/style/headers/images/icons/back-rtl.png (copied from apps/system/camera/style/images/video.png)bin1360 -> 1335 bytes
-rw-r--r--shared/style/headers/images/icons/back.png (renamed from apps/system/camera/style/images/video.png)bin1360 -> 1372 bytes
-rw-r--r--shared/style/headers/images/icons/clear.pngbin0 -> 3278 bytes
-rw-r--r--shared/style/headers/images/icons/close.png (copied from apps/system/camera/style/images/actionicon_cancel.png)bin1423 -> 1423 bytes
-rw-r--r--shared/style/headers/images/icons/compose.pngbin0 -> 1577 bytes
-rw-r--r--shared/style/headers/images/icons/edit.pngbin0 -> 1612 bytes
-rw-r--r--shared/style/headers/images/icons/menu.png (renamed from apps/system/camera/style/images/grid.png)bin1127 -> 1161 bytes
-rw-r--r--shared/style/headers/images/icons/reply-all.pngbin0 -> 1572 bytes
-rw-r--r--shared/style/headers/images/icons/reply.pngbin0 -> 1605 bytes
-rw-r--r--shared/style/headers/images/icons/send.png (copied from apps/system/camera/style/images/actionicon_cancel.png)bin1423 -> 1475 bytes
-rw-r--r--shared/style/headers/images/icons/user.png (renamed from apps/system/camera/style/images/actionicon_cancel.png)bin1423 -> 1498 bytes
-rw-r--r--shared/style/headers/images/ui/dark/header.pngbin0 -> 2849 bytes
-rw-r--r--shared/style/headers/images/ui/dark/negative.pngbin0 -> 2797 bytes
-rw-r--r--shared/style/headers/images/ui/dark/separator.pngbin0 -> 168 bytes
-rw-r--r--shared/style/headers/images/ui/dark/subheader.pngbin0 -> 90 bytes
-rw-r--r--shared/style/headers/images/ui/header.pngbin0 -> 149 bytes
-rw-r--r--shared/style/headers/images/ui/negative.pngbin0 -> 114 bytes
-rw-r--r--shared/style/headers/images/ui/organic/header.pngbin0 -> 94 bytes
-rw-r--r--shared/style/headers/images/ui/organic/negative.pngbin0 -> 73 bytes
-rw-r--r--shared/style/headers/images/ui/organic/pattern.pngbin0 -> 1852 bytes
-rw-r--r--shared/style/headers/images/ui/organic/separator.pngbin0 -> 168 bytes
-rw-r--r--shared/style/headers/images/ui/organic/subheader.pngbin0 -> 828 bytes
-rw-r--r--shared/style/headers/images/ui/overlay/header.pngbin0 -> 73 bytes
-rw-r--r--shared/style/headers/images/ui/overlay/separator.pngbin0 -> 142 bytes
-rw-r--r--shared/style/headers/images/ui/search.pngbin0 -> 92 bytes
-rw-r--r--shared/style/headers/images/ui/separator-large.pngbin0 -> 143 bytes
-rw-r--r--shared/style/headers/images/ui/separator.pngbin0 -> 175 bytes
-rw-r--r--shared/style/headers/images/ui/shadow.pngbin0 -> 76 bytes
-rw-r--r--shared/style/headers/images/ui/subheader.pngbin0 -> 73 bytes
-rw-r--r--shared/style/headers/index.html134
-rw-r--r--shared/style/input_areas.css309
-rw-r--r--shared/style/input_areas/images/icons/clear.pngbin0 -> 3278 bytes
-rw-r--r--shared/style/input_areas/images/ui/active.pngbin0 -> 956 bytes
-rw-r--r--shared/style/input_areas/images/ui/background.pngbin0 -> 936 bytes
-rw-r--r--shared/style/input_areas/images/ui/separator.pngbin0 -> 1000 bytes
-rw-r--r--shared/style/input_areas/images/ui/shadow-invert.pngbin0 -> 932 bytes
-rw-r--r--shared/style/input_areas/images/ui/shadow-search.pngbin0 -> 930 bytes
-rw-r--r--shared/style/input_areas/images/ui/shadow.pngbin0 -> 927 bytes
-rw-r--r--shared/style/input_areas/index.html123
-rw-r--r--shared/style/status.css43
-rw-r--r--shared/style/status/images/ui/gradient.png (renamed from apps/system/camera/style/images/ui/gradient.png)bin3713 -> 3713 bytes
-rw-r--r--shared/style/status/images/ui/pattern.png (renamed from apps/system/camera/style/images/ui/pattern.png)bin6851 -> 6851 bytes
-rw-r--r--shared/style/status/index.html35
-rw-r--r--shared/style/switches.css127
-rw-r--r--shared/style/switches/images/check/danger.pngbin0 -> 3689 bytes
-rw-r--r--shared/style/switches/images/check/default.pngbin0 -> 3726 bytes
-rw-r--r--shared/style/switches/images/radio/danger.pngbin0 -> 1589 bytes
-rw-r--r--shared/style/switches/images/radio/default.pngbin0 -> 1591 bytes
-rw-r--r--shared/style/switches/images/switch/background.pngbin0 -> 1015 bytes
-rw-r--r--shared/style/switches/images/switch/handler.pngbin0 -> 769 bytes
-rw-r--r--shared/style/switches/images/switch/icon.pngbin0 -> 2955 bytes
-rw-r--r--shared/style/switches/index.html89
223 files changed, 39907 insertions, 2832 deletions
diff --git a/.gitignore b/.gitignore
index 3bedf6b..ce9669c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
docs/*.html
+profile
diff --git a/Makefile b/Makefile
index a0a6cdb..6d8d6a0 100644
--- a/Makefile
+++ b/Makefile
@@ -49,46 +49,12 @@ endif
REPORTER?=Spec
-GAIA_APP_SRCDIRS?=apps test_apps showcase_apps
+GAIA_APP_SRCDIRS?=apps
GAIA_INSTALL_PARENT?=/data/local
ADB_REMOUNT?=0
GAIA_ALL_APP_SRCDIRS=$(GAIA_APP_SRCDIRS)
-ifeq ($(MAKECMDGOALS), demo)
-GAIA_DOMAIN=thisdomaindoesnotexist.org
-GAIA_APP_SRCDIRS=apps showcase_apps
-else ifeq ($(MAKECMDGOALS), dogfood)
-DOGFOOD=1
-PRODUCTION=1
-B2G_SYSTEM_APPS=1
-else ifeq ($(MAKECMDGOALS), production)
-PRODUCTION=1
-B2G_SYSTEM_APPS=1
-endif
-
-# PRODUCTION is also set for user and userdebug B2G builds
-ifeq ($(PRODUCTION), 1)
-GAIA_APP_SRCDIRS=apps
-ADB_REMOUNT=1
-endif
-
-ifeq ($(MAKECMDGOALS), dogfood)
-GAIA_APP_SRCDIRS=apps dogfood_apps
-endif
-
-ifeq ($(B2G_SYSTEM_APPS), 1)
-GAIA_INSTALL_PARENT=/system/b2g
-endif
-
-ifneq ($(GAIA_OUTOFTREE_APP_SRCDIRS),)
- $(shell mkdir -p outoftree_apps \
- $(foreach dir,$(GAIA_OUTOFTREE_APP_SRCDIRS),\
- $(foreach appdir,$(wildcard $(dir)/*),\
- && ln -sf $(appdir) outoftree_apps/)))
- GAIA_APP_SRCDIRS += outoftree_apps
-endif
-
GAIA_LOCALES_PATH?=locales
LOCALES_FILE?=shared/resources/languages.json
GAIA_LOCALE_SRCDIRS=shared $(GAIA_APP_SRCDIRS)
@@ -180,7 +146,7 @@ TEST_DIRS ?= $(CURDIR)/tests
# Generate profile/
-profile: multilocale applications-data preferences app-makefiles test-agent-config offline extensions profile/settings.json
+profile: multilocale applications-data preferences app-makefiles offline extensions profile/settings.json
@echo "Profile Ready: please run [b2g|firefox] -profile $(CURDIR)$(SEP)profile"
LANG=POSIX # Avoiding sort order differences between OSes
@@ -240,11 +206,8 @@ webapp-manifests:
@#cat profile/webapps/webapps.json
# Generate profile/webapps/APP/application.zip
-webapp-zip: stamp-commit-hash
+webapp-zip:
ifneq ($(DEBUG),1)
- @rm -rf apps/system/camera
- @cp -r apps/camera apps/system/camera
- @rm apps/system/camera/manifest.webapp
@mkdir -p profile/webapps
@$(call run-js-command, webapp-zip)
endif
@@ -357,96 +320,6 @@ common-install:
cd $(TEST_AGENT_DIR) && npm install .
-.PHONY: update-common
-update-common: common-install
- # integration tests
- rm -f tests/vendor/marionette.js
- cp $(TEST_AGENT_DIR)/node_modules/marionette-client/marionette.js tests/js/vendor/
-
- # common testing tools
- mkdir -p $(TEST_COMMON)/vendor/test-agent/
- mkdir -p $(TEST_COMMON)/vendor/chai/
- rm -Rf tools/xpcwindow
- rm -f $(TEST_COMMON)/vendor/test-agent/test-agent*.js
- rm -f $(TEST_COMMON)/vendor/chai/*.js
- cp -R $(TEST_AGENT_DIR)/node_modules/xpcwindow tools/xpcwindow
- rm -R tools/xpcwindow/vendor/
- cp $(TEST_AGENT_DIR)/node_modules/test-agent/test-agent.js $(TEST_COMMON)/vendor/test-agent/
- cp $(TEST_AGENT_DIR)/node_modules/test-agent/test-agent.css $(TEST_COMMON)/vendor/test-agent/
- cp $(TEST_AGENT_DIR)/node_modules/chai/chai.js $(TEST_COMMON)/vendor/chai/
-
-# Create the json config file
-# for use with the test agent GUI
-test-agent-config: test-agent-bootstrap-apps
- @rm -f $(TEST_AGENT_CONFIG)
- @touch $(TEST_AGENT_CONFIG)
- @rm -f /tmp/test-agent-config;
- @# Build json array of all test files
- @for d in ${GAIA_APP_SRCDIRS}; \
- do \
- find $$d -name '*_test.js' | sed "s:$$d/::g" >> /tmp/test-agent-config; \
- done;
- @echo '{"tests": [' >> $(TEST_AGENT_CONFIG)
- @cat /tmp/test-agent-config | \
- sed 's:\(.*\):"\1":' | \
- sed -e ':a' -e 'N' -e '$$!ba' -e 's/\n/,\
- /g' >> $(TEST_AGENT_CONFIG);
- @echo ' ]}' >> $(TEST_AGENT_CONFIG);
- @echo "Finished: test ui config file: $(TEST_AGENT_CONFIG)"
- @rm -f /tmp/test-agent-config
-
-.PHONY: test-agent-bootstrap-apps
-test-agent-bootstrap-apps:
- @for d in `find -L ${GAIA_APP_SRCDIRS} -mindepth 1 -maxdepth 1 -type d` ;\
- do \
- mkdir -p $$d/test/unit ; \
- mkdir -p $$d/test/integration ; \
- cp -f $(TEST_COMMON)/test/boilerplate/_proxy.html $$d/test/unit/_proxy.html; \
- cp -f $(TEST_COMMON)/test/boilerplate/_sandbox.html $$d/test/unit/_sandbox.html; \
- done
- @echo "Finished: bootstrapping test proxies/sandboxes";
-
-# Temp make file method until we can switch
-# over everything in test
-ifneq ($(strip $(APP)),)
-APP_TEST_LIST=$(shell find apps/$(APP)/test/unit -name '*_test.js')
-endif
-.PHONY: test-agent-test
-test-agent-test:
-ifneq ($(strip $(APP)),)
- @echo 'Running tests for $(APP)';
- @$(TEST_AGENT_DIR)/node_modules/test-agent/bin/js-test-agent test --reporter $(REPORTER) $(APP_TEST_LIST)
-else
- @echo 'Running all tests';
- @$(TEST_AGENT_DIR)/node_modules/test-agent/bin/js-test-agent test --reporter $(REPORTER)
-endif
-
-.PHONY: test-agent-server
-test-agent-server: common-install
- $(TEST_AGENT_DIR)/node_modules/test-agent/bin/js-test-agent server -c ./$(TEST_AGENT_DIR)/test-agent-server.js --http-path . --growl
-
-.PHONY: marionette
-marionette:
-#need the profile
- test -d $(GAIA)/profile || $(MAKE) profile
-ifneq ($(PYTHON_MAJOR), 2)
- @echo "Python 2.7.x is needed for the marionette client. You can set the PYTHON_27 variable to your python2.7 path." && exit 1
-endif
-ifneq ($(PYTHON_MINOR), 7)
- @echo "Python 2.7.x is needed for the marionette client. You can set the PYTHON_27 variable to your python2.7 path." && exit 1
-endif
-ifeq ($(strip $(MC_DIR)),)
- @echo "Please have the MC_DIR environment variable point to the top of your mozilla-central tree." && exit 1
-endif
-#if B2G_BIN is defined, we will run the b2g binary, otherwise, we assume an instance is running
-ifneq ($(strip $(B2G_BIN)),)
- cd $(MC_DIR)/testing/marionette/client/marionette && \
- sh venv_test.sh $(PYTHON_27) --address=$(MARIONETTE_HOST):$(MARIONETTE_PORT) --b2gbin=$(B2G_BIN) $(TEST_DIRS)
-else
- cd $(MC_DIR)/testing/marionette/client/marionette && \
- sh venv_test.sh $(PYTHON_27) --address=$(MARIONETTE_HOST):$(MARIONETTE_PORT) $(TEST_DIRS)
-endif
-
###############################################################################
# Utils #
###############################################################################
@@ -460,20 +333,6 @@ lint:
@gjslint --nojsdoc -r apps -e 'homescreen/everything.me,sms/js/ext,pdfjs/content,pdfjs/test,email/js/ext,music/js/ext,calendar/js/ext'
@gjslint --nojsdoc -r shared/js
-# Generate a text file containing the current changeset of Gaia
-# XXX I wonder if this should be a replace-in-file hack. This would let us
-# let us remove the update-offline-manifests target dependancy of the
-# default target.
-stamp-commit-hash:
- @(if [ -e gaia_commit_override.txt ]; then \
- cp gaia_commit_override.txt apps/settings/resources/gaia_commit.txt; \
- elif [ -d ./.git ]; then \
- git log -1 --format="%H%n%at" HEAD > apps/settings/resources/gaia_commit.txt; \
- else \
- echo 'Unknown Git commit; build date shown here.' > apps/settings/resources/gaia_commit.txt; \
- date +%s >> apps/settings/resources/gaia_commit.txt; \
- fi)
-
# Erase all the indexedDB databases on the phone, so apps have to rebuild them.
delete-databases:
@echo 'Stopping b2g'
diff --git a/apps/system/camera/index.html b/apps/system/camera/index.html
deleted file mode 100644
index c06bf41..0000000
--- a/apps/system/camera/index.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta charset="utf-8">
- <meta http-equiv="pragma" content="no-cache">
- <title>Camera</title>
- <link rel="resource" type="application/l10n" href="locales/locales.ini" />
- <link rel="resource" type="application/l10n" href="/shared/locales/date.ini" />
- <link type="text/css" rel="stylesheet" href="style/camera.css"/>
- <link type="text/css" rel="stylesheet" href="style/filmstrip.css"/>
- <link type="text/css" rel="stylesheet" href="style/VideoPlayer.css"/>
- </head>
- <body>
- <div id="focus-ring"></div>
- <video id="viewfinder" autoplay></video>
-
- <div id="hud">
- <a id="toggle-camera" class="hidden"></an>
- <a id="toggle-flash" class="hidden"></a>
- </div>
-
- <div id="controls">
- <a id="switch-button" name="Switch source" class="hidden" disabled="disabled"><span></span></a>
- <a id="capture-button" name="Capture" disabled="disabled"><span></span></a>
- <div id="misc-button">
- <a id="gallery-button" class="hidden" name="View Gallery"><span></span></a>
- <a id="cancel-pick" class="hidden"><span></span></a>
- <span id="video-timer">00:00</span>
- </div>
- </div>
-
- <div id="overlay" class="hidden">
- <div id="overlay-content">
- <h1 id="overlay-title"></h1>
- <p id="overlay-text"><p>
- </div>
- </div>
-
- <!-- see filmstrip.js and filmstrip.css for these elements -->
- <div id="filmstrip" class="hidden">
- <a id="filmstrip-gallery-button" class="hidden button"></a>
- </div>
- <div id="preview" class="offscreen">
- <div id="frame-container"> <!-- media frame rotates inside this -->
- <div id="media-frame"></div> <!-- image or video here -->
- </div>
- <footer id="preview-controls"> <!-- camera, delete, share buttons -->
- <a id="camera-button" class="button"></a>
- <a id="delete-button" class="button"></a>
- <a id="share-button" class="button"></a>
- </footer>
- </div>
-
- <script type="text/javascript" src="/shared/js/l10n.js"></script>
- <script type="text/javascript" src="/shared/js/l10n_date.js"></script>
- <script type="text/javascript" src="/shared/js/async_storage.js"></script>
- <script type="text/javascript" src="/shared/js/blobview.js"></script>
- <script type="text/javascript" src="/shared/js/media/jpeg_metadata_parser.js"></script>
- <script type="text/javascript" src="/shared/js/media/get_video_rotation.js"></script>
- <script type="text/javascript" src="/shared/js/media/video_player.js"></script>
- <script type="text/javascript" src="/shared/js/media/media_frame.js"></script>
- <script type="text/javascript" src="/shared/js/gesture_detector.js"></script>
- <script type="text/javascript" src="js/camera.js"></script>
- <script type="text/javascript" src="js/filmstrip.js"></script>
- </body>
-</html>
diff --git a/apps/system/camera/js/camera.js b/apps/system/camera/js/camera.js
deleted file mode 100644
index 25f12ae..0000000
--- a/apps/system/camera/js/camera.js
+++ /dev/null
@@ -1,982 +0,0 @@
-'use strict';
-
-// Utility functions
-function padLeft(num, length) {
- var r = String(num);
- while (r.length < length) {
- r = '0' + r;
- }
- return r;
-}
-
-
-// This handles the logic pertaining to the naming of files according
-// to the Design rule for Camera File System
-// * http://en.wikipedia.org/wiki/Design_rule_for_Camera_File_system
-var DCFApi = (function() {
-
- var api = {};
-
- var dcfConfigLoaded = false;
- var deferredArgs = null;
- var defaultSeq = {file: 1, dir: 100};
-
- var dcfConfig = {
- key: 'dcf_key',
- seq: null,
- postFix: 'MZLLA',
- prefix: {video: 'VID_', image: 'IMG_'},
- ext: {video: '3gp', image: 'jpg'}
- };
-
- api.init = function() {
-
- asyncStorage.getItem(dcfConfig.key, function(value) {
-
- dcfConfigLoaded = true;
- dcfConfig.seq = value ? value : defaultSeq;
-
- // We have a previous call to createDCFFilename that is waiting for
- // a response, fire it again
- if (deferredArgs) {
- var args = deferredArgs;
- api.createDCFFilename(args.storage, args.type, args.callback);
- deferredArgs = null;
- }
- });
- };
-
- api.createDCFFilename = function(storage, type, callback) {
-
- // We havent loaded the current counters from indexedDB yet, defer
- // the call
- if (!dcfConfigLoaded) {
- deferredArgs = {storage: storage, type: type, callback: callback};
- return;
- }
-
- var filepath = 'DCIM/' + dcfConfig.seq.dir + dcfConfig.postFix + '/';
- var filename = dcfConfig.prefix[type] +
- padLeft(dcfConfig.seq.file, 4) + '.' +
- dcfConfig.ext[type];
-
- // A file with this name may have been written by the user or
- // our indexeddb sequence tracker was cleared, check we wont overwrite
- // anything
- var req = storage.get(filepath + filename);
-
- // A file existed, we bump the directory then try to generate a
- // new filename
- req.onsuccess = function() {
- dcfConfig.seq.file = 1;
- dcfConfig.seq.dir += 1;
- asyncStorage.setItem(dcfConfig.key, dcfConfig.seq, function() {
- api.createDCFFilename(storage, type, callback);
- });
- };
-
- // No file existed, we are good to go
- req.onerror = function() {
- if (dcfConfig.seq.file < 9999) {
- dcfConfig.seq.file += 1;
- } else {
- dcfConfig.seq.file = 1;
- dcfConfig.seq.dir += 1;
- }
- asyncStorage.setItem(dcfConfig.key, dcfConfig.seq, function() {
- callback(filepath, filename);
- });
- };
- };
-
- return api;
-
-})();
-
-var Camera = {
- _cameras: null,
- _camera: 0,
- _captureMode: null,
- _recording: false,
-
- // In secure mode the user cannot browse to the gallery
- _secureMode: window.parent !== window,
- _currentOverlay: null,
-
- CAMERA: 'camera',
- VIDEO: 'video',
-
- _videoTimer: null,
- _videoStart: null,
- _videoPath: null,
-
- _autoFocusSupported: 0,
- _manuallyFocused: false,
-
- _timeoutId: 0,
- _cameraObj: null,
-
- _photosTaken: [],
- _cameraProfile: null,
-
- _resumeViewfinderTimer: null,
- _waitingToGenerateThumb: false,
-
- _styleSheet: document.styleSheets[0],
- _orientationRule: null,
- _phoneOrientation: 0,
-
- _pictureStorage: null,
- _videoStorage: null,
- _storageState: null,
-
- STORAGE_INIT: 0,
- STORAGE_AVAILABLE: 1,
- STORAGE_NOCARD: 2,
- STORAGE_UNMOUNTED: 3,
- STORAGE_CAPACITY: 4,
-
- _pictureSize: null,
- _previewPaused: false,
- _previewActive: false,
-
- PREVIEW_PAUSE: 500,
- FILMSTRIP_DURATION: 5000, // show filmstrip for 5s before fading
-
- _flashModes: [],
- _currentFlashMode: 0,
-
- _config: {
- fileFormat: 'jpeg'
- },
-
- get _previewConfig() {
- delete this._previewConfig;
- return this._previewConfig = {
- width: document.body.clientHeight,
- height: document.body.clientWidth
- };
- },
-
- _previewConfigVideo: {
- profile: 'cif',
- rotation: 0,
- width: 352,
- height: 288
- },
-
- _shutterKey: 'camera.shutter.enabled',
- _shutterSound: null,
- _shutterSoundEnabled: true,
-
- PROMPT_DELAY: 2000,
-
- _watchId: null,
- _position: null,
-
- _pendingPick: null,
-
- // The minimum available disk space to start recording a video.
- RECORD_SPACE_MIN: 1024 * 1024 * 2,
-
- // Number of bytes left on disk to let us stop recording.
- RECORD_SPACE_PADDING: 1024 * 1024 * 1,
-
- // Maximum image resolution for still photos taken with camera
- MAX_IMAGE_RES: 1600 * 1200, // Just under 2 megapixels
-
- get overlayTitle() {
- return document.getElementById('overlay-title');
- },
-
- get overlayText() {
- return document.getElementById('overlay-text');
- },
-
- get overlay() {
- return document.getElementById('overlay');
- },
-
- get viewfinder() {
- return document.getElementById('viewfinder');
- },
-
- get switchButton() {
- return document.getElementById('switch-button');
- },
-
- get captureButton() {
- return document.getElementById('capture-button');
- },
-
- get galleryButton() {
- return document.getElementById('gallery-button');
- },
-
- get videoTimer() {
- return document.getElementById('video-timer');
- },
-
- get focusRing() {
- return document.getElementById('focus-ring');
- },
-
- get toggleButton() {
- return document.getElementById('toggle-camera');
- },
-
- get toggleFlashBtn() {
- return document.getElementById('toggle-flash');
- },
-
- // We have seperated init and delayedInit as we want to make sure
- // that on first launch we dont interfere and load the camera
- // previewStream as fast as possible, once the previewStream is
- // active we do the rest of the initialisation.
- init: function() {
- this.setCaptureMode(this.CAMERA);
- this.loadCameraPreview(this._camera, this.delayedInit.bind(this));
- },
-
- delayedInit: function camera_delayedInit() {
- // If we don't have any pending messages, show the usual UI
- // Otherwise, determine which buttons to show once we get our
- // activity message
- if (!navigator.mozHasPendingMessage('activity')) {
- this.galleryButton.classList.remove('hidden');
- this.switchButton.classList.remove('hidden');
- this.enableButtons();
- }
-
- // Dont let the phone go to sleep while the camera is
- // active, user must manually close it
- if (navigator.requestWakeLock) {
- navigator.requestWakeLock('screen');
- }
-
- this.setToggleCameraStyle();
-
- // We lock the screen orientation and deal with rotating
- // the icons manually
- var css = '#switch-button span, #capture-button span, ' +
- '#gallery-button span { -moz-transform: rotate(0deg); }';
- var insertId = this._styleSheet.cssRules.length - 1;
- this._orientationRule = this._styleSheet.insertRule(css, insertId);
- window.addEventListener('deviceorientation', this.orientChange.bind(this));
-
- this.toggleButton.addEventListener('click', this.toggleCamera.bind(this));
- this.toggleFlashBtn.addEventListener('click', this.toggleFlash.bind(this));
- this.viewfinder.addEventListener('click', this.toggleFilmStrip.bind(this));
-
- this.switchButton
- .addEventListener('click', this.toggleModePressed.bind(this));
- this.captureButton
- .addEventListener('click', this.capturePressed.bind(this));
- this.galleryButton
- .addEventListener('click', this.galleryBtnPressed.bind(this));
-
- if (!navigator.mozCameras) {
- this.captureButton.setAttribute('disabled', 'disabled');
- return;
- }
-
- if (this._secureMode) {
- this.galleryButton.setAttribute('disabled', 'disabled');
- }
-
- this._shutterSound = new Audio('./resources/sounds/shutter.ogg');
- this._shutterSound.mozAudioChannelType = 'publicnotification';
-
- if ('mozSettings' in navigator) {
- var req = navigator.mozSettings.createLock().get(this._shutterKey);
- req.onsuccess = (function onsuccess() {
- this._shutterSoundEnabled = req.result[this._shutterKey];
- }).bind(this);
-
- navigator.mozSettings.addObserver(this._shutterKey, (function(e) {
- this._shutterSoundEnabled = e.settingValue;
- }).bind(this));
- }
-
- this._storageState = this.STORAGE_INIT;
-
- this._pictureStorage = navigator.getDeviceStorage('pictures');
- this._videoStorage = navigator.getDeviceStorage('videos'),
-
- this._pictureStorage
- .addEventListener('change', this.deviceStorageChangeHandler.bind(this));
-
- navigator.mozSetMessageHandler('activity', function(activity) {
- var name = activity.source.name;
- if (name === 'pick') {
- Camera.initPick(activity);
- }
- else {
- // We got another activity. Perhaps we were launched from gallery
- // So show our usual buttons
- Camera.galleryButton.classList.remove('hidden');
- Camera.switchButton.classList.remove('hidden');
- }
- Camera.enableButtons();
- });
-
- DCFApi.init();
- },
-
- enableButtons: function camera_enableButtons() {
- if (!this._pendingPick) {
- this.switchButton.removeAttribute('disabled');
- }
- this.captureButton.removeAttribute('disabled');
- },
-
- disableButtons: function camera_disableButtons() {
- this.switchButton.setAttribute('disabled', 'disabled');
- this.captureButton.setAttribute('disabled', 'disabled');
- },
-
- // When inside an activity the user cannot switch between
- // the gallery or video recording.
- initPick: function camera_initPick(activity) {
- this._pendingPick = activity;
-
- // Hide the gallery and switch buttons, leaving only the shutter
- this.galleryButton.classList.add('hidden');
- this.switchButton.classList.add('hidden');
-
- // Display the cancel button and add an event listener for it
- var cancelButton = document.getElementById('cancel-pick');
- cancelButton.classList.remove('hidden');
- cancelButton.onclick = this.cancelPick.bind(this);
- },
-
- cancelPick: function camera_cancelPick() {
- if (this._pendingPick) {
- this._pendingPick.postError('pick cancelled');
- }
- this._pendingPick = null;
- },
-
- toggleModePressed: function camera_toggleCaptureMode(e) {
- if (e.target.getAttribute('disabled')) {
- return;
- }
-
- var newMode = (this.captureMode === this.CAMERA) ? this.VIDEO : this.CAMERA;
- this.disableButtons();
- this.setCaptureMode(newMode);
-
- function gotPreviewStream(stream) {
- this.viewfinder.mozSrcObject = stream;
- this.viewfinder.play();
- this.enableButtons();
- }
- if (this.captureMode === this.CAMERA) {
- this._cameraObj.getPreviewStream(this._previewConfig,
- gotPreviewStream.bind(this));
- } else {
- this._previewConfigVideo.rotation = this._phoneOrientation;
- this._cameraObj.getPreviewStreamVideoMode(this._previewConfigVideo,
- gotPreviewStream.bind(this));
- }
- },
-
- toggleCamera: function camera_toggleCamera() {
- this._camera = 1 - this._camera;
- this.loadCameraPreview(this._camera, this.enableButtons.bind(this));
- this.setToggleCameraStyle();
- },
-
- setToggleCameraStyle: function camera_setToggleCameraStyle() {
- var modeName = this._camera === 0 ? 'back' : 'front';
- this.toggleButton.setAttribute('data-mode', modeName);
- },
-
- toggleFlash: function camera_toggleFlash() {
- if (this._currentFlashMode === this._flashModes.length - 1) {
- this._currentFlashMode = 0;
- } else {
- this._currentFlashMode = this._currentFlashMode + 1;
- }
- this.setFlashMode();
- },
-
- setFlashMode: function camera_setFlashMode() {
- var flashModeName = this._flashModes[this._currentFlashMode];
- this.toggleFlashBtn.setAttribute('data-mode', flashModeName);
- this._cameraObj.flashMode = flashModeName;
- },
-
- toggleRecording: function camera_toggleRecording() {
- if (this._recording) {
- this.stopRecording();
- return;
- }
-
- this.startRecording();
- },
-
- startRecording: function camera_startRecording() {
- var captureButton = this.captureButton;
- var switchButton = this.switchButton;
-
- var onerror = function() {
- handleError('error-recording');
- }
- var onsuccess = (function onsuccess() {
- document.body.classList.add('capturing');
- captureButton.removeAttribute('disabled');
- this._recording = true;
- this.startRecordingTimer();
-
- // Hide the filmstrip to prevent the users from
- // entering the preview mode after Camera starts recording
- if (Filmstrip.isShown())
- Filmstrip.hide();
-
- // User closed app while recording was trying to start
- if (document.mozHidden) {
- this.stopRecording();
- }
- }).bind(this);
-
- var handleError = (function handleError(id) {
- this.enableButtons();
- alert(navigator.mozL10n.get(id + '-title') + '. ' +
- navigator.mozL10n.get(id + '-text'));
- }).bind(this);
-
- this.disableButtons();
-
- var startRecording = (function startRecording(freeBytes) {
- if (freeBytes < this.RECORD_SPACE_MIN) {
- handleError('nospace');
- return;
- }
-
- var config = {
- rotation: this._phoneOrientation,
- maxFileSizeBytes: freeBytes - this.RECORD_SPACE_PADDING
- };
- this._cameraObj.startRecording(config,
- this._videoStorage, this._videoPath,
- onsuccess, onerror);
- }).bind(this);
-
- DCFApi.createDCFFilename(this._videoStorage, 'video', (function(path, name) {
- this._videoPath = path + name;
-
- // The CameraControl API will not automatically create directories
- // for the new file if they do not exist, so write a dummy file
- // to the same directory via DeviceStorage to ensure that the directory
- // exists before recording starts.
- var dummyblob = new Blob([''], {type: 'video/3gpp'});
- var dummyfilename = path + '.' + name;
- var req = this._videoStorage.addNamed(dummyblob, dummyfilename);
- req.onerror = onerror;
- req.onsuccess = (function fileCreated() {
- this._videoStorage.delete(dummyfilename); // No need to wait for success
- // Determine the number of bytes available on disk.
- var spaceReq = this._videoStorage.freeSpace();
- spaceReq.onerror = onerror;
- spaceReq.onsuccess = function() {
- startRecording(spaceReq.result);
- }
- }).bind(this);
- }).bind(this));
- },
-
- startRecordingTimer: function camera_startRecordingTimer() {
- this._videoStart = new Date().getTime();
- this.videoTimer.textContent = this.formatTimer(0);
- this._videoTimer =
- window.setInterval(this.updateVideoTimer.bind(this), 1000);
- },
-
- updateVideoTimer: function camera_updateVideoTimer() {
- var videoLength =
- Math.round((new Date().getTime() - this._videoStart) / 1000);
- this.videoTimer.textContent = this.formatTimer(videoLength);
- },
-
- stopRecording: function camera_stopRecording() {
- this._cameraObj.stopRecording();
- this._recording = false;
- window.clearInterval(this._videoTimer);
- this.enableButtons();
- document.body.classList.remove('capturing');
-
- // XXX
- // I need some way to know when the camera is done writing this file
- // currently I'm sending this to the filmstrip which is trying to
- // determine its rotation and fails sometimes if the file is not
- // yet complete. For now, I just defer for a second, but
- // there ought to be a better way.
- // See https://bugzilla.mozilla.org/show_bug.cgi?id=817367
- // Maybe I'll get a device storage callback... check this.
- var videofile = this._videoPath;
- setTimeout(function() {
- Filmstrip.addVideo(videofile);
- Filmstrip.show(Camera.FILMSTRIP_DURATION);
- }, 1000);
- },
-
- formatTimer: function camera_formatTimer(time) {
- var minutes = Math.floor(time / 60);
- var seconds = Math.round(time % 60);
- if (minutes < 60) {
- return padLeft(minutes, 2) + ':' + padLeft(seconds, 2);
- }
- return '';
- },
-
- capturePressed: function camera_doCapture(e) {
- if (e.target.getAttribute('disabled')) {
- return;
- }
-
- if (this.captureMode === this.CAMERA) {
- this.prepareTakePicture();
- } else {
- this.toggleRecording();
- }
- },
-
- galleryBtnPressed: function camera_galleryBtnPressed() {
- // Can't launch the gallery if the lockscreen is locked.
- // The button shouldn't even be visible in this case, but
- // let's be really sure here.
- if (this._secureMode)
- return;
-
- // Launch the gallery with an activity
- var a = new MozActivity({
- name: 'browse',
- data: {
- type: 'photos'
- }
- });
- },
-
- orientChange: function camera_orientChange(e) {
- // Orientation is 0 starting at 'natural portrait' increasing
- // going clockwise
- var orientation = (e.beta > 45) ? 180 :
- (e.beta < -45) ? 0 :
- (e.gamma < -45) ? 90 :
- (e.gamma > 45) ? 270 : 0;
-
- if (orientation !== this._phoneOrientation) {
- var rule = this._styleSheet.cssRules[this._orientationRule];
- // PLEASE DO SOMETHING KITTENS ARE DYING
- // Setting MozRotate to 90 or 270 causes element to disappear
- rule.style.MozTransform = 'rotate(' + -(orientation + 1) + 'deg)';
- this._phoneOrientation = orientation;
-
- Filmstrip.setOrientation(orientation);
- }
- },
-
- setCaptureMode: function camera_setCaptureMode(mode) {
- if (this.captureMode) {
- document.body.classList.remove(this.captureMode);
- }
- this.captureMode = mode;
- document.body.classList.add(mode);
- },
-
- toggleFilmStrip: function camera_toggleFilmStrip(ev) {
- // We will just ignore
- // because the filmstrip shouldn't be shown
- // while Camera is recording
- if (this._recording)
- return;
-
- if (Filmstrip.isShown())
- Filmstrip.hide();
- else
- Filmstrip.show();
- },
-
- loadCameraPreview: function camera_loadCameraPreview(camera, callback) {
-
- this.viewfinder.mozSrcObject = null;
- this._timeoutId = 0;
-
- var viewfinder = this.viewfinder;
- var style = viewfinder.style;
- var width = document.body.clientHeight;
- var height = document.body.clientWidth;
-
- style.top = ((width / 2) - (height / 2)) + 'px';
- style.left = -((width / 2) - (height / 2)) + 'px';
-
- var transform = 'rotate(90deg)';
- var rotation;
- if (camera == 1) {
- /* backwards-facing camera */
- transform += ' scale(-1, 1)';
- rotation = 0;
- } else {
- /* forwards-facing camera */
- rotation = 0;
- }
-
- style.MozTransform = transform;
- style.width = width + 'px';
- style.height = height + 'px';
-
- this._cameras = navigator.mozCameras.getListOfCameras();
- var options = {camera: this._cameras[this._camera]};
-
- function gotPreviewScreen(stream) {
- viewfinder.mozSrcObject = stream;
- viewfinder.play();
-
- if (callback) {
- callback();
- }
-
- this._previewActive = true;
- this.checkStorageSpace();
- setTimeout(this.initPositionUpdate.bind(this), this.PROMPT_DELAY);
- }
-
- function gotCamera(camera) {
- this._cameraObj = camera;
- this._config.rotation = rotation;
- this._autoFocusSupported =
- camera.capabilities.focusModes.indexOf('auto') !== -1;
- this._pictureSize =
- this.pickPictureSize(camera.capabilities.pictureSizes);
- this.enableCameraFeatures(camera.capabilities);
- camera.onShutter = (function() {
- if (this._shutterSoundEnabled) {
- this._shutterSound.play();
- }
- }).bind(this);
- camera.onRecorderStateChange = this.recordingStateChanged.bind(this);
- if (this.captureMode === this.CAMERA) {
- camera.getPreviewStream(this._previewConfig, gotPreviewScreen.bind(this));
- } else {
- this._previewConfigVideo.rotation = this._phoneOrientation;
- this._cameraObj.getPreviewStreamVideoMode(this._previewConfigVideo,
- gotPreviewScreen.bind(this));
- }
- }
-
- // If there is already a camera, we would have to release it first.
- if (this._cameraObj) {
- this.release(function camera_release_callback() {
- navigator.mozCameras.getCamera(options, gotCamera.bind(this));
- });
- } else {
- navigator.mozCameras.getCamera(options, gotCamera.bind(this));
- }
- },
-
- recordingStateChanged: function(msg) {
- if (msg === 'FileSizeLimitReached') {
- this.stopRecording();
- alert(navigator.mozL10n.get('size-limit-reached'));
- }
- },
-
- enableCameraFeatures: function camera_enableCameraFeatures(capabilities) {
- if (this._cameras.length > 1) {
- this.toggleButton.classList.remove('hidden');
- } else {
- this.toggleButton.classList.add('hidden');
- }
-
- this._flashModes = capabilities.flashModes;
- if (this._flashModes) {
- this.setFlashMode();
- this.toggleFlashBtn.classList.remove('hidden');
- } else {
- this.toggleFlashBtn.classList.add('hidden');
- }
- },
-
- startPreview: function camera_startPreview() {
- this.viewfinder.play();
- this.loadCameraPreview(this._camera, this.enableButtons.bind(this));
- this._previewActive = true;
- },
-
- stopPreview: function camera_stopPreview() {
- if (this._recording) {
- this.stopRecording();
- }
- this.disableButtons();
- this.viewfinder.pause();
- this._previewActive = false;
- this.viewfinder.mozSrcObject = null;
- this.release();
- },
-
- resumePreview: function camera_resumePreview() {
- this._cameraObj.resumePreview();
- this._previewActive = true;
- this.enableButtons();
- },
-
- restartPreview: function camera_restartPreview() {
- this._resumeViewfinderTimer =
- window.setTimeout(this.resumePreview.bind(this), this.PREVIEW_PAUSE);
- },
-
- takePictureSuccess: function camera_takePictureSuccess(blob) {
- this._manuallyFocused = false;
- this.hideFocusRing();
- this.restartPreview();
- DCFApi.createDCFFilename(this._pictureStorage, 'image', (function(path, name) {
- var addreq = this._pictureStorage.addNamed(blob, path + name);
- addreq.onsuccess = (function() {
- if (this._pendingPick) {
- // XXX: https://bugzilla.mozilla.org/show_bug.cgi?id=806503
- // We ought to just be able to pass this blob to the activity.
- // But there seems to be a bug with blob lifetimes and activities.
- // So we'll get a new blob back out of device storage to ensure
- // that we've got a file-backed blob instead of a memory-backed blob.
- var getreq = this._pictureStorage.get(path + name);
- getreq.onsuccess = (function() {
- this._pendingPick.postResult({
- type: 'image/jpeg',
- blob: getreq.result
- });
- this.cancelPick();
- }).bind(this);
-
- return;
- }
-
- Filmstrip.addImage(path + name, blob);
- Filmstrip.show(Camera.FILMSTRIP_DURATION);
- this.checkStorageSpace();
-
- }).bind(this);
-
- addreq.onerror = function() {
- alert(navigator.mozL10n.get('error-saving-title') + '. ' +
- navigator.mozL10n.get('error-saving-text'));
- };
- }).bind(this));
- },
-
- hideFocusRing: function camera_hideFocusRing() {
- this.focusRing.removeAttribute('data-state');
- },
-
- checkStorageSpace: function camera_checkStorageSpace() {
- if (this.updateOverlay()) {
- return;
- }
-
- // The first time we're called, we need to make sure that there
- // is an sdcard and that it is mounted. (Subsequently the device
- // storage change handler will track that.)
- if (this._storageState === this.STORAGE_INIT) {
- this._pictureStorage.available().onsuccess = (function(e) {
- this.updateStorageState(e.target.result);
- this.updateOverlay();
- // Now call the parent method again, so that if the sdcard is
- // available we will actually verify that there is enough space on it
- this.checkStorageSpace();
- }.bind(this));
- return;
- }
-
- // Now verify that there is enough space to store a picture
- // 4 bytes per pixel plus some room for a header should be more
- // than enough for a JPEG image.
- var MAX_IMAGE_SIZE =
- (this._pictureSize.width * this._pictureSize.height * 4) + 4096;
-
- this._pictureStorage.freeSpace().onsuccess = (function(e) {
- // XXX
- // If we ever enter this out-of-space condition, it looks like
- // this code will never be able to exit. The user will have to
- // quit the app and start it again. Just deleting files will
- // not be enough to get back to the STORAGE_AVAILABLE state.
- // To fix this, we need an else clause here, and also a change
- // in the updateOverlay() method.
- if (e.target.result < MAX_IMAGE_SIZE) {
- this._storageState = this.STORAGE_CAPACITY;
- }
- this.updateOverlay();
- }).bind(this);
- },
-
- deviceStorageChangeHandler: function camera_deviceStorageChangeHandler(e) {
- switch (e.reason) {
- case 'available':
- case 'unavailable':
- case 'shared':
- this.updateStorageState(e.reason);
- break;
- }
- this.checkStorageSpace();
- },
-
- updateStorageState: function camera_updateStorageState(state) {
- switch (state) {
- case 'available':
- this._storageState = this.STORAGE_AVAILABLE;
- break;
- case 'unavailable':
- this._storageState = this.STORAGE_NOCARD;
- break;
- case 'shared':
- this._storageState = this.STORAGE_UNMOUNTED;
- break;
- }
- },
-
- updateOverlay: function camera_updateOverlay() {
- if (this._storageState === this.STORAGE_INIT) {
- return false;
- }
-
- if (this._storageState === this.STORAGE_AVAILABLE) {
- // Preview may have previously been paused if storage
- // was not available
- if (!this._previewActive && !document.mozHidden) {
- this.startPreview();
- }
- this.showOverlay(null);
- return false;
- }
-
- switch (this._storageState) {
- case this.STORAGE_NOCARD:
- this.showOverlay('nocard');
- break;
- case this.STORAGE_UNMOUNTED:
- this.showOverlay('pluggedin');
- break;
- case this.STORAGE_CAPACITY:
- this.showOverlay('nospace2');
- break;
- }
- if (this._previewActive) {
- this.stopPreview();
- }
- return true;
- },
-
- prepareTakePicture: function camera_takePicture() {
- this.disableButtons();
- this.focusRing.setAttribute('data-state', 'focusing');
- if (this._autoFocusSupported && !this._manuallyFocused) {
- this._cameraObj.autoFocus(this.autoFocusDone.bind(this));
- } else {
- this.takePicture();
- }
- },
-
- autoFocusDone: function camera_autoFocusDone(success) {
- if (!success) {
- this.enableButtons();
- this.focusRing.setAttribute('data-state', 'fail');
- window.setTimeout(this.hideFocusRing.bind(this), 1000);
- return;
- }
- this.focusRing.setAttribute('data-state', 'focused');
- this.takePicture();
- },
-
- takePicture: function camera_takePicture() {
- this._config.rotation = this._phoneOrientation;
- this._config.pictureSize = this._pictureSize;
- if (this._position) {
- this._config.position = this._position;
- }
- this._cameraObj
- .takePicture(this._config, this.takePictureSuccess.bind(this));
- },
-
- showOverlay: function camera_showOverlay(id) {
- this._currentOverlay = id;
-
- if (id === null) {
- this.overlay.classList.add('hidden');
- return;
- }
-
- this.overlayTitle.textContent = navigator.mozL10n.get(id + '-title');
- this.overlayText.textContent = navigator.mozL10n.get(id + '-text');
- this.overlay.classList.remove('hidden');
- },
-
- pickPictureSize: function camera_pickPictureSize(pictureSizes) {
- var maxRes = this.MAX_IMAGE_RES;
- var size = pictureSizes.reduce(function(acc, size) {
- var mp = size.width * size.height;
- return (mp > acc.width * acc.height && mp <= maxRes) ? size : acc;
- }, {width: 0, height: 0});
-
- if (size.width === 0 && size.height === 0) {
- return pictureSizes[0];
- } else {
- return size;
- }
- },
-
- initPositionUpdate: function camera_initPositionUpdate() {
- if (this._watchId || document.mozHidden) {
- return;
- }
- this._watchId = navigator.geolocation
- .watchPosition(this.updatePosition.bind(this));
- },
-
- updatePosition: function camera_updatePosition(position) {
- this._position = {
- timestamp: position.timestamp,
- altitude: position.coords.altitude,
- latitude: position.coords.latitude,
- longitude: position.coords.longitude
- };
- },
-
- cancelPositionUpdate: function camera_cancelPositionUpdate() {
- navigator.geolocation.clearWatch(this._watchId);
- this._watchId = null;
- },
-
- release: function camera_release(callback) {
- if (!this._cameraObj)
- return;
-
- this._cameraObj.release(function cameraReleased() {
- Camera._cameraObj = null;
- if (callback)
- callback.call(Camera);
- }, function releaseError() {
- console.warn('Camera: failed to release hardware?');
- if (callback)
- callback.call(Camera);
- });
- }
-};
-
-Camera.init();
-
-document.addEventListener('mozvisibilitychange', function() {
- if (document.mozHidden) {
- Camera.stopPreview();
- Camera.cancelPick();
- Camera.cancelPositionUpdate();
- if (this._secureMode) // If the lockscreen is locked
- Filmstrip.clear(); // then forget everything when closing camera
- } else {
- Camera.startPreview();
- }
-});
-
-window.addEventListener('beforeunload', function() {
- window.clearTimeout(Camera._timeoutId);
- delete Camera._timeoutId;
- Camera.viewfinder.mozSrcObject = null;
-});
diff --git a/apps/system/camera/js/filmstrip.js b/apps/system/camera/js/filmstrip.js
deleted file mode 100644
index d428801..0000000
--- a/apps/system/camera/js/filmstrip.js
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- * filmstrip.js: filmstrip, thumbnails and previews for the camera.
- */
-
-'use strict';
-
-var Filmstrip = (function() {
-
- // This array holds all the data we need for image and video previews
- var items = [];
- var currentItemIndex;
-
- // Maximum number of thumbnails in the filmstrip
- var MAX_THUMBNAILS = 5;
- var THUMBNAIL_WIDTH = 46; // size of each thumbnail
- var THUMBNAIL_HEIGHT = 46;
-
- // Timer for auto-hiding the filmstrip
- var hideTimer = null;
-
- // Document elements we care about
- var filmstrip = document.getElementById('filmstrip');
- var preview = document.getElementById('preview');
- var frameContainer = document.getElementById('frame-container');
- var mediaFrame = document.getElementById('media-frame');
- var cameraButton = document.getElementById('camera-button');
- var shareButton = document.getElementById('share-button');
- var deleteButton = document.getElementById('delete-button');
- var filmstripGalleryButton =
- document.getElementById('filmstrip-gallery-button');
-
- // Offscreen elements for generating thumbnails with
- var offscreenImage = new Image();
- var offscreenVideo = document.createElement('video');
-
- // Set up event handlers
- cameraButton.onclick = returnToCameraMode;
- deleteButton.onclick = deleteCurrentItem;
- shareButton.onclick = shareCurrentItem;
- filmstripGalleryButton.onclick = Camera.galleryBtnPressed;
- mediaFrame.addEventListener('dbltap', handleDoubleTap);
- mediaFrame.addEventListener('transform', handleTransform);
- mediaFrame.addEventListener('pan', handlePan);
- mediaFrame.addEventListener('swipe', handleSwipe);
-
- // Generate gesture events
- var gestureDetector = new GestureDetector(mediaFrame);
- gestureDetector.startDetecting();
-
- // Create the MediaFrame for previews
- var frame = new MediaFrame(mediaFrame);
-
- // Start off with it positioned correctly.
- setOrientation(Camera._phoneOrientation);
-
- // If we're running in secure mode, we never want the user to see the
- // gallery button or the share button.
- filmstrip.removeChild(filmstripGalleryButton);
- shareButton.parentNode.removeChild(shareButton);
-
- function isShown() {
- return !filmstrip.classList.contains('hidden');
- }
-
- function hide() {
- filmstrip.classList.add('hidden');
- if (hideTimer) {
- clearTimeout(hideTimer);
- hideTimer = null;
- }
- }
-
- /*
- * With a time, show the filmstrip and then hide it after the time is up.
- * Without time, show until hidden.
- * Tapping in the camera toggles it. And if toggled on, it will be on
- * without a timer.
- * It is always on when a preview is shown.
- * After recording a photo or video, it is shown for 5 seconds.
- * And it is also shown for 5 seconds after leaving preview mode.
- */
- function show(time) {
- filmstrip.classList.remove('hidden');
- if (hideTimer) {
- clearTimeout(hideTimer);
- hideTimer = null;
- }
- if (time)
- hideTimer = setTimeout(hide, time);
- }
-
- filmstrip.onclick = function(event) {
- var target = event.target;
- if (!target || !target.classList.contains('thumbnail'))
- return;
-
- var index = parseInt(target.dataset.index);
- previewItem(index);
- // If we're showing previews be sure we're showing the filmstrip
- // with no timeout and be sure that the viewfinder video is paused.
- show();
- Camera.viewfinder.pause();
- // If there is a preview shown, we want the gallery button in
- // the filmstrip
- filmstripGalleryButton.classList.remove('hidden');
- };
-
- function previewItem(index) {
- // Don't redisplay the item if it is already displayed
- if (currentItemIndex === index)
- return;
-
- var item = items[index];
-
- if (item.isImage) {
- frame.displayImage(item.blob, item.width, item.height, item.preview);
- }
- else if (item.isVideo) {
- frame.displayVideo(item.blob, item.width, item.height, item.rotation);
- }
-
- preview.classList.remove('offscreen');
- currentItemIndex = index;
-
- // Highlight the border of the thumbnail we're previewing
- // and clear the highlight on all others
- items.forEach(function(item, itemindex) {
- if (itemindex === index)
- item.element.classList.add('previewed');
- else
- item.element.classList.remove('previewed');
- });
- }
-
- function returnToCameraMode() {
- Camera.viewfinder.play(); // Restart the viewfinder
- show(Camera.FILMSTRIP_DURATION); // Fade the filmstrip after a delay
- // hide the gallery button in the filmstrip
- filmstripGalleryButton.classList.add('hidden');
- preview.classList.add('offscreen');
- frame.clear();
- if (items.length > 0)
- items[currentItemIndex].element.classList.remove('previewed');
- currentItemIndex = null;
- }
-
- function deleteCurrentItem() {
- var item = items[currentItemIndex];
- var msg, storage, filename;
-
- if (item.isImage) {
- msg = navigator.mozL10n.get('delete-photo?');
- storage = Camera._pictureStorage;
- filename = item.filename;
- }
- else {
- msg = navigator.mozL10n.get('delete-video?');
- storage = Camera._videoStorage;
- filename = item.filename;
- }
-
- // The system app is not allowed to use confirm, I think
- // so if we're running in secure mode, just delete the file without
- // confirmation
- if (Camera._secureMode || confirm(msg)) {
- // Remove the item from the array of items
- items.splice(currentItemIndex, 1);
-
- // Remove the thumbnail image from the filmstrip
- filmstrip.removeChild(item.element);
- URL.revokeObjectURL(item.element.src);
-
- // Renumber the item elements
- items.forEach(function(item, index) {
- item.element.dataset.index = index;
- });
-
- // If there are no more items, go back to the camera
- if (items.length === 0) {
- returnToCameraMode();
- }
- else {
- // Otherwise, switch the frame to display the next item. But if
- // we just deleted the last item, then we'll need to display the
- // previous item.
- var newindex = currentItemIndex;
- if (newindex >= items.length)
- newindex = items.length - 1;
- currentItemIndex = null;
- previewItem(newindex);
- }
-
- // Actually delete the file
- storage.delete(filename).onerror = function(e) {
- console.warn('Failed to delete', filename,
- 'from DeviceStorage:', e.target.error);
- }
- }
- }
-
- function shareCurrentItem() {
- if (Camera._secureMode)
- return;
- var item = items[currentItemIndex];
- var type = item.isImage ? 'image/*' : 'video/*';
- var nameonly = item.filename.substring(item.filename.lastIndexOf('/') + 1);
- var activity = new MozActivity({
- name: 'share',
- data: {
- type: type,
- number: 1,
- blobs: [item.blob],
- filenames: [nameonly],
- filepaths: [item.filename] /* temporary hack for bluetooth app */
- }
- });
- activity.onerror = function(e) {
- console.warn('Share activity error:', activity.error.name);
- }
- }
-
- function handleDoubleTap(e) {
- if (!items[currentItemIndex].isImage)
- return;
-
- var scale;
- if (frame.fit.scale > frame.fit.baseScale)
- scale = frame.fit.baseScale / frame.fit.scale;
- else
- scale = 2;
-
- // If the phone orientation is 0 (unrotated) then the gesture detector's
- // event coordinates match what's on the screen, and we use them to
- // specify a point to zoom in or out on. For other orientations we could
- // calculate the correct point, but instead just use the midpoint.
- var x, y;
- if (Camera._phoneOrientation === 0) {
- x = e.detail.clientX;
- y = e.detail.clientY;
- }
- else {
- x = mediaFrame.offsetWidth / 2;
- y = mediaFrame.offsetHeight / 2;
- }
-
- frame.zoom(scale, x, y, 200);
- }
-
- function handleTransform(e) {
- if (!items[currentItemIndex].isImage)
- return;
-
- // If the phone orientation is 0 (unrotated) then the gesture detector's
- // event coordinates match what's on the screen, and we use them to
- // specify a point to zoom in or out on. For other orientations we could
- // calculate the correct point, but instead just use the midpoint.
- var x, y;
- if (Camera._phoneOrientation === 0) {
- x = e.detail.midpoint.clientX;
- y = e.detail.midpoint.clientY;
- }
- else {
- x = mediaFrame.offsetWidth / 2;
- y = mediaFrame.offsetHeight / 2;
- }
-
- frame.zoom(e.detail.relative.scale, x, y);
- }
-
- function handlePan(e) {
- if (!items[currentItemIndex].isImage)
- return;
-
- // The gesture detector event does not take our CSS rotation into
- // account, so we have to pan by a dx and dy that depend on how
- // the MediaFrame is rotated
- var dx, dy;
- switch (Camera._phoneOrientation) {
- case 0:
- dx = e.detail.relative.dx;
- dy = e.detail.relative.dy;
- break;
- case 90:
- dx = -e.detail.relative.dy;
- dy = e.detail.relative.dx;
- break;
- case 180:
- dx = -e.detail.relative.dx;
- dy = -e.detail.relative.dy;
- break;
- case 270:
- dx = e.detail.relative.dy;
- dy = -e.detail.relative.dx;
- break;
- }
-
- frame.pan(dx, dy);
- }
-
- function handleSwipe(e) {
- // Because the stuff around the media frame does not change position
- // when the phone is rotated, we don't alter these directions based
- // on orientation. To dismiss the preview, the user always swipes toward
- // the filmstrip.
-
- switch (e.detail.direction) {
- case 'up': // close the preview if the swipe is fast enough
- if (e.detail.vy < -1)
- returnToCameraMode();
- break;
- case 'left': // go to next image if fast enough
- if (e.detail.vx < -1 && currentItemIndex < items.length - 1)
- previewItem(currentItemIndex + 1);
- break;
- case 'right': // go to previous image if fast enough
- if (e.detail.vx > 1 && currentItemIndex > 0)
- previewItem(currentItemIndex - 1);
- break;
- }
- }
-
- function addImage(filename, blob) {
- parseJPEGMetadata(blob, function getPreviewBlob(metadata) {
- if (metadata.preview) {
- var previewBlob = blob.slice(metadata.preview.start,
- metadata.preview.end,
- 'image/jpeg');
-
- offscreenImage.src = URL.createObjectURL(previewBlob);
- offscreenImage.onload = function() {
- createThumbnailFromElement(offscreenImage, false, 0,
- function(thumbnail) {
- addItem({
- isImage: true,
- filename: filename,
- thumbnail: thumbnail,
- blob: blob,
- width: metadata.width,
- height: metadata.height,
- preview: metadata.preview
- });
- });
- URL.revokeObjectURL(offscreenImage.src);
- offscreenImage.onload = null;
- offscreenImage.src = null;
- };
- }
- }, function logerr(msg) { console.warn(msg); });
- }
-
- function addVideo(filename) {
- var request = Camera._videoStorage.get(filename);
- request.onerror = function() {
- console.warn('addVideo:', filename, request.error.name);
- };
- request.onsuccess = function() {
- var blob = request.result;
- getVideoRotation(blob, function(rotation) {
- if (typeof rotation !== 'number') {
- console.warn('Unexpected rotation:', rotation);
- rotation = 0;
- }
-
- var url = URL.createObjectURL(blob);
-
- offscreenVideo.preload = 'metadata';
- offscreenVideo.style.width = THUMBNAIL_WIDTH + 'px';
- offscreenVideo.style.height = THUMBNAIL_HEIGHT + 'px';
- offscreenVideo.src = url;
-
- offscreenVideo.onerror = function() {
- URL.revokeObjectURL(url);
- offscreenVideo.onerror = null;
- offscreenVideo.onloadedmetadata = null;
- offscreenVideo.removeAttribute('src');
- offscreenVideo.load();
- console.warn('not a video file', filename);
- }
-
- offscreenVideo.onloadedmetadata = function() {
- createThumbnailFromElement(offscreenVideo, true, rotation,
- function(thumbnail) {
- addItem({
- isVideo: true,
- filename: filename,
- thumbnail: thumbnail,
- blob: blob,
- width: offscreenVideo.videoWidth,
- height: offscreenVideo.videoHeight,
- rotation: rotation
- });
- });
- URL.revokeObjectURL(url);
- offscreenVideo.onerror = null;
- offscreenVideo.onloadedmetadata = null;
- offscreenVideo.removeAttribute('src');
- offscreenVideo.load();
- };
- });
- };
- }
-
- // Add a thumbnail to the filmstrip.
- // The details object contains everything we need to know
- // to display the thumbnail and preview the image or video
- function addItem(item) {
- // Thumbnails go from most recent to least recent.
- items.unshift(item);
-
- // Create an image element for this new thumbnail and display it
- item.element = new Image();
- item.element.src = URL.createObjectURL(item.thumbnail);
- item.element.classList.add('thumbnail');
- filmstrip.insertBefore(item.element, filmstrip.firstElementChild);
-
- // If we have too many thumbnails now, remove the oldest one from
- // the array, and remove its element from the filmstrip and release
- // its blob url
- if (items.length > MAX_THUMBNAILS) {
- var oldest = items.pop();
- filmstrip.removeChild(oldest.element);
- URL.revokeObjectURL(oldest.element.src);
- }
-
- // Now update the index associated with each of the remaining elements
- // so that the click event handle knows which one it clicked on
- items.forEach(function(item, index) {
- item.element.dataset.index = index;
- });
- }
-
- // Remove all items from the filmstrip. Don't delete the files, but
- // forget all of our state. This also exits preview mode if we're in it.
- function clear() {
- if (!preview.classList.contains('offscreen'))
- returnToCameraMode();
- items.forEach(function(item) {
- filmstrip.removeChild(item.element);
- URL.revokeObjectURL(item.element.src);
- });
- items.length = 0;
- }
-
- // Create a thumbnail size canvas, copy the <img> or <video> into it
- // cropping the edges as needed to make it fit, and then extract the
- // thumbnail image as a blob and pass it to the callback.
- function createThumbnailFromElement(elt, video, rotation, callback) {
- // Create a thumbnail image
- var canvas = document.createElement('canvas');
- var context = canvas.getContext('2d');
- canvas.width = THUMBNAIL_WIDTH;
- canvas.height = THUMBNAIL_HEIGHT;
- var eltwidth = video ? elt.videoWidth : elt.width;
- var eltheight = video ? elt.videoHeight : elt.height;
- var scalex = canvas.width / eltwidth;
- var scaley = canvas.height / eltheight;
-
- // Take the larger of the two scales: we crop the image to the thumbnail
- var scale = Math.max(scalex, scaley);
-
- // Calculate the region of the image that will be copied to the
- // canvas to create the thumbnail
- var w = Math.round(THUMBNAIL_WIDTH / scale);
- var h = Math.round(THUMBNAIL_HEIGHT / scale);
- var x = Math.round((eltwidth - w) / 2);
- var y = Math.round((eltheight - h) / 2);
-
- // If a rotation is specified, rotate the canvas context
- if (rotation) {
- context.save();
- switch (rotation) {
- case 90:
- context.translate(THUMBNAIL_WIDTH, 0);
- context.rotate(Math.PI / 2);
- break;
- case 180:
- context.translate(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT);
- context.rotate(Math.PI);
- break;
- case 270:
- context.translate(0, THUMBNAIL_HEIGHT);
- context.rotate(-Math.PI / 2);
- break;
- }
- }
-
- // Draw that region of the image into the canvas, scaling it down
- context.drawImage(elt, x, y, w, h,
- 0, 0, THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT);
-
- // Restore the default rotation so the play arrow comes out correctly
- if (rotation) {
- context.restore();
- }
-
- // If this is a video, superimpose a translucent play button over
- // the captured video frame to distinguish it from a still photo thumbnail
- if (video) {
- // First draw a transparent gray circle
- context.fillStyle = 'rgba(0, 0, 0, .3)';
- context.beginPath();
- context.arc(THUMBNAIL_WIDTH / 2, THUMBNAIL_HEIGHT / 2,
- THUMBNAIL_HEIGHT / 3, 0, 2 * Math.PI, false);
- context.fill();
-
- // Now outline the circle in white
- context.strokeStyle = 'rgba(255,255,255,.6)';
- context.lineWidth = 2;
- context.stroke();
-
- // And add a white play arrow.
- context.beginPath();
- context.fillStyle = 'rgba(255,255,255,.6)';
- // The height of an equilateral triangle is sqrt(3)/2 times the side
- var side = THUMBNAIL_HEIGHT / 3;
- var triangle_height = side * Math.sqrt(3) / 2;
- context.moveTo(THUMBNAIL_WIDTH / 2 + triangle_height * 2 / 3,
- THUMBNAIL_HEIGHT / 2);
- context.lineTo(THUMBNAIL_WIDTH / 2 - triangle_height / 3,
- THUMBNAIL_HEIGHT / 2 - side / 2);
- context.lineTo(THUMBNAIL_WIDTH / 2 - triangle_height / 3,
- THUMBNAIL_HEIGHT / 2 + side / 2);
- context.closePath();
- context.fill();
- }
-
- canvas.toBlob(callback, 'image/jpeg');
- }
-
- function setOrientation(orientation) {
- preview.dataset.orientation = orientation;
- filmstrip.dataset.orientation = orientation;
- mediaFrame.dataset.orientation = orientation;
-
- // When we rotate the media frame, we also have to change its size
- var containerWidth = frameContainer.offsetWidth;
- var containerHeight = frameContainer.offsetHeight;
- if (orientation === 0 || orientation === 180) {
- mediaFrame.style.width = containerWidth + 'px';
- mediaFrame.style.height = containerHeight + 'px';
- mediaFrame.style.top = 0 + 'px';
- mediaFrame.style.left = 0 + 'px';
- }
- else {
- mediaFrame.style.width = containerHeight + 'px';
- mediaFrame.style.height = containerWidth + 'px';
- mediaFrame.style.top = ((containerHeight - containerWidth) / 2) + 'px';
- mediaFrame.style.left = ((containerWidth - containerHeight) / 2) + 'px';
- }
-
- // And rotate so this new size fills the screen
- mediaFrame.style.transform = 'rotate(-' + orientation + 'deg)';
-
- // And we have to resize the frame (and its video player)
- frame.resize();
- frame.video.setPlayerSize();
- }
-
- return {
- isShown: isShown,
- hide: hide,
- show: show,
- addImage: addImage,
- addVideo: addVideo,
- clear: clear,
- setOrientation: setOrientation
- };
-}());
diff --git a/apps/system/camera/locales/camera.ar.properties b/apps/system/camera/locales/camera.ar.properties
deleted file mode 100644
index 9ca7690..0000000
--- a/apps/system/camera/locales/camera.ar.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-nospace2-title = لا توجد مساحة كافية على بطاقة الذاكرة
-nospace2-text = حرِّر مساحة بحذف ملفات.
-
-error-saving-title = لم يتم حفظ الصورة
-error-saving-text = حدث خطأ منع الكاميرا من حفظ الصورة.
-
-error-recording-title = لم يتم تصوير الفيديو
-error-recording-text = هنالك خطأ منع الكاميرا من تصوير الفيديو
-
-nocard-title = لم يتم العثور على بطاقة الذاكرة
-nocard-text = أدخل بطاقة الذاكرة لأخذ صور.
-
-pluggedin-title = لا يمكن استخدام الكاميرا والجوَّال موصول.
-pluggedin-text = إفصل الجوَّال لعرض الصور.
-
-size-limit-reached = لا توجد مساحة كافية على بطاقة الذاكرة
-
-delete-photo? = حذف الصورة ؟
-delete-video? = حذف الفيديو؟
diff --git a/apps/system/camera/locales/camera.en-US.properties b/apps/system/camera/locales/camera.en-US.properties
deleted file mode 100644
index 90b318d..0000000
--- a/apps/system/camera/locales/camera.en-US.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-nospace2-title = Not enough space on memory card
-nospace2-text = Try freeing up space by deleting media.
-
-error-saving-title = Picture not saved
-error-saving-text = An error prevented Camera from saving the picture.
-
-error-recording-title = Video not recorded
-error-recording-text = An error prevented Camera from recording the video.
-
-nocard-title = No memory card found
-nocard-text = Insert a memory card to take pictures.
-
-pluggedin-title = Camera can not be used while plugged in
-pluggedin-text = Unplug the phone to view pictures.
-
-size-limit-reached = You have run out of space on your SD card.
-
-delete-photo? = Delete photo?
-delete-video? = Delete video?
diff --git a/apps/system/camera/locales/camera.fr.properties b/apps/system/camera/locales/camera.fr.properties
deleted file mode 100644
index 56d7d3b..0000000
--- a/apps/system/camera/locales/camera.fr.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-nospace2-title = Espace libre sur la carte mémoire insuffisant
-nospace2-text = Essayez de libérer de l’espace en supprimant des médias.
-
-error-saving-title = Photo non sauvegardée
-error-saving-text = Une erreur a empêché l’application Photo de sauvegarder la photo.
-
-error-recording-title = Vidéo non enregistrée
-error-recording-text = Une erreur a empêché l’application Photo d’enregistrer la vidéo.
-
-nocard-title = Aucune carte mémoire trouvée
-nocard-text = Pour prendre des photos, insérez une carte mémoire.
-
-pluggedin-title = L’application Photo ne peut pas être utilisée tant que le téléphone est branché
-pluggedin-text = Pour afficher les photos, débranchez le téléphone.
-
-size-limit-reached = Vous n’avez pas assez d’espace sur votre carte SD.
-
-delete-photo? = Supprimer la photo ?
-delete-video? = Supprimer la vidéo ?
diff --git a/apps/system/camera/locales/camera.zh-TW.properties b/apps/system/camera/locales/camera.zh-TW.properties
deleted file mode 100644
index 9cf042a..0000000
--- a/apps/system/camera/locales/camera.zh-TW.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-nospace2-title = 記憶卡的空間不足
-nospace2-text = 刪除媒體檔案以釋放可用空間。
-
-error-saving-title = 相片未儲存
-error-saving-text = 發生錯誤,相機無法儲存相片。
-
-error-recording-title = 影片未紀錄
-error-recording-text = 有錯誤發生使照相機無法錄製影片。
-
-nocard-title = 找不到記憶卡
-nocard-text = 插入記憶卡以拍照。
-
-pluggedin-title = 連接到電腦時無法使用相機
-pluggedin-text = 拔線以檢視照片。
-
-size-limit-reached = 您已用盡 SD 卡上的空間。
-
-delete-photo? = 刪除相片?
-delete-video? = 刪除影片?
-
diff --git a/apps/system/camera/locales/locales.ini b/apps/system/camera/locales/locales.ini
deleted file mode 100644
index 93f5cbc..0000000
--- a/apps/system/camera/locales/locales.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-@import url(camera.en-US.properties)
-
-[ar]
-@import url(camera.ar.properties)
-
-[fr]
-@import url(camera.fr.properties)
-
-[zh-TW]
-@import url(camera.zh-TW.properties)
-
diff --git a/apps/system/camera/resources/sounds/shutter.ogg b/apps/system/camera/resources/sounds/shutter.ogg
deleted file mode 100644
index f0c67d6..0000000
--- a/apps/system/camera/resources/sounds/shutter.ogg
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/VideoPlayer.css b/apps/system/camera/style/VideoPlayer.css
deleted file mode 100644
index bc2b23c..0000000
--- a/apps/system/camera/style/VideoPlayer.css
+++ /dev/null
@@ -1,152 +0,0 @@
-/* styles for the video element itself */
-.videoPlayer {
- position: absolute;
- left: 0; /* we position it with a transform */
- top:0;
- transform-origin: 0 0;
-}
-
-/* video player controls */
-.videoPlayerControls {
- position: absolute;
- left: 0px;
- right: 0px;
- top: 0px;
- bottom: 0px;
- margin: 0;
- padding: 0;
-}
-
-.videoPlayerPlayButton {
- position: absolute;
- width: 106px;
- height: 106px;
- left: calc(50% - 53px);
- top: calc(50% - 53px);
- background: url("images/video_play_button.png") center no-repeat,
- url("images/video_play_normal.png") center no-repeat;
- border-width: 0;
-}
-
-.videoPlayerPlayButton:active {
- background: url("images/video_play_button.png") center no-repeat,
- url("images/video_play_focus.png") center no-repeat
-}
-
-.videoPlayerPlayButton.hidden {
- opacity: 0;
-}
-
-.videoPlayerFooter {
- position: absolute;
- left: 0px;
- right: 0px;
- bottom: 0px;
- height: 50px;
- margin: 0;
- padding: 0;
- background-color: rgba(0, 0, 0, 0.3);
- overflow: hidden;
- opacity: 1;
- transition: opacity 0.5s;
- font-family: "MozTT", sans-serif;
- -moz-user-select: none;
-}
-
-.videoPlayerFooter.hidden {
- opacity: 0;
- pointer-events: none;
-}
-
-.videoPlayerPauseButton {
- position: absolute;
- width: 100px;
- height: 100px;
- padding: 0;
- margin: 0;
- background: url("images/video_pause_button.png") center no-repeat,
- rgba(0,0,0,.5);
- border-radius: 53px;
- border: solid #ccc 3px;
- top: -25px;
- left: 10px;
-}
-
-.videoPlayerPauseButton:active {
- background: url("images/video_pause_button.png") center no-repeat,
- url("images/video_play_focus.png") center no-repeat
-}
-
-button::-moz-focus-inner {
- padding: 0;
- border: none;
-}
-
-/* time slider */
-.videoPlayerSlider {
- position: absolute;
- left: 110px;
- top: 0px;
- right: 0px;
- height: 100%;
-}
-
-.videoPlayerSlider > span {
- display: block;
- width: 45px;
- position: absolute;
- color: white;
- height: 100%;
- line-height: 50px;
- text-align: center;
- font-size: 15px;
-}
-
-.videoPlayerElapsedText {
- left: 10px;
-}
-
-.videoPlayerDurationText {
- right: 10px;
-}
-
-.videoPlayerProgress {
- position: absolute;
- top: 0px;
- left: 70px;
- right: 70px;
- height: 100%;
-}
-
-.videoPlayerProgress > div {
- position: absolute;
- pointer-events: none;
-}
-
-.videoPlayerElapsedBar, .videoPlayerBackgroundBar {
- height: 4px;
- width: 0%;
- top: 50%;
- margin-top: -2px;
- border-radius: 6px;
-}
-
-.videoPlayerElapsedBar {
- background-color: #0ac;
-}
-
-.videoPlayerBackgroundBar {
- background-color: #333;
- width: 100%;
-}
-
-.videoPlayerPlayHead {
- display: block;
- height: 20px;
- width: 25px;
- border-radius: 25px;
- background-color: white;
- top: 50%;
- margin: -10px 0 0 -12px;
-}
-
diff --git a/apps/system/camera/style/camera.css b/apps/system/camera/style/camera.css
deleted file mode 100644
index 6a1ca02..0000000
--- a/apps/system/camera/style/camera.css
+++ /dev/null
@@ -1,314 +0,0 @@
-html, body {
- font-family: "MozTT", sans-serif;
- font-size: 10px;
- height: 100%;
- width: 100%;
- padding: 0;
- margin: 0;
- overflow: hidden;
- background-color: black;
-}
-
-#viewfinder {
- position: absolute;
- z-index: 25;
-}
-
-#controls {
- position: absolute;
- bottom: 0;
- right: 0;
- left: 0;
- height: 45px;
- z-index: 50;
- background-color: rgba(0, 0, 0, 0.8);
- overflow: hidden;
-}
-
-#switch-button, #capture-button, #misc-button {
- position: absolute;
-}
-
-#switch-button, #misc-button {
- height: 45px;
- width: 33%;
-}
-
-#switch-button span,
-#capture-button span,
-#gallery-button span,
-#cancel-pick span
-{
- -moz-transition: 0.2s ease-in-out;
- pointer-events: none;
- background-position: center center;
- background-repeat: no-repeat;
- display: block;
- position: absolute;
- top: 50%;
- left: 50%;
- margin-left: -15px;
- margin-top: -15px;
- width: 30px;
- height: 30px;
-}
-
-#switch-button {
- left: 66%;
-}
-
-#misc-button {
- text-align: center;
- left: 0;
-}
-
-#video-timer {
- position:relative;
- top:50%;
- margin-top:-0.5em;
-}
-
-#gallery-button {
- display: block;
- width: 100%;
- height: 100%;
-}
-
-#gallery-button.hidden {
- display:none;
-}
-
-#gallery-button span {
- background-image: url(images/grid.png);
-}
-
-#gallery-button[disabled=disabled] {
- display: none;
-}
-
-#cancel-pick {
- display:block;
- width: 100%;
- height: 100%;
-}
-
-#cancel-pick.hidden {
- display:none
-}
-
-#cancel-pick span {
- background-image: url(images/actionicon_cancel.png);
-}
-
-#capture-button[disabled=disabled] {
- opacity: 0.5;
-}
-
-#switch-button[disabled=disabled] {
- opacity: 0.5;
-}
-
-#capture-button {
- background-color: #03a2b4;
- border-radius: 100px;
- left: 33%;
- height: 100px;
- width: 33%;
- top: -28px;
-}
-
-#video-timer {
- display: none;
- color: white;
-}
-
-/* Specific to when we are capturing video */
-.capturing #video-timer {
- display: block;
-}
-
-.capturing #gallery-button {
- display: none;
-}
-
-.capturing #capture-button {
- background-color: #d3361c;
-}
-
-.video.capturing #capture-button span {
- background-image: url(images/stop.png);
-}
-
-/* Swap the camera and video icons depending on mode */
-.video #switch-button span {
- background-image: url(images/camera.png);
-}
-
-.camera #switch-button span {
- background-image: url(images/video.png);
-}
-
-.camera #capture-button span {
- background-image: url(images/camera.png);
-}
-
-.video #capture-button span {
- background-image: url(images/video.png);
-}
-
-#focus-ring {
- position: absolute;
- z-index: 100;
- display: none;
- width: 50px;
- height: 50px;
- border-radius: 50px;
- top: 50%;
- left: 50%;
- margin-top: -30px;
- margin-left: -30px;
-}
-
-#focus-ring[data-state=focused] {
- border: 4px solid rgba(0, 255, 0, 0.3);
- display: block;
-}
-
-#focus-ring[data-state=focusing] {
- border: 4px solid rgba(0, 0, 0, 0.8);
- display: block;
-}
-
-#focus-ring[data-state=fail] {
- border: 4px solid rgba(255, 0, 0, 0.3);
- display: block;
-}
-
-/*
- * The overlay is where we display messages like Scanning, No Videos,
- * No SD card and SD Card in Use along with instructions for resolving
- * the issue. The user can't interact with the app while the overlay
- * is displayed.
- */
-#overlay {
- /* it takes up the whole screen */
- position: absolute;
- top: 0;
- left: 0;
- bottom: 0;
- right: 0;
-
- /* almost transparent gray */
- background-color: rgba(0, 0, 0, 0.4);
- z-index: 100;
-}
-
-/*
- * The overlay content area holds the text of the overlay.
- * It has borders and a less transparent background so that
- * the overlay text shows up more clearly
- */
-#overlay-content {
- background:
- url(images/ui/pattern.png) repeat left top,
- url(images/ui/gradient.png) no-repeat left top;
- background-size: auto auto, 100% 100%;
- /* We can't use shortand with background size because is not implemented yet:
- https://bugzilla.mozilla.org/show_bug.cgi?id=570326; */
- overflow: hidden;
- position: absolute;
- z-index: 100;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- font-family: "MozTT", Sans-serif;
- font-size: 0;
- /* Using font-size: 0; we avoid the unwanted visual space (about 3px)
- created by white-spaces and break lines in the code betewen inline-block elements */
- color: #fff;
- padding: 110px 25px 0px 25px;
-}
-
-#overlay-title {
- font-weight: normal;
- font-size: 1.9rem;
- color: #fff;
- margin: 0 5px -10px 5px;
-}
-
-#overlay-text {
- padding: 10px 5px 0 5px;
- border-top: 1px solid #686868;
- font-weight: 300;
- font-size: 2.5rem;
- color: #ebebeb;
-}
-
-.hidden {
- display: none;
-}
-
-#hud {
- position: absolute;
- top: 20px;
- height: 75px;
- left: 0;
- right: 0;
- z-index: 50;
-}
-
-#hud a {
- position: absolute;
- z-index: 50;
- height: 75px;
- width: 75px;
- border: 0;
- background-position: center center;
- background-repeat: no-repeat;
- background-image: url(images/hud_button_underlay.png);
-}
-
-#hud a:after {
- content: " ";
- display: block;
- position: relative;
- z-index: 60;
- height: 75px;
- width: 75px;
- background: transparent;
- background-position: center center;
- background-repeat: no-repeat;
-}
-
-#hud a:active {
- background-image: url(images/hud_button_underlay_focus.png);
-}
-
-#toggle-camera {
- right: 20px;
-}
-
-#toggle-flash {
- left: 20px;
-}
-
-#toggle-camera[data-mode=back]:after {
- background-image: url(images/toggle_front.png);
-}
-#toggle-camera[data-mode=front]:after {
- background-image: url(images/toggle_back.png);
-}
-
-#toggle-flash[data-mode=on]:after {
- background-image: url(images/flash_on.png);
-}
-#toggle-flash[data-mode=off]:after {
- background-image: url(images/flash_off.png);
-}
-#toggle-flash[data-mode=auto]:after {
- background-image: url(images/flash_auto.png);
-}
-#toggle-flash[data-mode=torch]:after {
- background-image: url(images/flash_torch.png);
-}
diff --git a/apps/system/camera/style/filmstrip.css b/apps/system/camera/style/filmstrip.css
deleted file mode 100644
index fd32dc6..0000000
--- a/apps/system/camera/style/filmstrip.css
+++ /dev/null
@@ -1,187 +0,0 @@
-#filmstrip {
- transition: 0.2s ease-in-out;
- position: absolute;
- z-index: 100;
- left: 0;
- right: 0;
- height: 50px;
- /*
- * the background must be solid for preview mode because otherwise some
- * of the frozen viewfinder shows through. If it really need to be translucent
- * in camera mode, we'll have to change it with javascript
- */
- background: black;
-}
-
-#filmstrip.hidden {
- transform: translateY(-50px);
-}
-
-img.thumbnail {
- position: relative;
- width: 46px;
- height: 46px;
- border: 2px solid white;
- margin-right: 4px;
- float: left; /* XXX: do we need this? */
- -moz-user-select: none;
- transition: 0.2s ease-in-out;
-}
-
-img.thumbnail.previewed { /* if the thumbnail is being previewed */
- border: 2px solid #0ac;
-}
-
-/*
- * Make the thumbnails rotate with the phone
- */
-#filmstrip[data-orientation="90"] img.thumbnail {
- transform: rotate(-90deg);
-}
-#filmstrip[data-orientation="180"] img.thumbnail {
- transform: rotate(-180deg);
-}
-#filmstrip[data-orientation="270"] img.thumbnail {
- transform: rotate(-270deg);
-}
-
-/* this is where we display image and video previews */
-#preview {
- position: absolute;
- left: 0;
- width: 100%;
- top: 50px;
- bottom: 0px;
- padding: 0;
- margin: 0;
- border-width: 0;
- background: #000; /* opaque */
- z-index: 100; /* on top of all the camera stuff */
- transition: transform 0.5s linear;
- overflow: hidden;
- transform-origin: 0 0;
-}
-
-#preview.offscreen {
- transform: translateY(-100%) scale(.125) translateX(50%);
-}
-
-#frame-container {
- position: absolute;
- left: 0;
- top: 0;
- width: 100%;
- bottom: 40px;
- padding: 0px;
- margin: 0px;
- overflow: hidden;
- -moz-user-select: none;
-}
-
-#media-frame {
- position: absolute;
- /* size, position, and rotation are set based on the phone orientation */
-}
-
-#media-frame > img {
- top: 0px; /* javascript modifies this position with a transform */
- left: 0px;
- position: absolute;
- border-width: 0px;
- padding: 0px;
- margin: 0px;
- transform-origin: 0px 0px;
- pointer-events: none;
- -moz-user-select: none;
-}
-
-/*
- * these styes apply when we're swapping out a preview image to replace
- * it with a full-resolution image, but the full image isn't ready yet.
- * This happens when the user starts to zoom in on the image. We need
- * some sort of simple visual effect to fill ~500ms of dead time so the
- * user doesn't think the app has frozen up
- */
-#media-frame > img.swapping {
- opacity: 0.8;
- outline: dashed #0ac 4px;
- outline-offset: -4px;
-}
-
-#media-frame > video {
- transform-origin: 0px 0px;
-}
-
-#preview-controls {
- position: absolute;
- left: 0;
- right: 0;
- bottom: 0px;
- height: 40px;
- background-color: rgba(0, 0, 0, 0.8);
- z-index: 100; /* above the dynamically inserted frame elements */
-}
-
-a.button {
- display: block;
- padding: 0;
- margin: 0;
- border-width: 0;
- background-position: center center;
- background-repeat: no-repeat;
- transition: 0.2s ease-in-out;
-}
-
-a.button:active, a.button:focus {
- outline: none;
-}
-
-a.button.hidden {
- display: none;
-}
-
-#camera-button {
- position: absolute;
- left: 0;
- width: 33%;
- height: 100%;
- background-image: url(images/camera.png);
-}
-
-#share-button {
- position: absolute;
- left: 33%;
- width: 33%;
- height: 100%;
- background-image: url(images/share.png);
-}
-
-#delete-button {
- position: absolute;
- left: 67%;
- width: 33%;
- height: 100%;
- background-image: url(images/delete.png);
-}
-
-#filmstrip-gallery-button {
- position: absolute;
- right: 0;
- top: 0;
- width: 50px;
- height: 50px;
- background-image: url(images/grid.png);
-}
-
-/*
- * Make the button icons rotate with the phone
- */
-#preview[data-orientation="90"] a.button {
- transform: rotate(-90deg);
-}
-#preview[data-orientation="180"] a.button {
- transform: rotate(-180deg);
-}
-#preview[data-orientation="270"] a.button {
- transform: rotate(-270deg);
-}
diff --git a/apps/system/camera/style/icons/60/Camera.png b/apps/system/camera/style/icons/60/Camera.png
deleted file mode 100644
index f27f506..0000000
--- a/apps/system/camera/style/icons/60/Camera.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/icons/Camera.png b/apps/system/camera/style/icons/Camera.png
deleted file mode 100644
index f27f506..0000000
--- a/apps/system/camera/style/icons/Camera.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/camera.png b/apps/system/camera/style/images/camera.png
deleted file mode 100644
index 85a80f5..0000000
--- a/apps/system/camera/style/images/camera.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/delete.png b/apps/system/camera/style/images/delete.png
deleted file mode 100644
index 0f2450e..0000000
--- a/apps/system/camera/style/images/delete.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/flash_auto.png b/apps/system/camera/style/images/flash_auto.png
deleted file mode 100644
index 3018d8d..0000000
--- a/apps/system/camera/style/images/flash_auto.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/flash_off.png b/apps/system/camera/style/images/flash_off.png
deleted file mode 100644
index 0fc7112..0000000
--- a/apps/system/camera/style/images/flash_off.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/flash_on.png b/apps/system/camera/style/images/flash_on.png
deleted file mode 100644
index c7983d1..0000000
--- a/apps/system/camera/style/images/flash_on.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/flash_torch.png b/apps/system/camera/style/images/flash_torch.png
deleted file mode 100644
index 3018d8d..0000000
--- a/apps/system/camera/style/images/flash_torch.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/hud_button_underlay.png b/apps/system/camera/style/images/hud_button_underlay.png
deleted file mode 100644
index 5853adb..0000000
--- a/apps/system/camera/style/images/hud_button_underlay.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/hud_button_underlay_focus.png b/apps/system/camera/style/images/hud_button_underlay_focus.png
deleted file mode 100644
index c3542bc..0000000
--- a/apps/system/camera/style/images/hud_button_underlay_focus.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/play_overlay.png b/apps/system/camera/style/images/play_overlay.png
deleted file mode 100644
index 2a56d04..0000000
--- a/apps/system/camera/style/images/play_overlay.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/share.png b/apps/system/camera/style/images/share.png
deleted file mode 100644
index 6a56f19..0000000
--- a/apps/system/camera/style/images/share.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/stop.png b/apps/system/camera/style/images/stop.png
deleted file mode 100644
index b358cc5..0000000
--- a/apps/system/camera/style/images/stop.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/toggle_back.png b/apps/system/camera/style/images/toggle_back.png
deleted file mode 100644
index 5e767b4..0000000
--- a/apps/system/camera/style/images/toggle_back.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/toggle_front.png b/apps/system/camera/style/images/toggle_front.png
deleted file mode 100644
index b67507f..0000000
--- a/apps/system/camera/style/images/toggle_front.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/video_pause_button.png b/apps/system/camera/style/images/video_pause_button.png
deleted file mode 100644
index b0224f8..0000000
--- a/apps/system/camera/style/images/video_pause_button.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/video_play_button.png b/apps/system/camera/style/images/video_play_button.png
deleted file mode 100644
index 56dba6b..0000000
--- a/apps/system/camera/style/images/video_play_button.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/video_play_focus.png b/apps/system/camera/style/images/video_play_focus.png
deleted file mode 100644
index 1bb0537..0000000
--- a/apps/system/camera/style/images/video_play_focus.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/style/images/video_play_normal.png b/apps/system/camera/style/images/video_play_normal.png
deleted file mode 100644
index 0cabf3d..0000000
--- a/apps/system/camera/style/images/video_play_normal.png
+++ /dev/null
Binary files differ
diff --git a/apps/system/camera/test/unit/_proxy.html b/apps/system/camera/test/unit/_proxy.html
deleted file mode 100644
index 2102451..0000000
--- a/apps/system/camera/test/unit/_proxy.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
- <title>Serve the tests</title>
-
- <script type="text/javascript" charset="utf-8">
- (function(window){
- var Loader = window.CommonResourceLoader = {},
- host = document.location.host,
- domain = host.replace(/(^[\w\d-]+\.)?([\w\d]+\.[a-z]+)/, 'test-agent.$2');
-
- Loader.domain = document.location.protocol + '//' + domain;
- Loader.url = function(url){
- return this.domain + url;
- }
-
- Loader.script = function(url, doc){
- doc = doc || document;
- doc.write('<script type="application/javascript;version=1.8" src="' + this.url(url) + '"><\/script>');
- return this;
- };
- }(this));
- </script>
-
- <style type="text/css" media="all">
- html,body,iframe {
- height: 100%;
- width: 100%;
- }
- </style>
-
-</head>
-<body>
-
-<!-- Test Agent UI will be loaded in here -->
-<div id="test-agent-ui">
-</div>
-
-<script type="text/javascript" charset="utf-8">
-CommonResourceLoader.
- script('/common/test/test_url_resolver.js').
- script('/common/vendor/test-agent/test-agent.js').
- script('/common/test/agent_proxy.js');
-</script>
-</body>
-</html>
-
-
diff --git a/apps/system/camera/test/unit/_sandbox.html b/apps/system/camera/test/unit/_sandbox.html
deleted file mode 100644
index 70d0efa..0000000
--- a/apps/system/camera/test/unit/_sandbox.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
- <title>Tests</title>
- <link rel="stylesheet" type="text/css" href="/vendor/mocha/mocha.css" />
- <style type="text/css" media="all">
- iframe {
- border: none;
- padding: 0px;
- }
- </style>
- <script type="text/javascript" charset="utf-8">
- </script>
-</head>
-
-<body>
-
-<div id="mocha">
-</div>
-
-<div id="test">
-</div>
-
-</body>
-</html>
-
-
diff --git a/build/applications-data.js b/build/applications-data.js
index 69ef24b..c94303d 100644
--- a/build/applications-data.js
+++ b/build/applications-data.js
@@ -83,161 +83,3 @@ function iconDescriptor(directory, app_name, entry_point) {
icon: icon
};
}
-
-// zeroth grid page is the dock
-let customize = {"homescreens": [
- [
- ["apps", "communications", "dialer"],
- ["apps", "sms"],
- ["apps", "communications", "contacts"],
- ["apps", "browser"]
- ], [
- ["apps", "camera"],
- ["apps", "gallery"],
- ["apps", "fm"],
- ["apps", "settings"],
- ["external-apps", "marketplace"]
- ], [
- ["apps", "calendar"],
- ["apps", "clock"],
- ["apps", "costcontrol"],
- ["apps", "email"],
- ["apps", "music"],
- ["apps", "video"]
- ]
-]};
-
-if (DOGFOOD == 1) {
- customize.homescreens[0].push(["dogfood_apps", "feedback"]);
-}
-
-let init = getFile(GAIA_DIR, 'customize.json');
-if (init.exists()) {
- customize = getJSON(init);
-}
-
-let content = {
- search_page: {
- provider: 'EverythingME',
- enabled: true
- },
-
- grid: customize.homescreens.map(
- function map_homescreens(applist) {
- var output = [];
- for (var i = 0; i < applist.length; i++) {
- if (applist[i] !== null) {
- output.push(iconDescriptor.apply(null, applist[i]));
- }
- }
- return output;
- }
- )
-};
-
-init = getFile(GAIA_DIR, GAIA_CORE_APP_SRCDIR, 'homescreen', 'js', 'init.json');
-writeContent(init, JSON.stringify(content));
-
-// Apps that should never appear in settings > app permissions
-// bug 830659: We want homescreen to appear in order to remove e.me geolocation permission
-let hidden_apps = [
- gaiaManifestURL('keyboard'),
- gaiaManifestURL('wallpaper'),
- gaiaManifestURL('bluetooth'),
- gaiaManifestURL('pdfjs')
-];
-
-init = getFile(GAIA_DIR, GAIA_CORE_APP_SRCDIR, 'settings', 'js', 'hiddenapps.js');
-writeContent(init, "var HIDDEN_APPS = " + JSON.stringify(hidden_apps));
-
-// Apps that should never appear as icons in the homescreen grid or dock
-hidden_apps = hidden_apps.concat([
- gaiaManifestURL('homescreen'),
- gaiaManifestURL('system')
-]);
-
-init = getFile(GAIA_DIR, GAIA_CORE_APP_SRCDIR, 'homescreen', 'js', 'hiddenapps.js');
-writeContent(init, "var HIDDEN_APPS = " + JSON.stringify(hidden_apps));
-
-// Cost Control
-init = getFile(GAIA_DIR, 'apps', 'costcontrol', 'js', 'config.json');
-
-content = {
- provider: 'Vivo',
- enable_on: { 724: [6, 10, 11, 23] }, // { MCC: [ MNC1, MNC2, ...] }
- is_free: true,
- is_roaming_free: true,
- credit: { currency : 'R$' },
- balance: {
- destination: '8000',
- text: 'SALDO',
- senders: ['1515'],
- regexp: 'Saldo Recarga: R\\$\\s*([0-9]+)(?:[,\\.]([0-9]+))?'
- },
- topup: {
- destination: '7000',
- ussd_destination: '*321#',
- text: '&code',
- senders: ['1515', '7000'],
- confirmation_regexp: 'Voce recarregou R\\$\\s*([0-9]+)(?:[,\\.]([0-9]+))?',
- incorrect_code_regexp: '(Favor enviar|envie novamente|Verifique) o codigo de recarga'
- },
- default_low_limit_threshold: 3
-};
-
-writeContent(init, JSON.stringify(content));
-
-// SMS
-init = getFile(GAIA_DIR, 'apps', 'sms', 'js', 'blacklist.json');
-content = ["1515", "7000"];
-writeContent(init, JSON.stringify(content));
-
-// Browser
-init = getFile(GAIA_DIR, 'apps', 'browser', 'js', 'init.json');
-
-content = {
- "bookmarks": [
- { "title": "Vivo Busca",
- "uri": "http://www.google.com.br/m/search?client=ms-hms-tef-br",
- "iconUri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAN1wAADdcBQiibeAAAAAd0SU1FB9wMDg8JHqyWLdEAAAbmSURBVFjD1ZdrjF1VFcd/6+xzz7nPzqOlFNpBKqA8Uoi0Cg1BjaARa+SDFDEKamk7My2tMZIYIUZ8pISoCbaEzsyFkqZSBaLhUUKMBLSAYMm0hqaNSFvSKTJMS2fambmP89h7+eFOHyOdYUD7wfVtn7Nz1m899n+vA/8Ptpz1U9zX/YG/LZO9XOb1UHbLj6+XsC4XTstl/YwfIOKpw9k0SaLharSL3srf2AhAu9dNt2v/7wDacz101xrOl+d7mgPfv1iM+bIJ/Ks9412IJyVBaurcGzZOt9nU/SGq13eW6+2HADpyZbpqyz4cQEf+AbqqS/kqPzFnFGbP94PM9/zAvynM5zC+Ac/DZAye7yHGA1Vqw1XiSv25aLR69+GRgRce4Y6os/gg60dv/WAAHWGZrmgZN/ELv6XYujiTDe4xvt+mTonqdU1qsaSJxTOAJ2SKAfmWgpZaW8RzQvXIaK06NHLn4NC7PZu5vdIe9tAdLZ8QwIxLO11023auYaW0lc5bHOSza41nzorjSCtDI+SmGWm7tJXzr5rFeVfMZPbFLRSbA+qjNTm4/5BKVig1N2d8439WrBcV6jNf/r29y63wNvKqPj71EnQWH1gQFnIPe57/sXq1otFoXc67cibzb5zL+VefyayLmvCzBhQGD1To2/Yurz3Vx44/7scv5LW1daZER6qHB/sPrequLPvtZCUwJ0ffyxa+zdqmQnPp9iCb/WJcq2t9pCqXLTqH6++ezyVfmk1heohNlDRypLEjKPjMuqiJCz49i4xn2PPXt8Uap4VCKS9Ky4XDV2/dwTNH2tlAL09MDNDLFgCualk8L8hl7zW+Hwy9M8gFC8+U69fM5+xLm0gjxVkFBBnLnTpFLZjA0Hb5dFzk2PXsAfLTi+KTOSdN4t2vRk9uP5VzAO/kxde4J/BNuDCTCwpRra75pows+Ppczp7XxPCIIbEeiCCiJ2oogqqiTvGzhvk3zOUj81pl9MiwelljsoXCZ5axdvpEJRgHkCNb9DLegiCXJarUmT2vhXM/NYNq5FOt+6iCoO9tpGMQVmmek2fedXOoHKogPgTZsC1FZ04JIBMGgWe8NjFCmiRyxtwSMz5aYrjig4DxGs5V5ZQQAGHB56wLm/GNiE0t4nltmSCcMSUA8Y2HSIgHaiAs+fjFDKkVjKfHUy8T6Kdqoz+CnE+Y93HWgdJiPFOaEoBNU6uqFRGDlzHYxKGJwxNwTjhF9k95sK1V4loKThCRIWft6JQAXJQkmtgBdY6gGDI0UOXoW6Pkcxargh1LvU4AIiKkkWPoQIXoqEUUrLVvJ0l6eEoAEfVhl7oXklpEsaVE/56jvPXaEZqLCYFvcU5Qxp+CE6kH8WDkYI1//rmfsBjirCOpxe/kaRp8X4AOr8xmfpAmSbQtqUTVbDbH0YFYd/7pACMH67QWY4KMbYR/UhOq6vEGdBYO7DjM35/o01wph9YtcbW+9T5u7v9pbs3kAF2ucXXWhitvxtWox9Ys0+fMlN4n9+srm/YQVS2eSMOZHItax60P7DjM43duJxOG4olHEsUvuRH7PMC+2sL3v4xWZrvpSVdGl6Wf7/fEfCFfKrVKKLL7uT51sZOW2QX80OCHBs8IYoQ0dlQOR+x96SC/W/UKR/sjCqUiLnHER2uP3G+XPAzwSRayfUxtJwQ4N72F3TxGr3164BP2ugGQa0vTmrOm4MuuZ/t074sDUj8Sk8aOkUN1BvsqvLF1gL+s/wfPrNmJSz0KhQLqVKPhuqRRkr+cRbu383TfdrawnO7jkj/hbbjaPMha2xgiVmQfvCU/Y9rPCq3TztHAURmpUD00qvFoLJnQI64moEKQCwjzIcYYNHFEIzVsnKhDBeRlYFWZjt5jc2MP7ZNfx7eZDdxnl4zNd+XPhS25FcXmadf4uaCZjOKsJY0smlqcU0gcNnYk9Yi0Equ1VhSngtDoWHleobNMx+sAS7mfB1gx+Uz4XfMbfm2/2cgEG5rJ8BVT9K8IctlLMkGmIMaEqEvS2MZpVN8XDUcFG6XXOywNryI0pGtMweQxRW8r03lwFQ+xju+8/1QMsNrfxNr05hONysaPp0RFhwYCaUg+LjBjbz+vNwWE9wI3CMeFYhyEwo+BX5bprE5pLD/Zvh88yq/iGyfds4yuuQLrgEWcEG5piKeKIO8CV/TQse+USjiZTeZ8OV0AlOl4E/gh8OIEwdUAN6EUf1jroeM4RA8dO0HvAN2l46IHRX+u6L/+5wDvheh8QZEfgQ7SSP1+Rb4FuqlMZ3JaAI5BtHP/mMLZpwQWKnK5wpXA5jIrao1eWc9ps8U8ytKxn9TVrOdWHvqPRj2Nzo/ZXdzFN9g07tlSyqfc+2+KJinaWejipgAAAABJRU5ErkJggg=="
- },
- { "title": "Serviços e Downloads",
- "uri": "http://vds.vivo.com.br",
- "iconUri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABOWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjarZGxSsNQFIa/G0XFoVYI4uBwJ1FQbNXBjElbiiBYq0OSrUlDldIk3NyqfQhHtw4u7j6Bk6PgoPgEvoHi1MEhSHASwW/6zs/hcOAHo2LXnYZRhkGsVbvpSNfz5ewTM0wBQCfMUrvVOgCIkzjiJwI+XxEAz5t23WnwN+bDVGlgAmx3oywEUQH6FzrVIMaAGfRTDeIOMNVJuwbiASj1cn8BSkHub0BJuZ4P4gMwe67ngzEHmEHuK4Cpo0sNUEvSkTrrnWpZtSxL2t0kiOTxKNPRIJP7cZioNFEdHXWB/D8AFvPFdtORa1XL2lvnn3E9X+b2foQAxNJjkRWEQ3X+3YWx8/tc3Bgvw+EtTE+KbPcKbjZg4brIVqtQ3oL78RfCs0/+HAmzJwAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAAAd0SU1FB9wMDg8FJ18m6tUAAAjBSURBVFjDrVd7cFXFGf/tnnPuM++bhBSD8rQq+MCkZVoQaEc7aivRqY8RLVroyB/BUmuSiqMdWxGQURkBR7AkPnCKVUSxVmYqRQTCACUE0YgPCCDP5L5C7r3nsbtnv/5xEyDVDsykO7MzZ3Z/+51vf99zgQscH6Pixl0/qan/fOEDhf8L8+XihqKOeQ/Ut44YeQcA/P0C5PLzAbo6NkZbh47+KlBVsSE0fORyp+3L3g8Bawsqz2Bahw7HRoBnWtsSVklsuVle/mb7vb9wfrxne/H55JvnAxz/w5LrKx+6d0xo1EiQlFCpNGXXdkybjO63+zETTxzG1srq6wqvnWCFho/G0Ecug0zFg+nNH84AsGxQChx5/wM99qe18E4d619iZqxk7cdJ32CwNC8NYFL6GMyS4s1GZRFEsisPYmD7//i8P2gT8HDZpkMvrIHqSUCl4lCpOEpn/wwE/dBkdGNS+hi2hCpvKrzxh1DJ/L5KJ9D5/OvQPtYPWoE6J5lzvum+L7PvK8h0CjKdgi9tWBXlz2wxqsIAYA4pXUchUP++e+wE5TpPPlHnpI6fTz47H+C9aDmm5RJ4v7SKqn85AaQJAKAzLjJv7XqcwYxHb7lyhVHRFxyM4cT6f0PlvCDjTEzLJQbnhP0CVM4bf3pvZ3v0klgfdxxmRckjAGyEGfzTvQAAN5GFyrp1dW5KXEh4s6ZhjQBDMfk0I+2kfeL0t+ZES/I3FbOwKt48ALw+Ejv4vUmjRiJPAnROAkqDFwfPYE62HsxahaHCm7vOsm8fWo3IiF/BO7EupqHv0na3QaTXFYyZc5wBQONFDU71j0YFw2UR1rG5HZlETyPAlrSkXh7gxevDsXCwJGQXX1JKoD7zMQAEgIGceA6ZE70VdU4yee45op2wD31dT35muerZCxgBsoouY9HR9Yw1Dmu8w4pYbw6bNBpaaRAIbsamAzv3M+F4U61QYMvKEyvpHBbeKasquZUbA/2XtEbyZE9HnZ0cd+766c9WTADUDj/zGcjPAoyDAbDKxoEZ4Vnc0qgMWCaE40IKD9L1wE2DXTppLKqvuGSzEvKbWbGZFQCwoGQK6uzkbb3dvTalBem0B532QGlBmXjWr7OT47bfMhEAEN/5dDjZ9uxB2fP5Du/UR9B2CloIaOFBS4Hc4U+R+bI9zJ4e0lQYlKxX15TDL7IAIpAmEJ2d3Z0nqberZ2tzomVKHwsPRmAsDVHehwU0skyuqbOT0wGge9ufN5FMTiX7EGOMAX2TcQaAQbsepfccZEZhYREDgNcwj2uDplghY9OpawvgFDGgX4m8EUl5knUfOOlKV85vTrQ89V6kvAPAFQBAjA7V5ZIjj/+z6UFobxFzD0ZAksAYY2AAZwDnIOkjte8wtOPdTtp/9+rFR3wOANyEvt9f9NGInDYu3nr6ntjODCjjQSoJKQSEEMyHRmzMkGC0vGD+rPKZrdPsxFhiVA6GqrpccuThd+es9bNHl+r03rB2c9BCMi0EtC8hMzbiezpxctv+6a7tGVct6nybmZb/rUT0qjUP98mFAIDFpY2PZGL8MRkzorAIRABR3hdTX8cBILIq3uwAwBev3sOtUNA3nf0A5+inXXk+cl2ZbK47s9CMWEtqF3zttM8bjfELD3x3IuqoUsDR/HcijLSGtknoKBGdMcl35nPLgLJtcCkBzs4ooIUPJRUUAO3IfKL6r9zHAaBpWGNfLIE3XdQ4vWF4A8lKf4UsVhWKJJSQkFJBSUVujw0i2r4q3uzs2nd5+a59lw+5dPpr2ndy64SMQAtBvhDQngDnGqVDowVVY8qeMgtC9s4nxt+djXdxAPji5bqztaBpWCMHYQpx2iQKFXxDD4gGEBH5xNRp6Wpfz29OtDzV2n7ZNgKbCDAw6PjE8V9U7nvuhgcZiUVBIxXhnPJOyPpqM+MgxiFYDEZB8e3gePfS6Wt91jSsoZCAXifqQTO/74cYEIbkaNKe3tKcaJkKABt3jJ3TIyqWZWQMACFsZFEePr7m+gkd0wGg7clJ75iGe2skmMmHYF/45RVh4MEIhcdcx4KFRUU8rNkMAxrCF3l7SQUlJJRQ8G0F3eMf054e0pxomTr//p/ns5sbXHC8N4KM6yDjuujKmdSdLbwTADasrUHN49tuEx6PpJPRTifDQZ4EybPTz/YyQ+VghaMzzLIc7xaccIoLcN13cw0yJGeM2GQwbGuOtxAAPPbKP/DGxqtf7UyXFiqtBhS1o16B8ca/rt6f1epyAPjBn3Y5AEZtf3jshNxpY0dhsYBlAsQYCICXTkHZHQ4DgL8ajzq7iuPBhOWwgLbAiTcSaElzomVAMXplwzWRrAjkuuwoMQwsRgRQcdBlZSH3qpk3t3967rk1E4GLrhxRb5r+8uIYgRsB4qEq9v2mVsaXhx5FsU9VN6Qq51Z50XoGXr4q0fwMY+xb/VzO41uOZsLwlGau0rCFQtaWcJWGpzTrzgVge3zri+tr+LNv1Zw5V33lcExecegFkVHliSOqXsTVXPfIN9UX1BH1j2ffvPaqXhn4JCMt6j/n2h6I6Ei4IHwxiBgABAwfsYB7d+Nde97A/+NdMK+lNn97wXekPBNKa6a0hvQ1lPQfU1I3CSGZ0hpKa9iSISeMNU+urgk/+nItBt0T5pWoudcha7Wks3DfVSCfIivn7nZmL6t1zUgg0M8CB6iAiyULZ7Y9PGgG6l+sMRzJV3vEoYlBEwMRg/Z1w8q5u518M0K3aalZ/74CY7bkv//dippRg1ZAerjJY8bZHgEE3xUAsHL20lrMXlqLl+a2bdBCAejDaILgJjzJbhz000z4MCJE0Izl+woiIqKGl+a2ZQf2fXQN+XovDA4iwASRD+KDZiBp8w9CzD8woliiIqwQJMWUj2Wzlw50sJf+EvyEKZUuDSiMKpEoMpUnfbw+aAVGVEA+98DuMaZBN4UMPcfkqG5+qE2u/O3ugcDPtsMy2PAgp/qAiTsX/Hp3eNzFPH0++f8BWpzorRJD7KcAAAAASUVORK5CYII="
- },
- {
- "title": "Site Vivo",
- "uri": "http://www.vivo.com.br/conteudosmartphone",
- "iconUri": "data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAlgCWAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAAgACADASIAAhEBAxEB/8QAGgAAAgIDAAAAAAAAAAAAAAAABQYBAwQHCP/EAC4QAAEDAwIEBQIHAAAAAAAAAAECAwQFBhEAIQcSMUETFFFhcSKBMkKCkqGxwf/EABkBAAIDAQAAAAAAAAAAAAAAAAMGAAECBP/EACQRAAIBAwQCAgMAAAAAAAAAAAECEQMEEgAFITEiQVFxMmGh/9oADAMBAAIRAxEAPwDrG7rkg25AEiVlx1eQywk/U4f8A7nSXFrXEW4k+ZpMJiFEV+BxYSAfgqyT8gasmQBcPEQpmDnjNuFPIenI2OnwVf3ozOnSKnJ8rDeUhnPIyyyoJKwO59Btn2Gky53F7lncswQMVVVMFiOzPxpko0KVsiqEDORJLcgA9CPnQGbVOJdvtGXUIrE+IjdxTaUr5R6kJwoD3wQNN9lXVCuaEXGR4UlsAuMk52PRST3ToLBRNgywtp59pxDwbcaWvmC9wMehznY++sOi01qlcRZSYIDbHmikIT0AW0lah8cxOpZX9ak6sC2JYKysZImYIPB4jkau4pUbimwKgMBIKiAY7BHXvgjQldRXa/F+WmouLEOWQ6ypXQJUCDj9RP7dTSLHrsC6mpER1C6c49zpmMPAEtE53Gc5x6ZGn29LUpd1QEx56VNvNEqYkN7LaJ649QcDIOxwO4B0jxba4kW2S1RqjGqEXP0guBKvulY5QfcHJ0W82rB/KmXTLIY/kCYkR7BgaNbbgtWl4OEfEKQ3RA6IPo/erJ9PumJeTtRapbstIfUtsBWW1D8pOD22ODo9Zdt1RmsP1+vPDzTpJbjpVlKCeqj2zjYY6DQZUHilUh4cmQ1BQepEhKMfdsc3862HSWpLFMjMzHQ7IbbSlxYJIUoDc7763tW3UzcM5RwAchnAGR98cn9Trm3C7dKIQMhJGJxkmB/PvX//2Q=="
- }
- ]
-}
-
-writeContent(init, JSON.stringify(content));
-
-// Support
-init = getFile(GAIA_DIR, 'apps', 'settings', 'resources', 'support.json');
-content = {
- "onlinesupport": {
- "href": "http://www.vivo.com.br/portalweb/appmanager/env/web?_nfls=false&_nfpb=true&_pageLabel=vcAtendMovelBook&WT.ac=portal.atendimento.movel",
- "title": "Vivo"
- },
- "callsupport": [
- {
- "href": "tel:*8486",
- "title": "*8486"
- },
- {
- "href": "tel:1058",
- "title": "1058"
- }
- ]
-}
-writeContent(init, JSON.stringify(content));
-
-// ICC / STK
-init = getFile(GAIA_DIR, 'apps', 'settings', 'resources', 'icc.json');
-content = {
- "defaultURL": "http://www.mozilla.org/en-US/firefoxos/"
-}
-writeContent(init, JSON.stringify(content));
diff --git a/build/utils.js b/build/utils.js
index 5b7a58b..eef810e 100644
--- a/build/utils.js
+++ b/build/utils.js
@@ -168,22 +168,10 @@ function makeWebappsObject(dirs) {
};
}
-let externalAppsDirs = ['external-apps'];
-
-// External apps are built differently from other apps by webapp-manifests.js,
-// and we need apps that are both external and dogfood to be treated like
-// external apps (to properly test external apps on dogfood devices), so we
-// segregate them into their own directory that we add to the list of external
-// apps dirs here when building a dogfood profile.
-if (DOGFOOD === '1') {
- externalAppsDirs.push('external-dogfood-apps');
-}
-
const Gaia = {
engine: GAIA_ENGINE,
sharedFolder: getFile(GAIA_DIR, 'shared'),
webapps: makeWebappsObject(GAIA_APP_SRCDIRS),
- externalWebapps: makeWebappsObject(externalAppsDirs.join(' ')),
aggregatePrefix: 'gaia_build_'
};
diff --git a/build/webapp-manifests.js b/build/webapp-manifests.js
index 6bd79b9..b5090e4 100644
--- a/build/webapp-manifests.js
+++ b/build/webapp-manifests.js
@@ -86,90 +86,6 @@ Gaia.webapps.forEach(function (webapp) {
});
-// Process external webapps from /gaia/external-app/ folder
-Gaia.externalWebapps.forEach(function (webapp) {
- // If BUILD_APP_NAME isn't `*`, we only accept one webapp
- if (BUILD_APP_NAME != '*' && webapp.sourceDirectoryName != BUILD_APP_NAME)
- return;
-
- if (!webapp.metaData) {
- return;
- }
-
- // Compute webapp folder name in profile
- let webappTargetDirName = webapp.sourceDirectoryName;
-
- // Copy webapp's manifest to the profile
- let webappTargetDir = webappsTargetDir.clone();
- webappTargetDir.append(webappTargetDirName);
-
- let origin;
- let installOrigin;
- let manifestURL;
-
- let removable;
-
- // In case of packaged app, just copy `application.zip` and `update.webapp`
- let appPackage = webapp.sourceDirectoryFile.clone();
- appPackage.append('application.zip');
- if (appPackage.exists()) {
- let updateManifest = webapp.sourceDirectoryFile.clone();
- updateManifest.append('update.webapp');
- if (!updateManifest.exists()) {
- throw new Error('External packaged webapp `' + webapp.domain + ' is ' +
- 'missing an `update.webapp` file. This JSON file ' +
- 'contains a `package_path` attribute specifying where ' +
- 'to download the application zip package from the origin ' +
- 'specified in `metadata.json` file.');
- }
- appPackage.copyTo(webappTargetDir, 'application.zip');
- updateManifest.copyTo(webappTargetDir, 'update.webapp');
- removable = true;
- origin = webapp.metaData.origin;
- installOrigin = webapp.metaData.installOrigin;
- manifestURL = webapp.metaData.manifestURL;
- } else {
- webapp.manifestFile.copyTo(webappTargetDir, 'manifest.webapp');
- origin = webapp.metaData.origin;
- installOrigin = webapp.metaData.origin;
- manifestURL = webapp.metaData.origin + 'manifest.webapp';
-
- // This is an hosted app. Check if there is an offline cache.
- let srcCacheFolder = webapp.sourceDirectoryFile.clone();
- srcCacheFolder.append('cache');
- if (srcCacheFolder.exists()) {
- let cacheManifest = srcCacheFolder.clone();
- cacheManifest.append('manifest.appcache');
- if (!cacheManifest.exists())
- throw new Error('External webapp `' + webapp.domain + '` has a cache ' +
- 'directory without `manifest.appcache` file.');
-
- // Copy recursively the whole cache folder to webapp folder
- let targetCacheFolder = webappTargetDir.clone();
- targetCacheFolder.append('cache');
- copyRec(srcCacheFolder, targetCacheFolder);
- }
- }
-
- let etag = webapp.metaData.etag || null;
- let packageEtag = webapp.metaData.packageEtag || null;
-
- // Add webapp's entry to the webapps global manifest
- manifests[webappTargetDirName] = {
- origin: origin,
- installOrigin: installOrigin,
- receipt: null,
- installTime: 132333986000,
- manifestURL: manifestURL,
- removable: removable,
- localId: id++,
- etag: etag,
- packageEtag: packageEtag,
- appStatus: getAppStatus(webapp.metaData.type || "web"),
- };
-
-});
-
// Write webapps global manifest
let manifestFile = webappsTargetDir.clone();
manifestFile.append('webapps.json');
diff --git a/shared/js/async_storage.js b/shared/js/async_storage.js
new file mode 100644
index 0000000..6cca66d
--- /dev/null
+++ b/shared/js/async_storage.js
@@ -0,0 +1,187 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+/**
+ * This file defines an asynchronous version of the localStorage API, backed by
+ * an IndexedDB database. It creates a global asyncStorage object that has
+ * methods like the localStorage object.
+ *
+ * To store a value use setItem:
+ *
+ * asyncStorage.setItem('key', 'value');
+ *
+ * If you want confirmation that the value has been stored, pass a callback
+ * function as the third argument:
+ *
+ * asyncStorage.setItem('key', 'newvalue', function() {
+ * console.log('new value stored');
+ * });
+ *
+ * To read a value, call getItem(), but note that you must supply a callback
+ * function that the value will be passed to asynchronously:
+ *
+ * asyncStorage.getItem('key', function(value) {
+ * console.log('The value of key is:', value);
+ * });
+ *
+ * Note that unlike localStorage, asyncStorage does not allow you to store and
+ * retrieve values by setting and querying properties directly. You cannot just
+ * write asyncStorage.key; you have to explicitly call setItem() or getItem().
+ *
+ * removeItem(), clear(), length(), and key() are like the same-named methods of
+ * localStorage, but, like getItem() and setItem() they take a callback
+ * argument.
+ *
+ * The asynchronous nature of getItem() makes it tricky to retrieve multiple
+ * values. But unlike localStorage, asyncStorage does not require the values you
+ * store to be strings. So if you need to save multiple values and want to
+ * retrieve them together, in a single asynchronous operation, just group the
+ * values into a single object. The properties of this object may not include
+ * DOM elements, but they may include things like Blobs and typed arrays.
+ *
+ * Unit tests are in apps/gallery/test/unit/asyncStorage_test.js
+ */
+
+this.asyncStorage = (function() {
+
+ var DBNAME = 'asyncStorage';
+ var DBVERSION = 1;
+ var STORENAME = 'keyvaluepairs';
+ var db = null;
+
+ function withStore(type, f) {
+ if (db) {
+ f(db.transaction(STORENAME, type).objectStore(STORENAME));
+ } else {
+ var openreq = indexedDB.open(DBNAME, DBVERSION);
+ openreq.onerror = function withStoreOnError() {
+ console.error("asyncStorage: can't open database:", openreq.error.name);
+ };
+ openreq.onupgradeneeded = function withStoreOnUpgradeNeeded() {
+ // First time setup: create an empty object store
+ openreq.result.createObjectStore(STORENAME);
+ };
+ openreq.onsuccess = function withStoreOnSuccess() {
+ db = openreq.result;
+ f(db.transaction(STORENAME, type).objectStore(STORENAME));
+ };
+ }
+ }
+
+ function getItem(key, callback) {
+ withStore('readonly', function getItemBody(store) {
+ var req = store.get(key);
+ req.onsuccess = function getItemOnSuccess() {
+ var value = req.result;
+ if (value === undefined)
+ value = null;
+ callback(value);
+ };
+ req.onerror = function getItemOnError() {
+ console.error('Error in asyncStorage.getItem(): ', req.error.name);
+ };
+ });
+ }
+
+ function setItem(key, value, callback) {
+ withStore('readwrite', function setItemBody(store) {
+ var req = store.put(value, key);
+ if (callback) {
+ req.onsuccess = function setItemOnSuccess() {
+ callback();
+ };
+ }
+ req.onerror = function setItemOnError() {
+ console.error('Error in asyncStorage.setItem(): ', req.error.name);
+ };
+ });
+ }
+
+ function removeItem(key, callback) {
+ withStore('readwrite', function removeItemBody(store) {
+ var req = store.delete(key);
+ if (callback) {
+ req.onsuccess = function removeItemOnSuccess() {
+ callback();
+ };
+ }
+ req.onerror = function removeItemOnError() {
+ console.error('Error in asyncStorage.removeItem(): ', req.error.name);
+ };
+ });
+ }
+
+ function clear(callback) {
+ withStore('readwrite', function clearBody(store) {
+ var req = store.clear();
+ if (callback) {
+ req.onsuccess = function clearOnSuccess() {
+ callback();
+ };
+ }
+ req.onerror = function clearOnError() {
+ console.error('Error in asyncStorage.clear(): ', req.error.name);
+ };
+ });
+ }
+
+ function length(callback) {
+ withStore('readonly', function lengthBody(store) {
+ var req = store.count();
+ req.onsuccess = function lengthOnSuccess() {
+ callback(req.result);
+ };
+ req.onerror = function lengthOnError() {
+ console.error('Error in asyncStorage.length(): ', req.error.name);
+ };
+ });
+ }
+
+ function key(n, callback) {
+ if (n < 0) {
+ callback(null);
+ return;
+ }
+
+ withStore('readonly', function keyBody(store) {
+ var advanced = false;
+ var req = store.openCursor();
+ req.onsuccess = function keyOnSuccess() {
+ var cursor = req.result;
+ if (!cursor) {
+ // this means there weren't enough keys
+ callback(null);
+ return;
+ }
+ if (n === 0) {
+ // We have the first key, return it if that's what they wanted
+ callback(cursor.key);
+ } else {
+ if (!advanced) {
+ // Otherwise, ask the cursor to skip ahead n records
+ advanced = true;
+ cursor.advance(n);
+ } else {
+ // When we get here, we've got the nth key.
+ callback(cursor.key);
+ }
+ }
+ };
+ req.onerror = function keyOnError() {
+ console.error('Error in asyncStorage.key(): ', req.error.name);
+ };
+ });
+ }
+
+ return {
+ getItem: getItem,
+ setItem: setItem,
+ removeItem: removeItem,
+ clear: clear,
+ length: length,
+ key: key
+ };
+}());
+
diff --git a/shared/js/blobview.js b/shared/js/blobview.js
new file mode 100644
index 0000000..eda519a
--- /dev/null
+++ b/shared/js/blobview.js
@@ -0,0 +1,412 @@
+'use strict';
+
+var BlobView = (function() {
+ function fail(msg) {
+ throw Error(msg);
+ }
+
+ // This constructor is for internal use only.
+ // Use the BlobView.get() factory function or the getMore instance method
+ // to obtain a BlobView object.
+ function BlobView(blob, sliceOffset, sliceLength, slice,
+ viewOffset, viewLength, littleEndian)
+ {
+ this.blob = blob; // The parent blob that the data is from
+ this.sliceOffset = sliceOffset; // The start address within the blob
+ this.sliceLength = sliceLength; // How long the slice is
+ this.slice = slice; // The ArrayBuffer of slice data
+ this.viewOffset = viewOffset; // The start of the view within the slice
+ this.viewLength = viewLength; // The length of the view
+ this.littleEndian = littleEndian; // Read little endian by default?
+
+ // DataView wrapper around the ArrayBuffer
+ this.view = new DataView(slice, viewOffset, viewLength);
+
+ // These fields mirror those of DataView
+ this.buffer = slice;
+ this.byteLength = viewLength;
+ this.byteOffset = viewOffset;
+
+ this.index = 0; // The read methods keep track of the read position
+ }
+
+ // Async factory function
+ BlobView.get = function(blob, offset, length, callback, littleEndian) {
+ if (offset < 0)
+ fail('negative offset');
+ if (length < 0)
+ fail('negative length');
+ if (offset > blob.size)
+ fail('offset larger than blob size');
+
+ // Don't fail if the length is too big; just reduce the length
+ if (offset + length > blob.size)
+ length = blob.size - offset;
+
+ var slice = blob.slice(offset, offset + length);
+ var reader = new FileReader();
+ reader.readAsArrayBuffer(slice);
+ reader.onloadend = function() {
+ var result = null;
+ if (reader.result) {
+ result = new BlobView(blob, offset, length, reader.result,
+ 0, length, littleEndian || false);
+ }
+ callback(result, reader.error);
+ }
+ };
+
+ BlobView.prototype = {
+ constructor: BlobView,
+
+ // This instance method is like the BlobView.get() factory method,
+ // but it is here because if the current buffer includes the requested
+ // range of bytes, they can be passed directly to the callback without
+ // going back to the blob to read them
+ getMore: function(offset, length, callback) {
+ if (offset >= this.sliceOffset &&
+ offset + length <= this.sliceOffset + this.sliceLength) {
+ // The quick case: we already have that region of the blob
+ callback(new BlobView(this.blob,
+ this.sliceOffset, this.sliceLength, this.slice,
+ offset - this.sliceOffset, length,
+ this.littleEndian));
+ }
+ else {
+ // Otherwise, we have to do an async read to get more bytes
+ BlobView.get(this.blob, offset, length, callback, this.littleEndian);
+ }
+ },
+
+ // Set the default endianness for the other methods
+ littleEndian: function() {
+ this.littleEndian = true;
+ },
+ bigEndian: function() {
+ this.littleEndian = false;
+ },
+
+ // These "get" methods are just copies of the DataView methods, except
+ // that they honor the default endianness
+ getUint8: function(offset) {
+ return this.view.getUint8(offset);
+ },
+ getInt8: function(offset) {
+ return this.view.getInt8(offset);
+ },
+ getUint16: function(offset, le) {
+ return this.view.getUint16(offset,
+ le !== undefined ? le : this.littleEndian);
+ },
+ getInt16: function(offset, le) {
+ return this.view.getInt16(offset,
+ le !== undefined ? le : this.littleEndian);
+ },
+ getUint32: function(offset, le) {
+ return this.view.getUint32(offset,
+ le !== undefined ? le : this.littleEndian);
+ },
+ getInt32: function(offset, le) {
+ return this.view.getInt32(offset,
+ le !== undefined ? le : this.littleEndian);
+ },
+ getFloat32: function(offset, le) {
+ return this.view.getFloat32(offset,
+ le !== undefined ? le : this.littleEndian);
+ },
+ getFloat64: function(offset, le) {
+ return this.view.getFloat64(offset,
+ le !== undefined ? le : this.littleEndian);
+ },
+
+ // These "read" methods read from the current position in the view and
+ // update that position accordingly
+ readByte: function() {
+ return this.view.getInt8(this.index++);
+ },
+ readUnsignedByte: function() {
+ return this.view.getUint8(this.index++);
+ },
+ readShort: function(le) {
+ var val = this.view.getInt16(this.index,
+ le !== undefined ? le : this.littleEndian);
+ this.index += 2;
+ return val;
+ },
+ readUnsignedShort: function(le) {
+ var val = this.view.getUint16(this.index,
+ le !== undefined ? le : this.littleEndian);
+ this.index += 2;
+ return val;
+ },
+ readInt: function(le) {
+ var val = this.view.getInt32(this.index,
+ le !== undefined ? le : this.littleEndian);
+ this.index += 4;
+ return val;
+ },
+ readUnsignedInt: function(le) {
+ var val = this.view.getUint32(this.index,
+ le !== undefined ? le : this.littleEndian);
+ this.index += 4;
+ return val;
+ },
+ readFloat: function(le) {
+ var val = this.view.getFloat32(this.index,
+ le !== undefined ? le : this.littleEndian);
+ this.index += 4;
+ return val;
+ },
+ readDouble: function(le) {
+ var val = this.view.getFloat64(this.index,
+ le !== undefined ? le : this.littleEndian);
+ this.index += 8;
+ return val;
+ },
+
+ // Methods to get and set the current position
+ tell: function() {
+ return this.index;
+ },
+ seek: function(index) {
+ if (index < 0)
+ fail('negative index');
+ if (index >= this.byteLength)
+ fail('index greater than buffer size');
+ this.index = index;
+ },
+ advance: function(n) {
+ var index = this.index + n;
+ if (index < 0)
+ fail('advance past beginning of buffer');
+ if (index >= this.byteLength)
+ fail('advance past end of buffer');
+ this.index = index;
+ },
+
+ // Additional methods to read other useful things
+ getUnsignedByteArray: function(offset, n) {
+ return new Uint8Array(this.buffer, offset + this.viewOffset, n);
+ },
+
+ // Additional methods to read other useful things
+ readUnsignedByteArray: function(n) {
+ var val = new Uint8Array(this.buffer, this.index + this.viewOffset, n);
+ this.index += n;
+ return val;
+ },
+
+ getBit: function(offset, bit) {
+ var byte = this.view.getUint8(offset);
+ return (byte & (1 << bit)) !== 0;
+ },
+
+ getUint24: function(offset, le) {
+ var b1, b2, b3;
+ if (le !== undefined ? le : this.littleEndian) {
+ b1 = this.view.getUint8(offset);
+ b2 = this.view.getUint8(offset + 1);
+ b3 = this.view.getUint8(offset + 2);
+ }
+ else { // big end first
+ b3 = this.view.getUint8(offset);
+ b2 = this.view.getUint8(offset + 1);
+ b1 = this.view.getUint8(offset + 2);
+ }
+
+ return (b3 << 16) + (b2 << 8) + b1;
+ },
+
+ readUint24: function(le) {
+ var value = this.getUint24(this.index, le);
+ this.index += 3;
+ return value;
+ },
+
+ // There are lots of ways to read strings.
+ // ASCII, UTF-8, UTF-16.
+ // null-terminated, character length, byte length
+ // I'll implement string reading methods as needed
+
+ getASCIIText: function(offset, len) {
+ var bytes = new Uint8Array(this.buffer, offset + this.viewOffset, len);
+ return String.fromCharCode.apply(String, bytes);
+ },
+
+ readASCIIText: function(len) {
+ var bytes = new Uint8Array(this.buffer,
+ this.index + this.viewOffset,
+ len);
+ this.index += len;
+ return String.fromCharCode.apply(String, bytes);
+ },
+
+ // Replace this with the StringEncoding API when we've got it.
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=764234
+ getUTF8Text: function(offset, len) {
+ function fail() { throw new Error('Illegal UTF-8'); }
+
+ var pos = offset; // Current position in this.view
+ var end = offset + len; // Last position
+ var charcode; // Current charcode
+ var s = ''; // Accumulate the string
+ var b1, b2, b3, b4; // Up to 4 bytes per charcode
+
+ // See http://en.wikipedia.org/wiki/UTF-8
+ while (pos < end) {
+ var b1 = this.view.getUint8(pos);
+ if (b1 < 128) {
+ s += String.fromCharCode(b1);
+ pos += 1;
+ }
+ else if (b1 < 194) {
+ // unexpected continuation character...
+ fail();
+ }
+ else if (b1 < 224) {
+ // 2-byte sequence
+ if (pos + 1 >= end)
+ fail();
+ b2 = this.view.getUint8(pos + 1);
+ if (b2 < 128 || b2 > 191)
+ fail();
+ charcode = ((b1 & 0x1f) << 6) + (b2 & 0x3f);
+ s += String.fromCharCode(charcode);
+ pos += 2;
+ }
+ else if (b1 < 240) {
+ // 3-byte sequence
+ if (pos + 3 >= end)
+ fail();
+ b2 = this.view.getUint8(pos + 1);
+ if (b2 < 128 || b2 > 191)
+ fail();
+ b3 = this.view.getUint8(pos + 2);
+ if (b3 < 128 || b3 > 191)
+ fail();
+ charcode = ((b1 & 0x0f) << 12) + ((b2 & 0x3f) << 6) + (b3 & 0x3f);
+ s += String.fromCharCode(charcode);
+ pos += 3;
+ }
+ else if (b1 < 245) {
+ // 4-byte sequence
+ if (pos + 3 >= end)
+ fail();
+ b2 = this.view.getUint8(pos + 1);
+ if (b2 < 128 || b2 > 191)
+ fail();
+ b3 = this.view.getUint8(pos + 2);
+ if (b3 < 128 || b3 > 191)
+ fail();
+ b4 = this.view.getUint8(pos + 3);
+ if (b4 < 128 || b4 > 191)
+ fail();
+ charcode = ((b1 & 0x07) << 18) +
+ ((b2 & 0x3f) << 12) +
+ ((b3 & 0x3f) << 6) +
+ (b4 & 0x3f);
+
+ // Now turn this code point into two surrogate pairs
+ charcode -= 0x10000;
+ s += String.fromCharCode(0xd800 + ((charcode & 0x0FFC00) >>> 10));
+ s += String.fromCharCode(0xdc00 + (charcode & 0x0003FF));
+
+ pos += 4;
+ }
+ else {
+ // Illegal byte
+ fail();
+ }
+ }
+
+ return s;
+ },
+
+ readUTF8Text: function(len) {
+ try {
+ return this.getUTF8Text(this.index, len);
+ }
+ finally {
+ this.index += len;
+ }
+ },
+
+ // Read 4 bytes, ignore the high bit and combine them into a 28-bit
+ // big-endian unsigned integer.
+ // This format is used by the ID3v2 metadata.
+ getID3Uint28BE: function(offset) {
+ var b1 = this.view.getUint8(offset) & 0x7f;
+ var b2 = this.view.getUint8(offset + 1) & 0x7f;
+ var b3 = this.view.getUint8(offset + 2) & 0x7f;
+ var b4 = this.view.getUint8(offset + 3) & 0x7f;
+ return (b1 << 21) | (b2 << 14) | (b3 << 7) | b4;
+ },
+
+ readID3Uint28BE: function() {
+ var value = this.getID3Uint28BE(this.index);
+ this.index += 4;
+ return value;
+ },
+
+ // Read bytes up to and including a null terminator, but never
+ // more than size bytes. And return as a Latin1 string
+ readNullTerminatedLatin1Text: function(size) {
+ var s = '';
+ for (var i = 0; i < size; i++) {
+ var charcode = this.view.getUint8(this.index + i);
+ if (charcode === 0) {
+ i++;
+ break;
+ }
+ s += String.fromCharCode(charcode);
+ }
+ this.index += i;
+ return s;
+ },
+
+ // Read bytes up to and including a null terminator, but never
+ // more than size bytes. And return as a UTF8 string
+ readNullTerminatedUTF8Text: function(size) {
+ for (var len = 0; len < size; len++) {
+ if (this.view.getUint8(this.index + len) === 0)
+ break;
+ }
+ var s = this.readUTF8Text(len);
+ if (len < size) // skip the null terminator if we found one
+ this.advance(1);
+ return s;
+ },
+
+ // Read UTF16 text. If le is not specified, expect a BOM to define
+ // endianness. If le is true, read UTF16LE, if false, UTF16BE
+ // Read until we find a null-terminator, but never more than size bytes
+ readNullTerminatedUTF16Text: function(size, le) {
+ if (le == null) {
+ var BOM = this.readUnsignedShort();
+ size -= 2;
+ if (BOM === 0xFEFF)
+ le = false;
+ else
+ le = true;
+ }
+
+ var s = '';
+ for (var i = 0; i < size; i += 2) {
+ var charcode = this.getUint16(this.index + i, le);
+ if (charcode === 0) {
+ i += 2;
+ break;
+ }
+ s += String.fromCharCode(charcode);
+ }
+ this.index += i;
+ return s;
+ }
+ };
+
+ // We don't want users of this library to accidentally call the constructor
+ // instead of using the factory function, so we return a dummy object
+ // instead of the real constructor. If someone really needs to get at the
+ // real constructor, the contructor property of the prototype refers to it.
+ return { get: BlobView.get };
+}());
diff --git a/shared/js/custom_dialog.js b/shared/js/custom_dialog.js
new file mode 100644
index 0000000..f4fa772
--- /dev/null
+++ b/shared/js/custom_dialog.js
@@ -0,0 +1,112 @@
+//XXX: Waiting for the window.showModalDialog support in B2G
+
+'use strict';
+
+var CustomDialog = (function() {
+
+ var screen = null;
+ var dialog = null;
+ var header = null;
+ var message = null;
+ var yes = null;
+ var no = null;
+
+ return {
+ hide: function dialog_hide() {
+ if (screen === null)
+ return;
+
+ document.body.removeChild(screen);
+ screen = null;
+ dialog = null;
+ header = null;
+ message = null;
+ yes = null;
+ no = null;
+ },
+
+ /**
+ * Method that shows the dialog
+ * @param {String} title the title of the dialog. null or empty for
+ * no title.
+ * @param {String} msg message for the dialog.
+ * @param {Object} cancel {title, callback} object when confirm.
+ * @param {Object} confirm {title, callback} object when cancel.
+ */
+ show: function dialog_show(title, msg, cancel, confirm) {
+ if (screen === null) {
+ screen = document.createElement('section');
+ screen.setAttribute('role', 'region');
+ screen.id = 'dialog-screen';
+
+ dialog = document.createElement('div');
+ dialog.id = 'dialog-dialog';
+ dialog.setAttribute('role', 'dialog');
+ screen.appendChild(dialog);
+
+ var info = document.createElement('div');
+ info.className = 'inner';
+
+ if (title && title != '') {
+ header = document.createElement('h3');
+ header.id = 'dialog-title';
+ header.textContent = title;
+ info.appendChild(header);
+ }
+
+ message = document.createElement('p');
+ message.id = 'dialog-message';
+ info.appendChild(message);
+ dialog.appendChild(info);
+
+ var menu = document.createElement('menu');
+ menu.dataset['items'] = 1;
+
+ no = document.createElement('button');
+ var noText = document.createTextNode(cancel.title);
+ no.appendChild(noText);
+ no.id = 'dialog-no';
+ no.addEventListener('click', clickHandler);
+ menu.appendChild(no);
+
+ if (confirm) {
+ menu.dataset['items'] = 2;
+ yes = document.createElement('button');
+ var yesText = document.createTextNode(confirm.title);
+ yes.appendChild(yesText);
+ yes.id = 'dialog-yes';
+ yes.className = 'negative';
+ yes.addEventListener('click', clickHandler);
+ menu.appendChild(yes);
+ }
+
+ dialog.appendChild(menu);
+
+ document.body.appendChild(screen);
+ }
+
+ // Put the message in the dialog.
+ // Note plain text since this may include text from
+ // untrusted app manifests, for example.
+ message.textContent = msg;
+
+ // Make the screen visible
+ screen.classList.add('visible');
+
+ // This is the event listener function for the buttons
+ function clickHandler(evt) {
+
+ // Hide the dialog
+ screen.classList.remove('visible');
+
+ // Call the appropriate callback, if it is defined
+ if (evt.target === yes && confirm.callback) {
+ confirm.callback();
+ } else if (evt.target === no && cancel.callback) {
+ cancel.callback();
+ }
+ }
+ }
+ };
+}());
+
diff --git a/shared/js/desktop.js b/shared/js/desktop.js
new file mode 100644
index 0000000..af0294a
--- /dev/null
+++ b/shared/js/desktop.js
@@ -0,0 +1,115 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+/**
+ * This library should help debugging Gaia on a desktop browser, where APIs like
+ * mozTelephony or mozApps are not supported.
+ */
+
+// navigator.mozTelephony
+(function(window) {
+ var navigator = window.navigator;
+ if ('mozTelephony' in navigator)
+ return;
+
+ var TelephonyCalls = [];
+ if (typeof(RecentsDBManager) != 'undefined' && RecentsDBManager) {
+ RecentsDBManager.init(function() {
+ RecentsDBManager.prepopulateDB(function() {
+ RecentsDBManager.close();
+ });
+ });
+ }
+ navigator.mozTelephony = {
+ dial: function(number) {
+ var TelephonyCall = {
+ number: number,
+ state: 'dialing',
+ addEventListener: function() {},
+ hangUp: function() {},
+ removeEventListener: function() {}
+ };
+
+ TelephonyCalls.push(TelephonyCall);
+
+ return TelephonyCall;
+ },
+ addEventListener: function(name, handler) {
+ },
+ get calls() {
+ return TelephonyCalls;
+ },
+ muted: false,
+ speakerEnabled: false,
+
+ // Stubs
+ onincoming: null,
+ oncallschanged: null
+ };
+})(this);
+
+// Emulate device buttons. This is groteskly unsafe and should be removed soon.
+(function(window) {
+ var supportedEvents = { keydown: true, keyup: true };
+ var listeners = [];
+
+ var originalAddEventListener = window.addEventListener;
+ window.addEventListener = function(type, listener, capture) {
+ if (this === window && supportedEvents[type]) {
+ listeners.push({ type: type, listener: listener, capture: capture });
+ }
+ originalAddEventListener.call(this, type, listener, capture);
+ };
+
+ var originalRemoveEventListener = window.removeEventListener;
+ window.removeEventListener = function(type, listener) {
+ if (this === window && supportedEvents[type]) {
+ var newListeners = [];
+ for (var n = 0; n < listeners.length; ++n) {
+ if (listeners[n].type == type && listeners[n].listener == listener)
+ continue;
+ newListeners.push(listeners[n]);
+ }
+ listeners = newListeners;
+ }
+ originalRemoveEventListener.call(this, type, listener);
+ };
+
+ var KeyEventProto = {
+ DOM_VK_HOME: 36
+ };
+
+ window.addEventListener('message', function(event) {
+ var data = event.data;
+ if (typeof data === 'string' && data.indexOf('moz-key-') == 0) {
+ var type, key;
+ if (data.indexOf('moz-key-down-') == 0) {
+ type = 'keydown';
+ key = data.substr(13);
+ } else if (data.indexOf('moz-key-up-') == 0) {
+ type = 'keyup';
+ key = data.substr(11);
+ } else {
+ return;
+ }
+ key = KeyEvent[key];
+ for (var n = 0; n < listeners.length; ++n) {
+ if (listeners[n].type == type) {
+ var fn = listeners[n].listener;
+ var e = Object.create(KeyEventProto);
+ e.type = type;
+ e.keyCode = key;
+ if (typeof fn === 'function')
+ fn(e);
+ else if (typeof fn === 'object' && fn.handleEvent)
+ fn.handleEvent(e);
+ if (listeners[n].capture)
+ return;
+ }
+ }
+ }
+ });
+})(this);
+
diff --git a/shared/js/gesture_detector.js b/shared/js/gesture_detector.js
new file mode 100644
index 0000000..61e2759
--- /dev/null
+++ b/shared/js/gesture_detector.js
@@ -0,0 +1,891 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+/**
+ * GestureDetector.js: generate events for one and two finger gestures.
+ *
+ * A GestureDetector object listens for touch and mouse events on a specified
+ * element and generates higher-level events that describe one and two finger
+ * gestures on the element. The hope is that this will be useful for webapps
+ * that need to run on mouse (or trackpad)-based desktop browsers and also in
+ * touch-based mobile devices.
+ *
+ * Supported events:
+ *
+ * tap like a click event
+ * dbltap like dblclick
+ * pan one finger motion, or mousedown followed by mousemove
+ * swipe when a finger is released following pan events
+ * holdstart touch (or mousedown) and hold. Must set an option to get these.
+ * holdmove motion after a holdstart event
+ * holdend when the finger or mouse goes up after holdstart/holdmove
+ * transform 2-finger pinch and twist gestures for scaling and rotation
+ * These are touch-only; they can't be simulated with a mouse.
+ *
+ * Each of these events is a bubbling CustomEvent with important details in the
+ * event.detail field. The event details are not yet stable and are not yet
+ * documented. See the calls to emitEvent() for details.
+ *
+ * To use this library, create a GestureDetector object by passing an element to
+ * the GestureDetector() constructor and then calling startDetecting() on it.
+ * The element will be the target of all the emitted gesture events. You can
+ * also pass an optional object as the second constructor argument. If you're
+ * interested in holdstart/holdmove/holdend events, pass {holdEvents:true} as
+ * this second argument. Otherwise they will not be generated.
+ *
+ * Implementation note: event processing is done with a simple finite-state
+ * machine. This means that in general, the various kinds of gestures are
+ * mutually exclusive. You won't get pan events until your finger or mouse has
+ * moved more than a minimum threshold, for example, but it does, the FSM enters
+ * a new state in which it can emit pan and swipe events and cannot emit hold
+ * events. Similarly, if you've started a 1 finger pan/swipe gesture and
+ * accidentally touch with a second finger, you'll continue to get pan events,
+ * and won't suddenly start getting 2-finger transform events.
+ *
+ * This library never calls preventDefault() or stopPropagation on any of the
+ * events it processes, so the raw touch or mouse events should still be
+ * available for other code to process. It is not clear to me whether this is a
+ * feature or a bug.
+ */
+
+var GestureDetector = (function() {
+
+ //
+ // Constructor
+ //
+ function GD(e, options) {
+ this.element = e;
+ this.options = options || {};
+ this.state = initialState;
+ this.timers = {};
+ this.listeningForMouseEvents = true;
+ }
+
+ //
+ // Public methods
+ //
+
+ GD.prototype.startDetecting = function() {
+ var self = this;
+ eventtypes.forEach(function(t) {
+ self.element.addEventListener(t, self);
+ });
+ };
+
+ GD.prototype.stopDetecting = function() {
+ var self = this;
+ eventtypes.forEach(function(t) {
+ self.element.removeEventListener(t, self);
+ });
+ };
+
+ //
+ // Internal methods
+ //
+
+ GD.prototype.handleEvent = function(e) {
+ var handler = this.state[e.type];
+ if (!handler) return;
+
+ // If this is a touch event handle each changed touch separately
+ if (e.changedTouches) {
+ // If we ever receive a touch event, then we know we are on a
+ // touch device and we stop listening for mouse events. If we
+ // don't do that, then the touchstart touchend mousedown mouseup
+ // generated by a single tap gesture will cause us to output
+ // tap tap dbltap, which is wrong
+ if (this.listeningForMouseEvents) {
+ this.listeningForMouseEvents = false;
+ this.element.removeEventListener('mousedown', this);
+ }
+
+ // XXX https://bugzilla.mozilla.org/show_bug.cgi?id=785554
+ // causes touchend events to list all touches as changed, so
+ // warn if we see that bug
+ if (e.type === 'touchend' && e.changedTouches.length > 1) {
+ console.warn('gesture_detector.js: spurious extra changed touch on ' +
+ 'touchend. See ' +
+ 'https://bugzilla.mozilla.org/show_bug.cgi?id=785554');
+ }
+
+ for (var i = 0; i < e.changedTouches.length; i++) {
+ handler(this, e, e.changedTouches[i]);
+ // The first changed touch might have changed the state of the
+ // FSM. We need this line to workaround the bug 785554, but it is
+ // probably the right thing to have here, even once that bug is fixed.
+ handler = this.state[e.type];
+ }
+ }
+ else { // Otherwise, just dispatch the event to the handler
+ handler(this, e);
+ }
+ };
+
+ GD.prototype.startTimer = function(type, time) {
+ this.clearTimer(type);
+ var self = this;
+ this.timers[type] = setTimeout(function() {
+ self.timers[type] = null;
+ var handler = self.state[type];
+ if (handler)
+ handler(self, type);
+ }, time);
+ };
+
+ GD.prototype.clearTimer = function(type) {
+ if (this.timers[type]) {
+ clearTimeout(this.timers[type]);
+ this.timers[type] = null;
+ }
+ };
+
+ // Switch to a new FSM state, and call the init() function of that
+ // state, if it has one. The event and touch arguments are optional
+ // and are just passed through to the state init function.
+ GD.prototype.switchTo = function(state, event, touch) {
+ this.state = state;
+ if (state.init)
+ state.init(this, event, touch);
+ };
+
+ GD.prototype.emitEvent = function(type, detail) {
+ if (!this.target) {
+ console.error('Attempt to emit event with no target');
+ return;
+ }
+
+ var event = this.element.ownerDocument.createEvent('CustomEvent');
+ event.initCustomEvent(type, true, true, detail);
+ this.target.dispatchEvent(event);
+ }
+
+ //
+ // Tuneable parameters
+ //
+ GD.HOLD_INTERVAL = 1000; // Hold events after 1000 ms
+ GD.PAN_THRESHOLD = 20; // 20 pixels movement before touch panning
+ GD.MOUSE_PAN_THRESHOLD = 15; // Mice are more precise, so smaller threshold
+ GD.DOUBLE_TAP_DISTANCE = 50;
+ GD.DOUBLE_TAP_TIME = 500;
+ GD.VELOCITY_SMOOTHING = .5;
+
+ // Don't start sending transform events until the gesture exceeds a threshold
+ GD.SCALE_THRESHOLD = 20; // pixels
+ GD.ROTATE_THRESHOLD = 22.5; // degrees
+
+ // For pans and zooms, we compute new starting coordinates that are part way
+ // between the initial event and the event that crossed the threshold so that
+ // the first event we send doesn't cause a big lurch. This constant must be
+ // between 0 and 1 and says how far along the line between the initial value
+ // and the new value we pick
+ GD.THRESHOLD_SMOOTHING = 0.9;
+
+ //
+ // Helpful shortcuts and utility functions
+ //
+
+ var abs = Math.abs, floor = Math.floor, sqrt = Math.sqrt, atan2 = Math.atan2;
+ var PI = Math.PI;
+
+ // The names of events that we need to register handlers for
+ var eventtypes = [
+ 'touchstart',
+ 'touchmove',
+ 'touchend',
+ 'mousedown' // We register mousemove and mouseup manually
+ ];
+
+ // Return the event's timestamp in ms
+ function eventTime(e) {
+ // In gecko, synthetic events seem to be in microseconds rather than ms.
+ // So if the timestamp is much larger than the current time, assue it is
+ // in microseconds and divide by 1000
+ var ts = e.timeStamp;
+ if (ts > 2 * Date.now())
+ return Math.floor(ts / 1000);
+ else
+ return ts;
+ }
+
+
+ // Return an object containg the space and time coordinates of
+ // and event and touch. We freeze the object to make it immutable so
+ // we can pass it in events and not worry about values being changed.
+ function coordinates(e, t) {
+ return Object.freeze({
+ screenX: t.screenX,
+ screenY: t.screenY,
+ clientX: t.clientX,
+ clientY: t.clientY,
+ timeStamp: eventTime(e)
+ });
+ }
+
+ // Like coordinates(), but return the midpoint between two touches
+ function midpoints(e, t1, t2) {
+ return Object.freeze({
+ screenX: floor((t1.screenX + t2.screenX) / 2),
+ screenY: floor((t1.screenY + t2.screenY) / 2),
+ clientX: floor((t1.clientX + t2.clientX) / 2),
+ clientY: floor((t1.clientY + t2.clientY) / 2),
+ timeStamp: eventTime(e)
+ });
+ }
+
+ // Like coordinates(), but for a mouse event
+ function mouseCoordinates(e) {
+ return Object.freeze({
+ screenX: e.screenX,
+ screenY: e.screenY,
+ clientX: e.clientX,
+ clientY: e.clientY,
+ timeStamp: eventTime(e)
+ });
+ }
+
+ // Given coordinates objects c1 and c2, return a new coordinates object
+ // representing a point and time along the line between those points.
+ // The position of the point is controlled by the THRESHOLD_SMOOTHING constant
+ function between(c1, c2) {
+ var r = GD.THRESHOLD_SMOOTHING;
+ return Object.freeze({
+ screenX: floor(c1.screenX + r * (c2.screenX - c1.screenX)),
+ screenY: floor(c1.screenY + r * (c2.screenY - c1.screenY)),
+ clientX: floor(c1.clientX + r * (c2.clientX - c1.clientX)),
+ clientY: floor(c1.clientY + r * (c2.clientY - c1.clientY)),
+ timeStamp: floor(c1.timeStamp + r * (c2.timeStamp - c1.timeStamp))
+ });
+ }
+
+ // Compute the distance between two touches
+ function touchDistance(t1, t2) {
+ var dx = t2.screenX - t1.screenX;
+ var dy = t2.screenY - t1.screenY;
+ return sqrt(dx * dx + dy * dy);
+ }
+
+ // Compute the direction (as an angle) of the line between two touches
+ // Returns a number d, -180 < d <= 180
+ function touchDirection(t1, t2) {
+ return atan2(t2.screenY - t1.screenY,
+ t2.screenX - t1.screenX) * 180 / PI;
+ }
+
+ // Compute the clockwise angle between direction d1 and direction d2.
+ // Returns an angle a -180 < a <= 180.
+ function touchRotation(d1, d2) {
+ var angle = d2 - d1;
+ if (angle > 180)
+ angle -= 360;
+ else if (angle <= -180)
+ angle += 360;
+ return angle;
+ }
+
+ // Determine if two taps are close enough in time and space to
+ // trigger a dbltap event. The arguments are objects returned
+ // by the coordinates() function.
+ function isDoubleTap(lastTap, thisTap) {
+ var dx = abs(thisTap.screenX - lastTap.screenX);
+ var dy = abs(thisTap.screenY - lastTap.screenY);
+ var dt = thisTap.timeStamp - lastTap.timeStamp;
+ return (dx < GD.DOUBLE_TAP_DISTANCE &&
+ dy < GD.DOUBLE_TAP_DISTANCE &&
+ dt < GD.DOUBLE_TAP_TIME);
+ }
+
+ //
+ // The following objects are the states of our Finite State Machine
+ //
+
+ // In this state we're not processing any gestures, just waiting
+ // for an event to start a gesture and ignoring others
+ var initialState = {
+ name: 'initialState',
+ init: function(d) {
+ // When we enter or return to the initial state, clear
+ // the detector properties that were tracking gestures
+ // Don't clear d.lastTap here, though. We need it for dbltap events
+ d.target = null;
+ d.start = d.last = null;
+ d.touch1 = d.touch2 = null;
+ d.vx = d.vy = null;
+ d.startDistance = d.lastDistance = null;
+ d.startDirection = d.lastDirection = null;
+ d.lastMidpoint = null;
+ d.scaled = d.rotated = null;
+ },
+
+ // Switch to the touchstarted state and process the touch event there
+ // Once we've started processing a touch gesture we'll ignore mouse events
+ touchstart: function(d, e, t) {
+ d.switchTo(touchStartedState, e, t);
+ },
+
+ // Or if we see a mouse event first, then start processing a mouse-based
+ // gesture, and ignore any touch events
+ mousedown: function(d, e) {
+ d.switchTo(mouseDownState, e);
+ }
+ };
+
+ // One finger is down but we haven't generated any event yet. We're
+ // waiting to see... If the finger goes up soon, its a tap. If the finger
+ // stays down and still, its a hold. If the finger moves its a pan/swipe.
+ // And if a second finger goes down, its a transform
+ var touchStartedState = {
+ name: 'touchStartedState',
+ init: function(d, e, t) {
+ // Remember the target of the event
+ d.target = e.target;
+ // Remember the id of the touch that started
+ d.touch1 = t.identifier;
+ // Get the coordinates of the touch
+ d.start = d.last = coordinates(e, t);
+ // Start a timer for a hold
+ // If we're doing hold events, start a timer for them
+ if (d.options.holdEvents)
+ d.startTimer('holdtimeout', GD.HOLD_INTERVAL);
+ },
+
+ touchstart: function(d, e, t) {
+ // If another finger goes down in this state, then
+ // go to transform state to start 2-finger gestures.
+ d.clearTimer('holdtimeout');
+ d.switchTo(transformState, e, t);
+ },
+ touchmove: function(d, e, t) {
+ // Ignore any touches but the initial one
+ // This could happen if there was still a finger down after
+ // the end of a previous 2-finger gesture, e.g.
+ if (t.identifier !== d.touch1)
+ return;
+
+ if (abs(t.screenX - d.start.screenX) > GD.PAN_THRESHOLD ||
+ abs(t.screenY - d.start.screenY) > GD.PAN_THRESHOLD) {
+ d.clearTimer('holdtimeout');
+ d.switchTo(panStartedState, e, t);
+ }
+ },
+ touchend: function(d, e, t) {
+ // Ignore any touches but the initial one
+ if (t.identifier !== d.touch1)
+ return;
+
+ // If there was a previous tap that was close enough in time
+ // and space, then emit a 'dbltap' event
+ if (d.lastTap && isDoubleTap(d.lastTap, d.start)) {
+ d.emitEvent('tap', d.start);
+ d.emitEvent('dbltap', d.start);
+ // clear the lastTap property, so we don't get another one
+ d.lastTap = null;
+ }
+ else {
+ // Emit a 'tap' event using the starting coordinates
+ // as the event details
+ d.emitEvent('tap', d.start);
+
+ // Remember the coordinates of this tap so we can detect double taps
+ d.lastTap = coordinates(e, t);
+ }
+
+ // In either case clear the timer and go back to the initial state
+ d.clearTimer('holdtimeout');
+ d.switchTo(initialState);
+ },
+
+ holdtimeout: function(d) {
+ d.switchTo(holdState);
+ }
+
+ };
+
+ // A single touch has moved enough to exceed the pan threshold and now
+ // we're going to generate pan events after each move and a swipe event
+ // when the touch ends. We ignore any other touches that occur while this
+ // pan/swipe gesture is in progress.
+ var panStartedState = {
+ name: 'panStartedState',
+ init: function(d, e, t) {
+ // Panning doesn't start until the touch has moved more than a
+ // certain threshold. But we don't want the pan to have a jerky
+ // start where the first event is a big distance. So proceed as
+ // pan actually started at a point along the path between the
+ // first touch and this current touch.
+ d.start = d.last = between(d.start, coordinates(e, t));
+
+ // If we transition into this state with a touchmove event,
+ // then process it with that handler. If we don't do this then
+ // we can end up with swipe events that don't know their velocity
+ if (e.type === 'touchmove')
+ panStartedState.touchmove(d, e, t);
+ },
+
+ touchmove: function(d, e, t) {
+ // Ignore any fingers other than the one we're tracking
+ if (t.identifier !== d.touch1)
+ return;
+
+ // Each time the touch moves, emit a pan event but stay in this state
+ var current = coordinates(e, t);
+ d.emitEvent('pan', {
+ absolute: {
+ dx: current.screenX - d.start.screenX,
+ dy: current.screenY - d.start.screenY
+ },
+ relative: {
+ dx: current.screenX - d.last.screenX,
+ dy: current.screenY - d.last.screenY
+ },
+ position: current
+ });
+
+ // Track the pan velocity so we can report this with the swipe
+ // Use a exponential moving average for a bit of smoothing
+ // on the velocity
+ var dt = current.timeStamp - d.last.timeStamp;
+ var vx = (current.screenX - d.last.screenX) / dt;
+ var vy = (current.screenY - d.last.screenY) / dt;
+
+ if (d.vx == null) { // first time; no average
+ d.vx = vx;
+ d.vy = vy;
+ }
+ else {
+ d.vx = d.vx * GD.VELOCITY_SMOOTHING +
+ vx * (1 - GD.VELOCITY_SMOOTHING);
+ d.vy = d.vy * GD.VELOCITY_SMOOTHING +
+ vy * (1 - GD.VELOCITY_SMOOTHING);
+ }
+
+ d.last = current;
+ },
+ touchend: function(d, e, t) {
+ // Ignore any fingers other than the one we're tracking
+ if (t.identifier !== d.touch1)
+ return;
+
+ // Emit a swipe event when the finger goes up.
+ // Report start and end point, dx, dy, dt, velocity and direction
+ var current = coordinates(e, t);
+ var dx = current.screenX - d.start.screenX;
+ var dy = current.screenY - d.start.screenY;
+ // angle is a positive number of degrees, starting at 0 on the
+ // positive x axis and increasing clockwise.
+ var angle = atan2(dy, dx) * 180 / PI;
+ if (angle < 0)
+ angle += 360;
+
+ // Direction is 'right', 'down', 'left' or 'up'
+ var direction;
+ if (angle >= 315 || angle < 45)
+ direction = 'right';
+ else if (angle >= 45 && angle < 135)
+ direction = 'down';
+ else if (angle >= 135 && angle < 225)
+ direction = 'left';
+ else if (angle >= 225 && angle < 315)
+ direction = 'up';
+
+ d.emitEvent('swipe', {
+ start: d.start,
+ end: current,
+ dx: dx,
+ dy: dy,
+ dt: e.timeStamp - d.start.timeStamp,
+ vx: d.vx,
+ vy: d.vy,
+ direction: direction,
+ angle: angle
+ });
+
+ // Go back to the initial state
+ d.switchTo(initialState);
+ }
+ };
+
+ // We enter this state if the user touches and holds for long enough
+ // without moving much. When we enter we emit a holdstart event. Motion
+ // after the holdstart generates holdmove events. And when the touch ends
+ // we generate a holdend event. holdmove and holdend events can be used
+ // kind of like drag and drop events in a mouse-based UI. Currently,
+ // these events just report the coordinates of the touch. Do we need
+ // other details?
+ var holdState = {
+ name: 'holdState',
+ init: function(d) {
+ d.emitEvent('holdstart', d.start);
+ },
+
+ touchmove: function(d, e, t) {
+ var current = coordinates(e, t);
+ d.emitEvent('holdmove', {
+ absolute: {
+ dx: current.screenX - d.start.screenX,
+ dy: current.screenY - d.start.screenY
+ },
+ relative: {
+ dx: current.screenX - d.last.screenX,
+ dy: current.screenY - d.last.screenY
+ },
+ position: current
+ });
+
+ d.last = current;
+ },
+
+ touchend: function(d, e, t) {
+ var current = coordinates(e, t);
+ d.emitEvent('holdend', {
+ start: d.start,
+ end: current,
+ dx: current.screenX - d.start.screenX,
+ dy: current.screenY - d.start.screenY
+ });
+ d.switchTo(initialState);
+ }
+ };
+
+ // We enter this state if a second touch starts before we start
+ // recoginzing any other gesture. As the touches move we track the
+ // distance and angle between them to report scale and rotation values
+ // in transform events.
+ var transformState = {
+ name: 'transformState',
+ init: function(d, e, t) {
+ // Remember the id of the second touch
+ d.touch2 = t.identifier;
+
+ // Get the two Touch objects
+ var t1 = e.touches.identifiedTouch(d.touch1);
+ var t2 = e.touches.identifiedTouch(d.touch2);
+
+ // Compute and remember the initial distance and angle
+ d.startDistance = d.lastDistance = touchDistance(t1, t2);
+ d.startDirection = d.lastDirection = touchDirection(t1, t2);
+
+ // Don't start emitting events until we're past a threshold
+ d.scaled = d.rotated = false;
+ },
+
+ touchmove: function(d, e, t) {
+ // Ignore touches we're not tracking
+ if (t.identifier !== d.touch1 && t.identifier !== d.touch2)
+ return;
+
+ // Get the two Touch objects
+ var t1 = e.touches.identifiedTouch(d.touch1);
+ var t2 = e.touches.identifiedTouch(d.touch2);
+
+ // Compute the new midpoints, distance and direction
+ var midpoint = midpoints(e, t1, t2);
+ var distance = touchDistance(t1, t2);
+ var direction = touchDirection(t1, t2);
+ var rotation = touchRotation(d.startDirection, direction);
+
+ // Check all of these numbers against the thresholds. Otherwise
+ // the transforms are too jittery even when you try to hold your
+ // fingers still.
+ if (!d.scaled) {
+ if (abs(distance - d.startDistance) > GD.SCALE_THRESHOLD) {
+ d.scaled = true;
+ d.startDistance = d.lastDistance =
+ floor(d.startDistance +
+ GD.THRESHOLD_SMOOTHING * (distance - d.startDistance));
+ }
+ else
+ distance = d.startDistance;
+ }
+ if (!d.rotated) {
+ if (abs(rotation) > GD.ROTATE_THRESHOLD)
+ d.rotated = true;
+ else
+ direction = d.startDirection;
+ }
+
+ // If nothing has exceeded the threshold yet, then we
+ // don't even have to fire an event.
+ if (d.scaled || d.rotated) {
+ // The detail field for the transform gesture event includes
+ // 'absolute' transformations against the initial values and
+ // 'relative' transformations against the values from the last
+ // transformgesture event.
+ d.emitEvent('transform', {
+ absolute: { // transform details since gesture start
+ scale: distance / d.startDistance,
+ rotate: touchRotation(d.startDirection, direction)
+ },
+ relative: { // transform since last gesture change
+ scale: distance / d.lastDistance,
+ rotate: touchRotation(d.lastDirection, direction)
+ },
+ midpoint: midpoint
+ });
+
+ d.lastDistance = distance;
+ d.lastDirection = direction;
+ d.lastMidpoint = midpoint;
+ }
+ },
+
+ touchend: function(d, e, t) {
+ // If either finger goes up, we're done with the gesture.
+ // The user might move that finger and put it right back down
+ // again to begin another 2-finger gesture, so we can't go
+ // back to the initial state while one of the fingers remains up.
+ // On the other hand, we can't go back to touchStartedState because
+ // that would mean that the finger left down could cause a tap or
+ // pan event. So we need an afterTransform state that waits for
+ // a finger to come back down or the other finger to go up.
+ if (t.identifier === d.touch2)
+ d.touch2 = null;
+ else if (t.identifier === d.touch1) {
+ d.touch1 = d.touch2;
+ d.touch2 = null;
+ }
+ else
+ return; // It was a touch we weren't tracking
+
+ // If we emitted any transform events, now we need to emit
+ // a transformend event to end the series. The details of this
+ // event use the values from the last touchmove, and the
+ // relative amounts will 1 and 0, but they are included for
+ // completeness even though they are not useful.
+ if (d.scaled || d.rotated) {
+ d.emitEvent('transformend', {
+ absolute: { // transform details since gesture start
+ scale: d.lastDistance / d.startDistance,
+ rotate: touchRotation(d.startDirection, d.lastDirection)
+ },
+ relative: { // nothing has changed relative to the last touchmove
+ scale: 1,
+ rotate: 0
+ },
+ midpoint: d.lastMidpoint
+ });
+ }
+
+ d.switchTo(afterTransformState);
+ }
+ };
+
+ // We did a tranform and one finger went up. Wait for that finger to
+ // come back down or the other finger to go up too.
+ var afterTransformState = {
+ name: 'afterTransformState',
+ touchstart: function(d, e, t) {
+ d.switchTo(transformState, e, t);
+ },
+
+ touchend: function(d, e, t) {
+ if (t.identifier === d.touch1)
+ d.switchTo(initialState);
+ }
+ };
+
+ var mouseDownState = {
+ name: 'mouseDownState',
+ init: function(d, e) {
+ // Remember the target of the event
+ d.target = e.target;
+
+ // Register this detector as a *capturing* handler on the document
+ // so we get all subsequent mouse events until we remove these handlers
+ var doc = d.element.ownerDocument;
+ doc.addEventListener('mousemove', d, true);
+ doc.addEventListener('mouseup', d, true);
+
+ // Get the coordinates of the mouse event
+ d.start = d.last = mouseCoordinates(e);
+
+ // Start a timer for a hold
+ // If we're doing hold events, start a timer for them
+ if (d.options.holdEvents)
+ d.startTimer('holdtimeout', GD.HOLD_INTERVAL);
+ },
+
+ mousemove: function(d, e) {
+ // If the mouse has moved more than the panning threshold,
+ // then switch to the mouse panning state. Otherwise remain
+ // in this state
+
+ if (abs(e.screenX - d.start.screenX) > GD.MOUSE_PAN_THRESHOLD ||
+ abs(e.screenY - d.start.screenY) > GD.MOUSE_PAN_THRESHOLD) {
+ d.clearTimer('holdtimeout');
+ d.switchTo(mousePannedState, e);
+ }
+ },
+
+ mouseup: function(d, e) {
+ // Remove the capturing event handlers
+ var doc = d.element.ownerDocument;
+ doc.removeEventListener('mousemove', d, true);
+ doc.removeEventListener('mouseup', d, true);
+
+ // If there was a previous tap that was close enough in time
+ // and space, then emit a 'dbltap' event
+ if (d.lastTap && isDoubleTap(d.lastTap, d.start)) {
+ d.emitEvent('tap', d.start);
+ d.emitEvent('dbltap', d.start);
+ d.lastTap = null; // so we don't get another one
+ }
+ else {
+ // Emit a 'tap' event using the starting coordinates
+ // as the event details
+ d.emitEvent('tap', d.start);
+
+ // Remember the coordinates of this tap so we can detect double taps
+ d.lastTap = mouseCoordinates(e);
+ }
+
+ // In either case clear the timer and go back to the initial state
+ d.clearTimer('holdtimeout');
+ d.switchTo(initialState);
+ },
+
+ holdtimeout: function(d) {
+ d.switchTo(mouseHoldState);
+ }
+ };
+
+ // Like holdState, but for mouse events instead of touch events
+ var mouseHoldState = {
+ name: 'mouseHoldState',
+ init: function(d) {
+ d.emitEvent('holdstart', d.start);
+ },
+
+ mousemove: function(d, e) {
+ var current = mouseCoordinates(e);
+ d.emitEvent('holdmove', {
+ absolute: {
+ dx: current.screenX - d.start.screenX,
+ dy: current.screenY - d.start.screenY
+ },
+ relative: {
+ dx: current.screenX - d.last.screenX,
+ dy: current.screenY - d.last.screenY
+ },
+ position: current
+ });
+
+ d.last = current;
+ },
+
+ mouseup: function(d, e) {
+ var current = mouseCoordinates(e);
+ d.emitEvent('holdend', {
+ start: d.start,
+ end: current,
+ dx: current.screenX - d.start.screenX,
+ dy: current.screenY - d.start.screenY
+ });
+ d.switchTo(initialState);
+ }
+ };
+
+ var mousePannedState = {
+ name: 'mousePannedState',
+ init: function(d, e) {
+ // Panning doesn't start until the mouse has moved more than
+ // a certain threshold. But we don't want the pan to have a jerky
+ // start where the first event is a big distance. So reset the
+ // starting point to a point between the start point and this
+ // current point
+ d.start = d.last = between(d.start, mouseCoordinates(e));
+
+ // If we transition into this state with a mousemove event,
+ // then process it with that handler. If we don't do this then
+ // we can end up with swipe events that don't know their velocity
+ if (e.type === 'mousemove')
+ mousePannedState.mousemove(d, e);
+ },
+ mousemove: function(d, e) {
+ // Each time the mouse moves, emit a pan event but stay in this state
+ var current = mouseCoordinates(e);
+ d.emitEvent('pan', {
+ absolute: {
+ dx: current.screenX - d.start.screenX,
+ dy: current.screenY - d.start.screenY
+ },
+ relative: {
+ dx: current.screenX - d.last.screenX,
+ dy: current.screenY - d.last.screenY
+ },
+ position: current
+ });
+
+ // Track the pan velocity so we can report this with the swipe
+ // Use a exponential moving average for a bit of smoothing
+ // on the velocity
+ var dt = current.timeStamp - d.last.timeStamp;
+ var vx = (current.screenX - d.last.screenX) / dt;
+ var vy = (current.screenY - d.last.screenY) / dt;
+
+ if (d.vx == null) { // first time; no average
+ d.vx = vx;
+ d.vy = vy;
+ }
+ else {
+ d.vx = d.vx * GD.VELOCITY_SMOOTHING +
+ vx * (1 - GD.VELOCITY_SMOOTHING);
+ d.vy = d.vy * GD.VELOCITY_SMOOTHING +
+ vy * (1 - GD.VELOCITY_SMOOTHING);
+ }
+
+ d.last = current;
+ },
+ mouseup: function(d, e) {
+ // Remove the capturing event handlers
+ var doc = d.element.ownerDocument;
+ doc.removeEventListener('mousemove', d, true);
+ doc.removeEventListener('mouseup', d, true);
+
+ // Emit a swipe event when the mouse goes up.
+ // Report start and end point, dx, dy, dt, velocity and direction
+ var current = mouseCoordinates(e);
+
+ // FIXME:
+ // lots of code duplicated between this state and the corresponding
+ // touch state, can I combine them somehow?
+ var dx = current.screenX - d.start.screenX;
+ var dy = current.screenY - d.start.screenY;
+ // angle is a positive number of degrees, starting at 0 on the
+ // positive x axis and increasing clockwise.
+ var angle = atan2(dy, dx) * 180 / PI;
+ if (angle < 0)
+ angle += 360;
+
+ // Direction is 'right', 'down', 'left' or 'up'
+ var direction;
+ if (angle >= 315 || angle < 45)
+ direction = 'right';
+ else if (angle >= 45 && angle < 135)
+ direction = 'down';
+ else if (angle >= 135 && angle < 225)
+ direction = 'left';
+ else if (angle >= 225 && angle < 315)
+ direction = 'up';
+
+ d.emitEvent('swipe', {
+ start: d.start,
+ end: current,
+ dx: dx,
+ dy: dy,
+ dt: current.timeStamp - d.start.timeStamp,
+ vx: d.vx,
+ vy: d.vy,
+ direction: direction,
+ angle: angle
+ });
+
+ // Go back to the initial state
+ d.switchTo(initialState);
+ }
+ };
+
+ return GD;
+}());
+
diff --git a/shared/js/idletimer.js b/shared/js/idletimer.js
new file mode 100644
index 0000000..5c42384
--- /dev/null
+++ b/shared/js/idletimer.js
@@ -0,0 +1,127 @@
+/*
+ This file implements window.setIdleTimeout() and
+ window.clearIdleTimeout(). They look like setTimeout() except the
+ setIdleTimeout() function takes two callbacks:
+
+ setIdleTimeout(idleCallback, activeCallback, ms):
+ idleCallback will fire after specific microsecond of idle.
+ The time it takes will calculated from the time
+ setIdleTimeout() is called and resets as user interacts.
+
+ activeCallback will fire when the first user action *after*
+ idleCallback fires
+
+ returns id.
+
+ clearIdleTimeout(id):
+ takes the id returns from setIdleTimeout() and cancels it.
+
+*/
+
+// Wrap everything into a closure so we will not expose idleTimerRegistry
+
+'use strict';
+
+(function idleTimerAsAIdleObserverWrapper(win) {
+
+ // stuff the 0th element so id is always a truey value
+ var idleTimerRegistry = [undefined];
+
+ // setIdleTimeout()
+ win.setIdleTimeout = function setIdleTimeout(idleCallback,
+ activeCallback,
+ ms) {
+ var startTimestamp = Date.now();
+ var idleFired = false;
+
+ var idleTimer = {
+ timer: undefined,
+ resetStartTimestamp: function resetStartTimestamp() {
+ startTimestamp = Date.now();
+ }
+ };
+
+ // If the system unix time changes, we would need to update
+ // the number we kept in startTimestamp, or bad things will happen.
+ window.addEventListener('moztimechange', idleTimer.resetStartTimestamp);
+
+ // Create an idle observer with a very short time as
+ // we are not interested in when onidle fires (since it's inaccuate),
+ // instead, we need to know when onactive callback calls.
+ idleTimer.observer = {
+ onidle: function observerReportIdle() {
+ // Once the onidle fires, the next user action will trigger
+ // onactive.
+
+ // The time it takes for onidle to fire need to be subtracted from
+ // the real time we are going to set to setTimeout()
+ var time = (ms - (Date.now() - startTimestamp));
+
+ // Let's start the real count down and wait for that.
+ idleTimer.timer = setTimeout(function idled() {
+ // remove the timer
+ idleTimer.timer = undefined;
+
+ // set idleFired to true
+ idleFired = true;
+
+ // fire the real idleCallback
+ idleCallback();
+ }, time);
+ },
+ onactive: function observerReportActive() {
+ // Remove the timer set by onidle
+ if (idleTimer.timer) {
+ clearTimeout(idleTimer.timer);
+ idleTimer.timer = undefined;
+ }
+
+ // Reset the timestamp; the next real count down should start
+ // from the time onactive fires
+ startTimestamp = Date.now();
+
+ // If idleCallback is not called yet,
+ // we should not trigger activeCallback here
+ if (!idleFired)
+ return;
+
+ // fire the real activeCallback
+ activeCallback();
+
+ // reset the flag
+ idleFired = false;
+
+ // After a short time, onidle will fire again.
+ // timer will be registered there again.
+ },
+ time: 1
+ };
+
+ // Register the idleObserver
+ navigator.addIdleObserver(idleTimer.observer);
+
+ // Push the idleTimer object to the registry
+ idleTimerRegistry.push(idleTimer);
+
+ // return the id so people can do clearIdleTimeout();
+ return (idleTimerRegistry.length - 1);
+ };
+
+ // clearIdleTimeout()
+ win.clearIdleTimeout = function clearIdleTimeout(id) {
+ if (!idleTimerRegistry[id])
+ return;
+
+ // Get the idleTimer object and remove it from registry
+ var idleTimer = idleTimerRegistry[id];
+ idleTimerRegistry[id] = undefined;
+
+ // Properly clean it up, make sure we will never heard from
+ // those callbacks ever again.
+ navigator.removeIdleObserver(idleTimer.observer);
+ window.removeEventListener('moztimechange', idleTimer.resetStartTimestamp);
+ if (idleTimer.timer)
+ clearTimeout(idleTimer.timer);
+ };
+
+})(this);
diff --git a/shared/js/l10n.js b/shared/js/l10n.js
new file mode 100644
index 0000000..adbc51a
--- /dev/null
+++ b/shared/js/l10n.js
@@ -0,0 +1,1014 @@
+/* -*- Mode: js; js-indent-level: 2; indent-tabs-mode: nil -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+/**
+ * This library exposes a `navigator.mozL10n' object to handle client-side
+ * application localization. See: https://github.com/fabi1cazenave/webL10n
+ */
+
+(function(window) {
+ var gL10nData = {};
+ var gTextProp = 'textContent';
+ var gLanguage = '';
+ var gMacros = {};
+ var gReadyState = 'loading';
+
+
+ /**
+ * Synchronously loading l10n resources significantly minimizes flickering
+ * from displaying the app with non-localized strings and then updating the
+ * strings. Although this will block all script execution on this page, we
+ * expect that the l10n resources are available locally on flash-storage.
+ *
+ * As synchronous XHR is generally considered as a bad idea, we're still
+ * loading l10n resources asynchronously -- but we keep this in a setting,
+ * just in case... and applications using this library should hide their
+ * content until the `localized' event happens.
+ */
+
+ var gAsyncResourceLoading = true; // read-only
+
+
+ /**
+ * Debug helpers
+ *
+ * gDEBUG == 0: don't display any console message
+ * gDEBUG == 1: display only warnings, not logs
+ * gDEBUG == 2: display all console messages
+ */
+
+ var gDEBUG = 1;
+
+ function consoleLog(message) {
+ if (gDEBUG >= 2) {
+ console.log('[l10n] ' + message);
+ }
+ };
+
+ function consoleWarn(message) {
+ if (gDEBUG) {
+ console.warn('[l10n] ' + message);
+ }
+ };
+
+
+ /**
+ * DOM helpers for the so-called "HTML API".
+ *
+ * These functions are written for modern browsers. For old versions of IE,
+ * they're overridden in the 'startup' section at the end of this file.
+ */
+
+ function getL10nResourceLinks() {
+ return document.querySelectorAll('link[type="application/l10n"]');
+ }
+
+ function getL10nDictionary() {
+ var script = document.querySelector('script[type="application/l10n"]');
+ // TODO: support multiple and external JSON dictionaries
+ return script ? JSON.parse(script.innerHTML) : null;
+ }
+
+ function getTranslatableChildren(element) {
+ return element ? element.querySelectorAll('*[data-l10n-id]') : [];
+ }
+
+ function getL10nAttributes(element) {
+ if (!element)
+ return {};
+
+ var l10nId = element.getAttribute('data-l10n-id');
+ var l10nArgs = element.getAttribute('data-l10n-args');
+ var args = {};
+ if (l10nArgs) {
+ try {
+ args = JSON.parse(l10nArgs);
+ } catch (e) {
+ consoleWarn('could not parse arguments for #' + l10nId);
+ }
+ }
+ return { id: l10nId, args: args };
+ }
+
+ function fireL10nReadyEvent() {
+ var evtObject = document.createEvent('Event');
+ evtObject.initEvent('localized', false, false);
+ evtObject.language = gLanguage;
+ window.dispatchEvent(evtObject);
+ }
+
+
+ /**
+ * l10n resource parser:
+ * - reads (async XHR) the l10n resource matching `lang';
+ * - imports linked resources (synchronously) when specified;
+ * - parses the text data (fills `gL10nData');
+ * - triggers success/failure callbacks when done.
+ *
+ * @param {string} href
+ * URL of the l10n resource to parse.
+ *
+ * @param {string} lang
+ * locale (language) to parse.
+ *
+ * @param {Function} successCallback
+ * triggered when the l10n resource has been successully parsed.
+ *
+ * @param {Function} failureCallback
+ * triggered when the an error has occured.
+ *
+ * @return {void}
+ * uses the following global variables: gL10nData, gTextProp.
+ */
+
+ function parseResource(href, lang, successCallback, failureCallback) {
+ var baseURL = href.replace(/\/[^\/]*$/, '/');
+
+ // handle escaped characters (backslashes) in a string
+ function evalString(text) {
+ if (text.lastIndexOf('\\') < 0)
+ return text;
+ return text.replace(/\\\\/g, '\\')
+ .replace(/\\n/g, '\n')
+ .replace(/\\r/g, '\r')
+ .replace(/\\t/g, '\t')
+ .replace(/\\b/g, '\b')
+ .replace(/\\f/g, '\f')
+ .replace(/\\{/g, '{')
+ .replace(/\\}/g, '}')
+ .replace(/\\"/g, '"')
+ .replace(/\\'/g, "'");
+ }
+
+ // parse *.properties text data into an l10n dictionary
+ function parseProperties(text) {
+ var dictionary = [];
+
+ // token expressions
+ var reBlank = /^\s*|\s*$/;
+ var reComment = /^\s*#|^\s*$/;
+ var reSection = /^\s*\[(.*)\]\s*$/;
+ var reImport = /^\s*@import\s+url\((.*)\)\s*$/i;
+ var reSplit = /^([^=\s]*)\s*=\s*(.+)$/; // TODO: escape EOLs with '\'
+
+ // parse the *.properties file into an associative array
+ function parseRawLines(rawText, extendedSyntax) {
+ var entries = rawText.replace(reBlank, '').split(/[\r\n]+/);
+ var currentLang = '*';
+ var genericLang = lang.replace(/-[a-z]+$/i, '');
+ var skipLang = false;
+ var match = '';
+
+ for (var i = 0; i < entries.length; i++) {
+ var line = entries[i];
+
+ // comment or blank line?
+ if (reComment.test(line))
+ continue;
+
+ // the extended syntax supports [lang] sections and @import rules
+ if (extendedSyntax) {
+ if (reSection.test(line)) { // section start?
+ match = reSection.exec(line);
+ currentLang = match[1];
+ skipLang = (currentLang !== '*') &&
+ (currentLang !== lang) && (currentLang !== genericLang);
+ continue;
+ } else if (skipLang) {
+ continue;
+ }
+ if (reImport.test(line)) { // @import rule?
+ match = reImport.exec(line);
+ loadImport(baseURL + match[1]); // load the resource synchronously
+ }
+ }
+
+ // key-value pair
+ var tmp = line.match(reSplit);
+ if (tmp && tmp.length == 3) {
+ dictionary[tmp[1]] = evalString(tmp[2]);
+ }
+ }
+ }
+
+ // import another *.properties file
+ function loadImport(url) {
+ loadResource(url, function(content) {
+ parseRawLines(content, false); // don't allow recursive imports
+ }, null, false); // load synchronously
+ }
+
+ // fill the dictionary
+ parseRawLines(text, true);
+ return dictionary;
+ }
+
+ // load the specified resource file
+ function loadResource(url, onSuccess, onFailure, asynchronous) {
+ onSuccess = onSuccess || function _onSuccess(data) {};
+ onFailure = onFailure || function _onFailure() {
+ consoleWarn(url + ' not found.');
+ };
+
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', url, asynchronous);
+ if (xhr.overrideMimeType) {
+ xhr.overrideMimeType('text/plain; charset=utf-8');
+ }
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200 || xhr.status === 0) {
+ onSuccess(xhr.responseText);
+ } else {
+ onFailure();
+ }
+ }
+ };
+ xhr.onerror = onFailure;
+ xhr.ontimeout = onFailure;
+
+ // in Firefox OS with the app:// protocol, trying to XHR a non-existing
+ // URL will raise an exception here -- hence this ugly try...catch.
+ try {
+ xhr.send(null);
+ } catch (e) {
+ onFailure();
+ }
+ }
+
+ // load and parse l10n data (warning: global variables are used here)
+ loadResource(href, function(response) {
+ // parse *.properties text data into an l10n dictionary
+ var data = parseProperties(response);
+
+ // find attribute descriptions, if any
+ for (var key in data) {
+ var id, prop, index = key.lastIndexOf('.');
+ if (index > 0) { // an attribute has been specified
+ id = key.substring(0, index);
+ prop = key.substr(index + 1);
+ } else { // no attribute: assuming text content by default
+ id = key;
+ prop = gTextProp;
+ }
+ if (!gL10nData[id]) {
+ gL10nData[id] = {};
+ }
+ gL10nData[id][prop] = data[key];
+ }
+
+ // trigger callback
+ if (successCallback) {
+ successCallback();
+ }
+ }, failureCallback, gAsyncResourceLoading);
+ };
+
+ // load and parse all resources for the specified locale
+ function loadLocale(lang, callback) {
+ callback = callback || function _callback() {};
+
+ clear();
+ gLanguage = lang;
+
+ // check all <link type="application/l10n" href="..." /> nodes
+ // and load the resource files
+ var langLinks = getL10nResourceLinks();
+ var langCount = langLinks.length;
+ if (langCount == 0) {
+ // we might have a pre-compiled dictionary instead
+ var dict = getL10nDictionary();
+ if (dict && dict.locales && dict.default_locale) {
+ consoleLog('using the embedded JSON directory, early way out');
+ gL10nData = dict.locales[lang] || dict.locales[dict.default_locale];
+ callback();
+ } else {
+ consoleLog('no resource to load, early way out');
+ }
+ // early way out
+ fireL10nReadyEvent(lang);
+ gReadyState = 'complete';
+ return;
+ }
+
+ // start the callback when all resources are loaded
+ var onResourceLoaded = null;
+ var gResourceCount = 0;
+ onResourceLoaded = function() {
+ gResourceCount++;
+ if (gResourceCount >= langCount) {
+ callback();
+ fireL10nReadyEvent(lang);
+ gReadyState = 'complete';
+ }
+ };
+
+ // load all resource files
+ function l10nResourceLink(link) {
+ var href = link.href;
+ var type = link.type;
+ this.load = function(lang, callback) {
+ var applied = lang;
+ parseResource(href, lang, callback, function() {
+ consoleWarn(href + ' not found.');
+ applied = '';
+ });
+ return applied; // return lang if found, an empty string if not found
+ };
+ }
+
+ for (var i = 0; i < langCount; i++) {
+ var resource = new l10nResourceLink(langLinks[i]);
+ var rv = resource.load(lang, onResourceLoaded);
+ if (rv != lang) { // lang not found, used default resource instead
+ consoleWarn('"' + lang + '" resource not found');
+ gLanguage = '';
+ }
+ }
+ }
+
+ // clear all l10n data
+ function clear() {
+ gL10nData = {};
+ gLanguage = '';
+ // TODO: clear all non predefined macros.
+ // There's no such macro /yet/ but we're planning to have some...
+ }
+
+
+ /**
+ * Get rules for plural forms (shared with JetPack), see:
+ * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
+ * https://github.com/mozilla/addon-sdk/blob/master/python-lib/plural-rules-generator.p
+ *
+ * @param {string} lang
+ * locale (language) used.
+ *
+ * @return {Function}
+ * returns a function that gives the plural form name for a given integer:
+ * var fun = getPluralRules('en');
+ * fun(1) -> 'one'
+ * fun(0) -> 'other'
+ * fun(1000) -> 'other'.
+ */
+
+ function getPluralRules(lang) {
+ var locales2rules = {
+ 'af': 3,
+ 'ak': 4,
+ 'am': 4,
+ 'ar': 1,
+ 'asa': 3,
+ 'az': 0,
+ 'be': 11,
+ 'bem': 3,
+ 'bez': 3,
+ 'bg': 3,
+ 'bh': 4,
+ 'bm': 0,
+ 'bn': 3,
+ 'bo': 0,
+ 'br': 20,
+ 'brx': 3,
+ 'bs': 11,
+ 'ca': 3,
+ 'cgg': 3,
+ 'chr': 3,
+ 'cs': 12,
+ 'cy': 17,
+ 'da': 3,
+ 'de': 3,
+ 'dv': 3,
+ 'dz': 0,
+ 'ee': 3,
+ 'el': 3,
+ 'en': 3,
+ 'eo': 3,
+ 'es': 3,
+ 'et': 3,
+ 'eu': 3,
+ 'fa': 0,
+ 'ff': 5,
+ 'fi': 3,
+ 'fil': 4,
+ 'fo': 3,
+ 'fr': 5,
+ 'fur': 3,
+ 'fy': 3,
+ 'ga': 8,
+ 'gd': 24,
+ 'gl': 3,
+ 'gsw': 3,
+ 'gu': 3,
+ 'guw': 4,
+ 'gv': 23,
+ 'ha': 3,
+ 'haw': 3,
+ 'he': 2,
+ 'hi': 4,
+ 'hr': 11,
+ 'hu': 0,
+ 'id': 0,
+ 'ig': 0,
+ 'ii': 0,
+ 'is': 3,
+ 'it': 3,
+ 'iu': 7,
+ 'ja': 0,
+ 'jmc': 3,
+ 'jv': 0,
+ 'ka': 0,
+ 'kab': 5,
+ 'kaj': 3,
+ 'kcg': 3,
+ 'kde': 0,
+ 'kea': 0,
+ 'kk': 3,
+ 'kl': 3,
+ 'km': 0,
+ 'kn': 0,
+ 'ko': 0,
+ 'ksb': 3,
+ 'ksh': 21,
+ 'ku': 3,
+ 'kw': 7,
+ 'lag': 18,
+ 'lb': 3,
+ 'lg': 3,
+ 'ln': 4,
+ 'lo': 0,
+ 'lt': 10,
+ 'lv': 6,
+ 'mas': 3,
+ 'mg': 4,
+ 'mk': 16,
+ 'ml': 3,
+ 'mn': 3,
+ 'mo': 9,
+ 'mr': 3,
+ 'ms': 0,
+ 'mt': 15,
+ 'my': 0,
+ 'nah': 3,
+ 'naq': 7,
+ 'nb': 3,
+ 'nd': 3,
+ 'ne': 3,
+ 'nl': 3,
+ 'nn': 3,
+ 'no': 3,
+ 'nr': 3,
+ 'nso': 4,
+ 'ny': 3,
+ 'nyn': 3,
+ 'om': 3,
+ 'or': 3,
+ 'pa': 3,
+ 'pap': 3,
+ 'pl': 13,
+ 'ps': 3,
+ 'pt': 3,
+ 'rm': 3,
+ 'ro': 9,
+ 'rof': 3,
+ 'ru': 11,
+ 'rwk': 3,
+ 'sah': 0,
+ 'saq': 3,
+ 'se': 7,
+ 'seh': 3,
+ 'ses': 0,
+ 'sg': 0,
+ 'sh': 11,
+ 'shi': 19,
+ 'sk': 12,
+ 'sl': 14,
+ 'sma': 7,
+ 'smi': 7,
+ 'smj': 7,
+ 'smn': 7,
+ 'sms': 7,
+ 'sn': 3,
+ 'so': 3,
+ 'sq': 3,
+ 'sr': 11,
+ 'ss': 3,
+ 'ssy': 3,
+ 'st': 3,
+ 'sv': 3,
+ 'sw': 3,
+ 'syr': 3,
+ 'ta': 3,
+ 'te': 3,
+ 'teo': 3,
+ 'th': 0,
+ 'ti': 4,
+ 'tig': 3,
+ 'tk': 3,
+ 'tl': 4,
+ 'tn': 3,
+ 'to': 0,
+ 'tr': 0,
+ 'ts': 3,
+ 'tzm': 22,
+ 'uk': 11,
+ 'ur': 3,
+ 've': 3,
+ 'vi': 0,
+ 'vun': 3,
+ 'wa': 4,
+ 'wae': 3,
+ 'wo': 0,
+ 'xh': 3,
+ 'xog': 3,
+ 'yo': 0,
+ 'zh': 0,
+ 'zu': 3
+ };
+
+ // utility functions for plural rules methods
+ function isIn(n, list) {
+ return list.indexOf(n) !== -1;
+ }
+ function isBetween(n, start, end) {
+ return start <= n && n <= end;
+ }
+
+ // list of all plural rules methods:
+ // map an integer to the plural form name to use
+ var pluralRules = {
+ '0': function(n) {
+ return 'other';
+ },
+ '1': function(n) {
+ if ((isBetween((n % 100), 3, 10)))
+ return 'few';
+ if (n === 0)
+ return 'zero';
+ if ((isBetween((n % 100), 11, 99)))
+ return 'many';
+ if (n == 2)
+ return 'two';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '2': function(n) {
+ if (n !== 0 && (n % 10) === 0)
+ return 'many';
+ if (n == 2)
+ return 'two';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '3': function(n) {
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '4': function(n) {
+ if ((isBetween(n, 0, 1)))
+ return 'one';
+ return 'other';
+ },
+ '5': function(n) {
+ if ((isBetween(n, 0, 2)) && n != 2)
+ return 'one';
+ return 'other';
+ },
+ '6': function(n) {
+ if (n === 0)
+ return 'zero';
+ if ((n % 10) == 1 && (n % 100) != 11)
+ return 'one';
+ return 'other';
+ },
+ '7': function(n) {
+ if (n == 2)
+ return 'two';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '8': function(n) {
+ if ((isBetween(n, 3, 6)))
+ return 'few';
+ if ((isBetween(n, 7, 10)))
+ return 'many';
+ if (n == 2)
+ return 'two';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '9': function(n) {
+ if (n === 0 || n != 1 && (isBetween((n % 100), 1, 19)))
+ return 'few';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '10': function(n) {
+ if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19)))
+ return 'few';
+ if ((n % 10) == 1 && !(isBetween((n % 100), 11, 19)))
+ return 'one';
+ return 'other';
+ },
+ '11': function(n) {
+ if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))
+ return 'few';
+ if ((n % 10) === 0 ||
+ (isBetween((n % 10), 5, 9)) ||
+ (isBetween((n % 100), 11, 14)))
+ return 'many';
+ if ((n % 10) == 1 && (n % 100) != 11)
+ return 'one';
+ return 'other';
+ },
+ '12': function(n) {
+ if ((isBetween(n, 2, 4)))
+ return 'few';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '13': function(n) {
+ if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))
+ return 'few';
+ if (n != 1 && (isBetween((n % 10), 0, 1)) ||
+ (isBetween((n % 10), 5, 9)) ||
+ (isBetween((n % 100), 12, 14)))
+ return 'many';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '14': function(n) {
+ if ((isBetween((n % 100), 3, 4)))
+ return 'few';
+ if ((n % 100) == 2)
+ return 'two';
+ if ((n % 100) == 1)
+ return 'one';
+ return 'other';
+ },
+ '15': function(n) {
+ if (n === 0 || (isBetween((n % 100), 2, 10)))
+ return 'few';
+ if ((isBetween((n % 100), 11, 19)))
+ return 'many';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '16': function(n) {
+ if ((n % 10) == 1 && n != 11)
+ return 'one';
+ return 'other';
+ },
+ '17': function(n) {
+ if (n == 3)
+ return 'few';
+ if (n === 0)
+ return 'zero';
+ if (n == 6)
+ return 'many';
+ if (n == 2)
+ return 'two';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '18': function(n) {
+ if (n === 0)
+ return 'zero';
+ if ((isBetween(n, 0, 2)) && n !== 0 && n != 2)
+ return 'one';
+ return 'other';
+ },
+ '19': function(n) {
+ if ((isBetween(n, 2, 10)))
+ return 'few';
+ if ((isBetween(n, 0, 1)))
+ return 'one';
+ return 'other';
+ },
+ '20': function(n) {
+ if ((isBetween((n % 10), 3, 4) || ((n % 10) == 9)) && !(
+ isBetween((n % 100), 10, 19) ||
+ isBetween((n % 100), 70, 79) ||
+ isBetween((n % 100), 90, 99)
+ ))
+ return 'few';
+ if ((n % 1000000) === 0 && n !== 0)
+ return 'many';
+ if ((n % 10) == 2 && !isIn((n % 100), [12, 72, 92]))
+ return 'two';
+ if ((n % 10) == 1 && !isIn((n % 100), [11, 71, 91]))
+ return 'one';
+ return 'other';
+ },
+ '21': function(n) {
+ if (n === 0)
+ return 'zero';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '22': function(n) {
+ if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99)))
+ return 'one';
+ return 'other';
+ },
+ '23': function(n) {
+ if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0)
+ return 'one';
+ return 'other';
+ },
+ '24': function(n) {
+ if ((isBetween(n, 3, 10) || isBetween(n, 13, 19)))
+ return 'few';
+ if (isIn(n, [2, 12]))
+ return 'two';
+ if (isIn(n, [1, 11]))
+ return 'one';
+ return 'other';
+ }
+ };
+
+ // return a function that gives the plural form name for a given integer
+ var index = locales2rules[lang.replace(/-.*$/, '')];
+ if (!(index in pluralRules)) {
+ consoleWarn('plural form unknown for [' + lang + ']');
+ return function() { return 'other'; };
+ }
+ return pluralRules[index];
+ }
+
+ // pre-defined 'plural' macro
+ gMacros.plural = function(str, param, key, prop) {
+ var n = parseFloat(param);
+ if (isNaN(n))
+ return str;
+
+ // TODO: support other properties (l20n still doesn't...)
+ if (prop != gTextProp)
+ return str;
+
+ // initialize _pluralRules
+ if (!gMacros._pluralRules) {
+ gMacros._pluralRules = getPluralRules(gLanguage);
+ }
+ var index = '[' + gMacros._pluralRules(n) + ']';
+
+ // try to find a [zero|one|two] key if it's defined
+ if (n === 0 && (key + '[zero]') in gL10nData) {
+ str = gL10nData[key + '[zero]'][prop];
+ } else if (n == 1 && (key + '[one]') in gL10nData) {
+ str = gL10nData[key + '[one]'][prop];
+ } else if (n == 2 && (key + '[two]') in gL10nData) {
+ str = gL10nData[key + '[two]'][prop];
+ } else if ((key + index) in gL10nData) {
+ str = gL10nData[key + index][prop];
+ } else if ((key + '[other]') in gL10nData) {
+ str = gL10nData[key + '[other]'][prop];
+ }
+
+ return str;
+ };
+
+
+ /**
+ * l10n dictionary functions
+ */
+
+ // fetch an l10n object, warn if not found, apply `args' if possible
+ function getL10nData(key, args) {
+ var data = gL10nData[key];
+ if (!data) {
+ consoleWarn('#' + key + ' is undefined.');
+ }
+
+ /** This is where l10n expressions should be processed.
+ * The plan is to support C-style expressions from the l20n project;
+ * until then, only two kinds of simple expressions are supported:
+ * {[ index ]} and {{ arguments }}.
+ */
+ var rv = {};
+ for (var prop in data) {
+ var str = data[prop];
+ str = substIndexes(str, args, key, prop);
+ str = substArguments(str, args, key);
+ rv[prop] = str;
+ }
+ return rv;
+ }
+
+ // replace {[macros]} with their values
+ function substIndexes(str, args, key, prop) {
+ var reIndex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)\s*\]\}/;
+ var reMatch = reIndex.exec(str);
+ if (!reMatch || !reMatch.length)
+ return str;
+
+ // an index/macro has been found
+ // Note: at the moment, only one parameter is supported
+ var macroName = reMatch[1];
+ var paramName = reMatch[2];
+ var param;
+ if (args && paramName in args) {
+ param = args[paramName];
+ } else if (paramName in gL10nData) {
+ param = gL10nData[paramName];
+ }
+
+ // there's no macro parser yet: it has to be defined in gMacros
+ if (macroName in gMacros) {
+ var macro = gMacros[macroName];
+ str = macro(str, param, key, prop);
+ }
+ return str;
+ }
+
+ // replace {{arguments}} with their values
+ function substArguments(str, args, key) {
+ var reArgs = /\{\{\s*(.+?)\s*\}\}/;
+ var match = reArgs.exec(str);
+ while (match) {
+ if (!match || match.length < 2)
+ return str; // argument key not found
+
+ var arg = match[1];
+ var sub = '';
+ if (args && arg in args) {
+ sub = args[arg];
+ } else if (arg in gL10nData) {
+ sub = gL10nData[arg][gTextProp];
+ } else {
+ consoleLog('argument {{' + arg + '}} for #' + key + ' is undefined.');
+ return str;
+ }
+
+ str = str.substring(0, match.index) + sub +
+ str.substr(match.index + match[0].length);
+ match = reArgs.exec(str);
+ }
+ return str;
+ }
+
+ // translate an HTML element
+ function translateElement(element) {
+ var l10n = getL10nAttributes(element);
+ if (!l10n.id) {
+ return;
+ }
+
+ // get the related l10n object
+ var data = getL10nData(l10n.id, l10n.args);
+ if (!data) {
+ consoleWarn('#' + l10n.id + ' is undefined.');
+ return;
+ }
+
+ // translate element (TODO: security checks?)
+ if (data[gTextProp]) { // XXX
+ if (element.children.length === 0) {
+ element[gTextProp] = data[gTextProp];
+ } else {
+ // this element has element children: replace the content of the first
+ // (non-empty) child textNode and clear other child textNodes
+ var children = element.childNodes;
+ var found = false;
+ for (var i = 0, l = children.length; i < l; i++) {
+ if (children[i].nodeType === 3 && /\S/.test(children[i].nodeValue)) {
+ if (found) {
+ children[i].nodeValue = '';
+ } else {
+ children[i].nodeValue = data[gTextProp];
+ found = true;
+ }
+ }
+ }
+ // if no (non-empty) textNode is found, insert a textNode before the
+ // first element child.
+ if (!found) {
+ var textNode = document.createTextNode(data[gTextProp]);
+ element.insertBefore(textNode, element.firstChild);
+ }
+ }
+ delete data[gTextProp];
+ }
+
+ for (var k in data) {
+ element[k] = data[k];
+ }
+ }
+
+ // translate an HTML subtree
+ function translateFragment(element) {
+ element = element || document.documentElement;
+
+ // check all translatable children (= w/ a `data-l10n-id' attribute)
+ var children = getTranslatableChildren(element);
+ var elementCount = children.length;
+ for (var i = 0; i < elementCount; i++) {
+ translateElement(children[i]);
+ }
+
+ // translate element itself if necessary
+ translateElement(element);
+ }
+
+
+ /**
+ * Startup & Public API
+ *
+ * This section is quite specific to the B2G project: old browsers are not
+ * supported and the API is slightly different from the standard webl10n one.
+ */
+
+ // load the default locale on startup
+ function l10nStartup() {
+ gReadyState = 'interactive';
+ consoleLog('loading [' + navigator.language + '] resources, ' +
+ (gAsyncResourceLoading ? 'asynchronously.' : 'synchronously.'));
+
+ // load the default locale and translate the document if required
+ if (document.documentElement.lang === navigator.language) {
+ loadLocale(navigator.language);
+ } else {
+ loadLocale(navigator.language, translateFragment);
+ }
+ }
+
+ // the B2G build system doesn't expose any `document'...
+ if (typeof(document) !== 'undefined') {
+ if (document.readyState === 'complete' ||
+ document.readyState === 'interactive') {
+ window.setTimeout(l10nStartup);
+ } else {
+ document.addEventListener('DOMContentLoaded', l10nStartup);
+ }
+ }
+
+ // load the appropriate locale if the language setting has changed
+ if ('mozSettings' in navigator && navigator.mozSettings) {
+ navigator.mozSettings.addObserver('language.current', function(event) {
+ loadLocale(event.settingValue, translateFragment);
+ });
+ }
+
+ // public API
+ navigator.mozL10n = {
+ // get a localized string
+ get: function l10n_get(key, args, fallback) {
+ var data = getL10nData(key, args) || fallback;
+ if (data) {
+ return 'textContent' in data ? data.textContent : '';
+ }
+ return '{{' + key + '}}';
+ },
+
+ // get|set the document language and direction
+ get language() {
+ return {
+ // get|set the document language (ISO-639-1)
+ get code() { return gLanguage; },
+ set code(lang) { loadLocale(lang, translateFragment); },
+
+ // get the direction (ltr|rtl) of the current language
+ get direction() {
+ // http://www.w3.org/International/questions/qa-scripts
+ // Arabic, Hebrew, Farsi, Pashto, Urdu
+ var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];
+ return (rtlList.indexOf(gLanguage) >= 0) ? 'rtl' : 'ltr';
+ }
+ };
+ },
+
+ // translate an element or document fragment
+ translate: translateFragment,
+
+ // get (a clone of) the dictionary for the current locale
+ get dictionary() { return JSON.parse(JSON.stringify(gL10nData)); },
+
+ // this can be used to prevent race conditions
+ get readyState() { return gReadyState; },
+ ready: function l10n_ready(callback) {
+ if (!callback) {
+ return;
+ } else if (gReadyState == 'complete' || gReadyState == 'interactive') {
+ window.setTimeout(callback);
+ } else {
+ window.addEventListener('localized', callback);
+ }
+ }
+ };
+
+ consoleLog('library loaded.');
+})(this);
+
diff --git a/shared/js/l10n_date.js b/shared/js/l10n_date.js
new file mode 100644
index 0000000..eb461a3
--- /dev/null
+++ b/shared/js/l10n_date.js
@@ -0,0 +1,141 @@
+/* -*- Mode: js; js-indent-level: 2; indent-tabs-mode: nil -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+/**
+ * This lib relies on `l10n.js' to implement localizable date/time strings.
+ *
+ * The proposed `DateTimeFormat' object should provide all the features that are
+ * planned for the `Intl.DateTimeFormat' constructor, but the API does not match
+ * exactly the ES-i18n draft.
+ * - https://bugzilla.mozilla.org/show_bug.cgi?id=769872
+ * - http://wiki.ecmascript.org/doku.php?id=globalization:specification_drafts
+ *
+ * Besides, this `DateTimeFormat' object provides two features that aren't
+ * planned in the ES-i18n spec:
+ * - a `toLocaleFormat()' that really works (i.e. fully translated);
+ * - a `fromNow()' method to handle relative dates ("pretty dates").
+ *
+ * WARNING: this library relies on the non-standard `toLocaleFormat()' method,
+ * which is specific to Firefox -- no other browser is supported.
+ */
+
+navigator.mozL10n.DateTimeFormat = function(locales, options) {
+ var _ = navigator.mozL10n.get;
+
+ // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/toLocaleFormat
+ function localeFormat(d, format) {
+ var tokens = format.match(/(%E.|%O.|%.)/g);
+
+ for (var i = 0; tokens && i < tokens.length; i++) {
+ var value = '';
+
+ // http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html
+ switch (tokens[i]) {
+ // localized day/month names
+ case '%a':
+ value = _('weekday-' + d.getDay() + '-short');
+ break;
+ case '%A':
+ value = _('weekday-' + d.getDay() + '-long');
+ break;
+ case '%b':
+ case '%h':
+ value = _('month-' + d.getMonth() + '-short');
+ break;
+ case '%B':
+ value = _('month-' + d.getMonth() + '-long');
+ break;
+
+ // like %H, but in 12-hour format and without any leading zero
+ case '%I':
+ value = d.getHours() % 12 || 12;
+ break;
+
+ // like %d, without any leading zero
+ case '%e':
+ value = d.getDate();
+ break;
+
+ // localized date/time strings
+ case '%c':
+ case '%x':
+ case '%X':
+ // ensure the localized format string doesn't contain any %c|%x|%X
+ var tmp = _('dateTimeFormat_' + tokens[i]);
+ if (tmp && !(/(%c|%x|%X)/).test(tmp)) {
+ value = localeFormat(d, tmp);
+ }
+ break;
+
+ // other tokens don't require any localization
+ }
+
+ format = format.replace(tokens[i], value || d.toLocaleFormat(tokens[i]));
+ }
+
+ return format;
+ }
+
+ // variant of John Resig's PrettyDate.js
+ function prettyDate(time, useCompactFormat) {
+ switch (time.constructor) {
+ case String: // timestamp
+ time = parseInt(time);
+ break;
+ case Date:
+ time = time.getTime();
+ break;
+ }
+
+ var secDiff = (Date.now() - time) / 1000;
+ if (isNaN(secDiff)) {
+ return _('incorrectDate');
+ }
+
+ var f = useCompactFormat ? '-short' : '-long';
+
+ if (secDiff >= 0) { // past
+ var dayDiff = Math.floor(secDiff / 86400);
+ if (secDiff < 3600) {
+ return _('minutesAgo' + f, { m: Math.floor(secDiff / 60) });
+ } else if (dayDiff === 0) {
+ return _('hoursAgo' + f, { h: Math.floor(secDiff / 3600) });
+ } else if (dayDiff < 10) {
+ return _('daysAgo' + f, { d: dayDiff });
+ }
+ }
+
+ if (secDiff < 0) { // future
+ secDiff = -secDiff;
+ dayDiff = Math.floor(secDiff / 86400);
+ if (secDiff < 3600) {
+ return _('inMinutes' + f, { m: Math.floor(secDiff / 60) });
+ } else if (dayDiff === 0) {
+ return _('inHours' + f, { h: Math.floor(secDiff / 3600) });
+ } else if (dayDiff < 10) {
+ return _('inDays' + f, { d: dayDiff });
+ }
+ }
+
+ // too far: return an absolute date
+ return localeFormat(new Date(time), '%x');
+ }
+
+ // API
+ return {
+ localeDateString: function localeDateString(d) {
+ return localeFormat(d, '%x');
+ },
+ localeTimeString: function localeTimeString(d) {
+ return localeFormat(d, '%X');
+ },
+ localeString: function localeString(d) {
+ return localeFormat(d, '%c');
+ },
+ localeFormat: localeFormat,
+ fromNow: prettyDate
+ };
+};
+
diff --git a/shared/js/manifest_helper.js b/shared/js/manifest_helper.js
new file mode 100644
index 0000000..d207603
--- /dev/null
+++ b/shared/js/manifest_helper.js
@@ -0,0 +1,26 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+/**
+ * Helper object to access manifest information with locale support.
+ */
+
+var ManifestHelper = function(manifest) {
+ var localeRoot = manifest;
+ var locales = manifest.locales;
+
+ if (locales) {
+ var lang = document.documentElement.lang;
+
+ // If there is a manifest entry for the curret locale, use it, otherwise
+ // fallback on the default manifest.
+ localeRoot = locales[lang] || locales[lang.split('-')[0]] || manifest;
+ }
+
+ // Bind the localized property values.
+ for (var prop in manifest) {
+ this[prop] = localeRoot[prop] || manifest[prop];
+ }
+};
diff --git a/shared/js/media/README b/shared/js/media/README
new file mode 100644
index 0000000..05a67a0
--- /dev/null
+++ b/shared/js/media/README
@@ -0,0 +1 @@
+This directory contains files shared by the Camera, Gallery and Video apps.
diff --git a/shared/js/media/get_video_rotation.js b/shared/js/media/get_video_rotation.js
new file mode 100644
index 0000000..3359b92
--- /dev/null
+++ b/shared/js/media/get_video_rotation.js
@@ -0,0 +1,143 @@
+'use strict';
+
+//
+// Given an MP4/Quicktime based video file as a blob, read through its
+// atoms to find the track header "tkhd" atom and extract the rotation
+// matrix from it. Convert the matrix value to rotation in degrees and
+// pass that number to the specified callback function. If no value is
+// found but the video file is valid, pass null to the callback. If
+// any errors occur, pass an error message (a string) callback.
+//
+// See also:
+// http://androidxref.com/4.0.4/xref/frameworks/base/media/libstagefright/MPEG4Writer.cpp
+// https://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap2/qtff2.html
+//
+function getVideoRotation(blob, rotationCallback) {
+
+ // A utility for traversing the tree of atoms in an MP4 file
+ function MP4Parser(blob, handlers) {
+ // Start off with a 1024 chunk from the start of the blob.
+ BlobView.get(blob, 0, 1024, function(data, error) {
+ // Make sure that the blob is, in fact, some kind of MP4 file
+ if (data.getASCIIText(4, 4) !== 'ftyp') {
+ handlers.errorHandler('not an MP4 file');
+ return;
+ }
+ parseAtom(data);
+ });
+
+ // Call this with a BlobView object that includes the first 16 bytes of
+ // an atom. It doesn't matter whether the body of the atom is included.
+ function parseAtom(data) {
+ var offset = data.sliceOffset + data.viewOffset; // atom position in blob
+ var size = data.readUnsignedInt(); // atom length
+ var type = data.readASCIIText(4); // atom type
+ var contentOffset = 8; // position of content
+
+ if (size === 0) {
+ // Zero size means the rest of the file
+ size = blob.size - offset;
+ }
+ else if (size === 1) {
+ // A size of 1 means the size is in bytes 8-15
+ size = data.readUnsignedInt() * 4294967296 + data.readUnsignedInt();
+ contentOffset = 16;
+ }
+
+ var handler = handlers[type] || handlers.defaultHandler;
+ if (typeof handler === 'function') {
+ // If the handler is a function, pass that function a
+ // DataView object that contains the entire atom
+ // including size and type. Then use the return value
+ // of the function as instructions on what to do next.
+ data.getMore(data.sliceOffset + data.viewOffset, size, function(atom) {
+ // Pass the entire atom to the handler function
+ var rv = handler(atom);
+
+ // If the return value is 'done', stop parsing.
+ // Otherwise, continue with the next atom.
+ // XXX: For more general parsing we need a way to pop some
+ // stack levels. A return value that is an atom name should mean
+ // pop back up to this atom type and go on to the next atom
+ // after that.
+ if (rv !== 'done') {
+ parseAtomAt(data, offset + size);
+ }
+ });
+ }
+ else if (handler === 'children') {
+ // If the handler is this string, then assume that the atom is
+ // a container atom and do its next child atom next
+ var skip = (type === 'meta') ? 4 : 0; // special case for meta atoms
+ parseAtomAt(data, offset + contentOffset + skip);
+ }
+ else if (handler === 'skip' || !handler) {
+ // Skip the atom entirely and go on to the next one.
+ // If there is no next one, call the eofHandler or just return
+ parseAtomAt(data, offset + size);
+ }
+ else if (handler === 'done') {
+ // Stop parsing
+ return;
+ }
+ }
+
+ function parseAtomAt(data, offset) {
+ if (offset >= blob.size) {
+ if (handlers.eofHandler)
+ handlers.eofHandler();
+ return;
+ }
+ else {
+ data.getMore(offset, 8, parseAtom);
+ }
+ }
+ }
+
+ // We want to loop through the top-level atoms until we find the 'moov'
+ // atom. Then, within this atom, there are one or more 'trak' atoms.
+ // Each 'trak' should begin with a 'tkhd' atom. The tkhd atom has
+ // a transformation matrix at byte 48. The matrix is 9 32 bit integers.
+ // We'll interpret those numbers as a rotation of 0, 90, 180 or 270.
+ // If the video has more than one track, we expect all of them to have
+ // the same rotation, so we'll only look at the first 'trak' atom that
+ // we find.
+ MP4Parser(blob, {
+ errorHandler: function(msg) { rotationCallback(msg); },
+ eofHandler: function() { rotationCallback(null); },
+ defaultHandler: 'skip', // Skip all atoms other than those listed below
+ moov: 'children', // Enumerate children of the moov atom
+ trak: 'children', // Enumerate children of the trak atom
+ tkhd: function(data) { // Pass the tkhd atom to this function
+ // The matrix begins at byte 48
+ data.advance(48);
+
+ var a = data.readUnsignedInt();
+ var b = data.readUnsignedInt();
+ data.advance(4); // we don't care about this number
+ var c = data.readUnsignedInt();
+ var d = data.readUnsignedInt();
+
+ if (a === 0 && d === 0) { // 90 or 270 degrees
+ if (b === 0x00010000 && c === 0xFFFF0000)
+ rotationCallback(90);
+ else if (b === 0xFFFF0000 && c === 0x00010000)
+ rotationCallback(270);
+ else
+ rotationCallback('unexpected rotation matrix');
+ }
+ else if (b === 0 && c === 0) { // 0 or 180 degrees
+ if (a === 0x00010000 && d === 0x00010000)
+ rotationCallback(0);
+ else if (a === 0xFFFF0000 && d === 0xFFFF0000)
+ rotationCallback(180);
+ else
+ rotationCallback('unexpected rotation matrix');
+ }
+ else {
+ rotationCallback('unexpected rotation matrix');
+ }
+ return 'done';
+ }
+ });
+}
diff --git a/shared/js/media/jpeg_metadata_parser.js b/shared/js/media/jpeg_metadata_parser.js
new file mode 100644
index 0000000..d8b2b02
--- /dev/null
+++ b/shared/js/media/jpeg_metadata_parser.js
@@ -0,0 +1,314 @@
+'use strict';
+
+//
+// This file defines a single function that asynchronously reads a
+// JPEG file (or blob) to determine its width and height and find the
+// location and size of the embedded preview image, if it has one. If
+// it succeeds, it passes an object containing this data to the
+// specified callback function. If it fails, it passes an error message
+// to the specified error function instead.
+//
+// This function is capable of parsing and returning EXIF data for a
+// JPEG file, but for speed, it ignores all EXIF data except the embedded
+// preview image.
+//
+// This function requires the BlobView utility class
+//
+function parseJPEGMetadata(file, metadataCallback, metadataError) {
+ // This is the object we'll pass to metadataCallback
+ var metadata = {};
+
+ // Start off reading a 16kb slice of the JPEG file.
+ // Hopefully, this will be all we need and everything else will
+ // be synchronous
+ BlobView.get(file, 0, Math.min(16 * 1024, file.size), function(data) {
+ if (data.byteLength < 2 ||
+ data.getUint8(0) !== 0xFF ||
+ data.getUint8(1) !== 0xD8) {
+ metadataError('Not a JPEG file');
+ return;
+ }
+
+ // Now start reading JPEG segments
+ // getSegment() and segmentHandler() are defined below.
+ getSegment(data, 2, segmentHandler);
+ });
+
+ // Read the JPEG segment at the specified offset and
+ // pass it to the callback function.
+ // Offset is relative to the current data offsets.
+ // We assume that data has enough data in it that we can
+ // can determine the size of the segment, and we guarantee that
+ // we read extra bytes so the next call works
+ function getSegment(data, offset, callback) {
+ try {
+ var header = data.getUint8(offset);
+ if (header !== 0xFF) {
+ metadataError('Malformed JPEG file: bad segment header');
+ return;
+ }
+
+ var type = data.getUint8(offset + 1);
+ var size = data.getUint16(offset + 2) + 2;
+
+ // the absolute position of the segment
+ var start = data.sliceOffset + data.viewOffset + offset;
+ // If this isn't the last segment in the file, add 4 bytes
+ // so we can read the size of the next segment
+ var isLast = (start + size >= file.size);
+ var length = isLast ? size : size + 4;
+
+ data.getMore(start, length,
+ function(data) {
+ callback(type, size, data, isLast);
+ });
+ }
+ catch (e) {
+ metadataError(e.toString() + '\n' + e.stack);
+ }
+ }
+
+ // This is a callback function for getNextSegment that handles the
+ // various types of segments we expect to see in a jpeg file
+ function segmentHandler(type, size, data, isLastSegment) {
+ try {
+ switch (type) {
+ case 0xC0: // Some actual image data, including image dimensions
+ case 0xC1:
+ case 0xC2:
+ case 0xC3:
+ // Get image dimensions
+ metadata.height = data.getUint16(5);
+ metadata.width = data.getUint16(7);
+
+ // We're done. All the EXIF data will come before this segment
+ // So call the callback
+ metadataCallback(metadata);
+ break;
+
+ case 0xE1: // APP1 segment. Probably holds EXIF metadata
+ parseAPP1(data);
+ /* fallthrough */
+
+ default:
+ // A segment we don't care about, so just go on and read the next one
+ if (isLastSegment) {
+ metadataError('unexpected end of JPEG file');
+ return;
+ }
+ getSegment(data, size, segmentHandler);
+ }
+ }
+ catch (e) {
+ metadataError(e.toString() + '\n' + e.stack);
+ }
+ }
+
+ function parseAPP1(data) {
+ if (data.getUint32(4, false) === 0x45786966) { // "Exif"
+ var exif = parseEXIFData(data);
+
+ if (exif.THUMBNAIL && exif.THUMBNAILLENGTH) {
+ var start = data.sliceOffset + data.viewOffset + 10 + exif.THUMBNAIL;
+ metadata.preview = {
+ start: start,
+ end: start + exif.THUMBNAILLENGTH
+ };
+ }
+ }
+ }
+
+ // Parse an EXIF segment from a JPEG file and return an object
+ // of metadata attributes. The argument must be a DataView object
+ function parseEXIFData(data) {
+ var exif = {};
+
+ var byteorder = data.getUint8(10);
+ if (byteorder === 0x4D) { // big endian
+ byteorder = false;
+ } else if (byteorder === 0x49) { // little endian
+ byteorder = true;
+ } else {
+ throw Error('invalid byteorder in EXIF segment');
+ }
+
+ if (data.getUint16(12, byteorder) !== 42) { // magic number
+ throw Error('bad magic number in EXIF segment');
+ }
+
+ var offset = data.getUint32(14, byteorder);
+
+ /*
+ * This is how we would parse all EXIF metadata more generally.
+ * I'm leaving this code in as a comment in case we need other EXIF
+ * data in the future.
+ *
+ parseIFD(data, offset + 10, byteorder, exif);
+
+ if (exif.EXIFIFD) {
+ parseIFD(data, exif.EXIFIFD + 10, byteorder, exif);
+ delete exif.EXIFIFD;
+ }
+
+ if (exif.GPSIFD) {
+ parseIFD(data, exif.GPSIFD + 10, byteorder, exif);
+ delete exif.GPSIFD;
+ }
+ */
+
+ // Instead of a general purpose EXIF parse, we're going to drill
+ // down directly to the thumbnail image.
+ // We're in IFD0 here. We want the offset of IFD1
+ var ifd0entries = data.getUint16(offset + 10, byteorder);
+ var ifd1 = data.getUint32(offset + 12 + 12 * ifd0entries, byteorder);
+ // If there is an offset for IFD1, parse that
+ if (ifd1 !== 0)
+ parseIFD(data, ifd1 + 10, byteorder, exif, true);
+
+ return exif;
+ }
+
+ function parseIFD(data, offset, byteorder, exif, onlyParseOne) {
+ var numentries = data.getUint16(offset, byteorder);
+ for (var i = 0; i < numentries; i++) {
+ parseEntry(data, offset + 2 + 12 * i, byteorder, exif);
+ }
+
+ if (onlyParseOne)
+ return;
+
+ var next = data.getUint32(offset + 2 + 12 * numentries, byteorder);
+ if (next !== 0 && next < file.size) {
+ parseIFD(data, next + 10, byteorder, exif);
+ }
+ }
+
+ // size, in bytes, of each TIFF data type
+ var typesize = [
+ 0, // Unused
+ 1, // BYTE
+ 1, // ASCII
+ 2, // SHORT
+ 4, // LONG
+ 8, // RATIONAL
+ 1, // SBYTE
+ 1, // UNDEFINED
+ 2, // SSHORT
+ 4, // SLONG
+ 8, // SRATIONAL
+ 4, // FLOAT
+ 8 // DOUBLE
+ ];
+
+ // This object maps EXIF tag numbers to their names.
+ // Only list the ones we want to bother parsing and returning.
+ // All others will be ignored.
+ var tagnames = {
+ /*
+ * We don't currently use any of these EXIF tags for anything.
+ *
+ *
+ '256': 'ImageWidth',
+ '257': 'ImageHeight',
+ '40962': 'PixelXDimension',
+ '40963': 'PixelYDimension',
+ '306': 'DateTime',
+ '315': 'Artist',
+ '33432': 'Copyright',
+ '36867': 'DateTimeOriginal',
+ '33434': 'ExposureTime',
+ '33437': 'FNumber',
+ '34850': 'ExposureProgram',
+ '34867': 'ISOSpeed',
+ '37377': 'ShutterSpeedValue',
+ '37378': 'ApertureValue',
+ '37379': 'BrightnessValue',
+ '37380': 'ExposureBiasValue',
+ '37382': 'SubjectDistance',
+ '37383': 'MeteringMode',
+ '37384': 'LightSource',
+ '37385': 'Flash',
+ '37386': 'FocalLength',
+ '41986': 'ExposureMode',
+ '41987': 'WhiteBalance',
+ '41991': 'GainControl',
+ '41992': 'Contrast',
+ '41993': 'Saturation',
+ '41994': 'Sharpness',
+ // These are special tags that we handle internally
+ '34665': 'EXIFIFD', // Offset of EXIF data
+ '34853': 'GPSIFD', // Offset of GPS data
+ */
+ '513': 'THUMBNAIL', // Offset of thumbnail
+ '514': 'THUMBNAILLENGTH' // Length of thumbnail
+ };
+
+ function parseEntry(data, offset, byteorder, exif) {
+ var tag = data.getUint16(offset, byteorder);
+ var tagname = tagnames[tag];
+
+ if (!tagname) // If we don't know about this tag type, skip it
+ return;
+
+ var type = data.getUint16(offset + 2, byteorder);
+ var count = data.getUint32(offset + 4, byteorder);
+
+ var total = count * typesize[type];
+ var valueOffset = total <= 4 ? offset + 8 :
+ data.getUint32(offset + 8, byteorder);
+ exif[tagname] = parseValue(data, valueOffset, type, count, byteorder);
+ }
+
+ function parseValue(data, offset, type, count, byteorder) {
+ if (type === 2) { // ASCII string
+ var codes = [];
+ for (var i = 0; i < count - 1; i++) {
+ codes[i] = data.getUint8(offset + i);
+ }
+ return String.fromCharCode.apply(String, codes);
+ } else {
+ if (count == 1) {
+ return parseOneValue(data, offset, type, byteorder);
+ } else {
+ var values = [];
+ var size = typesize[type];
+ for (var i = 0; i < count; i++) {
+ values[i] = parseOneValue(data, offset + size * i, type, byteorder);
+ }
+ return values;
+ }
+ }
+ }
+
+ function parseOneValue(data, offset, type, byteorder) {
+ switch (type) {
+ case 1: // BYTE
+ case 7: // UNDEFINED
+ return data.getUint8(offset);
+ case 2: // ASCII
+ // This case is handed in parseValue
+ return null;
+ case 3: // SHORT
+ return data.getUint16(offset, byteorder);
+ case 4: // LONG
+ return data.getUint32(offset, byteorder);
+ case 5: // RATIONAL
+ return data.getUint32(offset, byteorder) /
+ data.getUint32(offset + 4, byteorder);
+ case 6: // SBYTE
+ return data.getInt8(offset);
+ case 8: // SSHORT
+ return data.getInt16(offset, byteorder);
+ case 9: // SLONG
+ return data.getInt32(offset, byteorder);
+ case 10: // SRATIONAL
+ return data.getInt32(offset, byteorder) /
+ data.getInt32(offset + 4, byteorder);
+ case 11: // FLOAT
+ return data.getFloat32(offset, byteorder);
+ case 12: // DOUBLE
+ return data.getFloat64(offset, byteorder);
+ }
+ return null;
+ }
+}
diff --git a/shared/js/media/media_frame.js b/shared/js/media/media_frame.js
new file mode 100644
index 0000000..aaf8fbe
--- /dev/null
+++ b/shared/js/media/media_frame.js
@@ -0,0 +1,537 @@
+/*
+ * media_frame.js:
+ *
+ * A MediaFrame displays a photo or a video. The gallery app uses
+ * three side by side to support smooth panning from one item to the
+ * next. The Camera app uses one for image and video preview. The
+ * Gallery app's open activity uses one of these to display the opened
+ * item.
+ *
+ * MediaFrames have different behavior depending on whether they display
+ * images or videos. Photo frames allow the user to zoom and pan on the photo.
+ * Video frames allow the user to play and pause but don't allow zooming.
+ *
+ * When a frame is displaying a video, it handles mouse events.
+ * When display a picture, however, it expects the client to handle events
+ * and call the pan() and zoom() methods.
+ *
+ * The pan() method is a little unusual. It "uses" as much of the pan
+ * event as it can, and returns a number indicating how much of the
+ * horizontal motion it did not use. The gallery uses this returned
+ * value for transitioning between frames. If a frame displays a
+ * photo that is not zoomed in at all, then it can't use any of the
+ * pan, and returns the full amount which the gallery app turns into a
+ * panning motion between frames. But if the photo is zoomed in, then
+ * the MediaFrame will just move the photo within itself, if it can, and
+ * return 0.
+ *
+ * Much of the code in this file used to be part of the PhotoState class.
+ */
+function MediaFrame(container, includeVideo) {
+ if (typeof container === 'string')
+ container = document.getElementById(container);
+ this.container = container;
+ this.image = document.createElement('img');
+ this.container.appendChild(this.image);
+ this.image.style.display = 'none';
+ if (includeVideo !== false) {
+ this.video = new VideoPlayer(container);
+ this.video.hide();
+ }
+ this.displayingVideo = false;
+ this.displayingImage = false;
+ this.blob = null;
+ this.url = null;
+}
+
+MediaFrame.prototype.displayImage = function displayImage(blob, width, height,
+ preview)
+{
+ this.clear(); // Reset everything
+
+ // Remember what we're displaying
+ this.blob = blob;
+ this.fullsizeWidth = width;
+ this.fullsizeHeight = height;
+ this.preview = preview;
+
+ // Keep track of what kind of content we have
+ this.displayingImage = true;
+
+ // Make the image element visible
+ this.image.style.display = 'block';
+
+ // If the preview is at least as big as the screen, display that.
+ // Otherwise, display the full-size image.
+ if (preview &&
+ (preview.width >= window.innerWidth ||
+ preview.height >= window.innerHeight)) {
+ this.displayingPreview = true;
+ this._displayImage(blob.slice(preview.start, preview.end, 'image/jpeg'),
+ preview.width, preview.height);
+ }
+ else {
+ this._displayImage(blob, width, height);
+ }
+};
+
+// A utility function we use to display the full-size image or the
+// preview The last two arguments are optimizations used by
+// switchToFullSizeImage() to make the transition from preview to
+// fullscreen smooth. If waitForPaint is true, then this function will
+// keep the old image on the screen until the new image is painted
+// over it so we (hopefully) don't end up with a blank screen or
+// flash. And if callback is specified, it will call the callback
+// when thew new images is visible on the screen. If either of those
+// arguments are specified, the width and height must be specified.
+MediaFrame.prototype._displayImage = function _displayImage(blob, width, height,
+ waitForPaint,
+ callback)
+{
+ var self = this;
+ var oldImage;
+
+ // Create a URL for the blob (or preview blob)
+ if (this.url)
+ URL.revokeObjectURL(this.url);
+ this.url = URL.createObjectURL(blob);
+
+ // If we don't know the width or the height yet, then set up an event
+ // handler to set the image size and position once it is loaded.
+ // This happens for the open activity.
+ if (!width || !height) {
+ this.image.src = this.url;
+ this.image.addEventListener('load', function onload() {
+ this.removeEventListener('load', onload);
+ self.itemWidth = this.naturalWidth;
+ self.itemHeight = this.naturalHeight;
+ self.computeFit();
+ self.setPosition();
+ });
+ return;
+ }
+
+ // Otherwise, we have a width and height, and we may also have to handle
+ // the waitForPaint and callback arguments
+
+ // If waitForPaint is set, then keep the old image around and displayed
+ // until the new image is loaded.
+ if (waitForPaint) {
+ // Remember the old image
+ oldImage = this.image;
+
+ // Create a new element to load the new image into.
+ // Insert it into the frame, but don't remove the old image yet
+ this.image = document.createElement('img');
+ this.container.appendChild(this.image);
+
+ // Change the old image slightly to give the user some immediate
+ // feedback that something is happening
+ oldImage.classList.add('swapping');
+ }
+
+ // Start loading the new image
+ this.image.src = this.url;
+ // Update image size and position
+ this.itemWidth = width;
+ this.itemHeight = height;
+ this.computeFit();
+ this.setPosition();
+
+ // If waitForPaint is set, or if there is a callback, then we need to
+ // run some code when the new image has loaded and been painted.
+ if (waitForPaint || callback) {
+ whenLoadedAndVisible(this.image, 1000, function() {
+ if (waitForPaint) {
+ // Remove the old image now that the new one is visible
+ self.container.removeChild(oldImage);
+ oldImage.src = null;
+ }
+
+ if (callback) {
+ // Let the caller know that the new image is ready, but
+ // wait for an animation frame before doing it. The point of
+ // using mozRequestAnimationFrame here is that it gives the
+ // removeChild() call above a chance to take effect.
+ mozRequestAnimationFrame(function() {
+ callback();
+ });
+ }
+ });
+ }
+
+ // Wait until the load event on the image fires, and then wait for a
+ // MozAfterPaint event after that, and then, finally, invoke the
+ // callback. Don't wait more than the timeout, though: we need to
+ // ensure that we always call the callback even if the image does not
+ // load or if we don't get a MozAfterPaint event.
+ function whenLoadedAndVisible(image, timeout, callback) {
+ var called = false;
+ var timer = setTimeout(function()
+ {
+ called = true;
+ callback();
+ },
+ timeout || 1000);
+
+ image.addEventListener('load', function onload() {
+ image.removeEventListener('load', onload);
+ window.addEventListener('MozAfterPaint', function onpaint() {
+ window.removeEventListener('MozAfterPaint', onpaint);
+ clearTimeout(timer);
+ if (!called) {
+ callback();
+ }
+ });
+ });
+ }
+};
+
+MediaFrame.prototype._switchToFullSizeImage = function _switchToFull(cb) {
+ if (this.displayingImage && this.displayingPreview) {
+ this.displayingPreview = false;
+ this._displayImage(this.blob, this.fullsizeWidth, this.fullsizeHeight,
+ true, cb);
+ }
+};
+
+MediaFrame.prototype._switchToPreviewImage = function _switchToPreview() {
+ if (this.displayingImage && !this.displayingPreview) {
+ this.displayingPreview = true;
+ this._displayImage(this.blob.slice(this.preview.start,
+ this.preview.end,
+ 'image/jpeg'),
+ this.preview.width,
+ this.preview.height);
+ }
+};
+
+MediaFrame.prototype.displayVideo = function displayVideo(blob, width, height,
+ rotation)
+{
+ if (!this.video)
+ return;
+
+ this.clear(); // reset everything
+
+ // Keep track of what kind of content we have
+ this.displayingVideo = true;
+
+ // Show the video player and hide the image
+ this.video.show();
+
+ // Remember the blob
+ this.blob = blob;
+
+ // Get a new URL for this blob
+ this.url = URL.createObjectURL(blob);
+
+ // Display it in the video element.
+ // The VideoPlayer class takes care of positioning itself, so we
+ // don't have to do anything here with computeFit() or setPosition()
+ this.video.load(this.url, rotation || 0);
+};
+
+// Reset the frame state, release any urls and and hide everything
+MediaFrame.prototype.clear = function clear() {
+ // Reset the saved state
+ this.displayingImage = false;
+ this.displayingPreview = false;
+ this.displayingVideo = false;
+ this.itemWidth = this.itemHeight = null;
+ this.blob = null;
+ this.fullsizeWidth = this.fullsizeHeight = null;
+ this.preview = null;
+ this.fit = null;
+ if (this.url) {
+ URL.revokeObjectURL(this.url);
+ this.url = null;
+ }
+
+ // Hide the image
+ this.image.style.display = 'none';
+ this.image.src = null; // XXX: use about:blank or '' here?
+
+ // Hide the video player
+ if (this.video) {
+ this.video.hide();
+
+ // If the video player has its src set, clear it and release resources
+ // We do this in a roundabout way to avoid getting a warning in the console
+ if (this.video.player.src) {
+ this.video.player.removeAttribute('src');
+ this.video.player.load();
+ }
+ }
+};
+
+// Set the item's position based on this.fit
+// The VideoPlayer object fits itself to its container, and it
+// can't be zoomed or panned, so we only need to do this for images
+MediaFrame.prototype.setPosition = function setPosition() {
+ if (!this.fit || !this.displayingImage)
+ return;
+
+ this.image.style.transform =
+ 'translate(' + this.fit.left + 'px,' + this.fit.top + 'px) ' +
+ 'scale(' + this.fit.scale + ')';
+};
+
+MediaFrame.prototype.computeFit = function computeFit() {
+ if (!this.displayingImage)
+ return;
+ this.viewportWidth = this.container.offsetWidth;
+ this.viewportHeight = this.container.offsetHeight;
+
+ var scalex = this.viewportWidth / this.itemWidth;
+ var scaley = this.viewportHeight / this.itemHeight;
+ var scale = Math.min(Math.min(scalex, scaley), 1);
+
+ // Set the image size and position
+ var width = Math.floor(this.itemWidth * scale);
+ var height = Math.floor(this.itemHeight * scale);
+
+ this.fit = {
+ width: width,
+ height: height,
+ left: Math.floor((this.viewportWidth - width) / 2),
+ top: Math.floor((this.viewportHeight - height) / 2),
+ scale: scale,
+ baseScale: scale
+ };
+};
+
+MediaFrame.prototype.reset = function reset() {
+ // If we're not displaying the preview image, but we have one,
+ // and it is the right size, then switch to it
+ if (this.displayingImage && !this.displayingPreview && this.preview &&
+ (this.preview.width >= window.innerWidth ||
+ this.preview.height >= window.innerHeight)) {
+ this._switchToPreviewImage(); // resets image size and position
+ return;
+ }
+
+ // Otherwise, if we are displaying the preview image but it is no
+ // longer big enough for the screen (such as after a resize event)
+ // then switch to full size. This case should be rare.
+ if (this.displayingImage && this.displayingPreview &&
+ this.preview.width < window.innerWidth &&
+ this.preview.height < window.innerHeight) {
+ this._switchToFullSizeImage(); // resets image size and position
+ return;
+ }
+
+ // Otherwise, just resize and position the item we're already displaying
+ this.computeFit();
+ this.setPosition();
+};
+
+// We call this from the resize handler when the user rotates the
+// screen or when going into or out of fullscreen mode. If the user
+// has not zoomed in, then we just fit the image to the new size (same
+// as reset). But if the user has zoomed in (and we need to stay
+// zoomed for the new size) then we adjust the fit properties so that
+// the pixel that was at the center of the screen before remains at
+// the center now, or as close as possible
+MediaFrame.prototype.resize = function resize() {
+ var oldWidth = this.viewportWidth;
+ var oldHeight = this.viewportHeight;
+ var newWidth = this.container.offsetWidth;
+ var newHeight = this.container.offsetHeight;
+
+ var oldfit = this.fit; // The current image fit
+
+ // If this is triggered by a resize event before the frame has computed
+ // its size, then there is nothing we can do yet.
+ if (!oldfit)
+ return;
+
+ // Compute the new fit.
+ // This updates the the viewportWidth, viewportHeight and fit properties
+ this.computeFit();
+
+ // This is how the image would fit at the new screen size
+ var newfit = this.fit;
+
+ // If no zooming has been done, then a resize is just a reset.
+ // The same is true if the new fit base scale is greater than the
+ // old scale.
+ if (oldfit.scale === oldfit.baseScale || newfit.baseScale > oldfit.scale) {
+ this.reset();
+ return;
+ }
+
+ // Otherwise, just adjust the old fit as needed and use that so we
+ // retain the zoom factor.
+ oldfit.left += (newWidth - oldWidth) / 2;
+ oldfit.top += (newHeight - oldHeight) / 2;
+ oldfit.baseScale = newfit.baseScale;
+ this.fit = oldfit;
+
+ // Reposition this image without resetting the zoom
+ this.setPosition();
+};
+
+// Zoom in by the specified factor, adjusting the pan amount so that
+// the image pixels at (centerX, centerY) remain at that position.
+// Assume that zoom gestures can't be done in the middle of swipes, so
+// if we're calling zoom, then the swipe property will be 0.
+// If time is specified and non-zero, then we set a CSS transition
+// to animate the zoom.
+MediaFrame.prototype.zoom = function zoom(scale, centerX, centerY, time) {
+ // Ignore zooms if we're not displaying an image
+ if (!this.displayingImage)
+ return;
+
+ // If we were displaying the preview, switch to the full-size image
+ if (this.displayingPreview) {
+ // If we want to to animate the zoom, then switch images, wait
+ // for the new one to load, and call this function again to process
+ // the zoom and animation. But if we're not animating, then just
+ // switch images and continue.
+ if (time) { // if animating
+ var self = this;
+ this._switchToFullSizeImage(function() {
+ self.zoom(scale, centerX, centerY, time);
+ });
+ return;
+ }
+ else {
+ this.switching = true;
+ var self = this;
+ this._switchToFullSizeImage(function() { self.switching = false; });
+ }
+ }
+
+ // Never zoom in farther than the native resolution of the image
+ if (this.fit.scale * scale > 1) {
+ scale = 1 / (this.fit.scale);
+ }
+ // And never zoom out to make the image smaller than it would normally be
+ else if (this.fit.scale * scale < this.fit.baseScale) {
+ scale = this.fit.baseScale / this.fit.scale;
+ }
+
+ this.fit.scale = this.fit.scale * scale;
+
+ // Change the size of the photo
+ this.fit.width = Math.floor(this.itemWidth * this.fit.scale);
+ this.fit.height = Math.floor(this.itemHeight * this.fit.scale);
+
+ // centerX and centerY are in viewport coordinates.
+ // These are the photo coordinates displayed at that point in the viewport
+ var photoX = centerX - this.fit.left;
+ var photoY = centerY - this.fit.top;
+
+ // After zooming, these are the new photo coordinates.
+ // Note we just use the relative scale amount here, not this.fit.scale
+ var photoX = Math.floor(photoX * scale);
+ var photoY = Math.floor(photoY * scale);
+
+ // To keep that point still, here are the new left and top values we need
+ this.fit.left = centerX - photoX;
+ this.fit.top = centerY - photoY;
+
+ // Now make sure we didn't pan too much: If the image fits on the
+ // screen, center it. If the image is bigger than the screen, then
+ // make sure we haven't gone past any edges
+ if (this.fit.width <= this.viewportWidth) {
+ this.fit.left = (this.viewportWidth - this.fit.width) / 2;
+ }
+ else {
+ // Don't let the left of the photo be past the left edge of the screen
+ if (this.fit.left > 0)
+ this.fit.left = 0;
+
+ // Right of photo shouldn't be to the left of the right edge
+ if (this.fit.left + this.fit.width < this.viewportWidth) {
+ this.fit.left = this.viewportWidth - this.fit.width;
+ }
+ }
+
+ if (this.fit.height <= this.viewportHeight) {
+ this.fit.top = (this.viewportHeight - this.fit.height) / 2;
+ }
+ else {
+ // Don't let the top of the photo be below the top of the screen
+ if (this.fit.top > 0)
+ this.fit.top = 0;
+
+ // bottom of photo shouldn't be above the bottom of screen
+ if (this.fit.top + this.fit.height < this.viewportHeight) {
+ this.fit.top = this.viewportHeight - this.fit.height;
+ }
+ }
+
+ if (this.switching)
+ return;
+
+ // If a time was specified, set up a transition so that the
+ // call to setPosition() below is animated
+ if (time) {
+ // If a time was specfied, animate the transformation
+ this.image.style.transition = 'transform ' + time + 'ms ease';
+ var self = this;
+ this.image.addEventListener('transitionend', function done(e) {
+ self.image.removeEventListener('transitionend', done);
+ self.image.style.transition = null;
+ });
+ }
+
+ this.setPosition();
+};
+
+// If the item being displayed is larger than the continer, pan it by
+// the specified amounts. Return the "unused" dx amount for the gallery app
+// to use for sideways swiping
+MediaFrame.prototype.pan = function(dx, dy) {
+ // We can only pan images, so return the entire dx amount
+ if (!this.displayingImage) {
+ return dx;
+ }
+
+ // Handle panning in the y direction first, since it is easier.
+ // Don't pan in the y direction if we already fit on the screen
+ if (this.fit.height > this.viewportHeight) {
+ this.fit.top += dy;
+
+ // Don't let the top of the photo be below the top of the screen
+ if (this.fit.top > 0)
+ this.fit.top = 0;
+
+ // bottom of photo shouldn't be above the bottom of screen
+ if (this.fit.top + this.fit.height < this.viewportHeight)
+ this.fit.top = this.viewportHeight - this.fit.height;
+ }
+
+ // Now handle the X dimension. If we've already panned as far as we can
+ // within the image (or if it isn't zoomed in) then return the "extra"
+ // unused dx amount to the caller so that the caller can use them to
+ // shift the frame left or right.
+ var extra = 0;
+
+ if (this.fit.width <= this.viewportWidth) {
+ // In this case, the photo isn't zoomed in, so it is all extra
+ extra = dx;
+ }
+ else {
+ this.fit.left += dx;
+
+ // If this would take the left edge of the photo past the
+ // left edge of the screen, then some of the motion is extra
+ if (this.fit.left > 0) {
+ extra = this.fit.left;
+ this.fit.left = 0;
+ }
+
+ // Or, if this would take the right edge of the photo past the
+ // right edge of the screen, then we've got extra.
+ if (this.fit.left + this.fit.width < this.viewportWidth) {
+ extra = this.fit.left + this.fit.width - this.viewportWidth;
+ this.fit.left = this.viewportWidth - this.fit.width;
+ }
+ }
+
+ this.setPosition();
+ return extra;
+};
diff --git a/shared/js/media/video_player.js b/shared/js/media/video_player.js
new file mode 100644
index 0000000..c79bb8b
--- /dev/null
+++ b/shared/js/media/video_player.js
@@ -0,0 +1,313 @@
+'use strict';
+
+// Create a <video> element and <div> containing a video player UI and
+// add them to the specified container. The UI requires a GestureDetector
+// to be running for the container or one of its ancestors.
+function VideoPlayer(container) {
+ if (typeof container === 'string')
+ container = document.getElementById(container);
+
+ function newelt(parent, type, classes) {
+ var e = document.createElement(type);
+ if (classes)
+ e.className = classes;
+ parent.appendChild(e);
+ return e;
+ }
+
+ // This copies the controls structure of the Video app
+ var player = newelt(container, 'video', 'videoPlayer');
+ var controls = newelt(container, 'div', 'videoPlayerControls');
+ var playbutton = newelt(controls, 'button', 'videoPlayerPlayButton');
+ var footer = newelt(controls, 'div', 'videoPlayerFooter hidden');
+ var pausebutton = newelt(footer, 'button', 'videoPlayerPauseButton');
+ var slider = newelt(footer, 'div', 'videoPlayerSlider');
+ var elapsedText = newelt(slider, 'span', 'videoPlayerElapsedText');
+ var progress = newelt(slider, 'div', 'videoPlayerProgress');
+ var backgroundBar = newelt(progress, 'div', 'videoPlayerBackgroundBar');
+ var elapsedBar = newelt(progress, 'div', 'videoPlayerElapsedBar');
+ var playHead = newelt(progress, 'div', 'videoPlayerPlayHead');
+ var durationText = newelt(slider, 'span', 'videoPlayerDurationText');
+
+ this.player = player;
+ this.controls = controls;
+
+ player.preload = 'metadata';
+
+ var self = this;
+ var controlsHidden = false;
+ var dragging = false;
+ var pausedBeforeDragging = false;
+ var screenLock; // keep the screen on when playing
+ var endedTimer;
+ var rotation; // Do we have to rotate the video? Set by load()
+
+ this.load = function(url, rotate) {
+ rotation = rotate || 0;
+ player.mozAudioChannelType = 'content';
+ player.src = url;
+ };
+
+ // Call this when the container size changes
+ this.setPlayerSize = setPlayerSize;
+
+ // Set up everything for the initial paused state
+ this.pause = function pause() {
+ // Pause video playback
+ player.pause();
+
+ // Hide the pause button and slider
+ footer.classList.add('hidden');
+ controlsHidden = true;
+
+ // Show the big central play button
+ playbutton.classList.remove('hidden');
+
+ // Unlock the screen so it can sleep on idle
+ if (screenLock) {
+ screenLock.unlock();
+ screenLock = null;
+ }
+
+ if (this.onpaused)
+ this.onpaused();
+ };
+
+ // Set up the playing state
+ this.play = function play() {
+ // If we're at the end of the video, restart at the beginning.
+ // This seems to happen automatically when an 'ended' event was fired.
+ // But some media types don't generate the ended event and don't
+ // automatically go back to the start.
+ if (player.currentTime >= player.duration - 0.5)
+ player.currentTime = 0;
+
+ // Start playing the video
+ player.play();
+
+ // Hide the play button
+ playbutton.classList.add('hidden');
+
+ // Show the controls
+ footer.classList.remove('hidden');
+ controlsHidden = false;
+
+ // Don't let the screen go to sleep
+ if (!screenLock)
+ screenLock = navigator.requestWakeLock('screen');
+
+ if (this.onplaying)
+ this.onplaying();
+ };
+
+ // Hook up the play button
+ playbutton.addEventListener('tap', function(e) {
+ // If we're paused, go to the play state
+ if (player.paused) {
+ self.play();
+ }
+ e.stopPropagation();
+ });
+
+ // Hook up the pause button
+ pausebutton.addEventListener('tap', function(e) {
+ self.pause();
+ e.stopPropagation();
+ });
+
+ // A click anywhere else on the screen should toggle the footer
+ // But only when the video is playing.
+ controls.addEventListener('tap', function(e) {
+ if (e.target === controls && !player.paused) {
+ footer.classList.toggle('hidden');
+ controlsHidden = !controlsHidden;
+ }
+ });
+
+ // Set the video size and duration when we get metadata
+ player.onloadedmetadata = function() {
+ durationText.textContent = formatTime(player.duration);
+ setPlayerSize();
+ // start off in the paused state
+ self.pause();
+ };
+
+ // Also resize the player on a resize event
+ // (when the user rotates the phone)
+ window.addEventListener('resize', function() {
+ setPlayerSize();
+ });
+
+ // If we reach the end of a video, reset to beginning
+ // This isn't always reliable, so we also set a timer in updateTime()
+ player.onended = ended;
+
+ function ended() {
+ if (dragging)
+ return;
+ if (endedTimer) {
+ clearTimeout(endedTimer);
+ endedTimer = null;
+ }
+ self.pause();
+ };
+
+ // Update the slider and elapsed time as the video plays
+ player.ontimeupdate = updateTime;
+
+ // Set the elapsed time and slider position
+ function updateTime() {
+ if (!controlsHidden) {
+ elapsedText.textContent = formatTime(player.currentTime);
+
+ // We can't update a progress bar if we don't know how long
+ // the video is. It is kind of a bug that the <video> element
+ // can't figure this out for ogv videos.
+ if (player.duration === Infinity || player.duration === 0)
+ return;
+
+ var percent = (player.currentTime / player.duration) * 100 + '%';
+ elapsedBar.style.width = percent;
+ playHead.style.left = percent;
+ }
+
+ // Since we don't always get reliable 'ended' events, see if
+ // we've reached the end this way.
+ // See: https://bugzilla.mozilla.org/show_bug.cgi?id=783512
+ // If we're within 1 second of the end of the video, register
+ // a timeout a half a second after we'd expect an ended event.
+ if (!endedTimer) {
+ if (!dragging && player.currentTime >= player.duration - 1) {
+ var timeUntilEnd = (player.duration - player.currentTime + .5);
+ endedTimer = setTimeout(ended, timeUntilEnd * 1000);
+ }
+ }
+ else if (dragging && player.currentTime < player.duration - 1) {
+ // If there is a timer set and we drag away from the end, cancel the timer
+ clearTimeout(endedTimer);
+ endedTimer = null;
+ }
+ }
+
+ // Make the video fit the container
+ function setPlayerSize() {
+ var containerWidth = container.clientWidth;
+ var containerHeight = container.clientHeight;
+
+ // Don't do anything if we don't know our size.
+ // This could happen if we get a resize event before our metadata loads
+ if (!player.videoWidth || !player.videoHeight)
+ return;
+
+ var width, height; // The size the video will appear, after rotation
+ switch (rotation) {
+ case 0:
+ case 180:
+ width = player.videoWidth;
+ height = player.videoHeight;
+ break;
+ case 90:
+ case 270:
+ width = player.videoHeight;
+ height = player.videoWidth;
+ }
+
+ var xscale = containerWidth / width;
+ var yscale = containerHeight / height;
+ var scale = Math.min(xscale, yscale);
+
+ // Scale large videos down, and scale small videos up.
+ // This might reduce image quality for small videos.
+ width *= scale;
+ height *= scale;
+
+ var left = ((containerWidth - width) / 2);
+ var top = ((containerHeight - height) / 2);
+
+ var transform;
+ switch (rotation) {
+ case 0:
+ transform = 'translate(' + left + 'px,' + top + 'px)';
+ break;
+ case 90:
+ transform =
+ 'translate(' + (left + width) + 'px,' + top + 'px) ' +
+ 'rotate(90deg)';
+ break;
+ case 180:
+ transform =
+ 'translate(' + (left + width) + 'px,' + (top + height) + 'px) ' +
+ 'rotate(180deg)';
+ break;
+ case 270:
+ transform =
+ 'translate(' + left + 'px,' + (top + height) + 'px) ' +
+ 'rotate(270deg)';
+ break;
+ }
+
+ transform += ' scale(' + scale + ')';
+
+ player.style.transform = transform;
+ }
+
+ // handle drags on the time slider
+ slider.addEventListener('pan', function pan(e) {
+ e.stopPropagation();
+ // We can't do anything if we don't know our duration
+ if (player.duration === Infinity)
+ return;
+
+ if (!dragging) { // Do this stuff on the first pan event only
+ dragging = true;
+ pausedBeforeDragging = player.paused;
+ if (!pausedBeforeDragging) {
+ player.pause();
+ }
+ }
+
+ var rect = backgroundBar.getBoundingClientRect();
+ var position = (e.detail.position.clientX - rect.left) / rect.width;
+ var pos = Math.min(Math.max(position, 0), 1);
+ player.currentTime = player.duration * pos;
+ updateTime();
+ });
+
+ slider.addEventListener('swipe', function swipe(e) {
+ e.stopPropagation();
+ dragging = false;
+ if (player.currentTime >= player.duration) {
+ self.pause();
+ } else if (!pausedBeforeDragging) {
+ player.play();
+ }
+ });
+
+ function formatTime(time) {
+ function padLeft(num, length) {
+ var r = String(num);
+ while (r.length < length) {
+ r = '0' + r;
+ }
+ return r;
+ }
+
+ time = Math.round(time);
+ var minutes = Math.floor(time / 60);
+ var seconds = time % 60;
+ if (minutes < 60) {
+ return padLeft(minutes, 2) + ':' + padLeft(seconds, 2);
+ }
+ return '';
+ }
+}
+
+VideoPlayer.prototype.hide = function() {
+ this.player.style.display = 'none';
+ this.controls.style.display = 'none';
+};
+
+VideoPlayer.prototype.show = function() {
+ this.player.style.display = 'block';
+ this.controls.style.display = 'block';
+};
diff --git a/shared/js/mediadb.js b/shared/js/mediadb.js
new file mode 100644
index 0000000..cfdab33
--- /dev/null
+++ b/shared/js/mediadb.js
@@ -0,0 +1,1532 @@
+/* -*- Mode: js; js-indent-level: 2; indent-tabs-mode: nil -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+/**
+ * MediaDB.js: a simple interface to DeviceStorage and IndexedDB that serves
+ * as a model of the filesystem and provides easy access to the
+ * user's media files and their metadata.
+ *
+ * Gaia's media apps (Gallery, Music, Videos) read media files from the phone
+ * using the DeviceStorage API. They need to keep track of the complete list of
+ * media files, as well as the metadata (image thumbnails, song titles, etc.)
+ * they have extracted from those files. It would be much too slow to scan the
+ * filesystem and read all the metadata from all files each time the apps starts
+ * up, so the apps need to store the list of files and metadata in an IndexedDB
+ * database. This library integrates both DeviceStorage and IndexedDB into a
+ * single API. It keeps the database in sync with the filesystem and provides
+ * notifications when files are added or deleted.
+ *
+ * CONSTRUCTOR
+ *
+ * Create a MediaDB object with the MediaDB() constructor. It takes three
+ * arguments:
+ *
+ * mediaType:
+ * one of the DeviceStorage media types: "pictures", "movies" or "music".
+ *
+ * metadataParser:
+ * your metadata parser function. This function should expect three
+ * arguments. It will be called with a file to parse and two callback
+ * functions. It should read metadata from the file and then pass an object
+ * of metadata to the first callback. If parsing fails it should pass an
+ * Error object or error message to the second callback. If you omit this
+ * argument or pass null, a dummy parser that invokes the callback with an
+ * empty object will be used instead.
+ *
+ * options:
+ * An optional object containing additional MediaDB options.
+ * Supported options are:
+ *
+ * directory:
+ * a subdirectory of the DeviceStorage directory. If you are only
+ * interested in images in the screenshots/ subdirectory for example,
+ * you can set this property to "screenshots/".
+ *
+ * mimeTypes:
+ * an array of MIME types that specifies the kind of files you are
+ * interested in and that your metadata parser function knows how to
+ * handle. DeviceStorage infers MIME type from filename extension and
+ * filters the files it returns based on their extension. Use this
+ * property if you want to restrict the set of mime types further.
+ *
+ * indexes:
+ * an array of IndexedDB key path specifications that specify which
+ * properties of each media record should be indexed. If you want to
+ * search or sort on anything other than the file name and date you
+ * should set this property. "size", and "type" are valid keypaths as
+ * is "metadata.x" where x is any metadata property returned by your
+ * metadata parser.
+ *
+ * version:
+ * The version of your IndexedDB database. The default value is 1
+ * Setting it to a larger value will delete all data in the database
+ * and rebuild it from scratch. If you ever change your metadata parser
+ * function or alter the array of indexes.
+ *
+ * autoscan:
+ * Whether MediaDB should automatically scan every time it becomes
+ * ready. The default is true. If you set this to false you are
+ * responsible for calling scan() in response to the 'ready' event.
+ *
+ * batchHoldTime:
+ * How long (in ms) to wait after finding a new file during a scan
+ * before reporting it. Longer hold times allow more batching of
+ * changes. The default is 100ms.
+ *
+ * batchSize:
+ * When batching changes, don't allow the batches to exceed this
+ * amount. The default is 0 which means no maximum batch size.
+ *
+ * MediaDB STATE
+ *
+ * A MediaDB object must asynchronously open a connection to its database, and
+ * asynchronously check on the availability of device storage, which means that
+ * it is not ready for use when first created. After calling the MediaDB()
+ * constructor, register an event listener for 'ready' events with
+ * addEventListener() or by setting the onready property. You must not use
+ * the MediaDB object until the ready event has been delivered or until
+ * the state property is set to MediaDB.READY.
+ *
+ * The DeviceStorage API is not always available, and MediaDB is not usable if
+ * DeviceStorage is not usable. If the user removes the SD card from their
+ * phone, then DeviceStorage will not be able to read or write files,
+ * obviously. Also, when a USB Mass Storage session is in progress,
+ * DeviceStorage is not available either. If DeviceStorage is not available
+ * when a MediaDB object is created, an 'unavailable' event will be fired
+ * instead of a 'ready' event. Subsequently, a 'ready' event will be fired
+ * whenever DeviceStorage becomes available, and 'unavailable' will be fired
+ * whenever DeviceStorage becomes unavailable. Media apps can handle the
+ * unavailable case by displaying an informative message in an overlay that
+ * prevents all user interaction with the app.
+ *
+ * The 'ready' and 'unavailable' events signal changes to the state of a
+ * MediaDB object. The state is also available in the state property of the
+ * object. The possible values of this property are the following:
+ *
+ * Value Constant Meaning
+ * ----------------------------------------------------------------------
+ * 'opening' MediaDB.OPENING MediaDB is initializing itself
+ * 'ready' MediaDB.READY MediaDB is available and ready for use
+ * 'nocard' MediaDB.NOCARD Unavailable because there is no sd card
+ * 'unmounted' MediaDB.UNMOUNTED Unavailable because the card is unmounted
+ * 'closed' MediaDB.CLOSED Unavailable because close() was called
+ *
+ * When an 'unavailable' event is fired, the detail property of the event
+ * object specifies the reason that the MediaDB is unavailable. It is one of
+ * the state values 'nocard', 'unmounted' or 'closed'.
+ *
+ * The 'nocard' state occurs when device storage is not available because
+ * there is no SD card in the device. This is typically a permanent failure
+ * state, and media apps cannot run without an SD card. It can occur
+ * transiently, however, if the user is swapping SD cards while a media app is
+ * open.
+ *
+ * The 'unmounted' state occurs when the device's SD card is unmounted. This
+ * is generally a temporary condition that occurs when the user starts a USB
+ * Mass Storage transfer session by plugging their device into a computer. In
+ * this case, MediaDB will become available again as soon as the device is
+ * unplugged (it may have different files on it, though: see the SCANNING
+ * section below).
+ *
+ * DATABASE RECORDS
+ *
+ * MediaDB stores a record in its IndexedDB database for each DeviceStorage
+ * file of the appropriate media type, directory and mime type. The records
+ * are objects of this form:
+ *
+ * {
+ * name: // the filename (relative to the DeviceStorage root)
+ * type: // the file MIME type (extension-based, from DeviceStorage)
+ * size: // the file size in bytes
+ * date: // file modification time (as ms since the epoch)
+ * metadata: // whatever object the metadata parser returned
+ * }
+ *
+ * Note that the database records do not include the file itself, but only its
+ * name. Use the getFile() method to get a File object (a Blob) by name.
+ *
+ * ENUMERATING FILES
+ *
+ * Typically, the first thing an app will do with a MediaDB object after the
+ * ready event is triggered is call the enumerate() method to obtain the list
+ * of files that MediaDB already knows about from previous app invocations.
+ * enumerate() gets records from the database and passes them to the specified
+ * callback. Each record that is passed to the callback is an object in the
+ * form shown above.
+ *
+ * If you pass only a callback to enumerate(), it calls the callback once for
+ * each entry in the database and then calls the callback with an argument of
+ * null to indicate that it is done.
+ *
+ * By default, entries are returned in alphabetical order by filename and all
+ * entries in the database are returned. You can specify other arguments to
+ * enumerate() to change the set of entries that are returned and the order that
+ * they are enumerated in. The full set of arguments are:
+ *
+ * key:
+ * A keypath specification that specifies what field to sort on. If you
+ * specify this argument, it must be 'name', 'date', or one of the values
+ * in the options.indexes array passed to the MediaDB() constructor. This
+ * argument is optional. If omitted, the default is to use the file name
+ * as the key.
+ *
+ * range:
+ * An IDBKeyRange object that optionally specifies upper and lower bounds on
+ * the specified key. This argument is optional. If omitted, all entries in
+ * the database are enumerated. See IndexedDB documentation for more on
+ * key ranges.
+ *
+ * direction:
+ * One of the IndexedDB direction string "next", "nextunique", "prev" or
+ * "prevunique". This argument is optional. If omitted, the default is
+ * "next", which enumerates entries in ascending order.
+ *
+ * callback:
+ * The function that database entries should be passed to. This argument is
+ * not optional, and is always passed as the last argument to enumerate().
+ *
+ * The enumerate() method returns database entries. These include file names,
+ * but not the files themselves. enumerate() interacts solely with the
+ * IndexedDB; it does not use DeviceStorage. If you want to use a media file
+ * (to play a song or display a photo, for example) call the getFile() method.
+ *
+ * enumerate() returns an object with a 'state' property that starts out as
+ * 'enumerating' and switches to 'complete' when the enumeration is done. You
+ * can cancel a pending enumeration by passing this object to the
+ * cancelEnumeration() method. This switches the state to 'cancelling' and then
+ * it switches to 'cancelled' when the cancellation is complete. If you call
+ * cancelEnumeration(), the callback function you passed to enumerate() is
+ * guaranteed not to be called again.
+ *
+ * In addition to enumerate(), there are two other methods you can use
+ * to enumerate database entries:
+ *
+ * enumerateAll() takes the same arguments and returns the same values
+ * as enumerate(), but it batches the results and passes them in an
+ * array to the callback function.
+ *
+ * getAll() takes a callback argument and passes it an array of all
+ * entries in the database, sorted by filename. It does not allow you
+ * to specify a key, range, or direction, but if you need all entries
+ * from the database, this method is is much faster than enumerating
+ * entries individually.
+ *
+ * FILESYSTEM CHANGES
+ *
+ * When media files are added or removed, MediaDB reports this by triggering
+ * 'created' and 'deleted' events.
+ *
+ * When a 'created' event is fired, the detail property of the event is an
+ * array of database record objects. When a single file is created (for
+ * example when the user takes a picture with the Camera app) this array has
+ * only a single element. But when MediaDB scans for new files (see SCANNING
+ * below) it may batch multiple records into a single created event. If a
+ * 'created' event has many records, apps may choose to simply rebuild their
+ * UI from scratch with a new call to enumerate() instead of handling the new
+ * files one at a time.
+ *
+ * When a 'deleted' event is fired, the detail property of the event is an
+ * array of the names of the files that have been deleted. As with 'created'
+ * events, the array may have a single element or may have many batched
+ * elements.
+ *
+ * If MediaDB detects that a file has been modified in place (because its
+ * size or date changes) it treats this as a deletion of the old version and
+ * the creation of a new version, and will fire a deleted event followed by
+ * a created event.
+ *
+ * The created and deleted events are not triggered until the corresponding
+ * files have actually been created and deleted and their database records
+ * have been updated.
+ *
+ * SCANNING
+ *
+ * MediaDB automatically scans for new and deleted files every time it enters
+ * the MediaDB.READY state. This happens when the MediaDB object is first
+ * created, and also when an SD card is removed and reinserted or when the
+ * user finishes a USB Mass Storage session. If the scan finds new files, it
+ * reports them with one or more 'created' events. If the scan finds that
+ * files have been deleted, it reports them with one or more 'deleted' events.
+ *
+ * MediaDB fires a 'scanstart' event when a scan begins and fires a 'scanend'
+ * event when the scan is complete. Apps can use these events to let the user
+ * know that a scan is in progress.
+ *
+ * The scan algorithm attempts to quickly look for new files and reports those
+ * first. It then begins a slower full scan phase where it checks that each of
+ * the files it already knows about is still present.
+ *
+ * EVENTS
+ *
+ * As described above, MediaDB sends events to communicate with the apps
+ * that use it. The event types and their meanings are:
+ *
+ * Event Meaning
+ * --------------------------------------------------------------------------
+ * ready MediaDB is ready for use
+ * unavailable MediaDB is unavailable (often because of USB file transfer)
+ * created One or more files were created
+ * deleted One or more files were deleted
+ * scanstart MediaDB is scanning
+ * scanend MediaDB has finished scanning
+ *
+ * Because MediaDB is a JavaScript library, these are not real DOM events, but
+ * simulations.
+ *
+ * MediaDB defines two-argument versions of addEventListener() and
+ * removeEventListener() and also allows you to define event handlers by
+ * setting 'on' properties like 'onready' and 'onscanstart'.
+ *
+ * The objects passed on MediaDB event handlers are not true Event objects but
+ * simulate a CustomEvent by defining type, target, currentTarget, timestamp
+ * and detail properties. For MediaDB events, it is the detail property that
+ * always holds the useful information. These simulated event objects do not
+ * have preventDefault(), stopPropagation() or stopImmediatePropagation()
+ * methods.
+ *
+ * MediaDB events do not bubble and cannot be captured.
+ *
+ * METHODS
+ *
+ * MediaDB defines the following methods:
+ *
+ * - addEventListener(): register a function to call when an event is fired
+ *
+ * - removeEventListener(): unregister an event listener function
+ *
+ * - enumerate(): for each file that MediaDB knows about, pass its database
+ * record object to the specified callback. By default, records are returned
+ * in alphabetical order by name, but optional arguments allow you to
+ * specify a database index, a key range, and a sort direction.
+ *
+ * - cancelEnumeration(): stops an enumeration in progress. Pass the object
+ * returned by enumerate().
+ *
+ * - getFile(): given a filename and a callback, this method looks up the
+ * named file in DeviceStorage and passes it (a Blob) to the callback.
+ * An error callback is available as an optional third argument.
+ *
+ * - count(): count the number of records in the database and pass the value
+ * to the specified callback. Like enumerate(), this method allows you
+ * to specify the name of an index and a key range if you only want to
+ * count some of the records.
+ *
+ * - updateMetadata(): updates the metadata associated with a named file
+ *
+ * - addFile(): given a filename and a blob this method saves the blob as a
+ * named file to device storage.
+ *
+ * - deleteFile(): deletes the named file from device storage and the database
+ *
+ * - close(): closes the IndexedDB connections and stops listening to
+ * DeviceStorage events. This permanently puts the MediaDB object into
+ * the MediaDB.CLOSED state in which it is unusable.
+ *
+ * - freeSpace(): call the DeviceStorage freeSpace() method and pass the
+ * result to the specified callback
+ */
+var MediaDB = (function() {
+
+ function MediaDB(mediaType, metadataParser, options) {
+ this.mediaType = mediaType;
+ this.metadataParser = metadataParser;
+ if (!options)
+ options = {};
+ this.indexes = options.indexes || [];
+ this.version = options.version || 1;
+ this.directory = options.directory || '';
+ this.mimeTypes = options.mimeTypes;
+ this.autoscan = (options.autoscan !== undefined) ? options.autoscan : true;
+ this.state = MediaDB.OPENING;
+ this.scanning = false; // becomes true while scanning
+
+ // While scanning, we attempt to send change events in batches.
+ // After finding a new or deleted file, we'll wait this long before
+ // sending events in case we find another new or deleted file right away.
+ this.batchHoldTime = options.batchHoldTime || 100;
+
+ // But we'll send a batch of changes right away if it gets this big
+ // A batch size of 0 means no maximum batch size
+ this.batchSize = options.batchSize || 0;
+
+ if (this.directory &&
+ this.directory[this.directory.length - 1] !== '/')
+ this.directory += '/';
+
+ this.dbname = 'MediaDB/' + this.mediaType + '/' + this.directory;
+
+ var media = this; // for the nested functions below
+
+ // Private implementation details in this object
+ this.details = {
+ // This maps event type -> array of listeners
+ // See addEventListener and removeEventListener
+ eventListeners: {},
+
+ // Properties for queuing up db insertions and deletions and also
+ // for queueing up notifications to be sent
+ pendingInsertions: [], // Array of filenames to insert
+ pendingDeletions: [], // Array of filenames to remove
+ whenDoneProcessing: [], // Functions to run when queue is empty
+
+ pendingCreateNotifications: [], // Array of fileinfo objects
+ pendingDeleteNotifications: [], // Ditto
+ pendingNotificationTimer: null,
+
+ // This property holds the modification date of the newest file we have.
+ // We need to know the newest file in order to look for newer ones during
+ // scanning. We initialize newestFileModTime during initialization by
+ // actually checking the database (using the date index). We also update
+ // this property every time a new record is added to the database.
+ newestFileModTime: 0
+ };
+
+ // Define a dummy metadata parser if we're not given one
+ if (!this.metadataParser) {
+ this.metadataParser = function(file, callback) {
+ setTimeout(function() { callback({}); }, 0);
+ }
+ }
+
+ // Open the database
+ // Note that the user can upgrade the version and we can upgrade the version
+ var openRequest = indexedDB.open(this.dbname,
+ this.version * MediaDB.VERSION);
+
+ // This should never happen for Gaia apps
+ openRequest.onerror = function(e) {
+ console.error('MediaDB():', openRequest.error.name);
+ };
+
+ // This should never happen for Gaia apps
+ openRequest.onblocked = function(e) {
+ console.error('indexedDB.open() is blocked in MediaDB()');
+ };
+
+ // This is where we create (or delete and recreate) the database
+ openRequest.onupgradeneeded = function(e) {
+ var db = openRequest.result;
+
+ // If there are already existing object stores, delete them all
+ // If the version number changes we just want to start over.
+ var existingStoreNames = db.objectStoreNames;
+ for (var i = 0; i < existingStoreNames.length; i++) {
+ db.deleteObjectStore(existingStoreNames[i]);
+ }
+
+ // Now build the database
+ var filestore = db.createObjectStore('files', { keyPath: 'name' });
+ // Always index the files by modification date
+ filestore.createIndex('date', 'date');
+ // And index them by any other file properties or metadata properties
+ // passed to the constructor
+ media.indexes.forEach(function(indexName) {
+ // Don't recreate indexes we've already got
+ if (indexName === 'name' || indexName === 'date')
+ return;
+ // the index name is also the keypath
+ filestore.createIndex(indexName, indexName);
+ });
+ }
+
+ // This is called when we've got the database open and ready.
+ openRequest.onsuccess = function(e) {
+ media.db = openRequest.result;
+
+ // Log any errors that propagate up to here
+ media.db.onerror = function(event) {
+ console.error('MediaDB: ',
+ event.target.error && event.target.error.name);
+ }
+
+ // Query the db to find the modification time of the newest file
+ var cursorRequest =
+ media.db.transaction('files', 'readonly')
+ .objectStore('files')
+ .index('date')
+ .openCursor(null, 'prev');
+
+ cursorRequest.onerror = function() {
+ // If anything goes wrong just display an error.
+ // If this fails, don't even attempt error recovery
+ console.error('MediaDB initialization error', cursorRequest.error);
+ };
+ cursorRequest.onsuccess = function() {
+ var cursor = cursorRequest.result;
+ if (cursor) {
+ media.details.newestFileModTime = cursor.value.date;
+ }
+ else {
+ // No files in the db yet, so use a really old time
+ media.details.newestFileModTime = 0;
+ }
+
+ // The DB is initialized, and we've got our mod time
+ // so move on and initialize device storage
+ initDeviceStorage();
+ };
+ };
+
+ function initDeviceStorage() {
+ // Set up DeviceStorage
+ // If storage is null, then there is no sdcard installed and
+ // we have to abort.
+ media.storage = navigator.getDeviceStorage(mediaType);
+
+ // Handle change notifications from device storage
+ // We set this onchange property to null in the close() method
+ // so don't use addEventListener here
+ media.storage.addEventListener('change', deviceStorageChangeHandler);
+ media.details.dsEventListener = deviceStorageChangeHandler;
+
+ // Use available() to figure out if there is actually an sdcard there
+ // and emit a ready or unavailable event
+ var availreq = media.storage.available();
+ availreq.onsuccess = function(e) {
+ switch (e.target.result) {
+ case 'available':
+ changeState(media, MediaDB.READY);
+ if (media.autoscan)
+ scan(media); // Start scanning as soon as we're ready
+ break;
+ case 'unavailable':
+ changeState(media, MediaDB.NOCARD);
+ break;
+ case 'shared':
+ changeState(media, MediaDB.UNMOUNTED);
+ break;
+ }
+ };
+ availreq.onerror = function(e) {
+ console.error('available() failed',
+ availreq.error && availreq.error.name);
+ changeState(media, MediaDB.UNMOUNTED);
+ };
+ }
+
+ function deviceStorageChangeHandler(e) {
+ var filename;
+ switch (e.reason) {
+ case 'available':
+ changeState(media, MediaDB.READY);
+ if (media.autoscan)
+ scan(media); // automatically scan every time the card comes back
+ break;
+ case 'unavailable':
+ changeState(media, MediaDB.NOCARD);
+ endscan(media);
+ break;
+ case 'shared':
+ changeState(media, MediaDB.UNMOUNTED);
+ endscan(media);
+ break;
+ case 'modified':
+ case 'deleted':
+ filename = e.path;
+ if (ignoreName(filename))
+ break;
+ if (media.directory) {
+ // Ignore changes outside of our directory
+ if (filename.substring(0, media.directory.length) !==
+ media.directory)
+ break;
+ // And strip the directory from changes inside of it
+ filename = filename.substring(media.directory.length);
+ }
+ if (e.reason === 'modified')
+ insertRecord(media, filename);
+ else
+ deleteRecord(media, filename);
+ break;
+ }
+ }
+ }
+
+ MediaDB.prototype = {
+ close: function close() {
+ // Close the database
+ this.db.close();
+
+ // There is no way to close device storage, but we at least want
+ // to stop receiving events from it.
+ this.storage.removeEventListener('change', this.details.dsEventListener);
+
+ // Change state and send out an event
+ changeState(this, MediaDB.CLOSED);
+ },
+
+ addEventListener: function addEventListener(type, listener) {
+ if (!this.details.eventListeners.hasOwnProperty(type))
+ this.details.eventListeners[type] = [];
+ var listeners = this.details.eventListeners[type];
+ if (listeners.indexOf(listener) !== -1)
+ return;
+ listeners.push(listener);
+ },
+
+ removeEventListener: function removeEventListener(type, listener) {
+ if (!this.details.eventListeners.hasOwnProperty(type))
+ return;
+ var listeners = this.details.eventListeners[type];
+ var position = listeners.indexOf(listener);
+ if (position === -1)
+ return;
+ listeners.splice(position, 1);
+ },
+
+ // Look up the specified filename in DeviceStorage and pass the
+ // resulting File object to the specified callback.
+ getFile: function getFile(filename, callback, errback) {
+ if (this.state !== MediaDB.READY)
+ throw Error('MediaDB is not ready. State: ' + this.state);
+
+ var getRequest = this.storage.get(this.directory + filename);
+ getRequest.onsuccess = function() {
+ callback(getRequest.result);
+ };
+ getRequest.onerror = function() {
+ var errmsg = getRequest.error && getRequest.error.name;
+ if (errback)
+ errback(errmsg);
+ else
+ console.error('MediaDB.getFile:', errmsg);
+ }
+ },
+
+ // Delete the named file from device storage.
+ // This will cause a device storage change event, which will cause
+ // mediadb to remove the file from the database and send out a
+ // mediadb change event, which will notify the application UI.
+ deleteFile: function deleteFile(filename) {
+ if (this.state !== MediaDB.READY)
+ throw Error('MediaDB is not ready. State: ' + this.state);
+
+ this.storage.delete(this.directory + filename).onerror = function(e) {
+ console.error('MediaDB.deleteFile(): Failed to delete', filename,
+ 'from DeviceStorage:', e.target.error);
+ };
+ },
+
+ //
+ // Save the specified blob to device storage, using the specified filename.
+ // This will cause device storage to send us an event, and that event
+ // will cause mediadb to add the file to its database, and that will
+ // send out a mediadb event to the application UI.
+ //
+ addFile: function addFile(filename, file) {
+ if (this.state !== MediaDB.READY)
+ throw Error('MediaDB is not ready. State: ' + this.state);
+
+ var media = this;
+
+ // Delete any existing file by this name, then save the file.
+ var deletereq = media.storage.delete(media.directory + filename);
+ deletereq.onsuccess = deletereq.onerror = save;
+
+ function save() {
+ var request = media.storage.addNamed(file, media.directory + filename);
+ request.onerror = function() {
+ console.error('MediaDB: Failed to store', filename,
+ 'in DeviceStorage:', storeRequest.error);
+ };
+ }
+ },
+
+ // Look up the database record for the named file, and copy the properties
+ // of the metadata object into the file's metadata, and then write the
+ // updated record back to the database. The third argument is optional. If
+ // you pass a function, it will be called when the metadata is written.
+ updateMetadata: function(filename, metadata, callback) {
+ if (this.state !== MediaDB.READY)
+ throw Error('MediaDB is not ready. State: ' + this.state);
+
+ var media = this;
+
+ // First, look up the fileinfo record in the db
+ var read = media.db.transaction('files', 'readonly')
+ .objectStore('files')
+ .get(filename);
+
+ read.onerror = function() {
+ console.error('MediaDB.updateMetadata called with unknown filename');
+ };
+
+ read.onsuccess = function() {
+ var fileinfo = read.result;
+
+ // Update the fileinfo metadata
+ Object.keys(metadata).forEach(function(key) {
+ fileinfo.metadata[key] = metadata[key];
+ });
+
+ // And write it back into the database.
+ var write = media.db.transaction('files', 'readwrite')
+ .objectStore('files')
+ .put(fileinfo);
+
+ write.onerror = function() {
+ console.error('MediaDB.updateMetadata: database write failed',
+ write.error && write.error.name);
+ };
+
+ if (callback) {
+ write.onsuccess = function() {
+ callback();
+ }
+ }
+ }
+ },
+
+ // Count the number of records in the database and pass that number to the
+ // specified callback. key is 'name', 'date' or one of the index names
+ // passed to the constructor. range is be an IDBKeyRange that defines a
+ // the range of key values to count. key and range are optional
+ // arguments. If one argument is passed, it is the callback. If two
+ // arguments are passed, they are assumed to be the range and callback.
+ count: function(key, range, callback) {
+ if (this.state !== MediaDB.READY)
+ throw Error('MediaDB is not ready. State: ' + this.state);
+
+ // range is an optional argument
+ if (arguments.length === 1) {
+ callback = key;
+ range = undefined;
+ key = undefined;
+ }
+ else if (arguments.length === 2) {
+ callback = range;
+ range = key;
+ key = undefined;
+ }
+
+ var store = this.db.transaction('files').objectStore('files');
+ if (key && key !== 'name')
+ store = store.index(key);
+
+ var countRequest = store.count(range || null);
+
+ countRequest.onerror = function() {
+ console.error('MediaDB.count() failed with', countRequest.error);
+ };
+
+ countRequest.onsuccess = function(e) {
+ callback(e.target.result);
+ };
+ },
+
+
+ // Enumerate all files in the filesystem, sorting by the specified
+ // property (which must be one of the indexes, or null for the filename).
+ // Direction is ascending or descending. Use whatever string
+ // constant IndexedDB uses. f is the function to pass each record to.
+ //
+ // Each record is an object like this:
+ //
+ // {
+ // // The basic fields are all from the File object
+ // name: // the filename
+ // type: // the file type
+ // size: // the file size
+ // date: // file mod time
+ // metadata: // whatever object the metadata parser returns
+ // }
+ //
+ // This method returns an object that you can pass to cancelEnumeration()
+ // to cancel an enumeration in progress. You can use the state property
+ // of the returned object to find out the state of the enumeration. It
+ // should be one of the strings 'enumerating', 'complete', 'cancelling'
+ // 'cancelled', or 'error'
+ //
+ enumerate: function enumerate(key, range, direction, callback) {
+ if (this.state !== MediaDB.READY)
+ throw Error('MediaDB is not ready. State: ' + this.state);
+
+ var handle = { state: 'enumerating' };
+
+ // The first three arguments are optional, but the callback
+ // is required, and we don't want to have to pass three nulls
+ if (arguments.length === 1) {
+ callback = key;
+ key = undefined;
+ }
+ else if (arguments.length === 2) {
+ callback = range;
+ range = undefined;
+ }
+ else if (arguments.length === 3) {
+ callback = direction;
+ direction = undefined;
+ }
+
+ var store = this.db.transaction('files').objectStore('files');
+
+ // If a key other than "name" is specified, then use the index for that
+ // key instead of the store.
+ if (key && key !== 'name')
+ store = store.index(key);
+
+ // Now create a cursor for the store or index.
+ var cursorRequest = store.openCursor(range || null, direction || 'next');
+
+ cursorRequest.onerror = function() {
+ console.error('MediaDB.enumerate() failed with', cursorRequest.error);
+ handle.state = 'error';
+ };
+
+ cursorRequest.onsuccess = function() {
+ // If the enumeration has been cancelled, return without
+ // calling the callback and without calling cursor.continue();
+ if (handle.state === 'cancelling') {
+ handle.state = 'cancelled';
+ return;
+ }
+
+ var cursor = cursorRequest.result;
+ if (cursor) {
+ try {
+ if (!cursor.value.fail) // if metadata parsing succeeded
+ callback(cursor.value);
+ }
+ catch (e) {
+ console.warn('MediaDB.enumerate(): callback threw', e);
+ }
+ cursor.continue();
+ }
+ else {
+ // Final time, tell the callback that there are no more.
+ handle.state = 'complete';
+ callback(null);
+ }
+ };
+
+ return handle;
+ },
+
+ // This method takes the same arguments as enumerate(), but batches
+ // the results into an array and passes them to the callback all at
+ // once when the enumeration is complete. It uses enumerate() so it
+ // is no faster than that method, but may be more convenient.
+ enumerateAll: function enumerateAll(key, range, direction, callback) {
+ var batch = [];
+
+ // The first three arguments are optional, but the callback
+ // is required, and we don't want to have to pass three nulls
+ if (arguments.length === 1) {
+ callback = key;
+ key = undefined;
+ }
+ else if (arguments.length === 2) {
+ callback = range;
+ range = undefined;
+ }
+ else if (arguments.length === 3) {
+ callback = direction;
+ direction = undefined;
+ }
+
+ return this.enumerate(key, range, direction, function(fileinfo) {
+ if (fileinfo !== null)
+ batch.push(fileinfo);
+ else
+ callback(batch);
+ });
+ },
+
+ // Cancel a pending enumeration. After calling this the callback for
+ // the specified enumeration will not be invoked again.
+ cancelEnumeration: function cancelEnumeration(handle) {
+ if (handle.state === 'enumerating')
+ handle.state = 'cancelling';
+ },
+
+ // Use the non-standard mozGetAll() function to return all of the
+ // records in the database in one big batch. The records will be
+ // sorted by filename
+ getAll: function getAll(callback) {
+ if (this.state !== MediaDB.READY)
+ throw Error('MediaDB is not ready. State: ' + this.state);
+
+ var store = this.db.transaction('files').objectStore('files');
+ var request = store.mozGetAll();
+ request.onerror = function() {
+ console.error('MediaDB.getAll() failed with', request.error);
+ };
+ request.onsuccess = function() {
+ var all = request.result; // All records in the object store
+
+ // Filter out files that failed metadata parsing
+ var good = all.filter(function(fileinfo) { return !fileinfo.fail; });
+
+ callback(good);
+ };
+ },
+
+ // Scan for new or deleted files.
+ // This is only necessary if you have explicitly disabled automatic
+ // scanning by setting autoscan:false in the options object.
+ scan: function() {
+ scan(this);
+ },
+
+ // Use the device storage freeSpace() method and pass the returned
+ // value to the callback.
+ freeSpace: function freeSpace(callback) {
+ if (this.state !== MediaDB.READY)
+ throw Error('MediaDB is not ready. State: ' + this.state);
+
+ var freereq = this.storage.freeSpace();
+ freereq.onsuccess = function() {
+ callback(freereq.result);
+ }
+ }
+ };
+
+ // This is the version number of the MediaDB schema. If we change this
+ // number it will cause existing data stores to be deleted and rebuilt,
+ // which is useful when the schema changes. Note that the user can also
+ // upgrade the version number with an option to the MediaDB constructor.
+ // The final indexedDB version number we use is the product of our version
+ // and the user's version.
+ // This is version 2 because we modified the default schema to include
+ // an index for file modification date.
+ MediaDB.VERSION = 2;
+
+ // These are the values of the state property of a MediaDB object
+ // The NOCARD, UNMOUNTED, and CLOSED values are also used as the detail
+ // property of 'unavailable' events
+ MediaDB.OPENING = 'opening'; // MediaDB is initializing itself
+ MediaDB.READY = 'ready'; // MediaDB is available and ready for use
+ MediaDB.NOCARD = 'nocard'; // Unavailable because there is no sd card
+ MediaDB.UNMOUNTED = 'unmounted'; // Unavailable because card unmounted
+ MediaDB.CLOSED = 'closed'; // Unavailalbe because MediaDB has closed
+
+ /* Details of helper functions follow */
+
+ //
+ // Return true if media db should ignore this file.
+ //
+ // If any components of the path begin with a . we'll ignore the file.
+ // The '.' prefix indicates hidden files and directories on Unix and
+ // when files are "moved to trash" during a USB Mass Storage session they
+ // are sometimes not actually deleted, but moved to a hidden directory.
+ //
+ // If an array of media types was specified when the MediaDB was created
+ // and the type of this file is not a member of that list, then ignore it.
+ //
+ function ignore(media, file) {
+ if (ignoreName(file.name))
+ return true;
+ if (media.mimeTypes && media.mimeTypes.indexOf(file.type) === -1)
+ return true;
+ return false;
+ }
+
+ // Test whether this filename is one we ignore.
+ // This is a separate function because device storage change events
+ // give us a name only, not the file object.
+ function ignoreName(filename) {
+ return (filename[0] === '.' || filename.indexOf('/.') !== -1);
+ }
+
+ // Tell the db to start a manual scan. I think we don't do
+ // this automatically from the constructor, but most apps will start
+ // a scan right after calling the constructor and then will proceed to
+ // enumerate what is already in the db. If scan performance is bad
+ // for large media collections, apps can just have the user specify
+ // when to rescan rather than doing it automatically. Until we have
+ // change event notifications, gaia apps might want to do a scan
+ // every time they are made visible.
+ //
+ // Filesystem changes discovered by a scan are generally
+ // batched. If a scan discovers 10 new files, the information
+ // about those files will generally be passed as an array to a the
+ // onchange handler rather than calling that handler once for each
+ // newly discovered file. Apps can decide whether to handle
+ // batches by processing each element individually or by just starting
+ // fresh with a new call to enumerate().
+ //
+ // Scan details are not tightly specified, but the goal is to be
+ // as efficient as possible. We'll try to do a quick date-based
+ // scan to look for new files and report those first. Following
+ // that, a full scan will be compared with a full dump of the DB
+ // to see if any files have been deleted.
+ //
+ function scan(media) {
+ media.scanning = true;
+ dispatchEvent(media, 'scanstart');
+
+ // First, scan for new files since the last scan, if there was one
+ // When the quickScan is done it will begin a full scan. If we don't
+ // have a last scan date, then the database is empty and we don't
+ // have to do a full scan, since there will be no changes or deletions.
+ quickScan(media.details.newestFileModTime);
+
+ // Do a quick scan and then follow with a full scan
+ function quickScan(timestamp) {
+ var cursor;
+ if (timestamp > 0) {
+ media.details.firstscan = false;
+ cursor = media.storage.enumerate(media.directory, {
+ // add 1 so we don't find the same newest file again
+ since: new Date(timestamp + 1)
+ });
+ }
+ else {
+ // If there is no timestamp then this is the first time we've
+ // scanned and we don't have any files in the database, which
+ // allows important optimizations during the scanning process
+ media.details.firstscan = true;
+ media.details.records = [];
+ cursor = media.storage.enumerate(media.directory);
+ }
+
+ cursor.onsuccess = function() {
+ var file = cursor.result;
+ if (file) {
+ if (!ignore(media, file))
+ insertRecord(media, file);
+ cursor.continue();
+ }
+ else {
+ // Quick scan is done. When the queue is empty, force out
+ // any batched created events and move on to the slower
+ // more thorough full scan.
+ whenDoneProcessing(media, function() {
+ sendNotifications(media);
+ if (media.details.firstscan) {
+ // If this was the first scan, then we're done
+ endscan(media);
+ }
+ else {
+ // If this was not the first scan, then we need to go
+ // ensure that all of the old files we know about are still there
+ fullScan();
+ }
+ });
+ }
+ };
+
+ cursor.onerror = function() {
+ // We can't scan if we can't read device storage.
+ // Perhaps the card was unmounted or pulled out
+ console.warning('Error while scanning', cursor.error);
+ endscan(media);
+ };
+ }
+
+ // Get a complete list of files from DeviceStorage
+ // Get a complete list of files from IndexedDB.
+ // Sort them both (the indexedDB list will already be sorted)
+ // Step through the lists noting deleted files and created files.
+ // Pay attention to files whose size or date has changed and
+ // treat those as deletions followed by insertions.
+ // Sync up the database while stepping through the lists.
+ function fullScan() {
+ if (media.state !== MediaDB.READY) {
+ endscan(media);
+ return;
+ }
+
+ // The db may be busy right about now, processing files that
+ // were found during the quick scan. So we'll start off by
+ // enumerating all files in device storage
+ var dsfiles = [];
+ var cursor = media.storage.enumerate(media.directory);
+ cursor.onsuccess = function() {
+ var file = cursor.result;
+ if (file) {
+ if (!ignore(media, file)) {
+ dsfiles.push(file);
+ }
+ cursor.continue();
+ }
+ else {
+ // We're done enumerating device storage, so get all files from db
+ getDBFiles();
+ }
+ }
+
+ cursor.onerror = function() {
+ // We can't scan if we can't read device storage.
+ // Perhaps the card was unmounted or pulled out
+ console.warning('Error while scanning', cursor.error);
+ endscan(media);
+ };
+
+ function getDBFiles() {
+ var store = media.db.transaction('files').objectStore('files');
+ var getAllRequest = store.mozGetAll();
+
+ getAllRequest.onsuccess = function() {
+ var dbfiles = getAllRequest.result; // Should already be sorted
+ compareLists(dbfiles, dsfiles);
+ };
+ }
+
+ function compareLists(dbfiles, dsfiles) {
+ // The dbfiles are sorted when we get them from the db.
+ // But the ds files are not sorted
+ dsfiles.sort(function(a, b) {
+ if (a.name < b.name)
+ return -1;
+ else
+ return 1;
+ });
+
+ // Loop through both the dsfiles and dbfiles lists
+ var dsindex = 0, dbindex = 0;
+ while (true) {
+ // Get the next DeviceStorage file or null
+ var dsfile;
+ if (dsindex < dsfiles.length)
+ dsfile = dsfiles[dsindex];
+ else
+ dsfile = null;
+
+ // Get the next DB file or null
+ var dbfile;
+ if (dbindex < dbfiles.length)
+ dbfile = dbfiles[dbindex];
+ else
+ dbfile = null;
+
+ // Case 1: both files are null. If so, we're done.
+ if (dsfile === null && dbfile === null)
+ break;
+
+ // Case 2: no more files in the db. This means that
+ // the file from ds is a new one
+ if (dbfile === null) {
+ insertRecord(media, dsfile);
+ dsindex++;
+ continue;
+ }
+
+ // Case 3: no more files in ds. This means that the db file
+ // has been deleted
+ if (dsfile === null) {
+ deleteRecord(media, dbfile.name);
+ dbindex++;
+ continue;
+ }
+
+ // Case 4: two files with the same name.
+ // 4a: date and size are the same for both: do nothing
+ // 4b: file has changed: it is both a deletion and a creation
+ if (dsfile.name === dbfile.name) {
+ var lastModified = dsfile.lastModifiedDate;
+ if ((lastModified && lastModified.getTime() !== dbfile.date) ||
+ dsfile.size !== dbfile.size) {
+ deleteRecord(media, dbfile.name);
+ insertRecord(media, dsfile);
+ }
+ dsindex++;
+ dbindex++;
+ continue;
+ }
+
+ // Case 5: the dsfile name is less than the dbfile name.
+ // This means that the dsfile is new. Like case 2
+ if (dsfile.name < dbfile.name) {
+ insertRecord(media, dsfile);
+ dsindex++;
+ continue;
+ }
+
+ // Case 6: the dsfile name is greater than the dbfile name.
+ // this means that the dbfile no longer exists on disk
+ if (dsfile.name > dbfile.name) {
+ deleteRecord(media, dbfile.name);
+ dbindex++;
+ continue;
+ }
+
+ // That should be an exhaustive set of possiblities
+ // and we should never reach this point.
+ console.error('Assertion failed');
+ }
+
+ // Push a special value onto the queue so that when it is
+ // processed we can trigger a 'scanend' event
+ insertRecord(media, null);
+ }
+ }
+ }
+
+ // Called to send out a scanend event when scanning is done.
+ // This event is sent on normal scan termination and also
+ // when something goes wrong, such as the device storage being
+ // unmounted during a scan.
+ function endscan(media) {
+ if (media.scanning) {
+ media.scanning = false;
+ dispatchEvent(media, 'scanend');
+ }
+ }
+
+ // Pass in a file, or a filename. The function queues it up for
+ // metadata parsing and insertion into the database, and will send a
+ // mediadb change event (possibly batched with other changes).
+ // Ensures that only one file is being parsed at a time, but tries
+ // to make as many db changes in one transaction as possible. The
+ // special value null indicates that scanning is complete. If the
+ // 2nd argument is a File, it should come from enumerate() so that
+ // the name property does not include the directory prefix. If it
+ // is a name, then the directory prefix must already have been
+ // stripped.
+ function insertRecord(media, fileOrName) {
+ var details = media.details;
+
+ // Add this file to the queue of files to process
+ details.pendingInsertions.push(fileOrName);
+
+ // If the queue is already being processed, just return
+ if (details.processingQueue)
+ return;
+
+ // Otherwise, start processing the queue.
+ processQueue(media);
+ }
+
+ // Delete the database record associated with filename.
+ // filename must not include the directory prefix.
+ function deleteRecord(media, filename) {
+ var details = media.details;
+
+ // Add this file to the queue of files to process
+ details.pendingDeletions.push(filename);
+
+ // If there is already a transaction in progress return now.
+ if (details.processingQueue)
+ return;
+
+ // Otherwise, start processing the queue
+ processQueue(media);
+ }
+
+ function whenDoneProcessing(media, f) {
+ var details = media.details;
+ if (details.processingQueue)
+ details.whenDoneProcessing.push(f);
+ else
+ f();
+ }
+
+ function processQueue(media) {
+ var details = media.details;
+
+ details.processingQueue = true;
+
+ // Now get one filename off a queue and store it
+ next();
+
+ // Take an item from a queue and process it.
+ // Deletions are always processed before insertions because we want
+ // to clear away non-functional parts of the UI ASAP.
+ function next() {
+ if (details.pendingDeletions.length > 0) {
+ deleteFiles();
+ }
+ else if (details.pendingInsertions.length > 0) {
+ insertFile(details.pendingInsertions.shift());
+ }
+ else {
+ details.processingQueue = false;
+ if (details.whenDoneProcessing.length > 0) {
+ var functions = details.whenDoneProcessing;
+ details.whenDoneProcessing = [];
+ functions.forEach(function(f) { f(); });
+ }
+ }
+ }
+
+ // Delete all of the pending files in a single transaction
+ function deleteFiles() {
+ var transaction = media.db.transaction('files', 'readwrite');
+ var store = transaction.objectStore('files');
+
+ deleteNextFile();
+
+ function deleteNextFile() {
+ if (details.pendingDeletions.length === 0) {
+ next();
+ return;
+ }
+ var filename = details.pendingDeletions.shift();
+ var request = store.delete(filename);
+ request.onerror = function() {
+ // This probably means that the file wasn't in the db yet
+ console.warn('MediaDB: Unknown file in deleteRecord:',
+ filename, getreq.error);
+ deleteNextFile();
+ };
+ request.onsuccess = function() {
+ // We succeeded, so remember to send out an event about it.
+ queueDeleteNotification(media, filename);
+ deleteNextFile();
+ };
+ }
+ }
+
+ // Insert a file into the db. One transaction per insertion.
+ // The argument might be a filename or a File object
+ // If it is a File, then it came from enumerate and its name
+ // property already has the directory stripped off. If it is a
+ // filename, it came from a device storage change event and we
+ // stripped of the directory before calling insertRecord.
+ function insertFile(f) {
+ // null is a special value pushed on to the queue when a scan()
+ // is complete. We use it to trigger a scanend event
+ // after all the change events from the scan are delivered
+ if (f === null) {
+ sendNotifications(media);
+ endscan(media);
+ next();
+ return;
+ }
+
+ // If we got a filename, look up the file in device storage
+ if (typeof f === 'string') {
+ var getreq = media.storage.get(media.directory + f);
+ getreq.onerror = function() {
+ console.warn('MediaDB: Unknown file in insertRecord:',
+ media.directory + f, getreq.error);
+ next();
+ };
+ getreq.onsuccess = function() {
+ parseMetadata(getreq.result, f);
+ };
+ }
+ else {
+ // otherwise f is the file we want
+ parseMetadata(f, f.name);
+ }
+ }
+
+ function parseMetadata(file, filename) {
+ if (!file.lastModifiedDate) {
+ console.warn('MediaDB: parseMetadata: no lastModifiedDate for',
+ filename,
+ 'using Date.now() until #793955 is fixed');
+ }
+
+ // Basic information about the file
+ var fileinfo = {
+ name: filename, // we can't trust file.name
+ type: file.type,
+ size: file.size,
+ date: file.lastModifiedDate ?
+ file.lastModifiedDate.getTime() :
+ Date.now()
+ };
+
+ if (fileinfo.date > details.newestFileModTime)
+ details.newestFileModTime = fileinfo.date;
+
+ // Get metadata about the file
+ media.metadataParser(file, gotMetadata, metadataError);
+ function metadataError(e) {
+ console.warn('MediaDB: error parsing metadata for',
+ filename, ':', e);
+ // If we get an error parsing the metadata, assume it is invalid
+ // and make a note in the fileinfo record that we store in the database
+ // If we don't store it in the database, we'll keep finding it
+ // on every scan. But we make sure never to return the invalid file
+ // on an enumerate call.
+ fileinfo.fail = true;
+ storeRecord(fileinfo);
+ }
+ function gotMetadata(metadata) {
+ fileinfo.metadata = metadata;
+ storeRecord(fileinfo);
+ }
+ }
+
+ function storeRecord(fileinfo) {
+ if (media.details.firstscan) {
+ // If this is the first scan then we know this is a new file and
+ // we can assume that adding it to the db will succeed.
+ // So we can just queue a notification about the new file without
+ // waiting for a db operation.
+ media.details.records.push(fileinfo);
+ if (!fileinfo.fail) {
+ queueCreateNotification(media, fileinfo);
+ }
+ // And go on to the next
+ next();
+ }
+ else {
+ // If this is not the first scan, then we may already have a db
+ // record for this new file. In that case, the call to add() above
+ // is going to fail. We need to handle that case, so we can't send
+ // out the new file notification until we get a response to the add().
+ var transaction = media.db.transaction('files', 'readwrite');
+ var store = transaction.objectStore('files');
+ var request = store.add(fileinfo);
+
+ request.onsuccess = function() {
+ // Remember to send an event about this new file
+ if (!fileinfo.fail)
+ queueCreateNotification(media, fileinfo);
+ // And go on to the next
+ next();
+ };
+ request.onerror = function(event) {
+ // If the error name is 'ConstraintError' it means that the
+ // file already exists in the database. So try again, using put()
+ // instead of add(). If that succeeds, then queue a delete
+ // notification along with the insert notification. If the
+ // second try fails, or if the error was something different
+ // then issue a warning and continue with the next.
+ if (request.error.name === 'ConstraintError') {
+ // Don't let the higher-level DB error handler report the error
+ event.stopPropagation();
+ // And don't spew a default error message to the console either
+ event.preventDefault();
+ var putrequest = store.put(fileinfo);
+ putrequest.onsuccess = function() {
+ queueDeleteNotification(media, fileinfo.name);
+ if (!fileinfo.fail)
+ queueCreateNotification(media, fileinfo);
+ next();
+ };
+ putrequest.onerror = function() {
+ // Report and move on
+ console.error('MediaDB: unexpected ConstraintError',
+ 'in insertRecord for file:', fileinfo.name);
+ next();
+ };
+ }
+ else {
+ // Something unexpected happened!
+ // All we can do is report it and move on
+ console.error('MediaDB: unexpected error in insertRecord:',
+ request.error, 'for file:', fileinfo.name);
+ next();
+ }
+ };
+ }
+ }
+ }
+
+ // Don't send out notification events right away. Wait a short time to
+ // see if others arrive that we can batch up. This is common for scanning
+ function queueCreateNotification(media, fileinfo) {
+ var creates = media.details.pendingCreateNotifications;
+ creates.push(fileinfo);
+ if (media.batchSize && creates.length >= media.batchSize)
+ sendNotifications(media);
+ else
+ resetNotificationTimer(media);
+ }
+
+ function queueDeleteNotification(media, filename) {
+ var deletes = media.details.pendingDeleteNotifications;
+ deletes.push(filename);
+ if (media.batchSize && deletes.length >= media.batchSize)
+ sendNotifications(media);
+ else
+ resetNotificationTimer(media);
+ }
+
+ function resetNotificationTimer(media) {
+ var details = media.details;
+ if (details.pendingNotificationTimer)
+ clearTimeout(details.pendingNotificationTimer);
+ details.pendingNotificationTimer =
+ setTimeout(function() { sendNotifications(media); },
+ media.batchHoldTime);
+ }
+
+ // Send out notifications for creations and deletions
+ function sendNotifications(media) {
+ var details = media.details;
+ if (details.pendingNotificationTimer) {
+ clearTimeout(details.pendingNotificationTimer);
+ details.pendingNotificationTimer = null;
+ }
+ if (details.pendingDeleteNotifications.length > 0) {
+ var deletions = details.pendingDeleteNotifications;
+ details.pendingDeleteNotifications = [];
+ dispatchEvent(media, 'deleted', deletions);
+ }
+
+ if (details.pendingCreateNotifications.length > 0) {
+
+ // If this is a first scan, and we have records that are not
+ // in the db yet, write them to the db now
+ if (details.firstscan && details.records.length > 0) {
+ var transaction = media.db.transaction('files', 'readwrite');
+ var store = transaction.objectStore('files');
+ for (var i = 0; i < details.records.length; i++)
+ store.add(details.records[i]);
+ details.records.length = 0;
+ }
+
+ var creations = details.pendingCreateNotifications;
+ details.pendingCreateNotifications = [];
+ dispatchEvent(media, 'created', creations);
+ }
+ }
+
+ function dispatchEvent(media, type, detail) {
+ var handler = media['on' + type];
+ var listeners = media.details.eventListeners[type];
+
+ // Return if there is nothing to handle the event
+ if (!handler && (!listeners || listeners.length == 0))
+ return;
+
+ // We use a fake event object
+ var event = {
+ type: type,
+ target: media,
+ currentTarget: media,
+ timestamp: Date.now(),
+ detail: detail
+ };
+
+ // Call the 'on' handler property if there is one
+ if (typeof handler === 'function') {
+ try {
+ handler.call(media, event);
+ }
+ catch (e) {
+ console.warn('MediaDB: ', 'on' + type, 'event handler threw', e);
+ }
+ }
+
+ // Now call the listeners if there are any
+ if (!listeners)
+ return;
+ for (var i = 0; i < listeners.length; i++) {
+ try {
+ var listener = listeners[i];
+ if (typeof listener === 'function') {
+ listener.call(media, event);
+ }
+ else {
+ listener.handleEvent(event);
+ }
+ }
+ catch (e) {
+ console.warn('MediaDB: ', type, 'event listener threw', e);
+ }
+ }
+ }
+
+ function changeState(media, state) {
+ if (media.state !== state) {
+ media.state = state;
+ if (state === MediaDB.READY)
+ dispatchEvent(media, 'ready');
+ else
+ dispatchEvent(media, 'unavailable', state);
+ }
+ }
+
+ return MediaDB;
+
+}());
diff --git a/shared/js/mobile_operator.js b/shared/js/mobile_operator.js
new file mode 100644
index 0000000..edd2b44
--- /dev/null
+++ b/shared/js/mobile_operator.js
@@ -0,0 +1,96 @@
+'use strict';
+
+var MobileOperator = {
+ BRAZIL_MCC: 724,
+ BRAZIL_CELLBROADCAST_CHANNEL: 50,
+
+ userFacingInfo: function mo_userFacingInfo(mobileConnection) {
+ var network = mobileConnection.voice.network;
+ var iccInfo = mobileConnection.iccInfo;
+ var operator = network.shortName || network.longName;
+
+ if (iccInfo.isDisplaySpnRequired && iccInfo.spn
+ && !mobileConnection.voice.roaming) {
+ if (iccInfo.isDisplayNetworkNameRequired) {
+ operator = operator + ' ' + iccInfo.spn;
+ } else {
+ operator = iccInfo.spn;
+ }
+ }
+
+ var carrier, region;
+ if (this.isBrazil(mobileConnection)) {
+ // We are in Brazil, It is legally required to show local info
+ // about current registered GSM network in a legally specified way.
+ var lac = mobileConnection.voice.cell.gsmLocationAreaCode % 100;
+ var carriers = MobileInfo.brazil.carriers;
+ var regions = MobileInfo.brazil.regions;
+
+ carrier = carriers[network.mnc] || (this.BRAZIL_MCC.toString() + network.mnc);
+ region = (regions[lac] ? regions[lac] + ' ' + lac : '');
+ }
+
+ return {
+ 'operator': operator,
+ 'carrier': carrier,
+ 'region': region
+ };
+ },
+
+ isBrazil: function mo_isBrazil(mobileConnection) {
+ var cell = mobileConnection.voice.cell;
+ return mobileConnection.voice.network.mcc == this.BRAZIL_MCC &&
+ cell && cell.gsmLocationAreaCode;
+ }
+};
+
+
+var MobileInfo = {
+ brazil: {
+ carriers: {
+ '0': 'NEXTEL',
+ '2': 'TIM', '3': 'TIM', '4': 'TIM',
+ '5': 'CLARO', '6': 'VIVO', '7': 'CTBC', '8': 'TIM',
+ '10': 'VIVO', '11': 'VIVO', '15': 'SERCOMTEL',
+ '16': 'OI', '23': 'VIVO', '24': 'OI', '31': 'OI',
+ '32': 'CTBC', '33': 'CTBC', '34': 'CTBC', '37': 'AEIOU'
+ },
+ regions: {
+ '11': 'SP', '12': 'SP', '13': 'SP', '14': 'SP', '15': 'SP', '16': 'SP',
+ '17': 'SP', '18': 'SP', '19': 'SP',
+ '21': 'RJ', '22': 'RJ', '24': 'RJ',
+ '27': 'ES', '28': 'ES',
+ '31': 'MG', '32': 'MG', '33': 'MG', '34': 'MG', '35': 'MG', '37': 'MG',
+ '38': 'MG',
+ '41': 'PR', '42': 'PR', '43': 'PR', '44': 'PR', '45': 'PR', '46': 'PR',
+ '47': 'SC', '48': 'SC', '49': 'SC',
+ '51': 'RS', '53': 'RS', '54': 'RS', '55': 'RS',
+ '61': 'DF',
+ '62': 'GO',
+ '63': 'TO',
+ '64': 'GO',
+ '65': 'MT', '66': 'MT',
+ '67': 'MS',
+ '68': 'AC',
+ '69': 'RO',
+ '71': 'BA', '73': 'BA', '74': 'BA', '75': 'BA', '77': 'BA',
+ '79': 'SE',
+ '81': 'PE',
+ '82': 'AL',
+ '83': 'PB',
+ '84': 'RN',
+ '85': 'CE',
+ '86': 'PI',
+ '87': 'PE',
+ '88': 'CE',
+ '89': 'PI',
+ '91': 'PA',
+ '92': 'AM',
+ '93': 'PA', '94': 'PA',
+ '95': 'RR',
+ '96': 'AP',
+ '97': 'AM',
+ '98': 'MA', '99': 'MA'
+ }
+ }
+};
diff --git a/shared/js/mouse_event_shim.js b/shared/js/mouse_event_shim.js
new file mode 100644
index 0000000..053ef7f
--- /dev/null
+++ b/shared/js/mouse_event_shim.js
@@ -0,0 +1,282 @@
+/**
+ * mouse_event_shim.js: generate mouse events from touch events.
+ *
+ * This library listens for touch events and generates mousedown, mousemove
+ * mouseup, and click events to match them. It captures and dicards any
+ * real mouse events (non-synthetic events with isTrusted true) that are
+ * send by gecko so that there are not duplicates.
+ *
+ * This library does emit mouseover/mouseout and mouseenter/mouseleave
+ * events. You can turn them off by setting MouseEventShim.trackMouseMoves to
+ * false. This means that mousemove events will always have the same target
+ * as the mousedown even that began the series. You can also call
+ * MouseEventShim.setCapture() from a mousedown event handler to prevent
+ * mouse tracking until the next mouseup event.
+ *
+ * This library does not support multi-touch but should be sufficient
+ * to do drags based on mousedown/mousemove/mouseup events.
+ *
+ * This library does not emit dblclick events or contextmenu events
+ */
+
+'use strict';
+
+(function() {
+ // Make sure we don't run more than once
+ if (MouseEventShim)
+ return;
+
+ // Bail if we're not on running on a platform that sends touch
+ // events. We don't need the shim code for mouse events.
+ try {
+ document.createEvent('TouchEvent');
+ } catch (e) {
+ return;
+ }
+
+ var starttouch; // The Touch object that we started with
+ var target; // The element the touch is currently over
+ var emitclick; // Will we be sending a click event after mouseup?
+
+ // Use capturing listeners to discard all mouse events from gecko
+ window.addEventListener('mousedown', discardEvent, true);
+ window.addEventListener('mouseup', discardEvent, true);
+ window.addEventListener('mousemove', discardEvent, true);
+ window.addEventListener('click', discardEvent, true);
+
+ function discardEvent(e) {
+ if (e.isTrusted) {
+ e.stopImmediatePropagation(); // so it goes no further
+ if (e.type === 'click')
+ e.preventDefault(); // so it doesn't trigger a change event
+ }
+ }
+
+ // Listen for touch events that bubble up to the window.
+ // If other code has called stopPropagation on the touch events
+ // then we'll never see them. Also, we'll honor the defaultPrevented
+ // state of the event and will not generate synthetic mouse events
+ window.addEventListener('touchstart', handleTouchStart);
+ window.addEventListener('touchmove', handleTouchMove);
+ window.addEventListener('touchend', handleTouchEnd);
+ window.addEventListener('touchcancel', handleTouchEnd); // Same as touchend
+
+ function handleTouchStart(e) {
+ // If we're already handling a touch, ignore this one
+ if (starttouch)
+ return;
+
+ // Ignore any event that has already been prevented
+ if (e.defaultPrevented)
+ return;
+
+ // Sometimes an unknown gecko bug causes us to get a touchstart event
+ // for an iframe target that we can't use because it is cross origin.
+ // Don't start handling a touch in that case
+ try {
+ e.changedTouches[0].target.ownerDocument;
+ }
+ catch (e) {
+ // Ignore the event if we can't see the properties of the target
+ return;
+ }
+
+ // If there is more than one simultaneous touch, ignore all but the first
+ starttouch = e.changedTouches[0];
+ target = starttouch.target;
+ emitclick = true;
+
+ // Move to the position of the touch
+ emitEvent('mousemove', target, starttouch);
+
+ // Now send a synthetic mousedown
+ var result = emitEvent('mousedown', target, starttouch);
+
+ // If the mousedown was prevented, pass that on to the touch event.
+ // And remember not to send a click event
+ if (!result) {
+ e.preventDefault();
+ emitclick = false;
+ }
+ }
+
+ function handleTouchEnd(e) {
+ if (!starttouch)
+ return;
+
+ // End a MouseEventShim.setCapture() call
+ if (MouseEventShim.capturing) {
+ MouseEventShim.capturing = false;
+ MouseEventShim.captureTarget = null;
+ }
+
+ for (var i = 0; i < e.changedTouches.length; i++) {
+ var touch = e.changedTouches[i];
+ // If the ended touch does not have the same id, skip it
+ if (touch.identifier !== starttouch.identifier)
+ continue;
+
+ emitEvent('mouseup', target, touch);
+
+ // If target is still the same element we started and the touch did not
+ // move more than the threshold and if the user did not prevent
+ // the mousedown, then send a click event, too.
+ if (emitclick)
+ emitEvent('click', starttouch.target, touch);
+
+ starttouch = null;
+ return;
+ }
+ }
+
+ function handleTouchMove(e) {
+ if (!starttouch)
+ return;
+
+ for (var i = 0; i < e.changedTouches.length; i++) {
+ var touch = e.changedTouches[i];
+ // If the ended touch does not have the same id, skip it
+ if (touch.identifier !== starttouch.identifier)
+ continue;
+
+ // Don't send a mousemove if the touchmove was prevented
+ if (e.defaultPrevented)
+ return;
+
+ // See if we've moved too much to emit a click event
+ var dx = Math.abs(touch.screenX - starttouch.screenX);
+ var dy = Math.abs(touch.screenY - starttouch.screenY);
+ if (dx > MouseEventShim.dragThresholdX ||
+ dy > MouseEventShim.dragThresholdY) {
+ emitclick = false;
+ }
+
+ var tracking = MouseEventShim.trackMouseMoves &&
+ !MouseEventShim.capturing;
+
+ if (tracking) {
+ // If the touch point moves, then the element it is over
+ // may have changed as well. Note that calling elementFromPoint()
+ // forces a layout if one is needed.
+ // XXX: how expensive is it to do this on each touchmove?
+ // Can we listen for (non-standard) touchleave events instead?
+ var oldtarget = target;
+ var newtarget = document.elementFromPoint(touch.clientX, touch.clientY);
+ if (newtarget === null) {
+ // this can happen as the touch is moving off of the screen, e.g.
+ newtarget = oldtarget;
+ }
+ if (newtarget !== oldtarget) {
+ leave(oldtarget, newtarget, touch); // mouseout, mouseleave
+ target = newtarget;
+ }
+ }
+ else if (MouseEventShim.captureTarget) {
+ target = MouseEventShim.captureTarget;
+ }
+
+ emitEvent('mousemove', target, touch);
+
+ if (tracking && newtarget !== oldtarget) {
+ enter(newtarget, oldtarget, touch); // mouseover, mouseenter
+ }
+ }
+ }
+
+ // Return true if element a contains element b
+ function contains(a, b) {
+ return (a.compareDocumentPosition(b) & 16) !== 0;
+ }
+
+ // A touch has left oldtarget and entered newtarget
+ // Send out all the events that are required
+ function leave(oldtarget, newtarget, touch) {
+ emitEvent('mouseout', oldtarget, touch, newtarget);
+
+ // If the touch has actually left oldtarget (and has not just moved
+ // into a child of oldtarget) send a mouseleave event. mouseleave
+ // events don't bubble, so we have to repeat this up the hierarchy.
+ for (var e = oldtarget; !contains(e, newtarget); e = e.parentNode) {
+ emitEvent('mouseleave', e, touch, newtarget);
+ }
+ }
+
+ // A touch has entered newtarget from oldtarget
+ // Send out all the events that are required.
+ function enter(newtarget, oldtarget, touch) {
+ emitEvent('mouseover', newtarget, touch, oldtarget);
+
+ // Emit non-bubbling mouseenter events if the touch actually entered
+ // newtarget and wasn't already in some child of it
+ for (var e = newtarget; !contains(e, oldtarget); e = e.parentNode) {
+ emitEvent('mouseenter', e, touch, oldtarget);
+ }
+ }
+
+ function emitEvent(type, target, touch, relatedTarget) {
+ var synthetic = document.createEvent('MouseEvents');
+ var bubbles = (type !== 'mouseenter' && type !== 'mouseleave');
+ var count =
+ (type === 'mousedown' || type === 'mouseup' || type === 'click') ? 1 : 0;
+
+ synthetic.initMouseEvent(type,
+ bubbles, // canBubble
+ true, // cancelable
+ window,
+ count, // detail: click count
+ touch.screenX,
+ touch.screenY,
+ touch.clientX,
+ touch.clientY,
+ false, // ctrlKey: we don't have one
+ false, // altKey: we don't have one
+ false, // shiftKey: we don't have one
+ false, // metaKey: we don't have one
+ 0, // we're simulating the left button
+ relatedTarget || null);
+
+ try {
+ return target.dispatchEvent(synthetic);
+ }
+ catch (e) {
+ console.warn('Exception calling dispatchEvent', type, e);
+ return true;
+ }
+ }
+}());
+
+var MouseEventShim = {
+ // It is a known gecko bug that synthetic events have timestamps measured
+ // in microseconds while regular events have timestamps measured in
+ // milliseconds. This utility function returns a the timestamp converted
+ // to milliseconds, if necessary.
+ getEventTimestamp: function(e) {
+ if (e.isTrusted) // XXX: Are real events always trusted?
+ return e.timeStamp;
+ else
+ return e.timeStamp / 1000;
+ },
+
+ // Set this to false if you don't care about mouseover/out events
+ // and don't want the target of mousemove events to follow the touch
+ trackMouseMoves: true,
+
+ // Call this function from a mousedown event handler if you want to guarantee
+ // that the mousemove and mouseup events will go to the same element
+ // as the mousedown even if they leave the bounds of the element. This is
+ // like setting trackMouseMoves to false for just one drag. It is a
+ // substitute for event.target.setCapture(true)
+ setCapture: function(target) {
+ this.capturing = true; // Will be set back to false on mouseup
+ if (target)
+ this.captureTarget = target;
+ },
+
+ capturing: false,
+
+ // Keep these in sync with ui.dragThresholdX and ui.dragThresholdY prefs.
+ // If a touch ever moves more than this many pixels from its starting point
+ // then we will not synthesize a click event when the touch ends.
+ dragThresholdX: 25,
+ dragThresholdY: 25
+};
diff --git a/shared/js/notification_helper.js b/shared/js/notification_helper.js
new file mode 100644
index 0000000..384fbfc
--- /dev/null
+++ b/shared/js/notification_helper.js
@@ -0,0 +1,68 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+/**
+ * Keeping a reference on all active notifications to avoid weird GC issues.
+ * See https://bugzilla.mozilla.org/show_bug.cgi?id=755402
+ */
+
+var NotificationHelper = {
+ _referencesArray: [],
+
+ getIconURI: function nc_getIconURI(app, entryPoint) {
+ var icons = app.manifest.icons;
+
+ if (entryPoint) {
+ icons = app.manifest.entry_points[entryPoint].icons;
+ }
+
+ if (!icons)
+ return null;
+
+ var sizes = Object.keys(icons).map(function parse(str) {
+ return parseInt(str, 10);
+ });
+ sizes.sort(function(x, y) { return y - x; });
+
+ var HVGA = document.documentElement.clientWidth < 480;
+ var index = sizes[HVGA ? sizes.length - 1 : 0];
+ return app.installOrigin + icons[index];
+ },
+
+ send: function nc_send(title, body, icon, clickCB, closeCB) {
+ if (!('mozNotification' in navigator))
+ return;
+
+ var notification = navigator.mozNotification.createNotification(title,
+ body, icon);
+
+ notification.onclick = (function() {
+ if (clickCB)
+ clickCB();
+
+ this._forget(notification);
+ }).bind(this);
+
+ notification.onclose = (function() {
+ if (closeCB)
+ closeCB();
+
+ this._forget(notification);
+ }).bind(this);
+
+ notification.show();
+ this._keep(notification);
+ },
+
+ _keep: function nc_keep(notification) {
+ this._referencesArray.push(notification);
+ },
+ _forget: function nc_forget(notification) {
+ this._referencesArray.splice(
+ this._referencesArray.indexOf(notification), 1
+ );
+ }
+};
+
diff --git a/shared/js/phoneNumberJS/PhoneNumber.js b/shared/js/phoneNumberJS/PhoneNumber.js
new file mode 100644
index 0000000..16f9e80
--- /dev/null
+++ b/shared/js/phoneNumberJS/PhoneNumber.js
@@ -0,0 +1,335 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+var PhoneNumber = (function (dataBase) {
+ // Use strict in our context only - users might not want it
+ 'use strict';
+
+ const UNICODE_DIGITS = /[\uFF10-\uFF19\u0660-\u0669\u06F0-\u06F9]/g;
+ const ALPHA_CHARS = /[a-zA-Z]/g;
+ const NON_ALPHA_CHARS = /[^a-zA-Z]/g;
+ const NON_DIALABLE_CHARS = /[^+\*\d]/g;
+ const PLUS_CHARS = /^[+\uFF0B]+/;
+ const BACKSLASH = /\\/g;
+ const COMMACOMMA = /,,/g;
+ const COMMABRACKET = /,]/g;
+ const SPLIT_FIRST_GROUP = /^(\d+)(.*)$/;
+
+ // Format of the string encoded meta data. If the name contains "^" or "$"
+ // we will generate a regular expression from the value, with those special
+ // characters as prefix/suffix.
+ const META_DATA_ENCODING = ["region",
+ "^internationalPrefix",
+ "nationalPrefix",
+ "^nationalPrefixForParsing",
+ "nationalPrefixTransformRule",
+ "nationalPrefixFormattingRule",
+ "^possiblePattern$",
+ "^nationalPattern$",
+ "formats"];
+
+ const FORMAT_ENCODING = ["^pattern$",
+ "nationalFormat",
+ "^leadingDigits",
+ "nationalPrefixFormattingRule",
+ "internationalFormat"];
+
+ var regionCache = Object.create(null);
+
+ // Parse an array of strings into a convenient object. We store meta
+ // data as arrays since thats much more compact than JSON.
+ function ParseArray(array, encoding, obj) {
+ for (var n = 0; n < encoding.length; ++n) {
+ var value = array[n];
+ if (!value)
+ continue;
+ var field = encoding[n];
+ var fieldAlpha = field.replace(NON_ALPHA_CHARS, "");
+ if (field != fieldAlpha)
+ value = new RegExp(field.replace(fieldAlpha, value));
+ obj[fieldAlpha] = value;
+ }
+ return obj;
+ }
+
+ // Parse string encoded meta data into a convenient object
+ // representation.
+ function ParseMetaData(countryCode, md) {
+ var array = JSON.parse(md.replace(BACKSLASH, "\\\\").replace(COMMACOMMA, ', null,').replace(COMMACOMMA, ', null,').replace(COMMABRACKET, ', null]'));
+ md = ParseArray(array,
+ META_DATA_ENCODING,
+ { countryCode: countryCode });
+ regionCache[md.region] = md;
+ return md;
+ }
+
+ // Parse string encoded format data into a convenient object
+ // representation.
+ function ParseFormat(md) {
+ var formats = md.formats;
+ // Bail if we already parsed the format definitions.
+ if (!(Array.isArray(formats[0])))
+ return;
+ for (var n = 0; n < formats.length; ++n) {
+ formats[n] = ParseArray(formats[n],
+ FORMAT_ENCODING,
+ {});
+ }
+ }
+
+ // Search for the meta data associated with a region identifier ("US") in
+ // our database, which is indexed by country code ("1"). Since we have
+ // to walk the entire database for this, we cache the result of the lookup
+ // for future reference.
+ function FindMetaDataForRegion(region) {
+ // Check in the region cache first. This will find all entries we have
+ // already resolved (parsed from a string encoding).
+ var md = regionCache[region];
+ if (md)
+ return md;
+ for (var countryCode in dataBase) {
+ var entry = dataBase[countryCode];
+ // Each entry is a string encoded object of the form '["US..', or
+ // an array of strings. We don't want to parse the string here
+ // to save memory, so we just substring the region identifier
+ // and compare it. For arrays, we compare against all region
+ // identifiers with that country code. We skip entries that are
+ // of type object, because they were already resolved (parsed into
+ // an object), and their country code should have been in the cache.
+ if (Array.isArray(entry)) {
+ for (var n = 0; n < entry.length; ++n) {
+ if (typeof entry[n] == "string" && entry[n].substr(2,2) == region)
+ return entry[n] = ParseMetaData(countryCode, entry[n]);
+ }
+ continue;
+ }
+ if (typeof entry == "string" && entry.substr(2,2) == region)
+ return dataBase[countryCode] = ParseMetaData(countryCode, entry);
+ }
+ }
+
+ // Format a national number for a given region. The boolean flag "intl"
+ // indicates whether we want the national or international format.
+ function FormatNumber(regionMetaData, number, intl) {
+ // We lazily parse the format description in the meta data for the region,
+ // so make sure to parse it now if we haven't already done so.
+ ParseFormat(regionMetaData);
+ var formats = regionMetaData.formats;
+ for (var n = 0; n < formats.length; ++n) {
+ var format = formats[n];
+ // The leading digits field is optional. If we don't have it, just
+ // use the matching pattern to qualify numbers.
+ if (format.leadingDigits && !format.leadingDigits.test(number))
+ continue;
+ if (!format.pattern.test(number))
+ continue;
+ if (intl) {
+ // If there is no international format, just fall back to the national
+ // format.
+ var internationalFormat = format.internationalFormat;
+ if (!internationalFormat)
+ internationalFormat = format.nationalFormat;
+ // Some regions have numbers that can't be dialed from outside the
+ // country, indicated by "NA" for the international format of that
+ // number format pattern.
+ if (internationalFormat == "NA")
+ return null;
+ // Prepend "+" and the country code.
+ number = "+" + regionMetaData.countryCode + " " +
+ number.replace(format.pattern, internationalFormat);
+ } else {
+ number = number.replace(format.pattern, format.nationalFormat);
+ // The region has a national prefix formatting rule, and it can be overwritten
+ // by each actual number format rule.
+ var nationalPrefixFormattingRule = regionMetaData.nationalPrefixFormattingRule;
+ if (format.nationalPrefixFormattingRule)
+ nationalPrefixFormattingRule = format.nationalPrefixFormattingRule;
+ if (nationalPrefixFormattingRule) {
+ // The prefix formatting rule contains two magic markers, "$NP" and "$FG".
+ // "$NP" will be replaced by the national prefix, and "$FG" with the
+ // first group of numbers.
+ var match = number.match(SPLIT_FIRST_GROUP);
+ var firstGroup = match[1];
+ var rest = match[2];
+ var prefix = nationalPrefixFormattingRule;
+ prefix = prefix.replace("$NP", regionMetaData.nationalPrefix);
+ prefix = prefix.replace("$FG", firstGroup);
+ number = prefix + rest;
+ }
+ }
+ return (number == "NA") ? null : number;
+ }
+ return null;
+ }
+
+ function NationalNumber(regionMetaData, number) {
+ this.region = regionMetaData.region;
+ this.regionMetaData = regionMetaData;
+ this.nationalNumber = number;
+ }
+
+ // NationalNumber represents the result of parsing a phone number. We have
+ // three getters on the prototype that format the number in national and
+ // international format. Once called, the getters put a direct property
+ // onto the object, caching the result.
+ NationalNumber.prototype = {
+ // +1 949-726-2896
+ get internationalFormat() {
+ var value = FormatNumber(this.regionMetaData, this.nationalNumber, true);
+ Object.defineProperty(this, "internationalFormat", { value: value, enumerable: true });
+ return value;
+ },
+ // (949) 726-2896
+ get nationalFormat() {
+ var value = FormatNumber(this.regionMetaData, this.nationalNumber, false);
+ Object.defineProperty(this, "nationalFormat", { value: value, enumerable: true });
+ return value;
+ },
+ // +19497262896
+ get internationalNumber() {
+ var value = this.internationalFormat.replace(NON_DIALABLE_CHARS, "");
+ Object.defineProperty(this, "nationalNumber", { value: value, enumerable: true });
+ return value;
+ }
+ };
+
+ // Normalize a number by converting unicode numbers and symbols to their
+ // ASCII equivalents and removing all non-dialable characters.
+ function NormalizeNumber(number) {
+ number = number.replace(UNICODE_DIGITS,
+ function (ch) {
+ return String.fromCharCode(48 + (ch.charCodeAt(0) & 0xf));
+ });
+ number = number.replace(ALPHA_CHARS,
+ function (ch) {
+ return (ch.toLowerCase().charCodeAt(0) - 97)/3+2 | 0;
+ });
+ number = number.replace(PLUS_CHARS, "+");
+ number = number.replace(NON_DIALABLE_CHARS, "");
+ return number;
+ }
+
+ // Check whether the number is valid for the given region.
+ function IsValidNumber(number, md) {
+ return md.possiblePattern.test(number);
+ }
+
+ // Check whether the number is a valid national number for the given region.
+ function IsNationalNumber(number, md) {
+ return IsValidNumber(number, md) && md.nationalPattern.test(number);
+ }
+
+ // Determine the country code a number starts with, or return null if
+ // its not a valid country code.
+ function ParseCountryCode(number) {
+ for (var n = 1; n <= 3; ++n) {
+ var cc = number.substr(0,n);
+ if (dataBase[cc])
+ return cc;
+ }
+ return null;
+ }
+
+ // Parse an international number that starts with the country code. Return
+ // null if the number is not a valid international number.
+ function ParseInternationalNumber(number) {
+ var ret;
+
+ // Parse and strip the country code.
+ var countryCode = ParseCountryCode(number);
+ if (!countryCode)
+ return null;
+ number = number.substr(countryCode.length);
+
+ // Lookup the meta data for the region (or regions) and if the rest of
+ // the number parses for that region, return the parsed number.
+ var entry = dataBase[countryCode];
+ if (Array.isArray(entry)) {
+ for (var n = 0; n < entry.length; ++n) {
+ if (typeof entry[n] == "string")
+ entry[n] = ParseMetaData(countryCode, entry[n]);
+ if (ret = ParseNationalNumber(number, entry[n]))
+ return ret;
+ }
+ return null;
+ }
+ if (typeof entry == "string")
+ entry = dataBase[countryCode] = ParseMetaData(countryCode, entry);
+ return ParseNationalNumber(number, entry);
+ }
+
+ // Parse a national number for a specific region. Return null if the
+ // number is not a valid national number (it might still be a possible
+ // number for parts of that region).
+ function ParseNationalNumber(number, md) {
+ if (!md.possiblePattern.test(number) ||
+ !md.nationalPattern.test(number)) {
+ return null;
+ }
+ // Success.
+ return new NationalNumber(md, number);
+ }
+
+ // Parse a number and transform it into the national format, removing any
+ // international dial prefixes and country codes.
+ function ParseNumber(number, defaultRegion) {
+ var ret;
+
+ // Remove formating characters and whitespace.
+ number = NormalizeNumber(number);
+
+ // Detect and strip leading '+'.
+ if (number[0] === '+')
+ return ParseInternationalNumber(number.replace(PLUS_CHARS, ""));
+
+ // Lookup the meta data for the given region.
+ var md = FindMetaDataForRegion(defaultRegion.toUpperCase());
+
+ // See if the number starts with an international prefix, and if the
+ // number resulting from stripping the code is valid, then remove the
+ // prefix and flag the number as international.
+ if (md.internationalPrefix.test(number)) {
+ var possibleNumber = number.replace(md.internationalPrefix, "");
+ if (ret = ParseInternationalNumber(possibleNumber))
+ return ret;
+ }
+
+ // This is not an international number. See if its a national one for
+ // the current region. National numbers can start with the national
+ // prefix, or without.
+ if (md.nationalPrefixForParsing) {
+ // Some regions have specific national prefix parse rules. Apply those.
+ var withoutPrefix = number.replace(md.nationalPrefixForParsing,
+ md.nationalPrefixTransformRule);
+ if (ret = ParseNationalNumber(withoutPrefix, md))
+ return ret;
+ } else {
+ // If there is no specific national prefix rule, just strip off the
+ // national prefix from the beginning of the number (if there is one).
+ var nationalPrefix = md.nationalPrefix;
+ if (nationalPrefix && number.indexOf(nationalPrefix) == 0 &&
+ (ret = ParseNationalNumber(number.substr(nationalPrefix.length), md))) {
+ return ret;
+ }
+ }
+ if (ret = ParseNationalNumber(number, md))
+ return ret;
+
+ // If the number matches the possible numbers of the current region,
+ // return it as a possible number.
+ if (md.possiblePattern.test(number))
+ return new NationalNumber(md, number);
+
+ // Now lets see if maybe its an international number after all, but
+ // without '+' or the international prefix.
+ if (ret = ParseInternationalNumber(number))
+ return ret;
+
+ // We couldn't parse the number at all.
+ return null;
+ }
+
+ return {
+ Parse: ParseNumber
+ };
+})(PHONE_NUMBER_META_DATA);
diff --git a/shared/js/phoneNumberJS/PhoneNumberMetaData.js b/shared/js/phoneNumberJS/PhoneNumberMetaData.js
new file mode 100644
index 0000000..a901a78
--- /dev/null
+++ b/shared/js/phoneNumberJS/PhoneNumberMetaData.js
@@ -0,0 +1,218 @@
+/* Automatically generated. Do not edit. */
+const PHONE_NUMBER_META_DATA = {
+"46": '["SE","00","0",,,"$NP$FG","\\d{5,10}","[1-9]\\d{6,9}",[["(8)(\\d{2,3})(\\d{2,3})(\\d{2})","$1-$2 $3 $4","8",,"$1 $2 $3 $4"],["([1-69]\\d)(\\d{2,3})(\\d{2})(\\d{2})","$1-$2 $3 $4","1[013689]|2[0136]|3[1356]|4[0246]|54|6[03]|90",,"$1 $2 $3 $4"],["([1-69]\\d)(\\d{3})(\\d{2})","$1-$2 $3","1[13689]|2[136]|3[1356]|4[0246]|54|6[03]|90",,"$1 $2 $3"],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1-$2 $3 $4","1[2457]|2[2457-9]|3[0247-9]|4[1357-9]|5[0-35-9]|6[124-9]|9(?:[125-8]|3[0-5]|4[0-3])",,"$1 $2 $3 $4"],["(\\d{3})(\\d{2,3})(\\d{2})","$1-$2 $3","1[2457]|2[2457-9]|3[0247-9]|4[1357-9]|5[0-35-9]|6[124-9]|9(?:[125-8]|3[0-5]|4[0-3])",,"$1 $2 $3"],["(7\\d)(\\d{3})(\\d{2})(\\d{2})","$1-$2 $3 $4","7",,"$1 $2 $3 $4"],["(20)(\\d{2,3})(\\d{2})","$1-$2 $3","20",,"$1 $2 $3"],["(9[034]\\d)(\\d{2})(\\d{2})(\\d{3})","$1-$2 $3 $4","9[034]",,"$1 $2 $3 $4"]]]',
+"299": '["GL","00",,,,,"\\d{6}","[1-689]\\d{5}",[["(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",,,]]]',
+"385": '["HR","00","0",,,"$NP$FG","\\d{6,12}","[1-7]\\d{5,8}|[89]\\d{6,11}",[["(1)(\\d{4})(\\d{3})","$1 $2 $3","1",,],["(6[09])(\\d{4})(\\d{3})","$1 $2 $3","6[09]",,],["(62)(\\d{3})(\\d{3,4})","$1 $2 $3","62",,],["([2-5]\\d)(\\d{3})(\\d{3})","$1 $2 $3","[2-5]",,],["(9\\d)(\\d{3})(\\d{3,4})","$1 $2 $3","9",,],["(9\\d)(\\d{4})(\\d{4})","$1 $2 $3","9",,],["(9\\d)(\\d{3,4})(\\d{3})(\\d{3})","$1 $2 $3 $4","9",,],["(\\d{2})(\\d{2})(\\d{2,3})","$1 $2 $3","6[145]|7",,],["(\\d{2})(\\d{3,4})(\\d{3})","$1 $2 $3","6[145]|7",,],["(80[01])(\\d{2})(\\d{2,3})","$1 $2 $3","8",,],["(80[01])(\\d{3,4})(\\d{3})","$1 $2 $3","8",,]]]',
+"670": '["TL","00",,,,,"\\d{7,8}","[2-489]\\d{6}|7\\d{6,7}",[["(\\d{3})(\\d{4})","$1 $2","[2-489]",,],["(\\d{4})(\\d{4})","$1 $2","7",,]]]',
+"258": '["MZ","00",,,,,"\\d{8,9}","[28]\\d{7,8}",[["([28]\\d)(\\d{3})(\\d{3,4})","$1 $2 $3","2|8[246]",,],["(80\\d)(\\d{3})(\\d{3})","$1 $2 $3","80",,]]]',
+"359": '["BG","00","0",,,"$NP$FG","\\d{5,9}","[23567]\\d{5,7}|[489]\\d{6,8}",[["(2)(\\d{5})","$1 $2","29",,],["(2)(\\d{3})(\\d{3,4})","$1 $2 $3","2",,],["(\\d{3})(\\d{4})","$1 $2","43[124-7]|70[1-9]",,],["(\\d{3})(\\d{3})(\\d{2})","$1 $2 $3","43[124-7]|70[1-9]",,],["(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3","[78]00",,],["(\\d{2})(\\d{3})(\\d{2,3})","$1 $2 $3","[356]|7[1-9]|8[1-6]|9[1-7]",,],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3","48|8[7-9]|9[08]",,]]]',
+"682": '["CK","00",,,,,"\\d{5}","[2-57]\\d{4}",[["(\\d{2})(\\d{3})","$1 $2",,,]]]',
+"852": '["HK","00",,,,,"\\d{5,11}","[235-7]\\d{7}|8\\d{7,8}|9\\d{4,10}",[["(\\d{4})(\\d{4})","$1 $2","[235-7]|[89](?:0[1-9]|[1-9])",,],["(800)(\\d{3})(\\d{3})","$1 $2 $3","800",,],["(900)(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3 $4","900",,],["(900)(\\d{2,5})","$1 $2","900",,]]]',
+"998": '["UZ","810","8",,,"$NP $FG","\\d{7,9}","[679]\\d{8}",[["([679]\\d)(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"291": '["ER","00","0",,,"$NP$FG","\\d{6,7}","[178]\\d{6}",[["(\\d)(\\d{3})(\\d{3})","$1 $2 $3",,,]]]',
+"95": '["MM","00","0",,,"$NP$FG","\\d{5,10}","[124-8]\\d{5,7}|9(?:[25689]|4\\d{1,2}|7\\d)\\d{6}",[["(1)(\\d{3})(\\d{3})","$1 $2 $3","1",,],["(1)(3)(33\\d)(\\d{3})","$1 $2 $3 $4","133",,],["(2)(\\d{2})(\\d{3})","$1 $2 $3","2",,],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","67|81",,],["(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3","[4-8]",,],["(9)(\\d{3})(\\d{4,5})","$1 $2 $3","9(?:[25-9]|4[1349])",,],["(9)(4\\d{4})(\\d{4})","$1 $2 $3","94[0256]",,]]]',
+"266": '["LS","00",,,,,"\\d{8}","[2568]\\d{7}",[["(\\d{4})(\\d{4})","$1 $2",,,]]]',
+"245": '["GW","00",,,,,"\\d{7}","[3567]\\d{6}",[["(\\d{3})(\\d{4})","$1 $2",,,]]]',
+"374": '["AM","00","0",,,"($NP$FG)","\\d{5,8}","[1-9]\\d{7}",[["(\\d{2})(\\d{6})","$1 $2","1|47",,],["(\\d{2})(\\d{6})","$1 $2","[5-7]|9[1-9]","$NP$FG",],["(\\d{3})(\\d{5})","$1 $2","[23]",,],["(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3","8|90","$NP $FG",]]]',
+"379": '["VA","00",,,,,"\\d{10}","06\\d{8}",[["(06)(\\d{4})(\\d{4})","$1 $2 $3",,,]]]',
+"61": ['["AU","(?:14(?:1[14]|34|4[17]|[56]6|7[47]|88))?001[14-689]","0",,,,"\\d{6,10}","[1-578]\\d{5,9}",[["([2378])(\\d{4})(\\d{4})","$1 $2 $3","[2378]","($NP$FG)",],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3","[45]|14","$NP$FG",],["(16)(\\d{3})(\\d{2,4})","$1 $2 $3","16","$NP$FG",],["(1[389]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","1(?:[38]0|90)","$FG",],["(180)(2\\d{3})","$1 $2","180","$FG",],["(19\\d)(\\d{3})","$1 $2","19[13]","$FG",],["(19\\d{2})(\\d{4})","$1 $2","19[67]","$FG",],["(13)(\\d{2})(\\d{2})","$1 $2 $3","13[1-9]","$FG",]]]','["CC","(?:14(?:1[14]|34|4[17]|[56]6|7[47]|88))?001[14-689]","0",,,,"\\d{6,10}","[1458]\\d{5,9}",]','["CX","(?:14(?:1[14]|34|4[17]|[56]6|7[47]|88))?001[14-689]","0",,,,"\\d{6,10}","[1458]\\d{5,9}",]'],
+"500": '["FK","00",,,,,"\\d{5}","[2-7]\\d{4}",]',
+"261": '["MG","00","0",,,"$NP$FG","\\d{7,9}","[23]\\d{8}",[["([23]\\d)(\\d{2})(\\d{3})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"92": '["PK","00","0",,,"($NP$FG)","\\d{6,12}","1\\d{8}|[2-8]\\d{5,11}|9(?:[013-9]\\d{4,9}|2\\d(?:111\\d{6}|\\d{3,7}))",[["(\\d{2})(111)(\\d{3})(\\d{3})","$1 $2 $3 $4","(?:2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91)1",,],["(\\d{3})(111)(\\d{3})(\\d{3})","$1 $2 $3 $4","2[349]|45|54|60|72|8[2-5]|9[2-9]",,],["(\\d{2})(\\d{7,8})","$1 $2","(?:2[125]|4[0-246-9]|5[1-35-7]|6[1-8]|7[14]|8[16]|91)[2-9]",,],["(\\d{3})(\\d{6,7})","$1 $2","2[349]|45|54|60|72|8[2-5]|9[2-9]",,],["(3\\d{2})(\\d{7})","$1 $2","3","$NP$FG",],["([15]\\d{3})(\\d{5,6})","$1 $2","58[12]|1",,],["(586\\d{2})(\\d{5})","$1 $2","586",,],["([89]00)(\\d{3})(\\d{2})","$1 $2 $3","[89]00","$NP$FG",]]]',
+"234": '["NG","009","0",,,"$NP$FG","\\d{5,14}","[1-69]\\d{5,8}|[78]\\d{5,13}",[["([129])(\\d{3})(\\d{3,4})","$1 $2 $3","[129]",,],["([3-8]\\d)(\\d{3})(\\d{2,3})","$1 $2 $3","[3-6]|7(?:[1-79]|0[1-9])|8[2-9]",,],["([78]\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3","70|8[01]",,],["([78]00)(\\d{4})(\\d{4,5})","$1 $2 $3","[78]00",,],["([78]00)(\\d{5})(\\d{5,6})","$1 $2 $3","[78]00",,],["(78)(\\d{2})(\\d{3})","$1 $2 $3","78",,]]]',
+"350": '["GI","00",,,,,"\\d{8}","[2568]\\d{7}",]',
+"45": '["DK","00",,,,,"\\d{8}","[2-9]\\d{7}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"963": '["SY","00","0",,,"$NP$FG","\\d{6,9}","[1-59]\\d{7,8}",[["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3","[1-5]",,],["(9\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","9",,]]]',
+"226": '["BF","00",,,,,"\\d{8}","[24-7]\\d{7}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"974": '["QA","00",,,,,"\\d{7,8}","[2-8]\\d{6,7}",[["([28]\\d{2})(\\d{4})","$1 $2","[28]",,],["([3-7]\\d{3})(\\d{4})","$1 $2","[3-7]",,]]]',
+"218": '["LY","00","0",,,"$NP$FG","\\d{7,9}","[25679]\\d{8}",[["([25679]\\d)(\\d{7})","$1-$2",,,]]]',
+"51": '["PE","19(?:1[124]|77|90)00","0",,,"($NP$FG)","\\d{6,9}","[14-9]\\d{7,8}",[["(1)(\\d{7})","$1 $2","1",,],["([4-8]\\d)(\\d{6})","$1 $2","[4-7]|8[2-4]",,],["(\\d{3})(\\d{5})","$1 $2","80",,],["(9\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","9","$FG",]]]',
+"62": '["ID","0(?:0[1789]|10(?:00|1[67]))","0",,,"$NP$FG","\\d{5,11}","[1-9]\\d{6,10}",[["(\\d{2})(\\d{7,8})","$1 $2","2[124]|[36]1","($NP$FG)",],["(\\d{3})(\\d{5,7})","$1 $2","[4579]|2[035-9]|[36][02-9]","($NP$FG)",],["(8\\d{2})(\\d{3,4})(\\d{3,4})","$1-$2-$3","8[1-35-9]",,],["(177)(\\d{6,8})","$1 $2","1",,],["(800)(\\d{5,7})","$1 $2","800",,],["(809)(\\d)(\\d{3})(\\d{3})","$1 $2 $3 $4","809",,]]]',
+"298": '["FO","00",,"(10(?:01|[12]0|88))",,,"\\d{6}","[2-9]\\d{5}",[["(\\d{6})","$1",,,]]]',
+"381": '["RS","00","0",,,"$NP$FG","\\d{5,12}","[126-9]\\d{4,11}|3(?:[0-79]\\d{3,10}|8[2-9]\\d{2,9})",[["([23]\\d{2})(\\d{4,9})","$1 $2","(?:2[389]|39)0",,],["([1-3]\\d)(\\d{5,10})","$1 $2","1|2(?:[0-24-7]|[389][1-9])|3(?:[0-8]|9[1-9])",,],["(6\\d)(\\d{6,8})","$1 $2","6",,],["([89]\\d{2})(\\d{3,9})","$1 $2","[89]",,],["(7[26])(\\d{4,9})","$1 $2","7[26]",,],["(7[08]\\d)(\\d{4,9})","$1 $2","7[08]",,]]]',
+"975": '["BT","00",,,,,"\\d{6,8}","[1-8]\\d{6,7}",[["([17]7)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","1|77",,],["([2-8])(\\d{3})(\\d{3})","$1 $2 $3","[2-68]|7[246]",,]]]',
+"34": '["ES","00",,,,,"\\d{9}","[5-9]\\d{8}",[["([5-9]\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"881": '["001",,,,,,"\\d{9}","[67]\\d{8}",[["(\\d)(\\d{3})(\\d{5})","$1 $2 $3","[67]",,]]]',
+"855": '["KH","00[14-9]","0",,,,"\\d{6,10}","[1-9]\\d{7,9}",[["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3","1\\d[1-9]|[2-9]","$NP$FG",],["(1[89]00)(\\d{3})(\\d{3})","$1 $2 $3","1[89]0",,]]]',
+"420": '["CZ","00",,,,,"\\d{9,12}","[2-8]\\d{8}|9\\d{8,11}",[["([2-9]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","[2-8]|9[015-7]",,],["(96\\d)(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4","96",,],["(9\\d)(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4","9[36]",,]]]',
+"216": '["TN","00",,,,,"\\d{8}","[2-57-9]\\d{7}",[["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",,,]]]',
+"673": '["BN","00",,,,,"\\d{7}","[2-578]\\d{6}",[["([2-578]\\d{2})(\\d{4})","$1 $2",,,]]]',
+"290": '["SH","00",,,,,"\\d{4}","[2-9]\\d{3}",]',
+"882": '["001",,,,,,"\\d{7,12}","[13]\\d{6,11}",[["(\\d{2})(\\d{4})(\\d{3})","$1 $2 $3","3[23]",,],["(\\d{2})(\\d{5})","$1 $2","16|342",,],["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3","34[57]",,],["(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3","348",,],["(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3","1",,],["(\\d{2})(\\d{3,4})(\\d{4})","$1 $2 $3","16",,],["(\\d{2})(\\d{4,5})(\\d{5})","$1 $2 $3","16",,]]]',
+"267": '["BW","00",,,,,"\\d{7,8}","[2-79]\\d{6,7}",[["(\\d{3})(\\d{4})","$1 $2","[2-6]",,],["(7\\d)(\\d{3})(\\d{3})","$1 $2 $3","7",,],["(90)(\\d{5})","$1 $2","9",,]]]',
+"94": '["LK","00","0",,,"$NP$FG","\\d{7,9}","[1-9]\\d{8}",[["(\\d{2})(\\d{1})(\\d{6})","$1 $2 $3","[1-689]",,],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3","7",,]]]',
+"356": '["MT","00",,,,,"\\d{8}","[2579]\\d{7}",[["(\\d{4})(\\d{4})","$1 $2",,,]]]',
+"375": '["BY","810","8","80?",,,"\\d{7,11}","[1-4]\\d{8}|[89]\\d{9,10}",[["([1-4]\\d)(\\d{3})(\\d{4})","$1 $2 $3","[1-4]","$NP 0$FG",],["([89]\\d{2})(\\d{3})(\\d{4})","$1 $2 $3","8[01]|9","$NP $FG",],["(8\\d{2})(\\d{4})(\\d{4})","$1 $2 $3","82","$NP $FG",]]]',
+"690": '["TK","00",,,,,"\\d{4}","[2-5]\\d{3}",]',
+"507": '["PA","00",,,,,"\\d{7,8}","[1-9]\\d{6,7}",[["(\\d{3})(\\d{4})","$1-$2","[1-57-9]",,],["(\\d{4})(\\d{4})","$1-$2","6",,]]]',
+"692": '["MH","011","1",,,,"\\d{7}","[2-6]\\d{6}",[["(\\d{3})(\\d{4})","$1-$2",,,]]]',
+"250": '["RW","00","0",,,,"\\d{8,9}","[027-9]\\d{7,8}",[["(2\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","2","$FG",],["([7-9]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","[7-9]","$NP$FG",],["(0\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","0",,]]]',
+"81": '["JP","010","0",,,"$NP$FG","\\d{7,16}","[1-9]\\d{8,9}|0(?:[36]\\d{7,14}|7\\d{5,7}|8\\d{7})",[["(\\d{3})(\\d{3})(\\d{3})","$1-$2-$3","(?:12|57|99)0",,],["(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3","800",,],["(\\d{3})(\\d{4})","$1-$2","077",,],["(\\d{3})(\\d{2})(\\d{3,4})","$1-$2-$3","077",,],["(\\d{3})(\\d{2})(\\d{4})","$1-$2-$3","088",,],["(\\d{3})(\\d{3})(\\d{3,4})","$1-$2-$3","0(?:37|66)",,],["(\\d{3})(\\d{4})(\\d{4,5})","$1-$2-$3","0(?:37|66)",,],["(\\d{3})(\\d{5})(\\d{5,6})","$1-$2-$3","0(?:37|66)",,],["(\\d{3})(\\d{6})(\\d{6,7})","$1-$2-$3","0(?:37|66)",,],["(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3","[2579]0|80[1-9]",,],["(\\d{4})(\\d)(\\d{4})","$1-$2-$3","1(?:26|3[79]|4[56]|5[4-68]|6[3-5])|5(?:76|97)|499|746|8(?:3[89]|63|47|51)|9(?:49|80|9[16])",,],["(\\d{3})(\\d{2})(\\d{4})","$1-$2-$3","1(?:2[3-6]|3[3-9]|4[2-6]|5[2-8]|[68][2-7]|7[2-689]|9[1-578])|2(?:2[03-689]|3[3-58]|4[0-468]|5[04-8]|6[013-8]|7[06-9]|8[02-57-9]|9[13])|4(?:2[28]|3[689]|6[035-7]|7[05689]|80|9[3-5])|5(?:3[1-36-9]|4[4578]|5[013-8]|6[1-9]|7[2-8]|8[14-7]|9[4-9])|7(?:2[15]|3[5-9]|4[02-9]|6[135-8]|7[0-4689]|9[014-9])|8(?:2[49]|3[3-8]|4[5-8]|5[2-9]|6[35-9]|7[579]|8[03-579]|9[2-8])|9(?:[23]0|4[02-46-9]|5[024-79]|6[4-9]|7[2-47-9]|8[02-7]|9[3-7])",,],["(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3","1|2(?:2[37]|5[5-9]|64|78|8[39]|91)|4(?:2[2689]|64|7[347])|5(?:[2-589]|39)|60|8(?:[46-9]|3[279]|2[124589])|9(?:[235-8]|93)",,],["(\\d{3})(\\d{2})(\\d{4})","$1-$2-$3","2(?:9[14-79]|74|[34]7|[56]9)|82|993",,],["(\\d)(\\d{4})(\\d{4})","$1-$2-$3","3|4(?:2[09]|7[01])|6[1-9]",,],["(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3","[2479][1-9]",,]]]',
+"237": '["CM","00",,,,,"\\d{8}","[237-9]\\d{7}",[["([237-9]\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[2379]|88",,],["(800)(\\d{2})(\\d{3})","$1 $2 $3","80",,]]]',
+"351": '["PT","00",,,,,"\\d{9}","[2-46-9]\\d{8}",[["([2-46-9]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",,,]]]',
+"246": '["IO","00",,,,,"\\d{7}","3\\d{6}",[["(\\d{3})(\\d{4})","$1 $2",,,]]]',
+"227": '["NE","00",,,,,"\\d{8}","[029]\\d{7}",[["([029]\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[29]|09",,],["(08)(\\d{3})(\\d{3})","$1 $2 $3","08",,]]]',
+"27": '["ZA","00","0",,,"$NP$FG","\\d{5,9}","[1-5]\\d{8}|(?:7\\d{4,8}|8[1-5789]\\d{3,7})|8[06]\\d{7}",[["(860)(\\d{3})(\\d{3})","$1 $2 $3","860",,],["([1-578]\\d)(\\d{3})(\\d{4})","$1 $2 $3","[1-57]|8(?:[0-57-9]|6[1-9])",,],["(\\d{2})(\\d{3,4})","$1 $2","7|8[1-5789]",,],["(\\d{2})(\\d{3})(\\d{2,3})","$1 $2 $3","7|8[1-5789]",,]]]',
+"962": '["JO","00","0",,,"$NP$FG","\\d{7,9}","[235-9]\\d{7,8}",[["(\\d)(\\d{3})(\\d{4})","$1 $2 $3","[2356]|87","($NP$FG)",],["(7)(\\d{4})(\\d{4})","$1 $2 $3","7[457-9]",,],["(\\d{3})(\\d{5,6})","$1 $2","70|8[0158]|9",,]]]',
+"387": '["BA","00","0",,,"$NP$FG","\\d{6,9}","[3-9]\\d{7,8}",[["(\\d{2})(\\d{3})(\\d{3})","$1 $2-$3","[3-5]",,],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","6[1-356]|[7-9]",,],["(\\d{2})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4","6[047]",,]]]',
+"33": '["FR","[04579]0","0",,,"$NP$FG","\\d{4}(?:\\d{5})?","[124-9]\\d{8}|3\\d{3}(?:\\d{5})?",[["([1-79])(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5","[1-79]",,],["(8\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","8","$NP $FG",]]]',
+"972": '["IL","0(?:0|1[2-9])","0",,,"$FG","\\d{4,10}","[17]\\d{6,9}|[2-589]\\d{3}(?:\\d{3,6})?|6\\d{3}",[["([2-489])(\\d{3})(\\d{4})","$1-$2-$3","[2-489]","$NP$FG",],["([57]\\d)(\\d{3})(\\d{4})","$1-$2-$3","[57]","$NP$FG",],["(1)([7-9]\\d{2})(\\d{3})(\\d{3})","$1-$2-$3-$4","1[7-9]",,],["(1255)(\\d{3})","$1-$2","125",,],["(1200)(\\d{3})(\\d{3})","$1-$2-$3","120",,],["(1212)(\\d{2})(\\d{2})","$1-$2-$3","121",,],["(1599)(\\d{6})","$1-$2","15",,],["(\\d{4})","*$1","[2-689]",,]]]',
+"248": '["SC","0[0-2]",,,,,"\\d{6,7}","[24689]\\d{5,6}",[["(\\d{3})(\\d{3})","$1 $2","[89]",,],["(\\d)(\\d{3})(\\d{3})","$1 $2 $3","[246]",,]]]',
+"297": '["AW","00",,,,,"\\d{7}","[25-9]\\d{6}",[["(\\d{3})(\\d{4})","$1 $2",,,]]]',
+"421": '["SK","00","0",,,"$NP$FG","\\d{9}","[2-689]\\d{8}",[["(2)(\\d{3})(\\d{3})(\\d{2})","$1/$2 $3 $4","2",,],["([3-5]\\d)(\\d{3})(\\d{2})(\\d{2})","$1/$2 $3 $4","[3-5]",,],["([689]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","[689]",,]]]',
+"672": '["NF","00",,,,,"\\d{5,6}","[13]\\d{5}",[["(\\d{2})(\\d{4})","$1 $2","1",,],["(\\d)(\\d{5})","$1 $2","3",,]]]',
+"870": '["001",,,,,,"\\d{9}","[35-7]\\d{8}",[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",,,]]]',
+"883": '["001",,,,,,"\\d{9}(?:\\d{3})?","51\\d{7}(?:\\d{3})?",[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",,,],["(\\d{3})(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3 $4",,,]]]',
+"264": '["NA","00","0",,,"$NP$FG","\\d{8,9}","[68]\\d{7,8}",[["(8\\d)(\\d{3})(\\d{4})","$1 $2 $3","8[1235]",,],["(6\\d)(\\d{2,3})(\\d{4})","$1 $2 $3","6",,],["(88)(\\d{3})(\\d{3})","$1 $2 $3","88",,],["(870)(\\d{3})(\\d{3})","$1 $2 $3","870",,]]]',
+"878": '["001",,,,,,"\\d{12}","1\\d{11}",[["(\\d{2})(\\d{5})(\\d{5})","$1 $2 $3",,,]]]',
+"239": '["ST","00",,,,,"\\d{7}","[29]\\d{6}",[["(\\d{3})(\\d{4})","$1 $2",,,]]]',
+"357": '["CY","00",,,,,"\\d{8}","[257-9]\\d{7}",[["(\\d{2})(\\d{6})","$1 $2",,,]]]',
+"240": '["GQ","00",,,,,"\\d{9}","[23589]\\d{8}",[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3","[235]",,],["(\\d{3})(\\d{6})","$1 $2","[89]",,]]]',
+"506": '["CR","00",,"(19(?:0[0-2468]|19|66|77))",,,"\\d{8,10}","[24-9]\\d{7,9}",[["(\\d{4})(\\d{4})","$1 $2","[24-7]|8[3-9]",,],["(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3","[89]0",,]]]',
+"86": '["CN","(1[1279]\\d{3})?00","0","(1[1279]\\d{3})|0",,,"\\d{4,12}","[1-79]\\d{7,11}|8[0-357-9]\\d{6,9}",[["(80\\d{2})(\\d{4})","$1 $2","80[2678]","$NP$FG",],["([48]00)(\\d{3})(\\d{4})","$1 $2 $3","[48]00",,],["(\\d{3,4})(\\d{4})","$1 $2","[2-9]",,"NA"],["(21)(\\d{4})(\\d{4,6})","$1 $2 $3","21","$NP$FG",],["([12]\\d)(\\d{4})(\\d{4})","$1 $2 $3","10[1-9]|2[02-9]","$NP$FG",],["(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3","3(?:11|7[179])|4(?:[15]1|3[12])|5(?:1|2[37]|3[12]|7[13-79]|9[15])|7(?:31|5[457]|6[09]|91)|898","$NP$FG",],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","3(?:1[02-9]|35|49|5|7[02-68]|9[1-68])|4(?:1[02-9]|2[179]|[35][2-9]|6[4789]|7\\d|8[23])|5(?:3[03-9]|4[36]|5|6[1-6]|7[028]|80|9[2-46-9])|6(?:3[1-5]|6[0238]|9[12])|7(?:01|[1579]|2[248]|3[04-9]|4[3-6]|6[2368])|8(?:1[236-8]|2[5-7]|[37]|5[1-9]|8[3678]|9[1-7])|9(?:0[1-3689]|1[1-79]|[379]|4[13]|5[1-5])","$NP$FG",],["(1[3-58]\\d)(\\d{4})(\\d{4})","$1 $2 $3","1[3-58]",,],["(10800)(\\d{3})(\\d{4})","$1 $2 $3","108",,]]]',
+"257": '["BI","00",,,,,"\\d{8}","[27]\\d{7}",[["([27]\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"683": '["NU","00",,,,,"\\d{4}","[1-5]\\d{3}",]',
+"43": '["AT","00","0",,,"$NP$FG","\\d{3,13}","[1-9]\\d{3,12}",[["(1)(\\d{3,12})","$1 $2","1",,],["(5\\d)(\\d{3,5})","$1 $2","5[079]",,],["(5\\d)(\\d{3})(\\d{3,4})","$1 $2 $3","5[079]",,],["(5\\d)(\\d{4})(\\d{4,7})","$1 $2 $3","5[079]",,],["(\\d{3})(\\d{3,10})","$1 $2","316|46|51|732|6(?:44|5[0-3579]|[6-9])|7(?:1|[28]0)|[89]",,],["(\\d{4})(\\d{3,9})","$1 $2","2|3(?:1[1-578]|[3-8])|4[2378]|5[2-6]|6(?:[12]|4[1-35-9]|5[468])|7(?:2[1-8]|35|4[1-8]|[57-9])",,]]]',
+"247": '["AC","00",,,,,"\\d{4}","[2-467]\\d{3}",]',
+"675": '["PG","00",,,,,"\\d{7,8}","[1-9]\\d{6,7}",[["(\\d{3})(\\d{4})","$1 $2","[1-689]",,],["(7[1-36]\\d)(\\d{2})(\\d{3})","$1 $2 $3","7[1-36]",,]]]',
+"376": '["AD","00",,,,,"\\d{6,8}","(?:[346-9]|180)\\d{5}",[["(\\d{3})(\\d{3})","$1 $2","[346-9]",,],["(180[02])(\\d{4})","$1 $2","1",,]]]',
+"63": '["PH","00","0",,,,"\\d{7,13}","[2-9]\\d{7,9}|1800\\d{7,9}",[["(2)(\\d{3})(\\d{4})","$1 $2 $3","2","($NP$FG)",],["(\\d{4})(\\d{5})","$1 $2","3(?:23|39|46)|4(?:2[3-6]|[35]9|4[26]|76)|5(?:22|44)|642|8(?:62|8[245])","($NP$FG)",],["(\\d{5})(\\d{4})","$1 $2","346|4(?:27|9[35])|883","($NP$FG)",],["([3-8]\\d)(\\d{3})(\\d{4})","$1 $2 $3","[3-8]","($NP$FG)",],["(9\\d{2})(\\d{3})(\\d{4})","$1 $2 $3","9","$NP$FG",],["(1800)(\\d{3})(\\d{4})","$1 $2 $3","1",,],["(1800)(\\d{1,2})(\\d{3})(\\d{4})","$1 $2 $3 $4","1",,]]]',
+"236": '["CF","00",,,,,"\\d{8}","[278]\\d{7}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"590": ['["GP","00","0",,,"$NP$FG","\\d{9}","[56]\\d{8}",[["([56]90)(\\d{2})(\\d{4})","$1 $2-$3",,,]]]','["BL","00","0",,,,"\\d{9}","[56]\\d{8}",]','["MF","00","0",,,,"\\d{9}","[56]\\d{8}",]'],
+"53": '["CU","119","0",,,"($NP$FG)","\\d{4,8}","[2-57]\\d{5,7}",[["(\\d)(\\d{6,7})","$1 $2","7",,],["(\\d{2})(\\d{4,6})","$1 $2","[2-4]",,],["(\\d)(\\d{7})","$1 $2","5","$NP$FG",]]]',
+"64": '["NZ","0(?:0|161)","0",,,"$NP$FG","\\d{7,11}","6[235-9]\\d{6}|[2-57-9]\\d{7,10}",[["([34679])(\\d{3})(\\d{4})","$1-$2 $3","[3467]|9[1-9]",,],["(24099)(\\d{3})","$1 $2","240",,],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","21",,],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3","2(?:1[1-9]|[69]|7[0-35-9])|86",,],["(2\\d)(\\d{3,4})(\\d{4})","$1 $2 $3","2[028]",,],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3","2(?:10|74)|5|[89]0",,]]]',
+"965": '["KW","00",,,,,"\\d{7,8}","[12569]\\d{6,7}",[["(\\d{4})(\\d{3,4})","$1 $2","[1269]",,],["(5[015]\\d)(\\d{5})","$1 $2","5",,]]]',
+"224": '["GN","00",,,,,"\\d{8,9}","[23567]\\d{7,8}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[23567]",,],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","62",,]]]',
+"973": '["BH","00",,,,,"\\d{8}","[136-9]\\d{7}",[["(\\d{4})(\\d{4})","$1 $2",,,]]]',
+"32": '["BE","00","0",,,"$NP$FG","\\d{8,9}","[1-9]\\d{7,8}",[["(4[6-9]\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","4[6-9]",,],["([2-49])(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4","[23]|[49][23]",,],["([15-8]\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[156]|7[0178]|8(?:0[1-9]|[1-79])",,],["([89]\\d{2})(\\d{2})(\\d{3})","$1 $2 $3","(?:80|9)0",,]]]',
+"249": '["SD","00","0",,,"$NP$FG","\\d{9}","[19]\\d{8}",[["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",,,]]]',
+"678": '["VU","00",,,,,"\\d{5,7}","[2-57-9]\\d{4,6}",[["(\\d{3})(\\d{4})","$1 $2","[579]",,]]]',
+"52": '["MX","0[09]","01","0[12]|04[45](\\d{10})","1$1","$NP $FG","\\d{7,11}","[1-9]\\d{9,10}",[["([358]\\d)(\\d{4})(\\d{4})","$1 $2 $3","33|55|81",,],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","[2467]|3[12457-9]|5[89]|8[02-9]|9[0-35-9]",,],["(1)([358]\\d)(\\d{4})(\\d{4})","044 $2 $3 $4","1(?:33|55|81)","$FG","$1 $2 $3 $4"],["(1)(\\d{3})(\\d{3})(\\d{4})","044 $2 $3 $4","1(?:[2467]|3[12457-9]|5[89]|8[2-9]|9[1-35-9])","$FG","$1 $2 $3 $4"]]]',
+"968": '["OM","00",,,,,"\\d{7,9}","(?:2[2-6]|5|9[1-9])\\d{6}|800\\d{5,6}",[["(2\\d)(\\d{6})","$1 $2","2",,],["(9\\d{3})(\\d{4})","$1 $2","9",,],["([58]00)(\\d{4,6})","$1 $2","[58]",,]]]',
+"599": ['["CW","00",,,,,"\\d{7,8}","[169]\\d{6,7}",[["(\\d{3})(\\d{4})","$1 $2","[13-7]",,],["(9)(\\d{3})(\\d{4})","$1 $2 $3","9",,]]]','["BQ","00",,,,,"\\d{7}","[347]\\d{6}",]'],
+"800": '["001",,,,,,"\\d{8}","\\d{8}",[["(\\d{4})(\\d{4})","$1 $2",,,]]]',
+"386": '["SI","00","0",,,"$NP$FG","\\d{5,8}","[1-7]\\d{6,7}|[89]\\d{4,7}",[["(\\d)(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4","[12]|3[4-8]|4[24-8]|5[2-8]|7[3-8]","($NP$FG)",],["([3-7]\\d)(\\d{3})(\\d{3})","$1 $2 $3","[37][01]|4[019]|51|6",,],["([89][09])(\\d{3,6})","$1 $2","[89][09]",,],["([58]\\d{2})(\\d{5})","$1 $2","59|8[1-3]",,]]]',
+"679": '["FJ","0(?:0|52)",,,,,"\\d{7}(?:\\d{4})?","[36-9]\\d{6}|0\\d{10}",[["(\\d{3})(\\d{4})","$1 $2","[36-9]",,],["(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3","0",,]]]',
+"238": '["CV","0",,,,,"\\d{7}","[259]\\d{6}",[["(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3",,,]]]',
+"691": '["FM","00",,,,,"\\d{7}","[39]\\d{6}",[["(\\d{3})(\\d{4})","$1 $2",,,]]]',
+"262": ['["RE","00","0",,,"$NP$FG","\\d{9}","[268]\\d{8}",[["([268]\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]','["YT","00","0",,,"$NP$FG","\\d{9}","[268]\\d{8}",]'],
+"241": '["GA","00","0",,,,"\\d{7,8}","[01]\\d{6,7}",[["(1)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","1","$NP$FG",],["(0\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","0",,]]]',
+"370": '["LT","00","8",,,"($NP-$FG)","\\d{8}","[3-9]\\d{7}",[["([34]\\d)(\\d{6})","$1 $2","37|4(?:1|5[45]|6[2-4])",,],["([3-6]\\d{2})(\\d{5})","$1 $2","3[148]|4(?:[24]|6[09])|528|6",,],["([7-9]\\d{2})(\\d{2})(\\d{3})","$1 $2 $3","[7-9]","$NP $FG",],["(5)(2\\d{2})(\\d{4})","$1 $2 $3","52[0-79]",,]]]',
+"256": '["UG","00[057]","0",,,"$NP$FG","\\d{5,9}","\\d{9}",[["(\\d{3})(\\d{6})","$1 $2","[7-9]|20(?:[013-5]|2[5-9])|4(?:6[45]|[7-9])",,],["(\\d{2})(\\d{7})","$1 $2","3|4(?:[1-5]|6[0-36-9])",,],["(2024)(\\d{5})","$1 $2","2024",,]]]',
+"677": '["SB","0[01]",,,,,"\\d{5,7}","[1-9]\\d{4,6}",[["(\\d{3})(\\d{4})","$1 $2","[7-9]",,]]]',
+"377": '["MC","00","0",,,"$NP$FG","\\d{8,9}","[4689]\\d{7,8}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[89]","$FG",],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","4",,],["(6)(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5","6",,]]]',
+"382": '["ME","00","0",,,"$NP$FG","\\d{6,9}","[2-9]\\d{7,8}",[["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","[2-57-9]|6[3789]",,],["(67)(9)(\\d{3})(\\d{3})","$1 $2 $3 $4","679",,]]]',
+"231": '["LR","00","0",,,"$NP$FG","\\d{7,9}","(?:[29]\\d|[4-6]|7\\d{1,2}|[38]\\d{2})\\d{6}",[["([279]\\d)(\\d{3})(\\d{3})","$1 $2 $3","[279]",,],["(7\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","7",,],["([4-6])(\\d{3})(\\d{3})","$1 $2 $3","[4-6]",,],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3","[38]",,]]]',
+"591": '["BO","00(1\\d)?","0","0(1\\d)?",,,"\\d{7,8}","[23467]\\d{7}",[["([234])(\\d{7})","$1 $2","[234]",,],["([67]\\d{7})","$1","[67]",,]]]',
+"808": '["001",,,,,,"\\d{8}","\\d{8}",[["(\\d{4})(\\d{4})","$1 $2",,,]]]',
+"964": '["IQ","00","0",,,"$NP$FG","\\d{6,10}","[1-7]\\d{7,9}",[["(1)(\\d{3})(\\d{4})","$1 $2 $3","1",,],["([2-6]\\d)(\\d{3})(\\d{3,4})","$1 $2 $3","[2-6]",,],["(7\\d{2})(\\d{3})(\\d{4})","$1 $2 $3","7",,]]]',
+"225": '["CI","00",,,,,"\\d{8}","[02-6]\\d{7}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"992": '["TJ","810","8",,,"($NP) $FG","\\d{3,9}","[3-59]\\d{8}",[["([349]\\d{2})(\\d{2})(\\d{4})","$1 $2 $3","[34]7|91[78]",,],["([459]\\d)(\\d{3})(\\d{4})","$1 $2 $3","4[48]|5|9(?:1[59]|[0235-9])",,],["(331700)(\\d)(\\d{2})","$1 $2 $3","331",,],["(\\d{4})(\\d)(\\d{4})","$1 $2 $3","3[1-5]",,]]]',
+"55": '["BR","00(?:1[45]|2[135]|[34]1|43)","0","0(?:(1[245]|2[135]|[34]1)(\\d{10,11}))?","$2",,"\\d{8,11}","[1-46-9]\\d{7,10}|5\\d{8,9}",[["(\\d{2})(\\d{5})(\\d{4})","$1 $2-$3","119","($FG)",],["(\\d{2})(\\d{4})(\\d{4})","$1 $2-$3","[1-9][1-9]","($FG)",],["([34]00\\d)(\\d{4})","$1-$2","[34]00",,],["([3589]00)(\\d{2,3})(\\d{4})","$1 $2 $3","[3589]00","$NP$FG",]]]',
+"674": '["NR","00",,,,,"\\d{7}","[458]\\d{6}",[["(\\d{3})(\\d{4})","$1 $2",,,]]]',
+"967": '["YE","00","0",,,"$NP$FG","\\d{6,9}","[1-7]\\d{6,8}",[["([1-7])(\\d{3})(\\d{3,4})","$1 $2 $3","[1-6]|7[24-68]",,],["(7\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","7[0137]",,]]]',
+"49": '["DE","00","0",,,"$NP$FG","\\d{2,15}","[1-35-9]\\d{3,14}|4(?:[0-8]\\d{4,12}|9(?:[0-37]\\d|4[1-8]|5\\d{1,2}|6[1-8]\\d?)\\d{2,7})",[["(\\d{2})(\\d{4,11})","$1 $2","3[02]|40|[68]9",,],["(\\d{3})(\\d{3,11})","$1 $2","2(?:\\d1|0[2389]|1[24]|28|34)|3(?:[3-9][15]|40)|[4-8][1-9]1|9(?:06|[1-9]1)",,],["(\\d{4})(\\d{2,11})","$1 $2","[24-6]|[7-9](?:\\d[1-9]|[1-9]\\d)|3(?:[3569][02-46-9]|4[2-4679]|7[2-467]|8[2-46-8])",,],["(\\d{5})(\\d{1,10})","$1 $2","3",,],["(1\\d{2})(\\d{7,8})","$1 $2","1[5-7]",,],["(177)(99)(\\d{7,8})","$1 $2 $3","177",,],["(8\\d{2})(\\d{7,10})","$1 $2","800",,],["(\\d{3})(\\d)(\\d{4,10})","$1 $2 $3","(?:18|90)0",,],["(1\\d{2})(\\d{5,11})","$1 $2","181",,],["(18\\d{3})(\\d{6})","$1 $2","185",,],["(18\\d{2})(\\d{7})","$1 $2","18[68]",,],["(18\\d)(\\d{8})","$1 $2","18[2-579]",,],["(700)(\\d{4})(\\d{4})","$1 $2 $3","700",,]]]',
+"31": '["NL","00","0",,,"$NP$FG","\\d{5,10}","1\\d{4,8}|[2-7]\\d{8}|[89]\\d{6,9}",[["([1-578]\\d)(\\d{3})(\\d{4})","$1 $2 $3","1[035]|2[0346]|3[03568]|4[0356]|5[0358]|7|8[458]",,],["([1-5]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","1[16-8]|2[259]|3[124]|4[17-9]|5[124679]",,],["(6)(\\d{8})","$1 $2","6[0-57-9]",,],["(66)(\\d{7})","$1 $2","66",,],["(14)(\\d{3,4})","$1 $2","14","$FG",],["([89]0\\d)(\\d{4,7})","$1 $2","80|9",,]]]',
+"970": '["PS","00","0",,,"$NP$FG","\\d{4,10}","[24589]\\d{7,8}|1(?:[78]\\d{8}|[49]\\d{2,3})",[["([2489])(2\\d{2})(\\d{4})","$1 $2 $3","[2489]",,],["(5[69]\\d)(\\d{3})(\\d{3})","$1 $2 $3","5",,],["(1[78]00)(\\d{3})(\\d{3})","$1 $2 $3","1[78]","$FG",]]]',
+"58": '["VE","00","0","(1\\d{2})|0",,"$NP$FG","\\d{7,10}","[24589]\\d{9}",[["(\\d{3})(\\d{7})","$1-$2",,,]]]',
+"856": '["LA","00","0",,,"$NP$FG","\\d{6,10}","[2-8]\\d{7,9}",[["(20)(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3 $4","20",,],["([2-8]\\d)(\\d{3})(\\d{3})","$1 $2 $3","2[13]|[3-8]",,]]]',
+"354": '["IS","00",,,,,"\\d{7,9}","[4-9]\\d{6}|38\\d{7}",[["(\\d{3})(\\d{4})","$1 $2","[4-9]",,],["(3\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","3",,]]]',
+"242": '["CG","00",,,,,"\\d{9}","[028]\\d{8}",[["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3","[02]",,],["(\\d)(\\d{4})(\\d{4})","$1 $2 $3","8",,]]]',
+"423": '["LI","00","0",,,,"\\d{7,9}","6\\d{8}|[23789]\\d{6}",[["(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3","[23]|7[3-57-9]|87",,],["(6\\d)(\\d{3})(\\d{3})","$1 $2 $3","6",,],["(6[567]\\d)(\\d{3})(\\d{3})","$1 $2 $3","6[567]",,],["(69)(7\\d{2})(\\d{4})","$1 $2 $3","697",,],["([7-9]0\\d)(\\d{2})(\\d{2})","$1 $2 $3","[7-9]0",,],["([89]0\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[89]0","$NP$FG",]]]',
+"213": '["DZ","00","0",,,"$NP$FG","\\d{8,9}","(?:[1-4]|[5-9]\\d)\\d{7}",[["([1-4]\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[1-4]",,],["([5-8]\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[5-8]",,],["(9\\d)(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4","9",,]]]',
+"371": '["LV","00",,,,,"\\d{8}","[2689]\\d{7}",[["([2689]\\d)(\\d{3})(\\d{3})","$1 $2 $3",,,]]]',
+"503": '["SV","00",,,,,"\\d{7,8}|\\d{11}","[267]\\d{7}|[89]\\d{6}(?:\\d{4})?",[["(\\d{4})(\\d{4})","$1 $2","[267]",,],["(\\d{3})(\\d{4})","$1 $2","[89]",,],["(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3","[89]",,]]]',
+"685": '["WS","0",,,,,"\\d{5,7}","[2-8]\\d{4,6}",[["(8\\d{2})(\\d{3,4})","$1 $2","8",,],["(7\\d)(\\d{5})","$1 $2","7",,]]]',
+"880": '["BD","00[12]?","0",,,"$NP$FG","\\d{6,10}","[2-79]\\d{5,9}|1\\d{9}|8[0-7]\\d{4,8}",[["(2)(\\d{7})","$1 $2","2",,],["(\\d{2})(\\d{4,6})","$1 $2","[3-79]1",,],["(\\d{3})(\\d{3,7})","$1 $2","[3-79][2-9]|8",,],["(\\d{4})(\\d{6})","$1 $2","1",,]]]',
+"265": '["MW","00","0",,,"$NP$FG","\\d{7,9}","(?:1(?:\\d{2})?|[2789]\\d{2})\\d{6}",[["(\\d)(\\d{3})(\\d{3})","$1 $2 $3","1",,],["(2\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","2",,],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[1789]",,]]]',
+"65": '["SG","0[0-3][0-9]",,,,,"\\d{8,11}","[36]\\d{7}|[17-9]\\d{7,10}",[["([3689]\\d{3})(\\d{4})","$1 $2","[369]|8[1-9]",,],["(1[89]00)(\\d{3})(\\d{4})","$1 $2 $3","1[89]",,],["(7000)(\\d{4})(\\d{3})","$1 $2 $3","70",,],["(800)(\\d{3})(\\d{4})","$1 $2 $3","80",,]]]',
+"504": '["HN","00",,,,,"\\d{8}","[237-9]\\d{7}",[["(\\d{4})(\\d{4})","$1-$2",,,]]]',
+"688": '["TV","00",,,,,"\\d{5,6}","[29]\\d{4,5}",]',
+"84": '["VN","00","0",,,"$NP$FG","\\d{7,10}","[17]\\d{6,9}|[2-69]\\d{7,9}|8\\d{6,8}",[["([17]99)(\\d{4})","$1 $2","[17]99",,],["([48])(\\d{4})(\\d{4})","$1 $2 $3","[48]",,],["([235-7]\\d)(\\d{4})(\\d{3})","$1 $2 $3","2[025-79]|3[0136-9]|5[2-9]|6[0-46-8]|7[02-79]",,],["(80)(\\d{5})","$1 $2","80",,],["(69\\d)(\\d{4,5})","$1 $2","69",,],["([235-7]\\d{2})(\\d{4})(\\d{3})","$1 $2 $3","2[1348]|3[25]|5[01]|65|7[18]",,],["(9\\d)(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4","9",,],["(1[2689]\\d)(\\d{3})(\\d{4})","$1 $2 $3","1(?:[26]|8[68]|99)",,],["(1[89]00)(\\d{4,6})","$1 $2","1[89]0","$FG",]]]',
+"255": '["TZ","00[056]","0",,,"$NP$FG","\\d{7,9}","\\d{9}",[["([24]\\d)(\\d{3})(\\d{4})","$1 $2 $3","[24]",,],["([67]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","[67]",,],["([89]\\d{2})(\\d{2})(\\d{4})","$1 $2 $3","[89]",,]]]',
+"222": '["MR","00",,,,,"\\d{8}","[2-48]\\d{7}",[["([2-48]\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"230": '["MU","0(?:[2-7]0|33)",,,,,"\\d{7}","[2-9]\\d{6}",[["([2-9]\\d{2})(\\d{4})","$1 $2",,,]]]',
+"592": '["GY","001",,,,,"\\d{7}","[2-4679]\\d{6}",[["(\\d{3})(\\d{4})","$1 $2",,,]]]',
+"41": '["CH","00","0",,,"$NP$FG","\\d{9}(?:\\d{3})?","[2-9]\\d{8}|860\\d{9}",[["([2-9]\\d)(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4","[2-7]|[89]1",,],["([89]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","8[047]|90",,],["(\\d{3})(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4 $5","860",,]]]',
+"39": '["IT","00",,,,,"\\d{6,11}","[01589]\\d{5,10}|3(?:[12457-9]\\d{8}|[36]\\d{7,9})",[["(\\d{2})(\\d{3,4})(\\d{4})","$1 $2 $3","0[26]|55",,],["(0[26])(\\d{4})(\\d{5})","$1 $2 $3","0[26]",,],["(0[26])(\\d{4,6})","$1 $2","0[26]",,],["(0\\d{2})(\\d{3,4})(\\d{4})","$1 $2 $3","0[13-57-9][0159]",,],["(\\d{3})(\\d{3,6})","$1 $2","0[13-57-9][0159]|8(?:03|4[17]|9[245])",,],["(0\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","0[13-57-9][2-46-8]",,],["(0\\d{3})(\\d{2,6})","$1 $2","0[13-57-9][2-46-8]",,],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3","[13]|8(?:00|4[08]|9[59])",,],["(\\d{4})(\\d{4})","$1 $2","894",,],["(\\d{3})(\\d{4})(\\d{4})","$1 $2 $3","3",,]]]',
+"993": '["TM","810","8",,,"($NP $FG)","\\d{8}","[1-6]\\d{7}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2-$3-$4","12",,],["(\\d{2})(\\d{6})","$1 $2","6","$NP $FG",],["(\\d{3})(\\d)(\\d{2})(\\d{2})","$1 $2-$3-$4","13|[2-5]",,]]]',
+"888": '["001",,,,,,"\\d{11}","\\d{11}",[["(\\d{3})(\\d{3})(\\d{5})","$1 $2 $3",,,]]]',
+"353": '["IE","00","0",,,"($NP$FG)","\\d{5,10}","[124-9]\\d{6,9}",[["(1)(\\d{3,4})(\\d{4})","$1 $2 $3","1",,],["(\\d{2})(\\d{5})","$1 $2","2[2-9]|4[347]|5[2-58]|6[2-47-9]|9[3-9]",,],["(\\d{3})(\\d{5})","$1 $2","40[24]|50[45]",,],["(48)(\\d{4})(\\d{4})","$1 $2 $3","48",,],["(818)(\\d{3})(\\d{3})","$1 $2 $3","81",,],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3","[24-69]|7[14]",,],["([78]\\d)(\\d{3,4})(\\d{4})","$1 $2 $3","76|8[35-9]","$NP$FG",],["(700)(\\d{3})(\\d{3})","$1 $2 $3","70","$NP$FG",],["(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3","1(?:8[059]|5)","$FG",]]]',
+"966": '["SA","00","0",,,"$NP$FG","\\d{7,10}","(?:[1-467]|92)\\d{7}|5\\d{8}|8\\d{9}",[["([1-467])(\\d{3})(\\d{4})","$1 $2 $3","[1-467]",,],["(5\\d)(\\d{3})(\\d{4})","$1 $2 $3","5",,],["(9200)(\\d{5})","$1 $2","9","$FG",],["(800)(\\d{3})(\\d{4})","$1 $2 $3","80","$FG",],["(8111)(\\d{3})(\\d{3})","$1 $2 $3","81",,]]]',
+"380": '["UA","00","0",,,"$NP$FG","\\d{5,9}","[3-689]\\d{8}",[["([3-69]\\d)(\\d{3})(\\d{4})","$1 $2 $3","39|4(?:[45][0-5]|87)|5(?:0|6[37]|7[37])|6[36-8]|9[1-9]",,],["([3-689]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","3[1-8]2|4[1378]2|5(?:[12457]2|6[24])|6(?:[49]2|[12][29]|5[24])|8|90",,],["([3-6]\\d{3})(\\d{5})","$1 $2","3(?:5[013-9]|[1-46-8])|4(?:[137][013-9]|6|[45][6-9]|8[4-6])|5(?:[1245][013-9]|6[0135-9]|3|7[4-6])|6(?:[49][013-9]|5[0135-9]|[12][13-8])",,]]]',
+"98": '["IR","00","0",,,"$NP$FG","\\d{4,10}","[2-6]\\d{4,9}|9(?:[1-4]\\d{8}|9\\d{2,8})|[178]\\d{9}",[["(21)(\\d{3,5})","$1 $2","21",,],["(21)(\\d{3})(\\d{3,4})","$1 $2 $3","21",,],["(21)(\\d{4})(\\d{4})","$1 $2 $3","21",,],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3","[13-9]|2[02-9]",,]]]',
+"971": '["AE","00","0",,,"$NP$FG","\\d{5,12}","[2-79]\\d{7,8}|800\\d{2,9}",[["([2-4679])(\\d{3})(\\d{4})","$1 $2 $3","[2-4679][2-8]",,],["(5[0256])(\\d{3})(\\d{4})","$1 $2 $3","5",,],["([4679]00)(\\d)(\\d{5})","$1 $2 $3","[4679]0","$FG",],["(800)(\\d{2,9})","$1 $2","8","$FG",]]]',
+"30": '["GR","00",,,,,"\\d{10}","[26-9]\\d{9}",[["([27]\\d)(\\d{4})(\\d{4})","$1 $2 $3","21|7",,],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","2[2-9]1|[689]",,],["(2\\d{3})(\\d{6})","$1 $2","2[2-9][02-9]",,]]]',
+"228": '["TG","00",,,,,"\\d{8}","[29]\\d{7}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"48": '["PL","00",,,,,"\\d{6,9}","[1-58]\\d{6,8}|9\\d{8}|[67]\\d{5,8}",[["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4","[124]|3[2-4]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145]",,],["(\\d{2})(\\d{4,6})","$1 $2","[124]|3[2-4]|5[24-689]|6[1-3578]|7[14-7]|8[1-7]",,],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3","39|5[013]|6[0469]|7[0289]|8[08]",,],["(\\d{3})(\\d{2})(\\d{2,3})","$1 $2 $3","64",,],["(\\d{3})(\\d{3})","$1 $2","64",,]]]',
+"886": '["TW","0(?:0[25679]|19)","0",,,"$NP$FG","\\d{8,9}","[2-9]\\d{7,8}",[["([2-8])(\\d{3,4})(\\d{4})","$1 $2 $3","[2-7]|8[1-9]",,],["([89]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","80|9",,]]]',
+"212": '["MA","00","0",,,"$NP$FG","\\d{9}","[5689]\\d{8}",[["([56]\\d{2})(\\d{6})","$1-$2","5(?:2[015-7]|3[0-4])|6",,],["([58]\\d{3})(\\d{5})","$1-$2","5(?:2[2-489]|3[5-9])|892",,],["(5\\d{4})(\\d{4})","$1-$2","5(?:29|38)",,],["(8[09])(\\d{7})","$1-$2","8(?:0|9[013-9])",,]]]',
+"372": '["EE","00",,,,,"\\d{4,10}","1\\d{3,4}|[3-9]\\d{6,7}|800\\d{6,7}",[["([3-79]\\d{2})(\\d{4})","$1 $2","[369]|4[3-8]|5(?:[0-2]|5[0-478]|6[45])|7[1-9]",,],["(70)(\\d{2})(\\d{4})","$1 $2 $3","70",,],["(8000)(\\d{3})(\\d{3})","$1 $2 $3","800",,],["([458]\\d{3})(\\d{3,4})","$1 $2","40|5|8(?:00|[1-5])",,]]]',
+"598": '["UY","0(?:1[3-9]\\d|0)","0",,,,"\\d{7,8}","[2489]\\d{6,7}",[["(\\d{4})(\\d{4})","$1 $2","[24]",,],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","9[1-9]","$NP$FG",],["(\\d{3})(\\d{4})","$1 $2","[89]0","$NP$FG",]]]',
+"502": '["GT","00",,,,,"\\d{8}(?:\\d{3})?","[2-7]\\d{7}|1[89]\\d{9}",[["(\\d{4})(\\d{4})","$1 $2","[2-7]",,],["(\\d{4})(\\d{3})(\\d{4})","$1 $2 $3","1",,]]]',
+"82": '["KR","00(?:[124-68]|[37]\\d{2})","0","0(8[1-46-8]|85\\d{2})?",,"$NP$FG","\\d{4,10}","[1-7]\\d{3,9}|8\\d{8}",[["(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3","1(?:0|1[19]|[69]9|5[458])|[57]0",,],["(\\d{2})(\\d{3,4})(\\d{4})","$1-$2-$3","1(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-6][1-9][2-9]",,],["(\\d{3})(\\d)(\\d{4})","$1-$2-$3","131",,],["(\\d{3})(\\d{2})(\\d{4})","$1-$2-$3","131",,],["(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3","13[2-9]",,],["(\\d{2})(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3-$4","30",,],["(\\d)(\\d{3,4})(\\d{4})","$1-$2-$3","2[2-9]",,],["(\\d)(\\d{3,4})","$1-$2","21[0-46-9]",,],["(\\d{2})(\\d{3,4})","$1-$2","[3-6][1-9]1",,],["(\\d{4})(\\d{4})","$1-$2","1(?:5[46-9]|6[04678])","$FG",]]]',
+"253": '["DJ","00",,,,,"\\d{8}","[27]\\d{7}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"91": '["IN","00","0",,,"$NP$FG","\\d{6,13}","1\\d{7,12}|[2-9]\\d{9,10}",[["(\\d{2})(\\d{2})(\\d{6})","$1 $2 $3","7(?:2[0579]|3[057-9]|4[0-389]|5[024-9]|6[0-35-9]|7[03469]|8[0-4679])|8(?:0[01589]|1[0-479]|2[236-9]|3[0-57-9]|[45]|6[0245789]|7[1-69]|8[0124-9]|9[02-9])|9",,],["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3","11|2[02]|33|4[04]|79|80[2-46]",,],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","1(?:2[0-249]|3[0-25]|4[145]|[569][14]|7[1257]|8[1346]|[68][1-9])|2(?:1[257]|3[013]|4[01]|5[0137]|6[0158]|78|8[1568]|9[14])|3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])|4(?:1[36]|2[1-47]|3[15]|5[12]|6[126-9]|7[0-24-9]|8[013-57]|9[014-7])|5(?:[136][25]|22|4[28]|5[12]|[78]1|9[15])|6(?:12|[2345]1|57|6[13]|7[14]|80)",,],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","7(?:12|2[14]|3[134]|4[47]|5[15]|[67]1|88)",,],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","8(?:16|2[014]|3[126]|6[136]|7[078]|8[34]|91)",,],["(\\d{4})(\\d{3})(\\d{3})","$1 $2 $3","1(?:[2-579]|[68][1-9])|[2-8]",,],["(1600)(\\d{2})(\\d{4})","$1 $2 $3","160","$FG",],["(1800)(\\d{4,5})","$1 $2","180","$FG",],["(18[06]0)(\\d{2,4})(\\d{4})","$1 $2 $3","18[06]","$FG",],["(\\d{4})(\\d{3})(\\d{4})(\\d{2})","$1 $2 $3 $4","18[06]","$FG",]]]',
+"389": '["MK","00","0",,,"$NP$FG","\\d{8}","[2-578]\\d{7}",[["(2)(\\d{3})(\\d{4})","$1 $2 $3","2",,],["([347]\\d)(\\d{3})(\\d{3})","$1 $2 $3","[347]",,],["([58]\\d{2})(\\d)(\\d{2})(\\d{2})","$1 $2 $3 $4","[58]",,]]]',
+"1": ['["US","011","1",,,,"\\d{7}(?:\\d{3})?","[2-9]\\d{9}",[["(\\d{3})(\\d{4})","$1-$2",,,"NA"],["(\\d{3})(\\d{3})(\\d{4})","($1) $2-$3",,,"$1-$2-$3"]]]','["AI","011","1",,,,"\\d{7}(?:\\d{3})?","[2589]\\d{9}",]','["AS","011","1",,,,"\\d{7}(?:\\d{3})?","[5689]\\d{9}",]','["BB","011","1",,,,"\\d{7}(?:\\d{3})?","[2589]\\d{9}",]','["BM","011","1",,,,"\\d{7}(?:\\d{3})?","[4589]\\d{9}",]','["BS","011","1",,,,"\\d{7}(?:\\d{3})?","[2589]\\d{9}",]','["CA","011","1",,,,"\\d{7}(?:\\d{3})?","[2-9]\\d{9}|3\\d{6}",]','["DM","011","1",,,,"\\d{7}(?:\\d{3})?","[57-9]\\d{9}",]','["DO","011","1",,,,"\\d{7}(?:\\d{3})?","[589]\\d{9}",]','["GD","011","1",,,,"\\d{7}(?:\\d{3})?","[4589]\\d{9}",]','["GU","011","1",,,,"\\d{7}(?:\\d{3})?","[5689]\\d{9}",]','["JM","011","1",,,,"\\d{7}(?:\\d{3})?","[589]\\d{9}",]','["KN","011","1",,,,"\\d{7}(?:\\d{3})?","[589]\\d{9}",]','["KY","011","1",,,,"\\d{7}(?:\\d{3})?","[3589]\\d{9}",]','["LC","011","1",,,,"\\d{7}(?:\\d{3})?","[5789]\\d{9}",]','["MP","011","1",,,,"\\d{7}(?:\\d{3})?","[5689]\\d{9}",]','["MS","011","1",,,,"\\d{7}(?:\\d{3})?","[5689]\\d{9}",]','["PR","011","1",,,,"\\d{7}(?:\\d{3})?","[5789]\\d{9}",]','["SX","011","1",,,,"\\d{7}(?:\\d{3})?","[5789]\\d{9}",]','["TC","011","1",,,,"\\d{7}(?:\\d{3})?","[5689]\\d{9}",]','["TT","011","1",,,,"\\d{7}(?:\\d{3})?","[589]\\d{9}",]','["AG","011","1",,,,"\\d{7}(?:\\d{3})?","[2589]\\d{9}",]','["VC","011","1",,,,"\\d{7}(?:\\d{3})?","[5789]\\d{9}",]','["VG","011","1",,,,"\\d{7}(?:\\d{3})?","[2589]\\d{9}",]','["VI","011","1",,,,"\\d{7}(?:\\d{3})?","[3589]\\d{9}",]'],
+"60": '["MY","00","0",,,,"\\d{6,10}","[13-9]\\d{7,9}",[["([4-79])(\\d{3})(\\d{4})","$1-$2 $3","[4-79]","$NP$FG",],["(3)(\\d{4})(\\d{4})","$1-$2 $3","3","$NP$FG",],["([18]\\d)(\\d{3})(\\d{3,4})","$1-$2 $3","1[02-46-9][1-9]|8","$NP$FG",],["(1)([36-8]00)(\\d{2})(\\d{4})","$1-$2-$3-$4","1[36-8]0",,],["(11)(\\d{4})(\\d{4})","$1-$2 $3","11","$NP$FG",],["(154)(\\d{3})(\\d{4})","$1-$2 $3","15","$NP$FG",]]]',
+"355": '["AL","00","0",,,"$NP$FG","\\d{5,9}","[2-57]\\d{7}|6\\d{8}|8\\d{5,7}|9\\d{5}",[["(4)(\\d{3})(\\d{4})","$1 $2 $3","4[0-6]",,],["(6[6-9])(\\d{3})(\\d{4})","$1 $2 $3","6",,],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","[2358][2-5]|4[7-9]",,],["(\\d{3})(\\d{3,5})","$1 $2","[235][16-9]|8[016-9]|[79]",,]]]',
+"254": '["KE","000","0",,,"$NP$FG","\\d{5,10}","20\\d{6,7}|[4-9]\\d{6,9}",[["(\\d{2})(\\d{4,7})","$1 $2","[24-6]",,],["(\\d{3})(\\d{6,7})","$1 $2","7",,],["(\\d{3})(\\d{3})(\\d{3,4})","$1 $2 $3","[89]",,]]]',
+"223": '["ML","00",,,,,"\\d{8}","[246-8]\\d{7}",[["([246-8]\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"686": '["KI","00",,"0",,,"\\d{5}","[2-689]\\d{4}",]',
+"994": '["AZ","00","0",,,"($NP$FG)","\\d{7,9}","[1-9]\\d{8}",[["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4","(?:1[28]|2(?:[45]2|[0-36])|365)",,],["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4","[4-8]","$NP$FG",],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","9","$NP$FG",]]]',
+"979": '["001",,,,,,"\\d{9}","\\d{9}",[["(\\d)(\\d{4})(\\d{4})","$1 $2 $3",,,]]]',
+"66": '["TH","00","0",,,"$NP$FG","\\d{4}|\\d{8,10}","[2-9]\\d{7,8}|1\\d{3}(?:\\d{6})?",[["(2)(\\d{3})(\\d{4})","$1 $2 $3","2",,],["([3-9]\\d)(\\d{3})(\\d{3,4})","$1 $2 $3","[3-9]",,],["(1[89]00)(\\d{3})(\\d{3})","$1 $2 $3","1","$FG",]]]',
+"233": '["GH","00","0",,,"$NP$FG","\\d{7,9}","[235]\\d{8}|8\\d{7}",[["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3","[235]",,],["(\\d{3})(\\d{5})","$1 $2","8",,]]]',
+"593": '["EC","00","0",,,"($NP$FG)","\\d{7,11}","1\\d{9,10}|[2-8]\\d{7}|9\\d{8}",[["(\\d)(\\d{3})(\\d{4})","$1 $2-$3","[247]|[356][2-8]",,"$1-$2-$3"],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3","9","$NP$FG",],["(1800)(\\d{3})(\\d{3,4})","$1 $2 $3","1","$FG",]]]',
+"509": '["HT","00",,,,,"\\d{8}","[2-489]\\d{7}",[["(\\d{2})(\\d{2})(\\d{4})","$1 $2 $3",,,]]]',
+"54": '["AR","00","0","0?(?:(11|2(?:2(?:02?|[13]|2[13-79]|4[1-6]|5[2457]|6[124-8]|7[1-4]|8[13-6]|9[1267])|3(?:02?|1[467]|2[03-6]|3[13-8]|[49][2-6]|5[2-8]|[67])|4(?:7[3-578]|9)|6(?:[0136]|2[24-6]|4[6-8]?|5[15-8])|80|9(?:0[1-3]|[19]|2\\d|3[1-6]|4[02568]?|5[2-4]|6[2-46]|72?|8[23]?))|3(?:3(?:2[79]|6|8[2578])|4(?:0[124-9]|[12]|3[5-8]?|4[24-7]|5[4-68]?|6[02-9]|7[126]|8[2379]?|9[1-36-8])|5(?:1|2[1245]|3[237]?|4[1-46-9]|6[2-4]|7[1-6]|8[2-5]?)|6[24]|7(?:1[1568]|2[15]|3[145]|4[13]|5[14-8]|[069]|7[2-57]|8[126])|8(?:[01]|2[15-7]|3[2578]?|4[13-6]|5[4-8]?|6[1-357-9]|7[36-8]?|8[5-8]?|9[124])))15)?","9$1","$NP$FG","\\d{6,11}","[1-368]\\d{9}|9\\d{10}",[["([68]\\d{2})(\\d{3})(\\d{4})","$1-$2-$3","[68]",,],["(9)(11)(\\d{4})(\\d{4})","$2 15-$3-$4","911",,"$1 $2 $3-$4"],["(9)(\\d{3})(\\d{3})(\\d{4})","$2 15-$3-$4","9(?:2[234689]|3[3-8])",,"$1 $2 $3-$4"],["(9)(\\d{4})(\\d{3})(\\d{3})","$2 15-$3-$4","93[58]",,],["(9)(\\d{4})(\\d{2})(\\d{4})","$2 15-$3-$4","9[23]",,"$1 $2 $3-$4"],["(11)(\\d{4})(\\d{4})","$1 $2-$3","1",,],["(\\d{3})(\\d{3})(\\d{4})","$1 $2-$3","2(?:2[013]|3[067]|49|6[01346]|80|9[147-9])|3(?:36|4[12358]|5[138]|6[24]|7[069]|8[013578])",,],["(\\d{4})(\\d{3})(\\d{3})","$1 $2-$3","3(?:53|8[78])",,],["(\\d{4})(\\d{2})(\\d{4})","$1 $2-$3","[23]",,]]]',
+"57": '["CO","00[579]|#555|#999","0","0([3579]|4(?:44|56))?",,,"\\d{7,11}","(?:[13]\\d{0,3}|[24-8])\\d{7}",[["(\\d)(\\d{7})","$1 $2","1(?:8[2-9]|9[0-3]|[2-7])|[24-8]","($FG)",],["(\\d{3})(\\d{7})","$1 $2","3",,],["(1)(\\d{3})(\\d{7})","$1-$2-$3","1(?:80|9[04])","$NP$FG","$1 $2 $3"]]]',
+"597": '["SR","00",,,,,"\\d{6,7}","[2-8]\\d{5,6}",[["(\\d{3})(\\d{3})","$1-$2","[2-4]|5[2-58]",,],["(\\d{2})(\\d{2})(\\d{2})","$1-$2-$3","56",,],["(\\d{3})(\\d{4})","$1-$2","[6-8]",,]]]',
+"676": '["TO","00",,,,,"\\d{5,7}","[02-8]\\d{4,6}",[["(\\d{2})(\\d{3})","$1-$2","[1-6]|7[0-4]|8[05]",,],["(\\d{3})(\\d{4})","$1 $2","7[5-9]|8[7-9]",,],["(\\d{4})(\\d{3})","$1 $2","0",,]]]',
+"505": '["NI","00",,,,,"\\d{8}","[128]\\d{7}",[["(\\d{4})(\\d{4})","$1 $2",,,]]]',
+"850": '["KP","00|99","0",,,"$NP$FG","\\d{6,8}|\\d{10}","1\\d{9}|[28]\\d{7}",[["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","1",,],["(\\d)(\\d{3})(\\d{4})","$1 $2 $3","2",,],["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","8",,]]]',
+"7": ['["RU","810","8",,,"$NP ($FG)","\\d{10}","[3489]\\d{9}",[["(\\d{3})(\\d{2})(\\d{2})","$1-$2-$3","[1-79]","$FG","NA"],["([3489]\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2-$3-$4","[34689]",,],["(7\\d{2})(\\d{3})(\\d{4})","$1 $2 $3","7",,]]]','["KZ","810","8",,,,"\\d{10}","(?:33\\d|7\\d{2}|80[09])\\d{7}",]'],
+"268": '["SZ","00",,,,,"\\d{8}","[027]\\d{7}",[["(\\d{4})(\\d{4})","$1 $2","[027]",,]]]',
+"501": '["BZ","00",,,,,"\\d{7}(?:\\d{4})?","[2-8]\\d{6}|0\\d{10}",[["(\\d{3})(\\d{4})","$1-$2","[2-8]",,],["(0)(800)(\\d{4})(\\d{3})","$1-$2-$3-$4","0",,]]]',
+"252": '["SO","00","0",,,,"\\d{7,9}","[1-79]\\d{6,8}",[["(\\d)(\\d{6})","$1 $2","2[0-79]|[13-5]",,],["(\\d)(\\d{7})","$1 $2","24|[67]",,],["(\\d{2})(\\d{5,7})","$1 $2","15|28|6[178]|9",,],["(69\\d)(\\d{6})","$1 $2","69",,]]]',
+"229": '["BJ","00",,,,,"\\d{4,8}","[2689]\\d{7}|7\\d{3}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"680": '["PW","01[12]",,,,,"\\d{7}","[2-8]\\d{6}",[["(\\d{3})(\\d{4})","$1 $2",,,]]]',
+"263": '["ZW","00","0",,,"$NP$FG","\\d{3,10}","2(?:[012457-9]\\d{3,8}|6\\d{3,6})|[13-79]\\d{4,8}|86\\d{8}",[["([49])(\\d{3})(\\d{2,5})","$1 $2 $3","4|9[2-9]",,],["([179]\\d)(\\d{3})(\\d{3,4})","$1 $2 $3","[19]1|7",,],["(86\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","86[24]",,],["([1-356]\\d)(\\d{3,5})","$1 $2","1[3-9]|2(?:[1-469]|0[0-35-9]|[45][0-79])|3(?:0[0-79]|1[0-689]|[24-69]|3[0-69])|5(?:[02-46-9]|[15][0-69])|6(?:[0145]|[29][0-79]|3[0-689]|[68][0-69])",,],["([1-356]\\d)(\\d{3})(\\d{3})","$1 $2 $3","1[3-9]|2(?:[1-469]|0[0-35-9]|[45][0-79])|3(?:0[0-79]|1[0-689]|[24-69]|3[0-69])|5(?:[02-46-9]|[15][0-69])|6(?:[0145]|[29][0-79]|3[0-689]|[68][0-69])",,],["([2356]\\d{2})(\\d{3,5})","$1 $2","2(?:[278]|0[45]|48)|3(?:08|17|3[78]|[78])|5[15][78]|6(?:[29]8|37|[68][78])",,],["([2356]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","2(?:[278]|0[45]|48)|3(?:08|17|3[78]|[78])|5[15][78]|6(?:[29]8|37|[68][78])",,],["([25]\\d{3})(\\d{3,5})","$1 $2","(?:25|54)8",,],["([25]\\d{3})(\\d{3})(\\d{3})","$1 $2 $3","(?:25|54)8",,],["(8\\d{3})(\\d{6})","$1 $2","86[1389]",,]]]',
+"90": '["TR","00","0",,,,"\\d{7,10}","[2-589]\\d{9}|444\\d{4}",[["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","[23]|4(?:[0-35-9]|4[0-35-9])","($NP$FG)",],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","[589]","$NP$FG",],["(444)(\\d{1})(\\d{3})","$1 $2 $3","444",,]]]',
+"352": '["LU","00",,"(15(?:0[06]|1[12]|35|4[04]|55|6[26]|77|88|99)\\d)",,,"\\d{4,11}","[24-9]\\d{3,10}|3(?:[0-46-9]\\d{2,9}|5[013-9]\\d{1,8})",[["(\\d{2})(\\d{3})","$1 $2","[2-5]|7[1-9]|[89](?:[1-9]|0[2-9])",,],["(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3","[2-5]|7[1-9]|[89](?:[1-9]|0[2-9])",,],["(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3","20",,],["(\\d{2})(\\d{2})(\\d{2})(\\d{1,2})","$1 $2 $3 $4","2(?:[0367]|4[3-8])",,],["(\\d{2})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4","20",,],["(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{1,2})","$1 $2 $3 $4 $5","2(?:[0367]|4[3-8])",,],["(\\d{2})(\\d{2})(\\d{2})(\\d{1,4})","$1 $2 $3 $4","2(?:[12589]|4[12])|[3-5]|7[1-9]|[89](?:[1-9]|0[2-9])",,],["(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3","[89]0[01]|70",,],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3","6",,]]]',
+"47": ['["NO","00",,,,,"\\d{5}(?:\\d{3})?","0\\d{4}|[2-9]\\d{7}",[["([489]\\d{2})(\\d{2})(\\d{3})","$1 $2 $3","[489]",,],["([235-7]\\d)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[235-7]",,]]]','["SJ","00",,,,,"\\d{5}(?:\\d{3})?","0\\d{4}|[4789]\\d{7}",]'],
+"243": '["CD","00","0",,,"$NP$FG","\\d{7,9}","[1-6]\\d{6}|8\\d{6,8}|9\\d{8}",[["([89]\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","8[0-259]|9",,],["(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3","8[48]",,],["(\\d{2})(\\d{5})","$1 $2","[1-6]",,]]]',
+"220": '["GM","00",,,,,"\\d{7}","[2-9]\\d{6}",[["(\\d{3})(\\d{4})","$1 $2",,,]]]',
+"687": '["NC","00",,,,,"\\d{6}","[2-47-9]\\d{5}",[["(\\d{2})(\\d{2})(\\d{2})","$1.$2.$3",,,]]]',
+"995": '["GE","810","8",,,,"\\d{6,9}","[3458]\\d{8}",[["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[348]","$NP $FG",],["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","5","$FG",]]]',
+"961": '["LB","00","0",,,,"\\d{7,8}","[13-9]\\d{6,7}",[["(\\d)(\\d{3})(\\d{3})","$1 $2 $3","[13-6]|7(?:[2-579]|62|8[0-7])|[89][2-9]","$NP$FG",],["([7-9]\\d)(\\d{3})(\\d{3})","$1 $2 $3","[89][01]|7(?:[01]|6[013-9]|8[89]|91)",,]]]',
+"40": '["RO","00","0",,,"$NP$FG","\\d{6,9}","2\\d{5,8}|[37-9]\\d{8}",[["([237]\\d)(\\d{3})(\\d{4})","$1 $2 $3","[23]1|7",,],["(21)(\\d{4})","$1 $2","21",,],["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3","[23][3-7]|[89]",,],["(2\\d{2})(\\d{3})","$1 $2","2[3-6]",,]]]',
+"232": '["SL","00","0",,,"($NP$FG)","\\d{6,8}","[2-578]\\d{7}",[["(\\d{2})(\\d{6})","$1 $2",,,]]]',
+"594": '["GF","00","0",,,"$NP$FG","\\d{9}","[56]\\d{8}",[["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"976": '["MN","001","0",,,"$NP$FG","\\d{6,10}","[12]\\d{7,9}|[57-9]\\d{7}",[["([12]\\d)(\\d{2})(\\d{4})","$1 $2 $3","[12]1",,],["([12]2\\d)(\\d{5,6})","$1 $2","[12]2[1-3]",,],["([12]\\d{3})(\\d{5})","$1 $2","[12](?:27|[3-5])",,],["(\\d{4})(\\d{4})","$1 $2","[57-9]","$FG",],["([12]\\d{4})(\\d{4,5})","$1 $2","[12](?:27|[3-5])",,]]]',
+"20": '["EG","00","0",,,"$NP$FG","\\d{5,10}","1\\d{4,9}|[2456]\\d{8}|3\\d{7}|[89]\\d{8,9}",[["(\\d)(\\d{7,8})","$1 $2","[23]",,],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","1[012]|[89]00",,],["(\\d{2})(\\d{6,7})","$1 $2","1(?:3|5[23])|[4-6]|[89][2-9]",,]]]',
+"689": '["PF","00",,,,,"\\d{6}","[2-9]\\d{5}",[["(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",,,]]]',
+"56": '["CL","(?:0|1(?:1[0-69]|2[0-57]|5[13-58]|69|7[0167]|8[018]))0","0","0|(1(?:1[0-69]|2[0-57]|5[13-58]|69|7[0167]|8[018]))",,"$NP$FG","\\d{6,11}","(?:[2-9]|600|123)\\d{7,8}",[["(2)(\\d{3})(\\d{4})","$1 $2 $3","2","($FG)",],["(\\d{2})(\\d{2,3})(\\d{4})","$1 $2 $3","[357]|4[1-35]|6[13-57]","($FG)",],["(9)([5-9]\\d{3})(\\d{4})","$1 $2 $3","9",,],["(44)(\\d{3})(\\d{4})","$1 $2 $3","44",,],["([68]00)(\\d{3})(\\d{3,4})","$1 $2 $3","60|8","$FG",],["(600)(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3 $4","60","$FG",],["(1230)(\\d{3})(\\d{4})","$1 $2 $3","1","$FG",]]]',
+"596": '["MQ","00","0",,,"$NP$FG","\\d{9}","[56]\\d{8}",[["(\\d{3})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"508": '["PM","00","0",,,"$NP$FG","\\d{6}","[45]\\d{5}",[["([45]\\d)(\\d{2})(\\d{2})","$1 $2 $3",,,]]]',
+"269": '["KM","00",,,,,"\\d{7}","[379]\\d{6}",[["(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3",,,]]]',
+"358": ['["FI","00|99[049]","0",,,"$NP$FG","\\d{5,12}","1\\d{4,11}|[2-9]\\d{4,10}",[["(\\d{3})(\\d{3,7})","$1 $2","(?:[1-3]00|[6-8]0)",,],["(\\d{2})(\\d{4,10})","$1 $2","2[09]|[14]|50|7[135]",,],["(\\d)(\\d{4,11})","$1 $2","[25689][1-8]|3",,]]]','["AX","00|99[049]","0",,,"$NP$FG","\\d{5,12}","[135]\\d{5,9}|[27]\\d{4,9}|4\\d{5,10}|6\\d{7,8}|8\\d{6,9}",]'],
+"251": '["ET","00","0",,,"$NP$FG","\\d{7,9}","[1-59]\\d{8}",[["([1-59]\\d)(\\d{3})(\\d{4})","$1 $2 $3",,,]]]',
+"681": '["WF","00",,,,,"\\d{6}","[5-7]\\d{5}",[["(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",,,]]]',
+"853": '["MO","00",,,,,"\\d{8}","[268]\\d{7}",[["([268]\\d{3})(\\d{4})","$1 $2",,,]]]',
+"44": ['["GB","00","0",,,"$NP$FG","\\d{4,10}","\\d{7,10}",[["(\\d{2})(\\d{4})(\\d{4})","$1 $2 $3","2|5[56]|7(?:0|6[013-9])",,],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","1(?:1|\\d1)|3|9[018]",,],["(\\d{5})(\\d{4,5})","$1 $2","1(?:38|5[23]|69|76|94)",,],["(1\\d{3})(\\d{5,6})","$1 $2","1",,],["(7\\d{3})(\\d{6})","$1 $2","7(?:[1-5789]|62)",,],["(800)(\\d{4})","$1 $2","800",,],["(845)(46)(4\\d)","$1 $2 $3","845",,],["(8\\d{2})(\\d{3})(\\d{4})","$1 $2 $3","8(?:4[2-5]|7[0-3])",,],["(80\\d)(\\d{3})(\\d{4})","$1 $2 $3","80",,],["([58]00)(\\d{6})","$1 $2","[58]00",,]]]','["GG","00","0",,,"$NP$FG","\\d{6,10}","[135789]\\d{6,9}",]','["IM","00","0",,,"$NP$FG","\\d{6,10}","[135789]\\d{6,9}",]','["JE","00","0",,,"$NP$FG","\\d{6,10}","[135789]\\d{6,9}",]'],
+"244": '["AO","00",,,,,"\\d{9}","[29]\\d{8}",[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",,,]]]',
+"211": '["SS","00","0",,,,"\\d{9}","[19]\\d{8}",[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",,"$NP$FG",]]]',
+"373": '["MD","00","0",,,"$NP$FG","\\d{8}","[235-9]\\d{7}",[["(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3","22|3",,],["([25-7]\\d{2})(\\d{2})(\\d{3})","$1 $2 $3","2[13-79]|[5-7]",,],["([89]\\d{2})(\\d{5})","$1 $2","[89]",,]]]',
+"996": '["KG","00","0",,,"$NP$FG","\\d{5,10}","[35-8]\\d{8,9}",[["(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3","31[25]|[5-7]",,],["(\\d{4})(\\d{5})","$1 $2","3(?:1[36]|[2-9])",,],["(\\d{3})(\\d{3})(\\d)(\\d{3})","$1 $2 $3 $4","8",,]]]',
+"93": '["AF","00","0",,,"$NP$FG","\\d{7,9}","[2-7]\\d{8}",[["([2-7]\\d)(\\d{3})(\\d{4})","$1 $2 $3",,,]]]',
+"260": '["ZM","00","0",,,"$NP$FG","\\d{9}","[289]\\d{8}",[["([29]\\d)(\\d{7})","$1 $2","[29]",,],["(800)(\\d{3})(\\d{3})","$1 $2 $3","8",,]]]',
+"378": '["SM","00",,"(?:0549)?([89]\\d{5})","0549$1",,"\\d{6,10}","[05-7]\\d{7,9}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4","[5-7]",,],["(0549)(\\d{6})","$1 $2","0",,"($1) $2"],["(\\d{6})","0549 $1","[89]",,"(0549) $1"]]]',
+"235": '["TD","00|16",,,,,"\\d{8}","[2679]\\d{7}",[["(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"960": '["MV","0(?:0|19)",,,,,"\\d{7,10}","[3467]\\d{6}|9(?:00\\d{7}|\\d{6})",[["(\\d{3})(\\d{4})","$1-$2","[3467]|9(?:[1-9]|0[1-9])",,],["(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3","900",,]]]',
+"221": '["SN","00",,,,,"\\d{9}","[37]\\d{8}",[["(\\d{2})(\\d{3})(\\d{2})(\\d{2})","$1 $2 $3 $4",,,]]]',
+"595": '["PY","00","0",,,,"\\d{5,9}","5[0-5]\\d{4,7}|[2-46-9]\\d{5,8}",[["(\\d{2})(\\d{5,7})","$1 $2","(?:[26]1|3[289]|4[124678]|7[123]|8[1236])","($FG)",],["(\\d{3})(\\d{3,6})","$1 $2","[2-9]0","$NP$FG",],["(\\d{3})(\\d{6})","$1 $2","9[1-9]","$NP$FG",],["(\\d{2})(\\d{3})(\\d{4})","$1 $2 $3","8700",,],["(\\d{3})(\\d{4,6})","$1 $2","[2-8][1-9]","($FG)",]]]',
+"977": '["NP","00","0",,,"$NP$FG","\\d{6,10}","[1-8]\\d{7}|9(?:[1-69]\\d{6}|7[2-6]\\d{5,7}|8\\d{8})",[["(1)(\\d{7})","$1-$2","1[2-6]",,],["(\\d{2})(\\d{6})","$1-$2","1[01]|[2-8]|9(?:[1-69]|7[15-9])",,],["(9\\d{2})(\\d{7})","$1-$2","9(?:7[45]|8)",,]]]',
+"36": '["HU","00","06",,,"($FG)","\\d{6,9}","[1-9]\\d{7,8}",[["(1)(\\d{3})(\\d{4})","$1 $2 $3","1",,],["(\\d{2})(\\d{3})(\\d{3,4})","$1 $2 $3","[2-9]",,]]]',
+};
diff --git a/shared/js/phoneNumberJS/mcc_iso3166_table.js b/shared/js/phoneNumberJS/mcc_iso3166_table.js
new file mode 100644
index 0000000..4119856
--- /dev/null
+++ b/shared/js/phoneNumberJS/mcc_iso3166_table.js
@@ -0,0 +1,242 @@
+// MCC(Mobile Country Codes) and country name(ISO3166-1) mapping table.
+// Reference Data from:
+// http://en.wikipedia.org/wiki/List_of_mobile_country_codes
+
+MCC_ISO3166_TABLE = {
+412:'AF',
+276:'AL',
+603:'DZ',
+544:'AS',
+213:'AD',
+631:'AO',
+365:'AI',
+344:'AG',
+722:'AR',
+283:'AM',
+363:'AW',
+505:'AU',
+232:'AT',
+400:'AZ',
+364:'BS',
+426:'BH',
+470:'BD',
+342:'BB',
+257:'BY',
+206:'BE',
+702:'BZ',
+616:'BJ',
+350:'BM',
+402:'BT',
+736:'BO',
+218:'BA',
+652:'BW',
+724:'BR',
+348:'VG',
+528:'BN',
+284:'BG',
+613:'BF',
+642:'BI',
+456:'KH',
+624:'CM',
+302:'CA',
+625:'CV',
+346:'KY',
+623:'CF',
+622:'TD',
+730:'CL',
+460:'CN',
+461:'CN',
+732:'CO',
+654:'KM',
+629:'CG',
+548:'CK',
+712:'CR',
+612:'CI',
+219:'HR',
+368:'CU',
+362:'CW',
+280:'CY',
+230:'CZ',
+630:'CD',
+238:'DK',
+638:'DJ',
+366:'DM',
+370:'DO',
+514:'TL',
+740:'EC',
+602:'EG',
+706:'SV',
+627:'GQ',
+657:'ER',
+248:'EE',
+636:'ET',
+750:'FK',
+288:'FO',
+542:'FJ',
+244:'FI',
+208:'FR',
+742:'GF',
+547:'PF',
+628:'GA',
+607:'GM',
+282:'GE',
+262:'DE',
+620:'GH',
+266:'GI',
+202:'GR',
+290:'GL',
+352:'GD',
+340:'GP',
+535:'GU',
+704:'GT',
+611:'GN',
+632:'GW',
+738:'GY',
+372:'HT',
+708:'HN',
+454:'HK',
+216:'HU',
+274:'IS',
+404:'IN',
+405:'IN',
+406:'IN',
+510:'ID',
+432:'IR',
+418:'IQ',
+272:'IE',
+425:'IL',
+222:'IT',
+338:'JM',
+441:'JP',
+440:'JP',
+416:'JO',
+401:'KZ',
+639:'KE',
+545:'KI',
+467:'KP',
+450:'KR',
+419:'KW',
+437:'KG',
+457:'LA',
+247:'LV',
+415:'LB',
+651:'LS',
+618:'LR',
+606:'LY',
+295:'LI',
+246:'LT',
+270:'LU',
+455:'MO',
+294:'MK',
+646:'MG',
+650:'MW',
+502:'MY',
+472:'MV',
+610:'ML',
+278:'MT',
+551:'MH',
+340:'MQ',
+609:'MR',
+617:'MU',
+334:'MX',
+550:'FM',
+259:'MD',
+212:'MC',
+428:'MN',
+297:'ME',
+354:'MS',
+604:'MA',
+643:'MZ',
+414:'MM',
+649:'NA',
+536:'NR',
+429:'NP',
+204:'NL',
+546:'NC',
+530:'NZ',
+710:'NI',
+614:'NE',
+621:'NG',
+555:'NU',
+534:'MP',
+242:'NO',
+422:'OM',
+410:'PK',
+552:'PW',
+425:'PS',
+714:'PA',
+537:'PG',
+744:'PY',
+716:'PE',
+515:'PH',
+260:'PL',
+268:'PT',
+330:'PR',
+427:'QA',
+647:'RE',
+226:'RO',
+250:'RU',
+635:'RW',
+356:'KN',
+358:'LC',
+308:'PM',
+360:'VC',
+549:'WS',
+292:'SM',
+626:'ST',
+420:'SA',
+608:'SN',
+220:'RS',
+633:'SC',
+619:'SL',
+525:'SG',
+231:'SK',
+293:'SI',
+540:'SB',
+637:'SO',
+655:'ZA',
+214:'ES',
+413:'LK',
+634:'SD',
+746:'SR',
+653:'SZ',
+240:'SE',
+228:'CH',
+417:'SY',
+466:'TW',
+436:'TJ',
+640:'TZ',
+520:'TH',
+615:'TG',
+539:'TO',
+374:'TT',
+605:'TN',
+286:'TR',
+438:'TM',
+376:'TC',
+641:'UG',
+255:'UA',
+424:'AE',
+430:'AE',
+431:'AE',
+235:'GB',
+234:'GB',
+310:'US',
+311:'US',
+312:'US',
+313:'US',
+314:'US',
+315:'US',
+316:'US',
+332:'VI',
+748:'UY',
+434:'UZ',
+541:'VU',
+225:'VA',
+734:'VE',
+452:'VN',
+543:'WF',
+421:'YE',
+645:'ZM',
+648:'ZW'
+}
diff --git a/shared/js/settings_listener.js b/shared/js/settings_listener.js
new file mode 100644
index 0000000..272729c
--- /dev/null
+++ b/shared/js/settings_listener.js
@@ -0,0 +1,69 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var SettingsListener = {
+ /* Timer to remove the lock. */
+ _timer: null,
+
+ /* lock stores here */
+ _lock: null,
+
+ /**
+ * getSettingsLock: create a lock or retrieve one that we saved.
+ * mozSettings.createLock() is expensive and lock should be reused
+ * whenever possible.
+ */
+
+ getSettingsLock: function sl_getSettingsLock() {
+ // Each time there is a getSettingsLock call, we pospone the removal
+ clearTimeout(this._timer);
+ this._timer = setTimeout((function removeLock() {
+ this._lock = null;
+ }).bind(this), 0);
+
+ // If there is a lock present we return that
+ if (this._lock) {
+ return this._lock;
+ }
+
+ // If there isn't we return one.
+ var settings = window.navigator.mozSettings;
+
+ return (this._lock = settings.createLock());
+ },
+
+ observe: function sl_observe(name, defaultValue, callback) {
+ var settings = window.navigator.mozSettings;
+ if (!settings) {
+ window.setTimeout(function() { callback(defaultValue); });
+ return;
+ }
+
+ var req;
+ try {
+ req = this.getSettingsLock().get(name);
+ } catch (e) {
+ // It is possible (but rare) for getSettingsLock() to return
+ // a SettingsLock object that is no longer valid.
+ // Until https://bugzilla.mozilla.org/show_bug.cgi?id=793239
+ // is fixed, we just catch the resulting exception and try
+ // again with a fresh lock
+ console.warn('Stale lock in settings_listener.js.',
+ 'See https://bugzilla.mozilla.org/show_bug.cgi?id=793239');
+ this._lock = null;
+ req = this.getSettingsLock().get(name);
+ }
+
+ req.addEventListener('success', (function onsuccess() {
+ callback(typeof(req.result[name]) != 'undefined' ?
+ req.result[name] : defaultValue);
+ }));
+
+ settings.addObserver(name, function settingChanged(evt) {
+ callback(evt.settingValue);
+ });
+ }
+};
+
diff --git a/shared/js/simple_phone_matcher.js b/shared/js/simple_phone_matcher.js
new file mode 100644
index 0000000..249c551
--- /dev/null
+++ b/shared/js/simple_phone_matcher.js
@@ -0,0 +1,366 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+/**
+ * A simple lib to match internaional phone number with local
+ * and user formatted phone numbers.
+ *
+ * Adding this feature to gecko is discussed here:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=743363
+ *
+ */
+
+var SimplePhoneMatcher = {
+ mcc: '724', // Assuming a Brazilian mcc by default, can be changed.
+
+ // Used to remove all the formatting from a phone number.
+ sanitizedNumber: function spm_sanitizedNumber(number) {
+ var join = this._formattingChars.join('|\\');
+ var regexp = new RegExp('(\\' + join + ')', 'g');
+ return number.replace(regexp, '');
+ },
+
+ // Generate variants of a phone number (with prefix, without...).
+ // The variants are sorted from the shortest to the longest.
+ generateVariants: function spm_generateVariants(number) {
+ var sanitizedNumber = this.sanitizedNumber(number);
+
+ var variants = [];
+
+ variants = variants.concat(this._internationalPrefixes(sanitizedNumber),
+ this._trunkPrefixes(sanitizedNumber),
+ this._carrierPrefixes(sanitizedNumber),
+ this._areaPrefixes(sanitizedNumber));
+
+ return variants.sort(function shortestFirst(a, b) {
+ return a.length > b.length;
+ });
+ },
+
+ // Find the best (ie longest) match between the variants for a number
+ // and matches.
+ // |matches| is an array of arrays
+ // This way we can easily go trough the results of a mozContacts request:
+ // array (contacts) of arrays (phone numbers).
+ // => {
+ // bestMatchIndex: i,
+ // localIndex: j
+ // }
+ // ie. bestMatchIndex will be the index in the contact arrays, localIndex
+ // the index in the phone numbers array of this contact
+ bestMatch: function spm_bestMatchIndex(variants, matches) {
+ var bestMatchIndex = null;
+ var bestLocalIndex = null;
+ var bestMatchLength = 0;
+
+ matches.forEach(function(match, matchIndex) {
+ match.forEach(function(number, localIndex) {
+ var sanitizedNumber = this.sanitizedNumber(number);
+
+ variants.forEach(function match(variant) {
+ if (variant.indexOf(sanitizedNumber) !== -1 ||
+ sanitizedNumber.indexOf(variant) !== -1) {
+ var length = sanitizedNumber.length;
+
+ if (length > bestMatchLength) {
+ bestMatchLength = length;
+ bestMatchIndex = matchIndex;
+ bestLocalIndex = localIndex;
+ }
+ }
+ });
+ }, this);
+ }, this);
+
+ return {
+ bestMatchIndex: bestMatchIndex,
+ localIndex: bestLocalIndex
+ };
+ },
+
+ _formattingChars: ['\s', '-', '.', '(', ')'],
+
+ _mccWith00Prefix: ['208', '214', '234', '235', '724'],
+ _mccWith011Prefix: ['310', '311', '312', '313', '314', '315', '316'],
+
+ // https://en.wikipedia.org/wiki/Country_calling_code
+ // https://en.wikipedia.org/wiki/Trunk_code
+ // This is an array of objects composed by { p: <prefix>, t: <true if it can be trunk> }
+ _countryPrefixes: [
+ // North American Numbering Plan countries and territories
+ // US, CA, AG, AI, AS, BB, BM, BS, DM, DO, GD, GU, JM, KN, KY,
+ // LC, MP, MS, PR, SX, TC, TT, VC, VG, VI
+ {p: '1', t: false},
+
+ // BS BB AI
+ {p: '1242', t: false}, {p: '1246', t: false}, {p: '1264', t: false},
+ // AG VG VI KY BM
+ {p: '1268', t: false}, {p: '1284', t: false}, {p: '1340', t: false}, {p: '1345', t: false}, {p: '1441', t: false},
+ // GD TC MS MP GU
+ {p: '1473', t: false}, {p: '1649', t: false}, {p: '1664', t: false}, {p: '1670', t: false}, {p: '1671', t: false},
+ // AS SX LC DM VC
+ {p: '1684', t: false}, {p: '1721', t: false}, {p: '1758', t: false}, {p: '1767', t: false}, {p: '1784', t: false},
+ // PR DO DO DO TT
+ {p: '1787', t: false}, {p: '1809', t: false}, {p: '1829', t: false}, {p: '1849', t: false}, {p: '1868', t: false},
+ // KN JM PR
+ {p: '1869', t: false}, {p: '1876', t: false}, {p: '1939', t: false},
+
+ // EG -- SS
+ {p: '20', t: false}, {p: '210', t: false}, {p: '211', t: false},
+ // MA,EH DZ -- -- TN
+ {p: '212', t: false}, {p: '213', t: false}, {p: '214', t: false}, {p: '215', t: false}, {p: '216', t: false},
+ // -- LY -- GM SN
+ {p: '217', t: false}, {p: '218', t: false}, {p: '219', t: false}, {p: '220', t: false}, {p: '221', t: false},
+ // MR ML GN CI BF
+ {p: '222', t: false}, {p: '223', t: false}, {p: '224', t: false}, {p: '225', t: false}, {p: '226', t: false},
+ // NE TG BJ MU LR
+ {p: '227', t: false}, {p: '228', t: false}, {p: '229', t: false}, {p: '230', t: false}, {p: '231', t: false},
+ // SL GH NG TD CF
+ {p: '232', t: false}, {p: '233', t: false}, {p: '234', t: false}, {p: '235', t: false}, {p: '236', t: false},
+ // CM CV ST GQ GA
+ {p: '237', t: false}, {p: '238', t: false}, {p: '239', t: false}, {p: '240', t: false}, {p: '241', t: false},
+ // CG CD AO GW IO
+ {p: '242', t: false}, {p: '243', t: false}, {p: '244', t: false}, {p: '245', t: false}, {p: '246', t: false},
+ // AC SC SD RW ET
+ {p: '247', t: false}, {p: '248', t: false}, {p: '249', t: false}, {p: '250', t: false}, {p: '251', t: false},
+ // SO,QS DJ KE TZ UG
+ {p: '252', t: false}, {p: '253', t: false}, {p: '254', t: false}, {p: '255', t: false}, {p: '256', t: false},
+ // BI MZ -- ZM MG
+ {p: '257', t: false}, {p: '258', t: false}, {p: '259', t: false}, {p: '260', t: false}, {p: '261', t: false},
+ // RE,YT ZW NA MW LS
+ {p: '262', t: false}, {p: '263', t: false}, {p: '264', t: false}, {p: '265', t: false}, {p: '266', t: false},
+ // BW SZ KM ZA --
+ {p: '267', t: false}, {p: '268', t: false}, {p: '269', t: false}, {p: '27', t: false}, {p: '28', t: false},
+ // SH,TA ER -- -- --
+ {p: '290', t: false}, {p: '291', t: false}, {p: '292', t: false}, {p: '293', t: false}, {p: '294', t: false},
+ // -- -- AW FO GL
+ {p: '295', t: false}, {p: '296', t: false}, {p: '297', t: false}, {p: '298', t: false}, {p: '299', t: false},
+
+ // GR NL BE
+ {p: '30', t: false}, {p: '31', t: true}, {p: '32', t: true},
+ // FR ES GI PT LU
+ {p: '33', t: true}, {p: '34', t: false}, {p: '350', t: false}, {p: '351', t: true}, {p: '352', t: false},
+ // IE IS AL MT CY
+ {p: '353', t: false}, {p: '354', t: false}, {p: '355', t: true}, {p: '356', t: false}, {p: '357', t: false},
+ // FI,AX BG HU LT LV
+ {p: '358', t: false}, {p: '359', t: true}, {p: '36', t: true}, {p: '370', t: true}, {p: '371', t: false},
+ // EE MD AM,QN BY AD
+ {p: '372', t: false}, {p: '373', t: true}, {p: '374', t: false}, {p: '375', t: true}, {p: '376', t: false},
+ // MC SM VA UA RS
+ {p: '377', t: false}, {p: '378', t: false}, {p: '379', t: false}, {p: '380', t: true}, {p: '381', t: true},
+ // ME -- -- HR SI
+ {p: '382', t: true}, {p: '383', t: false}, {p: '384', t: false}, {p: '385', t: true}, {p: '386', t: false},
+ // BA EU MK IT,VA
+ {p: '387', t: true}, {p: '388', t: false}, {p: '389', t: true}, {p: '39', t: false},
+
+ // RO CH CZ
+ {p: '40', t: true}, {p: '41', t: true}, {p: '420', t: false},
+ // SK -- LI -- --
+ {p: '421', t: false}, {p: '422', t: false}, {p: '423', t: false}, {p: '424', t: false}, {p: '425', t: false},
+ // -- -- -- -- AT
+ {p: '426', t: false}, {p: '427', t: false}, {p: '428', t: false}, {p: '429', t: false}, {p: '43', t: true},
+ // GB/UK,GG,IM,JE DK SE NO,SJ PL
+ {p: '44', t: true}, {p: '45', t: false}, {p: '46', t: true}, {p: '47', t: false}, {p: '48', t: true},
+ // DE
+ {p: '49', t: true},
+
+ // FK BZ GT
+ {p: '500', t: false}, {p: '501', t: false}, {p: '502', t: false},
+ // SV HN NI CR PA
+ {p: '503', t: false}, {p: '504', t: false}, {p: '505', t: false}, {p: '506', t: false}, {p: '507', t: false},
+ // PM HT PE MX CU
+ {p: '508', t: false}, {p: '509', t: false}, {p: '51', t: true}, {p: '52', t: false}, {p: '53', t: false},
+ // AR BR CL CO VE
+ {p: '54', t: true}, {p: '55', t: true}, {p: '56', t: false}, {p: '57', t: false}, {p: '58', t: false},
+ // GP,BL,MF BO GY EC GF
+ {p: '590', t: false}, {p: '591', t: true}, {p: '592', t: false}, {p: '593', t: false}, {p: '594', t: false},
+ // PY MQ SR UY BQ,CW
+ {p: '595', t: false}, {p: '596', t: false}, {p: '597', t: false}, {p: '598', t: false}, {p: '599', t: true},
+
+ // MY AU,CX,CC ID
+ {p: '60', t: true}, {p: '61', t: true}, {p: '62', t: true},
+ // PH NZ SG TH TL
+ {p: '63', t: true}, {p: '64', t: false}, {p: '65', t: true}, {p: '66', t: true}, {p: '670', t: false},
+ // -- NF,AQ BN NR PG
+ {p: '671', t: false}, {p: '672', t: false}, {p: '673', t: true}, {p:'674', t: false}, {p: '675', t: false},
+ // TO SB VU FJ PW
+ {p: '676', t: false}, {p: '677', t: false}, {p: '678', t: false}, {p:'679', t: false}, {p: '680', t: false},
+ // WF CK NU -- WS
+ {p: '681', t: false}, {p: '682', t: false}, {p: '683', t: false}, {p:'684', t: false}, {p: '685', t: false},
+ // KI NC TV PF TK
+ {p: '686', t: false}, {p: '687', t: false}, {p: '688', t: false}, {p:'689', t: false}, {p: '690', t: false},
+ // FM MH -- -- --
+ {p: '691', t: false}, {p: '692', t: false}, {p: '693', t: false}, {p: '694', t: false}, {p: '695', t: false},
+ // -- -- -- -- --
+ {p: '696', t: false}, {p: '697', t: false}, {p: '698', t: false}, {p: '699', t: false}, {p: '699', t: false},
+
+ // RU,KZ
+ {p: '7', t: true},
+
+ // KZ KZ Abkhazia Abkhazia
+ {p: '76', t: true}, {p: '77', t: true}, {p: '7840', t: false}, {p: '7940', t: false},
+
+ // XT -- --
+ {p: '800', t: false}, {p: '801', t: false}, {p: '802', t: false},
+ // -- -- -- -- --
+ {p: '803', t: false}, {p: '804', t: false}, {p: '805', t: false}, {p: '806', t: false}, {p: '807', t: false},
+ // XS -- JP KR --
+ {p: '808', t: false}, {p: '809', t: false}, {p: '81', t: false}, {p: '82', t: true}, {p: '83', t: false},
+ // VN KP -- HK MO
+ {p: '84', t: true}, {p: '850', t: true}, {p: '851', t: false}, {p: '852', t: false}, {p: '853', t: false},
+ // -- KH LA -- --
+ {p: '854', t: false}, {p: '855', t: true}, {p: '856', t: true}, {p: '857', t: false}, {p: '858', t: false},
+ // -- CN XN -- --
+ {p: '859', t: false}, {p: '86', t: true}, {p: '870', t: false}, {p: '871', t: false}, {p: '872', t: false},
+ // -- -- -- -- --
+ {p: '873', t: false}, {p: '874', t: false}, {p: '875', t: false}, {p: '876', t: false}, {p: '877', t: false},
+ // XP -- BD XG XV
+ {p: '878', t: false}, {p: '879', t: false}, {p: '880', t: true}, {p: '881', t: false}, {p: '882', t: false},
+ // XV -- -- TW --
+ {p: '883', t: false}, {p: '884', t: false}, {p: '885', t: false}, {p: '886', t: true}, {p: '887', t: false},
+ // XD -- --
+ {p: '888', t: false}, {p: '889', t: false}, {p: '89', t: false},
+
+ // TR,QY IN PK
+ {p: '90', t: false}, {p: '91', t: true}, {p: '92', t: true},
+ // AF LK MM MV LB
+ {p: '93', t: true}, {p: '94', t: false}, {p: '95', t: true}, {p: '960', t: false}, {p: '961', t: false},
+ // JO SY IQ KW SA
+ {p: '962', t: false}, {p: '963', t: false}, {p: '964', t: false}, {p: '965', t: false}, {p: '966', t: false},
+ // YE OM -- PS AE
+ {p: '967', t: false}, {p: '968', t: false}, {p: '969', t: false}, {p: '970', t: false}, {p: '971', t: false},
+ // IL BH QA BT MN
+ {p: '972', t: false}, {p: '973', t: false}, {p: '974', t: false}, {p: '975', t: true}, {p: '976', t: true},
+ // NP -- XR IR --
+ {p: '977', t: true}, {p: '978', t: false}, {p: '979', t: false}, {p: '98', t: false}, {p: '990', t: false},
+ // XC TJ TM AZ GE
+ {p: '991', t: false}, {p: '992', t: false}, {p: '993', t: true}, {p: '994', t: true}, {p: '995', t: true},
+ // KG -- UZ --
+ {p: '996', t: false}, {p: '997', t: false}, {p: '998', t: true}, {p: '999', t: false}
+ ],
+ _trunkCodes: ['0'],
+
+ // https://en.wikipedia.org/wiki/List_of_dialling_codes_in_Brazil
+ // https://en.wikipedia.org/wiki/Telephone_numbers_in_the_United_Kingdom
+ // https://en.wikipedia.org/wiki/Telephone_numbering_plan
+ // country code -> length of the area code
+ _areaCodeSwipe: {
+ '55': 2,
+ '44': 3,
+ '1': 3
+ },
+
+ _internationalPrefixes: function spm_internatialPrefixes(number) {
+ var variants = [number];
+
+ var internationalPrefix = '';
+ if (this._mccWith00Prefix.indexOf(this.mcc) !== -1) {
+ internationalPrefix = '00';
+ }
+ if (this._mccWith011Prefix.indexOf(this.mcc) !== -1) {
+ internationalPrefix = '011';
+ }
+
+ var plusRegexp = new RegExp('^\\+');
+ if (number.match(plusRegexp)) {
+ variants.push(number.replace(plusRegexp, internationalPrefix));
+ }
+
+ var ipRegexp = new RegExp('^' + internationalPrefix);
+ if (number.match(ipRegexp)) {
+ variants.push(number.replace(ipRegexp, '+'));
+ }
+
+ return variants;
+ },
+
+ _trunkPrefixes: function spm_trunkPrefixes(number) {
+ var variants = [];
+
+ var prefixesWithTrunk0 = [];
+ var prefixesWithNoTrunk = [];
+ this._countryPrefixes.forEach(function(prefix) {
+ if (prefix.t) {
+ prefixesWithTrunk0.push(prefix.p);
+ } else {
+ prefixesWithNoTrunk.push(prefix.p);
+ }
+ });
+
+ var trunk0Join = prefixesWithTrunk0.join('|')
+ var trunk0Regexp = new RegExp('^\\+(' + trunk0Join + ')');
+ this._internationalPrefixes(number).some(function match(variant) {
+ var match = variant.match(trunk0Regexp);
+
+ if (match) {
+ variants.push(variant.replace(trunk0Regexp, '0'));
+ variants.push(variant.replace(trunk0Regexp, ''));
+ }
+
+ return match;
+ });
+
+ var noTrunkJoin = prefixesWithNoTrunk.join('|');
+ var noTrunkRegexp = new RegExp('^\\+(' + noTrunkJoin + ')');
+ this._internationalPrefixes(number).some(function match(variant) {
+ var match = variant.match(noTrunkRegexp);
+
+ if (match) {
+ variants.push(variant.replace(noTrunkRegexp, ''));
+ }
+
+ return match;
+ });
+
+ // If the number has a trunk prefix already we need a variant without it
+ var withTrunkRegexp = new RegExp('^(' + this._trunkCodes.join('|') + ')');
+ if (number.match(withTrunkRegexp)) {
+ variants.push(number.replace(withTrunkRegexp, ''));
+ }
+
+ return variants;
+ },
+
+ _areaPrefixes: function spm_areaPrefixes(number) {
+ var variants = [];
+
+ Object.keys(this._areaCodeSwipe).forEach(function(country) {
+ var re = new RegExp('^\\+' + country);
+
+ this._internationalPrefixes(number).some(function match(variant) {
+ var match = variant.match(re);
+
+ if (match) {
+ var afterArea = 1 + country.length + this._areaCodeSwipe[country];
+ variants.push(variant.substring(afterArea));
+ }
+
+ return match;
+ }, this);
+ }, this);
+
+ return variants;
+ },
+
+ // http://thebrazilbusiness.com/article/telephone-system-in-brazil
+ _carrierPrefixes: function spm_carrierPrefix(number) {
+ if (this.mcc != '724') {
+ return [];
+ }
+
+ var variants = [];
+ var withTrunk = new RegExp('^0');
+
+ // A number with carrier prefix will have a trunk code and at
+ // lest 13 digits
+ if (number.length >= 13 && number.match(withTrunk)) {
+ var afterCarrier = 3;
+ variants.push(number.substring(afterCarrier));
+ }
+
+ return variants;
+ }
+};
+
diff --git a/shared/js/tz_select.js b/shared/js/tz_select.js
new file mode 100644
index 0000000..720df43
--- /dev/null
+++ b/shared/js/tz_select.js
@@ -0,0 +1,155 @@
+/* -*- Mode: js; js-indent-level: 2; indent-tabs-mode: nil -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+function tzSelect(regionSelector, citySelector, onchange) {
+ var TIMEZONE_FILE = '/shared/resources/tz.json';
+
+
+ /**
+ * Activate a timezone selector UI
+ */
+
+ function newTZSelector(onchangeTZ, currentID) {
+ var gRegion = currentID.replace(/\/.*/, '');
+ var gCity = currentID.replace(/.*?\//, '');
+ var gTZ = null;
+
+ function loadTZ(callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', TIMEZONE_FILE, true);
+ xhr.responseType = 'json';
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200 || xhr.status === 0) {
+ gTZ = xhr.response;
+ }
+ callback();
+ }
+ };
+ xhr.send();
+ }
+
+ function fillSelectElement(selector, options) {
+ selector.innerHTML = '';
+ options.sort(function(a, b) {
+ return (a.text > b.text);
+ });
+ for (var i = 0; i < options.length; i++) {
+ var option = document.createElement('option');
+ option.textContent = options[i].text;
+ option.selected = options[i].selected;
+ option.value = options[i].value;
+ selector.appendChild(option);
+ }
+ }
+
+ function getSelectedText(selector) {
+ var options = selector.querySelectorAll('option');
+ return options[selector.selectedIndex].textContent;
+ }
+
+ function fillRegions() {
+ var _ = navigator.mozL10n.get;
+ var options = [];
+ for (var c in gTZ) {
+ options.push({
+ text: _('tzRegion-' + c) || c,
+ value: c,
+ selected: (c == gRegion)
+ });
+ }
+ fillSelectElement(regionSelector, options);
+ fillCities();
+ }
+
+ function fillCities() {
+ gRegion = regionSelector.value;
+ var list = gTZ[gRegion];
+ var options = [];
+ for (var i = 0; i < list.length; i++) {
+ options.push({
+ text: list[i].name || list[i].city.replace(/_/g, ' '),
+ value: i,
+ selected: (list[i].city == gCity)
+ });
+ }
+ fillSelectElement(citySelector, options);
+ setTimezone();
+ }
+
+ function setTimezone() {
+ var res = gTZ[gRegion][citySelector.value];
+ gCity = res.city;
+ var offset = res.offset.split(',');
+ onchangeTZ({
+ id: res.id || gRegion + '/' + res.city,
+ region: getSelectedText(regionSelector),
+ city: getSelectedText(citySelector),
+ cc: res.cc,
+ utcOffset: offset[0],
+ dstOffset: offset[1]
+ });
+ }
+
+ regionSelector.onchange = fillCities;
+ citySelector.onchange = setTimezone;
+ loadTZ(fillRegions);
+ }
+
+
+ /**
+ * Monitor time.timezone changes
+ */
+
+ function newTZObserver() {
+ var settings = window.navigator.mozSettings;
+ if (!settings)
+ return;
+
+ settings.addObserver('time.timezone', function(event) {
+ setTimezoneDescription(event.settingValue);
+ });
+
+ var reqTimezone = settings.createLock().get('time.timezone');
+ reqTimezone.onsuccess = function dt_getStatusSuccess() {
+ var lastMozSettingValue = reqTimezone.result['time.timezone'];
+ if (!lastMozSettingValue) {
+ lastMozSettingValue = 'Pacific/Pago_Pago';
+ }
+
+ setTimezoneDescription(lastMozSettingValue);
+
+ // initialize the timezone selector with the initial TZ setting
+ newTZSelector(function updateTZ(tz) {
+ var req = settings.createLock().set({ 'time.timezone': tz.id });
+ if (onchange) {
+ req.onsuccess = function updateTZ_callback() {
+ // Wait until the timezone is actually set
+ // before calling the callback.
+ window.addEventListener('moztimechange', function timeChanged() {
+ window.removeEventListener('moztimechange', timeChanged);
+ onchange(tz);
+ });
+ }
+ }
+ }, lastMozSettingValue);
+
+ console.log('Initial TZ value: ' + lastMozSettingValue);
+ };
+
+ function setTimezoneDescription(timezoneID) {
+ regionSelector.value = timezoneID.replace(/\/.*/, '');
+ citySelector.value = timezoneID.replace(/.*?\//, '');
+ }
+ }
+
+
+ /**
+ * Startup -- make sure webL10n is ready before using tzSelect()
+ */
+
+ newTZObserver();
+}
+
diff --git a/shared/js/visibility_monitor.js b/shared/js/visibility_monitor.js
new file mode 100644
index 0000000..5a8ba1f
--- /dev/null
+++ b/shared/js/visibility_monitor.js
@@ -0,0 +1,494 @@
+/*
+ * visibility_monitor.js
+ *
+ * Given a scrolling container element (with overflow-y: scroll set,
+ * e.g.), monitorChildVisibility() listens for scroll events in order to
+ * determine which child elements are visible within the element and
+ * which are not (assuming that the element itself is visible).
+ *
+ * When a child scrolls onscreen, it is passed to the onscreen callback.
+ *
+ * When a child scrolls offscreen, it is passed to the offscreen callback.
+ *
+ * This class also listens for DOM modification events so that it can handle
+ * children being added to or removed from the scrolling element. It also
+ * handles resize events.
+ *
+ * Note that this class only pays attention to the direct children of
+ * the container element, not all ancestors.
+ *
+ * When you insert a new child into the container, you should create it in
+ * its offscreen state. If it is inserted offscreen nothing will happen.
+ * If you insert it onscreen, it will immediately be passed to the onscreen
+ * callback function
+ *
+ * The scrollmargin argument specifies a number of pixels. Elements
+ * that are within this many pixels of being onscreen are considered
+ * onscreen.
+ *
+ * By specifing proper onscreen and offscreen functions you can use this
+ * class to (for example) remove the background-image style of elements
+ * that are not visible, allowing gecko to free up image memory.
+ * In that sense, this class can be used to workaround
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=689623
+ *
+ * The return value of this function is an object that has a stop() method.
+ * calling the stop method stops visiblity monitoring. If you want to restart
+ * call monitorChildVisiblity() again.
+ *
+ * monitorChildVisiblity() makes the following assumptions. If your program
+ * violates them, the function may not work correctly:
+ *
+ * Child elements of the container element flow left to right and
+ * top to bottom. I.e. the nextSibling of a child element never has a
+ * smaller clientTop value. They are not absolutely positioned and don't
+ * move on their own.
+ *
+ * The children of the container element are themselves all elements;
+ * there are no text nodes or comments cluttering things up.
+ *
+ * Children don't change size, either spontaneously or in response to
+ * onscreen and offscreen callbacks. Don't set display:none on an element
+ * when it goes offscreen, for example.
+ *
+ * Children aren't added or removed to the container while the container
+ * or any of its ancestors is hidden with display:none or is removed from
+ * the tree. The mutation observer that responds to additions and deletions
+ * needs the container and its children to have valid layout data in order
+ * to figure out what is onscreen and what is offscreen. Use visiblity:hidden
+ * instead of display:none if you need to add or remove children while
+ * the container is hidden.
+ *
+ * DocumentFragments are not used to add multiple children at once to
+ * the container, and multiple children are not deleted at once by
+ * setting innerHTML or innerText to ''.
+ *
+ * The container element only changes size when there is a resize event
+ * on the window.
+ */
+'use strict';
+
+function monitorChildVisibility(container, scrollmargin,
+ onscreenCallback, offscreenCallback)
+{
+ // The onscreen region is represented by these two elements
+ var firstOnscreen = null, lastOnscreen = null;
+
+ // This is the last onscreen region that we have notified the client about
+ var firstNotifiedOnscreen = null, lastNotifiedOnscreen = null;
+
+ // The timer used by deferCallbacks()
+ var pendingCallbacks = null;
+
+ // Update the onscreen region whenever we scroll
+ container.addEventListener('scroll', scrollHandler);
+
+ // Update the onscreen region when the window changes size
+ window.addEventListener('resize', resizeHandler);
+
+ // Update the onscreen region when children are added or removed
+ var observer = new MutationObserver(mutationHandler);
+ observer.observe(container, { childList: true });
+
+ // Now determine the initial onscreen region
+ adjustBounds();
+
+ // Call the onscreenCallback for the initial onscreen elements
+ callCallbacks();
+
+ // Return an object that allows the caller to stop monitoring
+ return {
+ stop: function stop() {
+ // Unregister our event handlers and stop the mutation observer.
+ container.removeEventListener('scroll', scrollHandler);
+ window.removeEventListener('resize', resizeHandler);
+ observer.disconnect();
+ }
+ };
+
+ // Adjust the onscreen element range and synchronously call onscreen
+ // and offscreen callbacks as needed.
+ function resizeHandler() {
+ // If we are triggered with 0 height, ignore the event. If this happens
+ // we don't have any layout data and we'll end up thinking that all
+ // of the children are onscreen. Better to do nothing at all here and
+ // just wait until the container becomes visible again.
+ if (container.clientHeight === 0) {
+ return;
+ }
+ adjustBounds();
+ callCallbacks();
+ }
+
+ // This gets called when children are added or removed from the container.
+ // Adding and removing nodes can change the position of other elements
+ // so changes may extend beyond just the ones added or removed
+ function mutationHandler(mutations) {
+ // Ignore any mutations while we are not displayed because
+ // none of our calculations will be right
+ if (container.clientHeight === 0) {
+ return;
+ }
+
+ // If there are any pending callbacks, call them now before handling
+ // the mutations so that we start off in sync, with the onscreen range
+ // equal to the notified range.
+ if (pendingCallbacks)
+ callCallbacks();
+
+ for (var i = 0; i < mutations.length; i++) {
+ var mutation = mutations[i];
+ if (mutation.addedNodes) {
+ for (var j = 0; j < mutation.addedNodes.length; j++) {
+ var child = mutation.addedNodes[j];
+ if (child.nodeType === Node.ELEMENT_NODE)
+ childAdded(child);
+ }
+ }
+
+ if (mutation.removedNodes) {
+ for (var j = 0; j < mutation.removedNodes.length; j++) {
+ var child = mutation.removedNodes[j];
+ if (child.nodeType === Node.ELEMENT_NODE)
+ childRemoved(child,
+ mutation.previousSibling,
+ mutation.nextSibling);
+ }
+ }
+ }
+ }
+
+ // If the new child is onscreen, call the onscreen callback for it.
+ // Adjust the onscreen element range and synchronously call
+ // onscreen and offscreen callbacks as needed.
+ function childAdded(child) {
+ // If the added child is after the last onscreen child, and we're
+ // not filling in the first page of content then this insertion
+ // doesn't affect us at all.
+ if (lastOnscreen &&
+ after(child, lastOnscreen) &&
+ child.offsetTop > container.clientHeight + scrollmargin)
+ return;
+
+ // Otherwise, if this is the first element added or if it is after
+ // the first onscreen element, then it is onscreen and we need to
+ // call the onscreen callback for it.
+ if (!firstOnscreen || after(child, firstOnscreen)) {
+ // Invoke the onscreen callback for this child
+ try {
+ onscreenCallback(child);
+ }
+ catch (e) {
+ console.warn('monitorChildVisiblity: Exception in onscreenCallback:',
+ e, e.stack);
+ }
+ }
+
+ // Now adjust the first and last onscreen element and
+ // send a synchronous notification
+ adjustBounds();
+ callCallbacks();
+ }
+
+ // If the removed element was after the last onscreen element just return.
+ // Otherwise adjust the onscreen element range and synchronously call
+ // onscreen and offscreen callbacks as needed. Note, however that there
+ // are some special cases when the last element is deleted or when the
+ // first or last onscreen element is deleted.
+ function childRemoved(child, previous, next) {
+ // If there aren't any elements left revert back to initial state
+ if (container.firstElementChild === null) {
+ firstOnscreen = lastOnscreen = null;
+ firstNotifiedOnscreen = lastNotifiedOnscreen = null;
+ }
+ else {
+ // If the removed child was after the last onscreen child, then
+ // this removal doesn't affect us at all.
+ if (previous !== null && after(previous, lastOnscreen))
+ return;
+
+ // If the first onscreen element was the one removed
+ // use the next or previous element as a starting point instead.
+ // We know that there is at least one element left, so one of these
+ // two must be defined.
+ if (child === firstOnscreen) {
+ firstOnscreen = firstNotifiedOnscreen = next || previous;
+ }
+
+ // And similarly for the last onscreen element
+ if (child === lastOnscreen) {
+ lastOnscreen = lastNotifiedOnscreen = previous || next;
+ }
+
+ // Find the new bounds after the deletion
+ adjustBounds();
+ }
+
+ // Synchronously call the callbacks
+ callCallbacks();
+ }
+
+ // Adjust the onscreen element range and asynchronously call
+ // onscreen and offscreen callbacks as needed. We do this
+ // asynchronously so that if we get lots of scroll events in
+ // rapid succession and can't keep up, we can skip some of
+ // the notifications.
+ function scrollHandler() {
+ // Ignore scrolls while we are not displayed because
+ // none of our calculations will be right
+ if (container.clientHeight === 0) {
+ return;
+ }
+
+ // Adjust the first and last onscreen element
+ adjustBounds();
+
+ // We may get a lot of scroll events in quick succession, so
+ // don't call the callbacks synchronously. Instead defer so that
+ // we can handle any other queued scroll events.
+ deferCallbacks();
+ }
+
+ // Return true if node a is before node b and false otherwise
+ function before(a, b) {
+ return !!(a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING);
+ }
+
+ // Return true if node a is after node b and false otherwise
+ function after(a, b) {
+ return !!(a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_PRECEDING);
+ }
+
+ // This function recomputes the range of onscreen elements. Normally it
+ // just needs to do small amounts of nextElementSibling
+ // or previousElementSibling iteration to find the range. But it can also
+ // start from an unknown state and search the entire container to find
+ // the range of child elements that are onscreen.
+ function adjustBounds() {
+ // If the container has no children, the bounds are null
+ if (container.firstElementChild === null) {
+ firstOnscreen = lastOnscreen = null;
+ return;
+ }
+
+ // Compute the visible region of the screen, including scroll margin
+ var scrollTop = container.scrollTop;
+ var screenTop = scrollTop - scrollmargin;
+ var screenBottom = scrollTop + container.clientHeight + scrollmargin;
+
+ // This utility function returns ON if the child is onscreen,
+ // BEFORE if it offscreen before the visible elements and AFTER if
+ // it is offscreen aafter the visible elements
+ var BEFORE = -1, ON = 0, AFTER = 1;
+ function position(child) {
+ var childTop = child.offsetTop;
+ var childBottom = childTop + child.offsetHeight;
+ if (childBottom < screenTop)
+ return BEFORE;
+ if (childTop > screenBottom)
+ return AFTER;
+ return ON;
+ }
+
+ // If we don't have a first onscreen element yet, start with the first.
+ if (!firstOnscreen)
+ firstOnscreen = container.firstElementChild;
+
+ // Check the position of the top
+ var toppos = position(firstOnscreen);
+
+ // If the first element is onscreen, see if there are earlier ones
+ if (toppos === ON) {
+ var prev = firstOnscreen.previousElementSibling;
+ while (prev && position(prev) === ON) {
+ firstOnscreen = prev;
+ prev = prev.previousElementSibling;
+ }
+ }
+ else if (toppos === BEFORE) {
+ // The screen is below us, so find the next element that is visible.
+ var e = firstOnscreen.nextElementSibling;
+ while (e && position(e) !== ON) {
+ e = e.nextElementSibling;
+ }
+ firstOnscreen = e;
+ }
+ else {
+ // We've scrolled a lot or things have moved so much that the
+ // entire visible region is now above the first element.
+ // So scan backwards to find the new lastOnscreen and firstOnscreen
+ // elements. Note that if we get here, we can return since we
+ // will have updated both bounds
+
+ // Loop until we find an onscreen element
+ lastOnscreen = firstOnscreen.previousElementSibling;
+ while (lastOnscreen && position(lastOnscreen) !== ON)
+ lastOnscreen = lastOnscreen.previousElementSibling;
+
+ // Now loop from there to find the first onscreen element
+ firstOnscreen = lastOnscreen;
+ prev = firstOnscreen.previousElementSibling;
+ while (prev && position(prev) === ON) {
+ firstOnscreen = prev;
+ prev = prev.previousElementSibling;
+ }
+ return;
+ }
+
+ // Now make the same adjustment on the bottom of the onscreen region
+ // If we don't have a lastOnscreen value to start with, use the newly
+ // computed firstOnscreen value.
+ if (lastOnscreen === null)
+ lastOnscreen = firstOnscreen;
+
+ var bottompos = position(lastOnscreen);
+ if (bottompos === ON) {
+ // If the last element is onscreen, see if there are more below it.
+ var next = lastOnscreen.nextElementSibling;
+ while (next && position(next) === ON) {
+ lastOnscreen = next;
+ next = next.nextElementSibling;
+ }
+ }
+ else if (bottompos === AFTER) {
+ // the last element is now below the visible part of the screen
+ lastOnscreen = lastOnscreen.previousElementSibling;
+ while (position(lastOnscreen) !== ON)
+ lastOnscreen = lastOnscreen.previousElementSibling;
+ }
+ else {
+ // First and last are now both above the visible portion of the screen
+ // So loop down to find their new positions
+ firstOnscreen = lastOnscreen.nextElementSibling;
+ while (firstOnscreen && position(firstOnscreen) !== ON) {
+ firstOnscreen = firstOnscreen.nextElementSibling;
+ }
+
+ lastOnscreen = firstOnscreen;
+ var next = lastOnscreen.nextElementSibling;
+ while (next && position(next) === ON) {
+ lastOnscreen = next;
+ next = next.nextElementSibling;
+ }
+ }
+ }
+
+ // Call the callCallbacks() function after any pending events are processed
+ // We use this for asynchronous notification after scroll events.
+ function deferCallbacks() {
+ if (pendingCallbacks) {
+ // XXX: or we could just return here, which would defer for less time.
+ clearTimeout(pendingCallbacks);
+ }
+ pendingCallbacks = setTimeout(callCallbacks, 0);
+ }
+
+ // Synchronously call the callbacks to notify the client of the new set
+ // of onscreen elements. This only calls the onscreen and offscreen
+ // callbacks for elements that have come onscreen or gone offscreen since
+ // the last time it was called.
+ function callCallbacks() {
+ // If there is a pending call to this function (or if this was the pending
+ // call) clear it now, since we are sending the callbacks
+ if (pendingCallbacks) {
+ clearTimeout(pendingCallbacks);
+ pendingCallbacks = null;
+ }
+
+ // Call the onscreen callback for element from and its siblings
+ // up to, but not including to.
+ function onscreen(from, to) {
+ var e = from;
+ while (e && e !== to) {
+ try {
+ onscreenCallback(e);
+ }
+ catch (ex) {
+ console.warn('monitorChildVisibility: Exception in onscreenCallback:',
+ ex, ex.stack);
+ }
+ e = e.nextElementSibling;
+ }
+ }
+
+ // Call the offscreen callback for element from and its siblings
+ // up to, but not including to.
+ function offscreen(from, to) {
+ var e = from;
+ while (e && e !== to) {
+ try {
+ offscreenCallback(e);
+ }
+ catch (ex) {
+ console.warn('monitorChildVisibility: ' +
+ 'Exception in offscreenCallback:',
+ ex, ex.stack);
+ }
+ e = e.nextElementSibling;
+ }
+ }
+
+ // If the two ranges are the same, return immediately
+ if (firstOnscreen === firstNotifiedOnscreen &&
+ lastOnscreen === lastNotifiedOnscreen)
+ return;
+
+ // If the last notified range is null, then we just add the new range
+ if (firstNotifiedOnscreen === null) {
+ onscreen(firstOnscreen, lastOnscreen.nextElementSibling);
+ }
+
+ // If the new range is null, this means elements have been removed.
+ // We don't need to call offscreen for elements that are not in the
+ // container anymore, so we don't do anything in this case
+ else if (firstOnscreen === null) {
+ // Nothing to do here
+ }
+
+ // If the new range and the old range are disjoint, call the onscreen
+ // callback for the new range first and then call the offscreen callback
+ // for the old.
+ else if (before(lastOnscreen, firstNotifiedOnscreen) ||
+ after(firstOnscreen, lastNotifiedOnscreen)) {
+ // Mark the new ones onscreen
+ onscreen(firstOnscreen, lastOnscreen.nextElementSibling);
+
+ // Mark the old range offscreen
+ offscreen(firstNotifiedOnscreen,
+ lastNotifiedOnscreen.nextElementSibling);
+ }
+
+ // Otherwise if new elements are visible at the top, call those callbacks
+ // If new elements are visible at the bottom, call those.
+ // If elements have gone offscreen at the top, call those callbacks
+ // If elements have gone offscreen at the bottom, call those.
+ else {
+ // Are there new onscreen elements at the top?
+ if (before(firstOnscreen, firstNotifiedOnscreen)) {
+ onscreen(firstOnscreen, firstNotifiedOnscreen);
+ }
+
+ // Are there new onscreen elements at the bottom?
+ if (after(lastOnscreen, lastNotifiedOnscreen)) {
+ onscreen(lastNotifiedOnscreen.nextElementSibling,
+ lastOnscreen.nextElementSibling);
+ }
+
+ // Have elements gone offscreen at the top?
+ if (after(firstOnscreen, firstNotifiedOnscreen)) {
+ offscreen(firstNotifiedOnscreen, firstOnscreen);
+ }
+
+ // Have elements gone offscreen at the bottom?
+ if (before(lastOnscreen, lastNotifiedOnscreen)) {
+ offscreen(lastOnscreen.nextElementSibling,
+ lastNotifiedOnscreen.nextElementSibling);
+ }
+ }
+
+ // Now the notified onscreen range is in sync with the actual
+ // onscreen range.
+ firstNotifiedOnscreen = firstOnscreen;
+ lastNotifiedOnscreen = lastOnscreen;
+ }
+}
diff --git a/shared/resources/apn.json b/shared/resources/apn.json
new file mode 100644
index 0000000..023c61f
--- /dev/null
+++ b/shared/resources/apn.json
@@ -0,0 +1,3175 @@
+{
+"202": {
+ "1": [
+ {"carrier":"Cosmote Wireless Internet","apn":"internet","type":["default","supl"]},
+ {"voicemail":"123","type":["operatorvariant"]},
+ {"carrier":"Cosmote Mms","apn":"mms","mmsc":"http://mmsc.cosmote.gr:8002","mmsproxy":"10.10.10.20","mmsport":"8080","type":["mms"]}
+ ],
+ "5": [
+ {"carrier":"Vf Mobile Internet","apn":"internet.vodafone.gr","type":["default","supl","dun"]},
+ {"voicemail":"121","type":["operatorvariant"]},
+ {"carrier":"Vf MMS","apn":"mms.vodafone.net","user":"user","password":"pass","mmsc":"http://mms.vodafone.gr","mmsproxy":"213.249.19.49","mmsport":"5080","type":["mms"]}
+ ],
+ "9": [
+ {"carrier":"Q-Telecom MMS GPRS","apn":"q-mms.myq.gr","mmsc":"http://mms.myq.gr","mmsproxy":"192.168.80.134","mmsport":"8080","type":["mms"]},
+ {"voicemail":"122","type":["operatorvariant"]}
+ ],
+ "10": [
+ {"carrier":"Wind Internet","apn":"gint.b-online.gr","type":["default","supl"]},
+ {"voicemail":"122","type":["operatorvariant"]},
+ {"carrier":"Wind MMS","apn":"mnet.b-online.gr","mmsc":"http://192.168.200.95/servlets/mms","mmsproxy":"192.168.200.11","mmsport":"9401","type":["mms"]}
+ ]
+},
+"204": {
+ "4": [
+ {"carrier":"Vodafone NL","apn":"live.vodafone.com","user":"vodafone","password":"vodafone","mmsc":"http://mmsc.mms.vodafone.nl","mmsproxy":"192.168.251.150","mmsport":"8799","type":["default","supl","mms"]}
+ ],
+ "8": [
+ {"carrier":"KPN Internet","apn":"portalmmm.nl","mmsc":"http://mp.mobiel.kpn/mmsc","mmsproxy":"10.10.100.20","mmsport":"5080","type":["default","supl","mms"]}
+ ],
+ "12": [
+ {"carrier":"Telfort Internet","apn":"internet","mmsc":"http://mms","mmsproxy":"193.113.200.195","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "16": [
+ {"carrier":"T-Mobile Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"T-Mobile MMS","apn":"mms","user":"tmobilemms","password":"tmobilemms","mmsc":"http://t-mobilemms","mmsproxy":"10.10.10.11","mmsport":"8080","type":["mms"]}
+ ],
+ "20": [
+ {"carrier":"Rabo Mobiel","apn":"rabo.plus","type":["default","supl"]}
+ ]
+},
+"206": {
+ "1": [
+ {"carrier":"Proximus MMS","apn":"event.proximus.be","user":"mms","password":"mms","mmsc":"http://mmsc.proximus.be/mms","mmsproxy":"10.55.14.75","mmsport":"8080","type":["mms"]},
+ {"voicemail":"1230","type":["operatorvariant"]},
+ {"carrier":"Proximus Internet","apn":"internet.proximus.be","type":["default","supl"]},
+ {"carrier":"Telenet Internet","apn":"telenetwap.be","type":["default","supl"]},
+ {"carrier":"Telenet MMS","apn":"mms.be","mmsc":"http://mmsc.telenet.be","mmsproxy":"195.130.149.100","mmsport":"80","type":["mms"]}
+ ],
+ "5": [
+ {"carrier":"Telenet","apn":"telenetwap.be","type":["default","supl"]},
+ {"carrier":"Telenet MMS","apn":"mms.be","mmsc":"http://mmsc.telenet.be","mmsproxy":"195.130.149.100","mmsport":"80","type":["mms"]}
+ ],
+ "10": [
+ {"carrier":"Mobistar MMS","apn":"mms.be","mmsc":"http://mmsc.mobistar.be","mmsproxy":"212.65.63.143","mmsport":"8080","type":["mms"]},
+ {"voicemail":"5555","type":["operatorvariant"]},
+ {"carrier":"Mobistar","apn":"mworld.be","user":"mobistar","password":"mobistar","proxy":"212.65.63.143","port":"8080","type":["default","supl"]}
+ ],
+ "20": [
+ {"carrier":"Base","apn":"gprs.base.be","user":"base","password":"base","proxy":"172.31.198.37","port":"5080","type":["default","supl"]},
+ {"voicemail":"1933","type":["operatorvariant"]},
+ {"carrier":"BASE MMS","apn":"mms.base.be","user":"base","password":"base","mmsc":"http://mmsc.base.be","mmsproxy":"217.72.235.1","mmsport":"8080","type":["mms"]}
+ ]
+},
+"208": {
+ "1": [
+ {"carrier":"Orange World","apn":"orange","user":"orange","password":"orange","authtype":"2","type":["default","supl"]},
+ {"voicemail":"888","type":["operatorvariant"]},
+ {"carrier":"Orange MMS","apn":"orange.acte","user":"orange","password":"orange","mmsc":"http://mms.orange.fr","mmsproxy":"192.168.10.200","mmsport":"8080","authtype":"2","type":["mms"]},
+ {"carrier":"Orange Entreprise","apn":"orange-mib","proxy":"172.16.2.8","port":"8000","user":"orange","password":"orange","authtype":"2","type":["default"]},
+ {"carrier":"VM WAP","apn":"ofnew.fr","user":"orange","password":"orange","type":["default","supl"]},
+ {"carrier":"VM MMS","apn":"orange.acte","user":"orange","password":"orange","mmsc":"http://mms.orange.fr","mmsproxy":"192.168.10.200","mmsport":"8080","type":["mms"]},
+ {"carrier":"Tele2 WAP","apn":"ofnew.fr","user":"orange","password":"orange","type":["default","supl"]},
+ {"carrier":"Tele2 MMS","apn":"orange.acte","user":"orange","password":"orange","mmsc":"http://mms.orange.fr","mmsproxy":"192.168.10.200","mmsport":"8080","type":["mms"]},
+ {"carrier":"Carrefour WAP","apn":"ofnew.fr","user":"orange","password":"orange","type":["default","supl"]},
+ {"carrier":"Carrefour MMS","apn":"orange.acte","user":"orange","password":"orange","mmsc":"http://mms.orange.fr","mmsproxy":"192.168.10.200","mmsport":"8080","type":["mms"]},
+ {"carrier":"NRJWEB","apn":"ofnew.fr","user":"orange","password":"orange","type":["default","supl"]},
+ {"carrier":"NRJMMS","apn":"orange.acte","user":"orange","password":"orange","mmsc":"http://mms.orange.fr","mmsproxy":"192.168.10.200","mmsport":"8080","type":["mms"]}
+ ],
+ "10": [
+ {"carrier":"SFR webphone","apn":"sl2sfr","type":["default","supl"]},
+ {"voicemail":"123","type":["operatorvariant"]},
+ {"carrier":"SFR Mobile","apn":"wapsfr","type":["default","supl"]},
+ {"carrier":"MMS","apn":"mmssfr","mmsc":"http://mms1","mmsproxy":"10.151.0.1","mmsport":"8080","type":["mms"]},
+ {"carrier":"NRJWEB","apn":"fnetnrj","type":["default","supl"]},
+ {"carrier":"NRJMMS","mmsc":"http://mmsnrj","mmsproxy":"10.143.156.5","mmsport":"8080","apn":"mmsnrj","type":["mms"]},
+ {"carrier":"Auchan WAP","proxy":"192.168.21.8","port":"8080","apn":"wap65","type":["default","supl"]},
+ {"carrier":"Auchan MMS","mmsc":"http://mms65","mmsproxy":"10.143.156.8","mmsport":"8080","apn":"mms65","type":["mms"]},
+ {"carrier":"WAP Simplicime","proxy":"192.168.21.3","port":"8080","apn":"wapdebitel","type":["default","supl"]},
+ {"carrier":"MMS Simplicime","mmsc":"http://mmsdebitel","mmsproxy":"10.143.156.3","mmsport":"8080","apn":"mmsdebitel","type":["mms"]},
+ {"carrier":"WAP LeclercMobile","proxy":"192.168.21.9","port":"8080","apn":"wap66","type":["default","supl"]},
+ {"carrier":"MMS LeclercMobile","mmsc":"http://mms66","mmsproxy":"10.143.156.9","mmsport":"8080","apn":"mms66","type":["mms"]},
+ {"carrier":"Coriolis WAP","proxy":"192.168.21.6","port":"8080","apn":"wapcoriolis","type":["default","supl"]},
+ {"carrier":"Coriolis MMS","mmsc":"http://mmscoriolis","mmsproxy":"10.143.156.6","mmsport":"8080","apn":"mmscoriolis","type":["mms"]},
+ {"carrier":"Keyyo Mobile Internet","apn":"internet68","type":["default","supl"]},
+ {"carrier":"Keyyo Mobile MMS","mmsc":"http://mms68","mmsproxy":"10.143.156.11","mmsport":"8080","apn":"mms68","type":["mms"]},
+ {"carrier":"WEB La Poste Mobile","proxy":"192.168.21.3","port":"8080","apn":"wapdebitel","type":["default","supl"]},
+ {"carrier":"MMS La Poste Mobile","mmsc":"http://mmsdebitel","mmsproxy":"10.143.156.3","mmsport":"8080","apn":"mmsdebitel","type":["mms"]}
+ ],
+ "20": [
+ {"carrier":"Bouygues Telecom","apn":"mmsbouygtel.com","mmsc":"http://mms.bouyguestelecom.fr/mms/wapenc","mmsproxy":"62.201.129.226","mmsport":"8080","type":["default","supl","mms"]},
+ {"voicemail":"660","type":["operatorvariant"]}
+ ],
+ "15": [
+ {"carrier":"Free","apn":"free","type":["default","supl"]},
+ {"carrier":"Free MMS","mmsc":"http://mms.free.fr","apn":"mmsfree","type":["mms"]}
+ ]
+},
+"214": {
+ "1": [
+ {"carrier":"Internet movil","apn":"airtelwap.es","user":"wap@wap","password":"wap125","type":["default","supl"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS VODAFONE","apn":"mms.vodafone.net","user":"wap@wap","password":"wap125","mmsc":"http://mmsc.vodafone.es/servlets/mms","mmsproxy":"212.73.32.10","mmsport":"80","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Orange Internet Móvil","apn":"orangeworld","user":"orange","password":"orange","authtype":"1","type":["default"]},
+ {"voicemail":"242","enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Orange MMS","apn":"orangemms","proxy":"172.22.188.25","port":"8080","user":"orange","password":"orange","mmsc":"http://mms.orange.es","mmsproxy":"172.22.188.25","mmsport":"8080","authtype":"2","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"Yoigo Navegador","apn":"internet","type":["default","supl"]},
+ {"voicemail":"633","enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Yoigo MMS","apn":"mms","mmsc":"http://mmss/","mmsproxy":"193.209.134.141","mmsport":"80","type":["mms"]}
+ ],
+ "6": [
+ {"carrier":"INTERNET GPRS","apn":"airtelnet.es","user":"vodafone","password":"vodafone","type":["default","supl"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Euskaltel MMS","apn":"euskaltelmms.euskaltel.mobi","user":"MMS","password":"EUSKALTEL","mmsc":"http://mms.euskaltel.mobi","mmsproxy":"172.16.18.74","mmsport":"8080","type":["mms"]},
+ {"carrier":"Euskaltel Internet","apn":"internet.euskaltel.mobi","user":"CLIENTE","password":"EUSKALTEL","type":["default","supl"]},
+ {"carrier":"Internet R","apn":"internet.mundo-r.com","type":["default","supl"]},
+ {"carrier":"TeleCable Internet","apn":"internet.telecable.es","user":"telecable","password":"telecable","type":["default","supl"]},
+ {"carrier":"MMS R","apn":"euskaltelmms.euskaltel.mobi","mmsc":"http://mms.mundo-r.com","mmsproxy":"10.0.157.169","mmsport":"8080","type":["mms"]},
+ {"carrier":"TeleCable MMS","apn":"mms.telecable.es","user":"telecable","password":"telecable","mmsc":"http://mms.telecable.es/mms/","mmsproxy":"212.89.0.84","mmsport":"8080","type":["mms"]},
+ {"carrier":"MMS Vodafone","apn":"mms.vodafone.net","user":"wap@wap","password":"wap125","mmsc":"http://mmsc.vodafone.es/servlets/mms","mmsproxy":"212.73.32.10","mmsport":"80","type":["mms"]}
+ ],
+ "7": [
+ {"carrier":"Movistar MMS","apn":"telefonica.es","user":"telefonica","password":"telefonica","mmsc":"http://mms.movistar.com","mmsproxy":"10.138.255.5","mmsport":"8080","type":["mms"]},
+ {"voicemail":"123","enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Movistar","apn":"telefonica.es","user":"telefonica","password":"telefonica","proxy":"10.138.255.133","port":"8080","type":["default","supl"]}
+ ],
+ "8": [
+ {"carrier":"Euskaltel MMS","apn":"euskaltelmms.euskaltel.mobi","user":"MMS","password":"EUSKALTEL","mmsc":"http://mms.euskaltel.mobi","mmsproxy":"172.16.18.74","mmsport":"8080","type":["mms"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Euskaltel Internet","apn":"internet.euskaltel.mobi","user":"CLIENTE","password":"EUSKALTEL","type":["default","supl"]}
+ ],
+ "16": [
+ {"carrier":"TeleCable Internet","apn":"internet.telecable.es","user":"telecable","password":"telecable","type":["default","supl"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"TeleCable MMS","apn":"mms.telecable.es","user":"telecable","password":"telecable","mmsc":"http://mms.telecable.es/mms/","mmsproxy":"212.89.0.84","mmsport":"8080","type":["mms"]}
+ ]
+},
+"216": {
+ "1": [
+ {"carrier":"Telenor MMS","apn":"mms","mmsc":"http://mmsc.telenor.hu/","mmsproxy":"84.225.255.1","mmsport":"8080","type":["mms"]},
+ {"carrier":"Telenor Online","apn":"online","type":["default","supl"]}
+ ],
+ "30": [
+ {"carrier":"T-Mobile MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mms.t-mobile.hu/servlets/mms","mmsproxy":"212.51.126.10","mmsport":"8080","type":["mms"]},
+ {"carrier":"Web","apn":"wnw","type":["default","supl"]}
+ ],
+ "70": [
+ {"carrier":"VF internet","apn":"internet.vodafone.net","type":["default","supl"]},
+ {"carrier":"Vodafone MMS","apn":"mms.vodafone.net","mmsc":"http://mms.vodafone.hu/servlets/mms","mmsproxy":"80.244.97.2","mmsport":"8080","type":["mms"]},
+ {"carrier":"VMAX Internet","apn":"vitamax.internet.vodafone.net","type":["default","supl"]}
+ ]
+},
+"218": {
+ "3": [
+ {"carrier":"HT Eronet WAP","apn":"wap.eronet.ba","proxy":"10.12.3.10","port":"8080","type":["default","supl"]},
+ {"carrier":"HT Eronet GPRS","apn":"gprs.eronet.ba","type":["default","supl"]},
+ {"carrier":"Ht Eronet MMS","apn":"mms.eronet.ba","mmsc":"http://mms.gprs.eronet.ba/mms/wapenc","mmsproxy":"10.12.3.11","mmsport":"8080","type":["mms"]}
+ ],
+ "5": [
+ {"carrier":"m:tel","apn":"3g1","proxy":"192.168.61.10","port":"80","type":["default","supl"]},
+ {"carrier":"mtelmms","apn":"mtelmms","mmsc":"http://mmsc.mtel.ba/mms/wapenc","mmsproxy":"192.168.61.11","mmsport":"8080","type":["mms"]}
+ ],
+ "90": [
+ {"carrier":"Bh Mobile","apn":"active.bhmobile.ba","type":["default","supl"]},
+ {"carrier":"BHMobileMMS","apn":"mms.bhmobile.ba","mmsc":"http://mms.bhmobile.ba/cmmsc/post","mmsproxy":"195.222.56.041","mmsport":"8080","type":["mms"]}
+ ]
+},
+"219": {
+ "1": [
+ {"carrier":"T-Mobile MMS","apn":"mms.htgprs","mmsc":"http://mms.t-mobile.hr/servlets/mms","mmsproxy":"10.12.0.4","mmsport":"8080","type":["mms"]},
+ {"carrier":"T-Mobile","apn":"web.htgprs","type":["default","supl"]}
+ ],
+ "2": [
+ {"carrier":"Tele2","apn":"internet.tele2.hr","mmsc":"http://mmsc.tele2.hr","mmsproxy":"193.12.40.66","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "10": [
+ {"carrier":"Broadband","apn":"data.vip.hr","user":"38591","password":"38591","type":["default","supl"]},
+ {"carrier":"VIP.mms","apn":"mms.vipnet.hr","user":"38591","password":"38591","mmsc":"http://mms.vipnet.hr/servlets/mms","mmsproxy":"212.91.99.91","mmsport":"8080","type":["mms"]}
+ ]
+},
+"220": {
+ "1": [
+ {"carrier":"Telenor WAP","apn":"internet","user":"telenor","password":"gprs","proxy":"217.65.192.33","port":"8080","type":["default","supl"]},
+ {"carrier":"Telenor MMS","apn":"mms","mmsc":"http://mms.telenor.rs/servlets/mms","mmsproxy":"217.65.192.33","mmsport":"8080","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Telenor MNE internet","apn":"internet","user":"gprs","password":"gprs","proxy":"192.168.246.5","port":"8080","type":["default","supl"]},
+ {"carrier":"Telenor MNE mms","apn":"mms","user":"mms","password":"mms","mmsc":"http://mm.vor.telenor.me","mmsproxy":"192.168.246.5","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"mt:s wap","apn":"gprswap","user":"mts","password":"064","proxy":"172.17.88.198","port":"8080","type":["default","supl"]},
+ {"carrier":"mt:s mms","apn":"mms","user":"mts","password":"064","mmsc":"http://mms.mts064.telekom.rs/mms/wapenc","mmsproxy":"172.17.85.131","mmsport":"8080","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"T-Mobile MMS","apn":"mms","user":"38267","password":"38267","mmsc":"http://192.168.180.100/servlets/mms","mmsproxy":"10.0.5.19","mmsport":"8080","type":["mms"]},
+ {"carrier":"T-Mobile Internet","apn":"tmcg-wnw","user":"38267","password":"38267","proxy":"10.0.5.19","port":"8080","type":["default","supl"]}
+ ],
+ "5": [
+ {"carrier":"Vip GPRS","apn":"vipmobile","user":"vipmobile","password":"vipmobile","proxy":"212.15.182.82","port":"8080","type":["default","supl"]},
+ {"carrier":"Vip MMS","apn":"vipmobile.mms","user":"vipmobile","password":"vipmobile","mmsc":"http://mmsc.vipmobile.rs","mmsproxy":"212.15.182.82","mmsport":"8080","type":["mms"]}
+ ]
+},
+"222": {
+ "1": [
+ {"carrier":"TIM WAP","apn":"wap.tim.it","user":"WAPTIM","password":"WAPTIM","authtype":"1","type":["default","supl"]},
+ {"carrier":"TIM WEB","apn":"ibox.tim.it","type":["default","supl"]},
+ {"carrier":"TIM MMS","apn":"unico.tim.it","mmsc":"http://mms.tim.it/servlets/mms","mmsproxy":"213.230.130.89","mmsport":"80","type":["mms"]}
+ ],
+ "10": [
+ {"carrier":"MMS Vodafone","apn":"mms.vodafone.it","mmsc":"http://mms.vodafone.it/servlets/mms","mmsproxy":"10.128.224.10","mmsport":"80","type":["mms"]},
+ {"carrier":"Acc. Internet da cell","apn":"mobile.vodafone.it","type":["default","supl"]}
+ ],
+ "88": [
+ {"carrier":"WIND WEB","apn":"internet.wind","type":["default","supl"]},
+ {"carrier":"WIND BIZ WEB","apn":"internet.wind.biz","type":["default","supl"]},
+ {"carrier":"WIND MMS","apn":"mms.wind","mmsc":"http://mms.wind.it","mmsproxy":"212.245.244.100","mmsport":"8080","type":["mms"]}
+ ],
+ "99": [
+ {"carrier":"3","apn":"tre.it","mmsc":"http://10.216.59.240:10021/mmsc","mmsproxy":"62.13.171.3","mmsport":"8799","type":["default","supl","mms"]},
+ {"carrier":"Fastweb WEB","apn":"apn.fastweb.it","mmsc":"http://mms.fastweb.it/mms/wapenc","mmsproxy":"10.0.65.9","mmsport":"8080","type":["default","supl","mms"]}
+ ]
+},
+"226": {
+ "1": [
+ {"carrier":"Vodafone live!","apn":"live.vodafone.com","user":"live","password":"vodafone","proxy":"193.230.161.231","port":"8080","type":["default","supl"]},
+ {"carrier":"Vodafone live! PRE","apn":"live.pre.vodafone.com","user":"live","password":"vodafone","proxy":"193.230.161.231","port":"8080","type":["default","supl"]},
+ {"carrier":"Vodafone MMS","apn":"mms.vodafone.ro","user":"mms","password":"vodafone","mmsc":"http://multimedia/servlets/mms","mmsproxy":"193.230.161.231","mmsport":"8080","type":["mms"]},
+ {"carrier":"Vodafone MMS PRE","apn":"mms.pre.vodafone.ro","user":"mms","password":"vodafone","mmsc":"http://multimedia/servlets/mms","mmsproxy":"193.230.161.231","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Cosmote Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"Cosmote MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mmsc1.mms.cosmote.ro:8002","mmsproxy":"10.252.1.62","mmsport":"8080","type":["mms"]},
+ {"carrier":"web'n'walk","apn":"wnw","user":"wnw","password":"wnw","proxy":"10.252.1.62","port":"8080","type":["default","supl"]}
+ ],
+ "6": [
+ {"carrier":"Cosmote MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mmsc1.mms.cosmote.ro:8002","mmsproxy":"10.252.1.62","mmsport":"8080","type":["mms"]},
+ {"carrier":"web'n'walk","apn":"wnw","user":"wnw","password":"wnw","proxy":"10.252.1.62","port":"8080","type":["default","supl"]}
+ ],
+ "10": [
+ {"carrier":"Orange MMS","apn":"mms","mmsc":"http://wap.mms.orange.ro:8002","mmsproxy":"62.217.247.252","mmsport":"9201","type":["mms"]},
+ {"carrier":"Orange WAP","apn":"wap","proxy":"62.217.247.252","port":"8799","type":["default"]},
+ {"carrier":"Orange Internet","apn":"net","type":["default"]}
+ ]
+},
+"228": {
+ "1": [
+ {"carrier":"Swisscom MMS","apn":"event.swisscom.ch","mmsc":"http://mms.natel.ch:8079","mmsproxy":"192.168.210.2","mmsport":"8080","type":["mms"]},
+ {"carrier":"Swisscom Services","apn":"gprs.swisscom.ch","proxy":"192.168.210.1","port":"8080","type":["default","supl"]}
+ ],
+ "2": [
+ {"carrier":"Sunrise live","apn":"internet","type":["default","supl"]},
+ {"carrier":"Sunrise MMS","apn":"mms.sunrise.ch","mmsc":"http://mmsc.sunrise.ch","mmsproxy":"212.35.34.75","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Orange Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"Orange MMS","apn":"mms","mmsc":"http://192.168.151.3:8002","mmsproxy":"192.168.151.2","mmsport":"8080","type":["mms"]}
+ ]
+},
+"230": {
+ "1": [
+ {"carrier":"T-Mobile CZ","apn":"internet.t-mobile.cz","user":"wap","password":"wap","type":["default","supl"]},
+ {"carrier":"T-Mobile MMS","apn":"mms.t-mobile.cz","user":"mms","password":"mms","mmsc":"http://mms","mmsproxy":"10.0.0.10","mmsport":"80","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"O2 internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"O2 MMS","apn":"mms","mmsc":"http://mms.o2active.cz:8002","mmsproxy":"160.218.160.218","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"GPRS Web","apn":"internet","type":["default","supl"]},
+ {"carrier":"Vodafone MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mms","mmsproxy":"10.11.10.111","mmsport":"80","type":["mms"]}
+ ]
+},
+"231": {
+ "1": [
+ {"carrier":"Orange SK","apn":"internet","type":["default"]},
+ {"carrier":"Orange SK MMS","apn":"mms","user":"wap","password":"wap","mmsc":"http://imms.orange.sk","mmsproxy":"213.151.208.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Orange World","apn":"orangewap","user":"wap","password":"wap","proxy":"213.151.208.156","port":"8799","type":["default","supl"]}
+ ],
+ "2": [
+ {"carrier":"T-Mobile internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"T-Mobile MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mms","mmsproxy":"192.168.1.1","mmsport":"8080","type":["mms"]}
+ ],
+ "6": [
+ {"carrier":"O2 internet","apn":"o2internet","type":["default","supl"]},
+ {"carrier":"O2 MMS","apn":"o2mms","mmsc":"http://mms.o2world.sk:8002","mmsproxy":"10.97.1.11","mmsport":"8080","type":["mms"]}
+ ]
+},
+"232": {
+ "1": [
+ {"carrier":"A1","apn":"a1.net","user":"ppp@a1plus.at","password":"ppp","type":["default","supl"]},
+ {"carrier":"aonMobil","apn":"aon.at","user":"mobil@aon.at","password":"ppp","type":["default","supl"]},
+ {"carrier":"A1 MMS","apn":"free.a1.net","user":"ppp@a1plus.at","password":"ppp","mmsc":"http://mmsc.a1.net","mmsproxy":"194.48.124.71","mmsport":"8001","type":["mms"]},
+ {"carrier":"aonMobil MMS","apn":"mms.aon.at","user":"mobil@aon.at","password":"ppp","mmsc":"http://mmsc.aon.at","mmsproxy":"194.48.124.134","mmsport":"8001","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"T-Mobile Internet","apn":"gprsinternet","user":"t-mobile","password":"tm","type":["default","supl"]},
+ {"carrier":"T-Mobile MMS","apn":"gprsmms","user":"t-mobile","password":"tm","mmsc":"http://mmsc.t-mobile.at/servlets/mms","mmsproxy":"10.12.0.20","mmsport":"80","type":["mms"]}
+ ],
+ "5": [
+ {"carrier":"Orange MMS","apn":"orange.mms","user":"mms","password":"mms","mmsc":"http://mmsc.orange.at/mms/wapenc","mmsproxy":"194.24.128.118","mmsport":"8080","type":["mms"]},
+ {"carrier":"Orange Smartphone","apn":"orange.smartphone","user":"web","password":"web","type":["default","supl"]}
+ ],
+ "7": [
+ {"carrier":"tele.ring mms","apn":"mms","user":"wap@telering.at","password":"wap","mmsc":"http://relay.mms.telering.at","mmsproxy":"212.95.31.50","mmsport":"80","type":["mms"]},
+ {"carrier":"tele.ring web","apn":"web","user":"web@telering.at","password":"web","type":["default","supl"]}
+ ],
+ "10": [
+ {"carrier":"Planet3","apn":"drei.at","mmsc":"http://mmsc","mmsproxy":"213.94.78.133","mmsport":"8799","type":["default","supl","mms"]}
+ ],
+ "11": [
+ {"carrier":"data.bob","apn":"bob.at","user":"data@bob.at","password":"ppp","type":["default","supl"]},
+ {"carrier":"data.bob MMS","apn":"mms.bob.at","user":"data@bob.at","password":"ppp","mmsc":"http://mmsc.bob.at","mmsproxy":"194.48.124.7","mmsport":"8001","type":["mms"]}
+ ],
+ "12": [
+ {"carrier":"YESSS! GPRS","apn":"web.yesss.at","type":["default","supl"]}
+ ]
+},
+"234": {
+ "1": [
+ {"carrier":"UBIQUISYS","apn":"internet","type":["default","supl","mms"]}
+ ],
+ "2": [
+ {"carrier":"O2 MOBILE WEB","apn":"mobile.o2.co.uk","user":"O2web","password":"O2web","type":["default","supl"]},
+ {"voicemail":"901","type":["operatorvariant"]},
+ {"carrier":"O2 MMS Prepay","apn":"payandgo.o2.co.uk","user":"payandgo","password":"password","mmsc":"http://mmsc.mms.o2.co.uk:8002","mmsproxy":"82.132.254.1","mmsport":"8080","type":["mms"]},
+ {"carrier":"O2 MMS Postpay","apn":"wap.o2.co.uk","user":"o2wap","password":"password","mmsc":"http://mmsc.mms.o2.co.uk:8002","mmsproxy":"82.132.254.1","mmsport":"8080","type":["mms"]}
+ ],
+ "10": [
+ {"carrier":"O2 Mobile Web","apn":"mobile.o2.co.uk","user":"o2web","password":"password","type":["default","supl"]},
+ {"voicemail":"901","type":["operatorvariant"]},
+ {"carrier":"O2 MMS","apn":"wap.o2.co.uk","user":"o2wap","password":"password","proxy":"193.113.200.195","port":"8080","mmsc":"http://mmsc.mms.o2.co.uk:8002","mmsproxy":"82.132.254.1","mmsport":"8080","type":["mms"]},
+ {"carrier":"O2 PREPAY","apn":"payandgo.o2.co.uk","proxy":"193.113.200.195","port":"8080","user":"payandgo","password":"password","mmsc":"http://mmsc.mms.o2.co.uk:8002","mmsproxy":"82.132.254.1","mmsport":"8080","type":["default","supl","mms"]},
+ {"carrier":"TESCO","apn":"prepay.tesco-mobile.com","user":"tescowap","password":"password","mmsc":"http://mmsc.mms.o2.co.uk:8002","mmsproxy":"82.132.254.1","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "11": [
+ {"carrier":"O2 MOBILE WEB","apn":"mobile.o2.co.uk","user":"O2web","password":"O2web","type":["default","supl"]},
+ {"voicemail":"901","type":["operatorvariant"]},
+ {"carrier":"O2 MMS Prepay","apn":"payandgo.o2.co.uk","user":"payandgo","password":"password","mmsc":"http://mmsc.mms.o2.co.uk:8002","mmsproxy":"82.132.254.1","mmsport":"8080","type":["mms"]},
+ {"carrier":"O2 MMS Postpay","apn":"wap.o2.co.uk","user":"o2wap","password":"password","mmsc":"http://mmsc.mms.o2.co.uk:8002","mmsproxy":"82.132.254.1","mmsport":"8080","type":["mms"]},
+ {"carrier":"O2 MOBILE WEB","apn":"mobile.o2.co.uk","user":"O2web","password":"O2web","type":["default","supl"]},
+ {"carrier":"O2 MMS Prepay","apn":"payandgo.o2.co.uk","user":"payandgo","password":"password","mmsc":"http://mmsc.mms.02.co.uk:8002","mmsproxy":"82.132.254.1","mmsport":"8080","type":["mms"]},
+ {"carrier":"O2 MMS Postpay","apn":"wap.o2.co.uk","user":"o2wap","password":"password","mmsc":"http://mmsc.mms.02.co.uk:8002","mmsproxy":"82.132.254.1","mmsport":"8080","type":["mms"]}
+ ],
+ "15": [
+ {"carrier":"Vodafone UK","apn":"wap.vodafone.co.uk","user":"wap","password":"wap","mmsc":"http://mms.vodafone.co.uk/servlets/mms","mmsproxy":"212.183.137.12","mmsport":"8799","type":["default","supl","mms"]},
+ {"voicemail":"121","type":["operatorvariant"]},
+ {"carrier":"Vodafone UK Prepay","apn":"pp.vodafone.co.uk","user":"wap","password":"wap","mmsc":"http://mms.vodafone.co.uk/servlets/mms","mmsproxy":"212.183.137.12","mmsport":"8799","type":["default","supl","mms"]}
+ ],
+ "20": [
+ {"carrier":"3","apn":"three.co.uk","mmsc":"http://mms.um.three.co.uk:10021/mmsc","mmsproxy":"mms.three.co.uk","mmsport":"8799","type":["default","supl","mms"]}
+ ],
+ "30": [
+ {"carrier":"T-Mobile UK","apn":"general.t-mobile.uk","user":"t-mobile","password":"tm","mmsc":"http://mmsc.t-mobile.co.uk:8002","mmsproxy":"149.254.201.135","mmsport":"8080","type":["default","supl","mms"]},
+ {"voicemail":"222","type":["operatorvariant"]},
+ {"carrier":"Virgin Media","apn":"goto.virginmobile.uk","user":"user","mmsc":"http://mms.virginmobile.co.uk:8002","mmsproxy":"193.30.166.2","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "31": [
+ {"carrier":"T-Mobile Internet","apn":"general.t-mobile.uk","user":"t-mobile","password":"tm","type":["default","supl"]},
+ {"carrier":"T-Mobile Picture Message","apn":"general.t-mobile.uk","user":"t-mobile","password":"tm","mmsc":"http://mmsc.t-mobile.co.uk:8002","mmsproxy":"149.254.201.135","mmsport":"8080","type":["mms"]}
+ ],
+ "32": [
+ {"carrier":"T-Mobile Internet","apn":"general.t-mobile.uk","user":"t-mobile","password":"tm","type":["default","supl"]},
+ {"carrier":"T-Mobile Picture Message","apn":"general.t-mobile.uk","user":"t-mobile","password":"tm","mmsc":"http://mmsc.t-mobile.co.uk:8002","mmsproxy":"149.254.201.135","mmsport":"8080","type":["mms"]}
+ ],
+ "33": [
+ {"carrier":"Orange Internet","apn":"orangeinternet","authtype":"2","type":["default"]},
+ {"voicemail":"123","type":["operatorvariant"]},
+ {"carrier":"Orange MMS","apn":"orangemms","mmsc":"http://mms.orange.co.uk/","mmsproxy":"192.168.224.10","mmsport":"8080","authtype":"2","type":["mms"]}
+ ],
+ "34": [
+ {"carrier":"Orange internet","apn":"orangeinternet","type":["default","supl"]},
+ {"voicemail":"123","type":["operatorvariant"]},
+ {"carrier":"Orange MMS","apn":"orangemms","mmsc":"http://mms.orange.co.uk/","mmsproxy":"192.168.224.10","mmsport":"8080","type":["mms"]}
+ ],
+ "50": [
+ {"carrier":"Jersey Telecom","apn":"mms","user":"mms","password":"mms","mmsc":"http://mms.surfmail.com/mmsc","mmsproxy":"212.9.19.199","mmsport":"3130","type":["mms"]},
+ {"carrier":"pepperWEB (Jersey)","apn":"pepper","type":["default","supl"]}
+ ],
+ "55": [
+ {"carrier":"C&W Guernsey Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"Sure Picture Messaging","apn":"mms","mmsc":"http://mmsc.gprs.cw.com/","mmsproxy":"10.0.3.101","mmsport":"80","type":["mms"]}
+ ],
+ "58": [
+ {"carrier":"3G HSDPA","apn":"3gpronto","type":["default","supl"]},
+ {"carrier":"Manx Telecom Contract MMS","apn":"mms.manxpronto.net","user":"mms","password":"mms","mmsc":"http://mms.manxpronto.net:8002","mmsproxy":"195.10.99.46","mmsport":"8080","type":["mms"]},
+ {"carrier":"Manx Telecom Prepay MMS","apn":"mms.prontogo.net","user":"mmsgo","password":"mmsgo","mmsc":"http://mms.manxpronto.net:8002","mmsproxy":"195.10.99.41","mmsport":"8080","type":["mms"]},
+ {"carrier":"Manx Telecom Contract WEB","apn":"web.manxpronto.net","user":"gprs","password":"gprs","type":["default","supl"]}
+ ],
+ "86": [
+ {"carrier":"Orange internet","apn":"orangeinternet","type":["default","supl"]},
+ {"carrier":"Orange MMS","apn":"orangemms","mmsc":"http://mms.orange.co.uk/","mmsproxy":"192.168.224.10","mmsport":"8080","type":["mms"]}
+ ]
+},
+"238": {
+ "1": [
+ {"carrier":"TDC","apn":"internet","type":["default","supl"]},
+ {"voicemail":"20171717","type":["operatorvariant"]},
+ {"carrier":"TDC MMS","apn":"mms","mmsc":"http://mmsc.tdc.dk:8002","mmsproxy":"194.182.251.15","mmsport":"8080","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Telenor Internet","apn":"Internet","type":["default","supl"]},
+ {"voicemail":"20171717","type":["operatorvariant"]},
+ {"carrier":"Telenor MMS","apn":"telenor","mmsc":"http://mms.telenor.dk","mmsproxy":"212.88.64.8","mmsport":"8080","type":["mms"]}
+ ],
+ "6": [
+ {"carrier":"3","apn":"data.tre.dk","mmsc":"http://mms.3.dk/","mmsproxy":"mmsproxy.3.dk","mmsport":"8799","type":["default","supl","mms"]}
+ ],
+ "20": [
+ {"carrier":"Telia Internet","apn":"www.internet.mtelia.dk","type":["default","supl"]},
+ {"carrier":"Telia MMS","apn":"www.mms.mtelia.dk","mmsc":"http://mms.telia.dk","mmsproxy":"193.209.134.131","mmsport":"8080","type":["mms"]}
+ ],
+ "77": [
+ {"carrier":"Telenor Internet","apn":"Internet","type":["default","supl"]},
+ {"voicemail":"20171717","type":["operatorvariant"]},
+ {"carrier":"Telenor MMS","apn":"telenor","mmsc":"http://mms.telenor.dk","mmsproxy":"212.88.64.8","mmsport":"8080","type":["mms"]}
+ ]
+},
+"240": {
+ "1": [
+ {"carrier":"Telia SE MMS","apn":"mms.telia.se","mmsc":"http://mmss/","mmsproxy":"193.209.134.132","mmsport":"80","type":["mms"]},
+ {"voicemail":"*133#","type":["operatorvariant"]},
+ {"carrier":"Telia SE WAP","apn":"online.telia.se","proxy":"10.254.254.254","port":"8080","type":["default","supl"]}
+ ],
+ "17": [
+ {"carrier":"Halebop Internet","apn":"halebop.telia.se","type":["default","supl"]},
+ {"carrier":"Halebop MMS","apn":"mms.telia.se","user":"mms","password":"telia","mmsc":"http://mmss","mmsproxy":"193.209.134.132","mmsport":"9201","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"3","apn":"data.tre.se","mmsc":"http://mms.tre.se","mmsproxy":"mmsproxy.tre.se","mmsport":"8799","type":["default","supl","mms"]}
+ ],
+ "4": [
+ {"carrier":"Telenor Mobilsurf","apn":"services.telenor.se","proxy":"172.30.253.241","port":"8799","mmsc":"http://mms","mmsproxy":"172.30.253.241","mmsport":"8799","type":["default","supl","mms"]},
+ {"voicemail":"888","type":["operatorvariant"]}
+ ],
+ "6": [
+ {"carrier":"Telenor MMS","apn":"services.telenor.se","mmsc":"http://mms","mmsproxy":"173.30.253.241","mmsport":"8799","type":["mms"]},
+ {"voicemail":"888","type":["operatorvariant"]},
+ {"carrier":"Telenor Mobilsurf","apn":"services.telenor.se","proxy":"173.30.253.241","port":"8799","type":["default","supl"]}
+ ],
+ "7": [
+ {"carrier":"Tele2","apn":"internet.tele2.se","mmsc":"http://mmsc.tele2.se","mmsproxy":"130.244.202.30","mmsport":"8080","type":["default","supl","mms"]},
+ {"voicemail":"222","type":["operatorvariant"]}
+ ],
+ "8": [
+ {"carrier":"Telenor Mobilsurf","apn":"services.telenor.se","proxy":"172.30.253.241","port":"8799","type":["default","supl"]},
+ {"voicemail":"888","type":["operatorvariant"]},
+ {"carrier":"Telenor MMS","apn":"services.telenor.se","mmsc":"http://mms","mmsproxy":"172.30.253.241","mmsport":"8799","type":["mms"]}
+ ],
+ "9": [
+ {"carrier":"Telenor MMS","apn":"services.telenor.se","mmsc":"http://mms","mmsproxy":"173.30.253.241","mmsport":"8799","type":["mms"]},
+ {"carrier":"TelenorMobilsurf","apn":"services.telenor.se","proxy":"173.30.253.241","port":"8799","type":["default","supl"]}
+ ],
+ "10": [
+ {"carrier":"Spring data","apn":"data.springmobil.se","type":["default","supl"]},
+ {"carrier":"Spring MMS","apn":"mms.springmobil.se","mmsc":"http://mms.springmobil.se","mmsproxy":"213.88.184.37","mmsport":"8080","type":["mms"]}
+ ]
+},
+"242": {
+ "1": [
+ {"carrier":"Ventelo Internett","apn":"internet.ventelo.no","type":["default","supl"]},
+ {"voicemail":"91500002","type":["operatorvariant"]},
+ {"carrier":"Ventelo MMS","apn":"mms.ventelo.no","user":"ventelo","password":"1111","mmsc":"http://mmsc/","mmsproxy":"10.10.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"Telenor","apn":"telenor","mmsc":"http://mmsc","mmsproxy":"10.10.10.11","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "2": [
+ {"carrier":"NetCom MMS","apn":"mms.netcom.no","mmsc":"http://mm/","mmsproxy":"212.169.66.4","mmsport":"8080","type":["mms"]},
+ {"voicemail":"47230000","type":["operatorvariant"]},
+ {"carrier":"NetCom Internett","apn":"wap","type":["default","supl"]}
+ ],
+ "4": [
+ {"carrier":"Tele2 Internett","apn":"internet.tele2.no","mmsc":"http://mmsc.tele2.no","mmsproxy":"193.12.40.14","mmsport":"8080","type":["default","supl","mms"]},
+ {"voicemail":"47230000","type":["operatorvariant"]}
+ ],
+ "5": [
+ {"carrier":"NwN Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"NwN MMS","apn":"mms","mmsc":"http://mms.nwn.no","mmsproxy":"188.149.250.10","mmsport":"80","type":["mms"]}
+ ]
+},
+"244": {
+ "3": [
+ {"carrier":"DNA Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"DNA MMS","apn":"mms","mmsc":"http://mmsc.dnafinland.fi/","mmsproxy":"10.1.1.2","mmsport":"8080","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"DNA Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"DNA MMS","apn":"mms","user":"dna","password":"mms","mmsc":"http://mmsc.dnafinland.fi/","mmsproxy":"10.1.1.2","mmsport":"8080","type":["mms"]}
+ ],
+ "5": [
+ {"carrier":"Elisa Internet","apn":"internet","type":["default","supl"]},
+ {"voicemail":"777","type":["operatorvariant"]},
+ {"carrier":"Elisa MMS","apn":"mms","mmsc":"http://mms.elisa.fi","mmsproxy":"213.161.41.57","mmsport":"80","type":["mms"]}
+ ],
+ "10": [
+ {"carrier":"TDC Internet","apn":"internet.song.fi","user":"song@internet","password":"songnet","type":["default","supl"]},
+ {"carrier":"TDC MMS","apn":"mms.song.fi","mmsc":"http://mms.song.fi","mmsproxy":"213.161.41.58","mmsport":"80","type":["mms"]}
+ ],
+ "12": [
+ {"carrier":"DNA Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"DNA MMS","apn":"mms","mmsc":"http://mmsc.dnafinland.fi/","mmsproxy":"10.1.1.2","mmsport":"8080","type":["mms"]},
+ {"carrier":"DNA Pro Internet","apn":"dnapro.fi","authtype":"1","type":["default","supl"]},
+ {"carrier":"DNA Pro MMS","apn":"mms.dnapro.fi","mmsc":"http://mmsc.dnapro.fi/","mmsproxy":"10.1.1.21","mmsport":"8080","authtype":"1","type":["mms"]},
+ {"carrier":"TDC Internet Finland","apn":"inet.tdc.fi","authtype":"1","type":["default","supl"]},
+ {"carrier":"TDC MMS Finland","apn":"mms.tdc.fi","mmsc":"http://mmsc.tdc.fi","mmsproxy":"10.1.12.2","mmsport":"8080","authtype":"1","type":["mms"]}
+ ],
+ "13": [
+ {"carrier":"DNA Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"DNA MMS","apn":"mms","user":"dna","password":"mms","mmsc":"http://mmsc.dnafinland.fi/","mmsproxy":"10.1.1.2","mmsport":"8080","type":["mms"]}
+ ],
+ "21": [
+ {"carrier":"Saunalahti Internet","apn":"internet.saunalahti","type":["default","supl"]},
+ {"carrier":"Saunalahti MMS","apn":"mms.saunalahti.fi","mmsc":"http://mms.saunalahti.fi:8002/","mmsproxy":"62.142.4.197","mmsport":"8080","type":["mms"]}
+ ],
+ "91": [
+ {"carrier":"SONERA Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"SONERA MMS","apn":"wap.sonera.net","mmsc":"http://mms.sonera.fi:8002","mmsproxy":"195.156.25.33","mmsport":"80","type":["mms"]}
+ ]
+},
+"246": {
+ "1": [
+ {"carrier":"Omnitel MMS","apn":"gprs.mms.lt","user":"mms","password":"mms","mmsc":"http://mms.omnitel.net:8002/","mmsproxy":"194.176.32.149","mmsport":"8080","type":["mms"]},
+ {"carrier":"Omnitel Internet","apn":"omnitel","user":"omni","password":"omni","type":["default","supl"]}
+ ],
+ "2": [
+ {"carrier":"Bite LT Internet","apn":"internet","user":"mms@mms","password":"mms","mmsc":"http://mmsc/servlets/mms","mmsproxy":"192.168.150.2","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "3": [
+ {"carrier":"Tele2 Internet LT","apn":"internet.tele2.lt","user":"wap","password":"wap","proxy":"130.244.196.90","port":"8080","mmsc":"http://mmsc.tele2.lt/","mmsproxy":"193.12.40.29","mmsport":"8080","type":["default","supl","mms"]}
+ ]
+},
+"247": {
+ "1": [
+ {"carrier":"LMT Internet","apn":"internet.lmt.lv","type":["default","supl"]},
+ {"carrier":"LMT MMS","apn":"mms.lmt.lv","mmsc":"http://mmsc.lmt.lv/mmsc","mmsproxy":"212.93.97.201","mmsport":"80","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Tele2 LV Internet","apn":"internet.tele2.lv","user":"wap","password":"wap","type":["default","supl"]},
+ {"carrier":"Tele2 LV MMS","apn":"mms.tele2.lv","user":"wap","password":"wap","mmsc":"http://mmsc.tele2.lv/","mmsproxy":"193.12.40.38","mmsport":"8080","type":["mms"]}
+ ],
+ "5": [
+ {"carrier":"Bite LV Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"Bite LV MMS","apn":"mms","user":"mms@mms","password":"mms","mmsc":"http://mmsc/servlets/mms","mmsproxy":"192.168.150.2","mmsport":"8080","type":["mms"]},
+ {"carrier":"Bite LV WAP","apn":"wap","proxy":"213.226.131.133","port":"8080","type":["default","supl"]}
+ ]
+},
+"248": {
+ "1": [
+ {"carrier":"EMT Internet","apn":"internet.emt.ee","type":["default","supl"]},
+ {"carrier":"EMT MMS","apn":"mms.emt.ee","mmsc":"http://mms.emt.ee/servlets/mms","mmsproxy":"217.71.32.82","mmsport":"8080","type":["mms"]},
+ {"carrier":"EMT WAP","apn":"wap.emt.ee","proxy":"217.71.32.236","port":"8080","type":["default","supl"]}
+ ],
+ "2": [
+ {"carrier":"Elisa Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"Elisa MMS","apn":"mms","mmsc":"http://194.204.2.10","mmsproxy":"194.204.2.6","mmsport":"8000","type":["mms"]},
+ {"carrier":"Elisa WAP","apn":"wap","proxy":"194.204.2.6","port":"8000","type":["default","supl"]}
+ ],
+ "3": [
+ {"carrier":"Tele2 Internet","apn":"internet.tele2.ee","type":["default","supl"]},
+ {"carrier":"Tele2 MMS","apn":"mms.tele2.ee","mmsc":"http://mmsc.tele2.ee","mmsproxy":"193.12.40.6","mmsport":"8080","type":["mms"]}
+ ]
+},
+"250": {
+ "1": [
+ {"carrier":"MTS Internet","apn":"internet.mts.ru","user":"mts","password":"mts","type":["default","supl"]},
+ {"carrier":"MTS MMS","apn":"mms.mts.ru","user":"mts","password":"mts","mmsc":"http://mmsc","mmsproxy":"192.168.192.192","mmsport":"9201","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Megafon Internet","apn":"internet","user":"gdata","password":"gdata","type":["default","supl"]},
+ {"carrier":"Megafon MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mmsc:8002","mmsproxy":"10.10.10.10","mmsport":"8080","type":["mms"]}
+ ],
+ "99": [
+ {"carrier":"Beeline Internet","apn":"internet.beeline.ru","user":"beeline","password":"beeline","type":["default","supl"]},
+ {"carrier":"Beeline MMS","apn":"mms.beeline.ru","user":"beeline","password":"beeline","mmsc":"http://mms/","mmsproxy":"192.168.94.23","mmsport":"8080","type":["mms"]}
+ ],
+ "20": [
+ {"carrier":"TELE2 Internet","apn":"internet.tele2.ru","type":["default","supl"]},
+ {"carrier":"TELE2 MMS","apn":"mms.tele2.ru","mmsc":"http://mmsc.tele2.ru","mmsproxy":"193.12.40.65","mmsport":"8080","type":["mms"]}
+ ]
+},
+"255": {
+ "1": [
+ {"carrier":"Jeans MMS","apn":"mms.jeans.ua","mmsc":"http://mmsc:8002/","mmsproxy":"192.168.10.10","mmsport":"8080","type":["mms"]},
+ {"carrier":"MTS MMS","apn":"mms","mmsc":"http://mms/","mmsproxy":"192.168.10.10","mmsport":"8080","type":["mms"]},
+ {"carrier":"MTS-internet","apn":"internet","type":["default","supl"]}
+ ],
+ "2": [
+ {"carrier":"Beeline-internet","apn":"internet.beeline.ua","type":["default","supl"]},
+ {"carrier":"Beeline MMS","apn":"mms.beeline.ua","mmsc":"http://mms/","mmsproxy":"172.29.18.192","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Djuice MMS","apn":"mms.djuice.com.ua","user":"djuice","password":"mms","mmsc":"http://mms.kyivstar.net","mmsproxy":"10.10.10.10","mmsport":"8080","type":["mms"]},
+ {"carrier":"Kyivstar MMS","apn":"mms.kyivstar.net","user":"mms","password":"mms","mmsc":"http://mms.kyivstar.net","mmsproxy":"10.10.10.10","mmsport":"8080","type":["mms"]},
+ {"carrier":"Kyivstar Internet","apn":"www.kyivstar.net","type":["default","supl"]}
+ ],
+ "6": [
+ {"carrier":"life:) internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"life:) MMS","apn":"mms","mmsc":"http://mms.life.com.ua/cmmsc/post","mmsproxy":"212.58.162.230","mmsport":"8080","type":["mms"]}
+ ],
+ "7": [
+ {"carrier":"Utel Internet","apn":"3g.utel.ua","type":["default","supl"]},
+ {"carrier":"Utel MMS","apn":"3g.utel.ua","mmsc":"http://10.212.1.4/mms/wapenc","mmsproxy":"10.212.3.148","mmsport":"8080","type":["mms"]}
+ ]
+},
+"259": {
+ "1": [
+ {"carrier":"Orange MMS","apn":"mms.orange.md","mmsc":"http://mms/mms","mmsproxy":"192.168.127.125","mmsport":"3128","type":["mms"]},
+ {"carrier":"Orange IMO","apn":"wap.orange.md","proxy":"192.168.127.124","mmsport":"3128","type":["mms"]}
+ ]
+},
+"260": {
+ "1": [
+ {"carrier":"Plus Internet","apn":"internet","type":["default","supl"]},
+ {"voicemail":"2222","type":["operatorvariant"]},
+ {"carrier":"Plus MMS","apn":"mms","mmsc":"http://mms.plusgsm.pl:8002","mmsproxy":"212.2.96.16","mmsport":"8080","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"T-mobile.pl","apn":"internet","type":["default","supl"]},
+ {"voicemail":"602950","type":["operatorvariant"]},
+ {"carrier":"T-mobile.pl","apn":"mms","mmsc":"http://mms/servlets/mms","mmsproxy":"213.158.194.226","mmsport":"8080","type":["mms"]},
+ {"carrier":"heyahinternet","apn":"heyah.pl","type":["default","supl"]},
+ {"carrier":"heyahmms","apn":"heyahmms","mmsc":"http://mms.heyah.pl/servlets/mms","mmsproxy":"213.158.194.226","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Internet","apn":"Internet","user":"internet","password":"internet","type":["default"]},
+ {"voicemail":"*501","type":["operatorvariant"]},
+ {"carrier":"MMS Orange","apn":"mms","user":"mms","password":"mms","mmsc":"http://mms.orange.pl","mmsproxy":"192.168.6.104","mmsport":"8080","type":["mms"]}
+ ],
+ "6": [
+ {"carrier":"P4 Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"P4 MMS","apn":"mms","mmsc":"http://10.10.28.164/mms/wapenc","mmsproxy":"10.10.25.5","mmsport":"8080","type":["mms"]}
+ ]
+},
+"262": {
+ "1": [
+ {"carrier":"T-Mobile Internet","apn":"internet.t-mobile","user":"t-mobile","password":"tm","mmsc":"http://mms.t-mobile.de/servlets/mms","mmsproxy":"172.28.23.131","mmsport":"8008","type":["default","supl","mms"]}
+ ],
+ "2": [
+ {"carrier":"Vodafone DE-MMS","apn":"event.vodafone.de","mmsc":"http://139.7.24.1/servlets/mms","mmsproxy":"139.7.29.17","mmsport":"80","type":["mms"]},
+ {"voicemail":"5500","type":["operatorvariant"]},
+ {"carrier":"Vodafone DE","apn":"web.vodafone.de","type":["default","supl"]}
+ ],
+ "3": [
+ {"carrier":"E-Plus Web GPRS","apn":"internet.eplus.de","user":"eplus","password":"internet","type":["default","supl"]},
+ {"voicemail":"9911","type":["operatorvariant"]},
+ {"carrier":"E-Plus MMS","apn":"mms.eplus.de","user":"mms","password":"eplus","mmsc":"http://mms/eplus/","mmsproxy":"212.23.97.153","mmsport":"5080","type":["mms"]}
+ ],
+ "7": [
+ {"carrier":"o2","apn":"internet","mmsc":"http://10.81.0.7:8002","mmsproxy":"82.113.100.5","mmsport":"8080","type":["default","supl","mms"]},
+ {"voicemail":"333","type":["operatorvariant"]},
+ {"carrier":"o2 Internet Prepaid","apn":"pinternet.interkom.de","proxy":"82.113.100.6","port":"8080","mmsc":"http://10.81.0.7:8002","mmsproxy":"82.113.100.6","mmsport":"8080","type":["default","supl","mms"]}
+ ]
+},
+"268": {
+ "1": [
+ {"carrier":"Vodafone Net2","apn":"net2.vodafone.pt","user":"vodafone","password":"vodafone","proxy":"iproxy.vodafone.pt","port":"80","mmsc":"http://mms.vodafone.pt/servlets/mms","mmsproxy":"iproxy.vodafone.pt","mmsport":"80","type":["default","supl","mms"]}
+ ],
+ "3": [
+ {"carrier":"Optimus Internet","apn":"umts","type":["default"]},
+ {"carrier":"Optimus MMS","apn":"mms","mmsc":"http://mmsc:10021/mmsc","mmsproxy":"62.169.66.1","mmsport":"8799","type":["mms"]}
+ ],
+ "6": [
+ {"carrier":"tmn internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"mms tmn","apn":"mmsc.tmn.pt","user":"tmn","password":"tmnnet","mmsc":"http://mmsc/","mmsproxy":"10.111.2.16","mmsport":"8080","type":["mms"]}
+ ]
+},
+"270": {
+ "1": [
+ {"carrier":"LUXGSM MMS","apn":"mms.pt.lu","user":"mms","password":"mms","mmsc":"http://mmsc.pt.lu","mmsproxy":"194.154.192.88","mmsport":"8080","type":["mms"]},
+ {"carrier":"LUXGSM WAP","apn":"wap.pt.lu","user":"wap","password":"wap","proxy":"194.154.192.98","port":"8080","type":["default","supl"]}
+ ],
+ "77": [
+ {"carrier":"Tango WAP","apn":"internet","user":"tango","password":"tango","proxy":"130.244.196.90","port":"8080","type":["default","supl"]},
+ {"carrier":"Tango MMS","apn":"mms","user":"tango","password":"tango","mmsc":"http://mms.tango.lu","mmsproxy":"212.66.75.3","mmsport":"8080","type":["mms"]}
+ ],
+ "99": [
+ {"carrier":"Vox Mobile","apn":"vox.lu","mmsc":"http://mms.vox.lu","mmsproxy":"212.88.139.44","mmsport":"8080","type":["default","supl","mms"]}
+ ]
+},
+"272": {
+ "1": [
+ {"carrier":"Vodafone IE","apn":"live.vodafone.com","type":["default","supl"]},
+ {"carrier":"Vodafone IE-MMS","apn":"mms.vodafone.net","mmsc":"http://www.vodafone.ie/mms","mmsproxy":"10.24.59.200","mmsport":"80","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"O2 Ireland","apn":"internet","proxy":"62.40.32.40","port":"8080","mmsc":"http://mmsc.mms.o2.ie:8002","mmsproxy":"62.40.32.40","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "3": [
+ {"carrier":"Meteor Data","apn":"data.mymeteor.ie","type":["default","supl"]},
+ {"carrier":"Meteor","apn":"mms.mymeteor.ie","user":"my","password":"wap","mmsc":"http://mms.mymeteor.ie","mmsproxy":"10.85.85.85","mmsport":"8799","type":["default","supl","mms"]}
+ ],
+ "5": [
+ {"carrier":"3","apn":"3ireland.ie","mmsc":"http://mms.um.3ireland.ie:10021/mmsc","mmsproxy":"mms.3ireland.ie","mmsport":"8799","type":["default","supl","mms"]}
+ ],
+ "11": [
+ {"carrier":"Tesco","apn":"tescomobile.liffeytelecom.com","mmsc":"http://10.1.11.68/servlets/mms","mmsproxy":"10.1.11.19","mmsport":"8080","type":["default","supl","mms"]}
+ ]
+},
+"274": {
+ "1": [
+ {"carrier":"Siminn Internet","apn":"internet","proxy":"213.167.138.200","port":"8080","type":["default","supl"]},
+ {"carrier":"Siminn MMS","apn":"mms.simi.is","mmsc":"http://mms.simi.is/servlets/mms","mmsproxy":"213.167.138.200","mmsport":"8080","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Vodafone Internet","apn":"gprs.is","type":["default","supl"]},
+ {"carrier":"Vodafone MMS","apn":"mms.gprs.is","mmsc":"http://mmsc.vodafone.is","mmsproxy":"10.22.0.10","mmsport":"8080","type":["mms"]}
+ ],
+ "11": [
+ {"carrier":"MMS Nova","apn":"mms.nova.is","mmsc":"http://mmsc.nova.is","mmsproxy":"10.10.2.60","mmsport":"8080","type":["mms"]},
+ {"carrier":"Net Nova","apn":"net.nova.is","proxy":"10.10.2.60","port":"8080","type":["default","supl"]}
+ ]
+},
+"278": {
+ "1": [
+ {"carrier":"Vodafone MT","apn":"internet","user":"internet","password":"internet","type":["default","supl"]},
+ {"carrier":"Vodafone MT-MMS","apn":"mms.vodafone.com.mt","mmsc":"http://mms.vodafone.com.mt/servlets/mms","mmsproxy":"10.12.0.3","mmsport":"8080","type":["mms"]}
+ ]
+},
+"280": {
+ "1": [
+ {"carrier":"CYTA","apn":"cytamobile","user":"user","password":"pass","mmsc":"http://mmsc.cyta.com.cy","mmsproxy":"212.31.96.161","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "10": [
+ {"carrier":"MTN MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mms.mtn.com.cy/mmsc","mmsproxy":"172.24.97.1","mmsport":"3130","type":["mms"]},
+ {"carrier":"MTN Wap","apn":"wap","user":"wap","password":"wap","proxy":"172.24.97.3","port":"3130","type":["default","supl"]}
+ ]
+},
+"283": {
+ "10": [
+ {"carrier":"Orange Armenia MMS","apn":"mms","mmsc":"http://mms/","mmsproxy":"192.168.220.251","mmsport":"3128","type":["mms"],"authtype":"1"},
+ {"carrier":"Orange Armenia Internet","apn":"Internet","type":["default"],"authtype":"1"}
+ ]
+},
+"284": {
+ "1": [
+ {"carrier":"M-Tel","apn":"wap-gprs.mtel.bg","type":["default","supl"]},
+ {"voicemail":"131","type":["operatorvariant"]},
+ {"carrier":"M-Tel MMS","apn":"mms-gprs.mtel.bg","user":"mtel","password":"mtel","mmsc":"http://mmsc/","mmsproxy":"10.150.0.33","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Vivacom WAP","apn":"wap.vivacom.bg","user":"wap","password":"wap","proxy":"192.168.123.123","port":"8080","type":["default","supl"]},
+ {"voicemail":"110","type":["operatorvariant"]},
+ {"carrier":"Vivacom MMS","apn":"mms.vivacom.bg","user":"mms","password":"mms","mmsc":"http://mmsc.vivacom.bg","mmsproxy":"192.168.123.123","mmsport":"8080","type":["mms"]}
+ ],
+ "5": [
+ {"carrier":"GPRS GLOBUL","apn":"globul","type":["default","supl"]},
+ {"voicemail":"120","type":["operatorvariant"]},
+ {"carrier":"GLOBUL MMS GPRS","apn":"mms.globul.bg","user":"mms","mmsc":"http://mmsc1.mms.globul.bg:8002","mmsproxy":"192.168.87.11","mmsport":"8004","type":["mms"]}
+ ]
+},
+"286": {
+ "1": [
+ {"carrier":"Turkcell Internet","apn":"internet","user":"gprs","password":"gprs","type":["default","supl"]},
+ {"carrier":"Turkcell MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mms.turkcell.com.tr/servlets/mms","mmsproxy":"212.252.169.217","mmsport":"8080","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Vodafone Internet","apn":"internet","user":"vodafone","password":"vodafone","type":["default","supl"]},
+ {"carrier":"Vodafone MMS","apn":"mms","mmsc":"http://217.31.233.18:6001/MM1Servlet","mmsproxy":"217.31.233.18","mmsport":"9401","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Avea Internet","apn":"internet","user":"wap","password":"wap","type":["default","supl"]},
+ {"carrier":"Avea MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mms.avea.com.tr/servlets/mms","mmsproxy":"213.161.151.201","mmsport":"8080","type":["mms"]}
+ ]
+},
+"290": {
+ "1": [
+ {"carrier":"Tele Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"Tele MMS","apn":"mms","mmsc":"http://mms.tele.gl/mms/wapenc","mmsproxy":"10.112.222.37","mmsport":"8080","type":["mms"]}
+ ]
+},
+"293": {
+ "40": [
+ {"carrier":"Vodafone live!","apn":"internet.simobil.si","user":"simobil","password":"internet","proxy":"80.95.224.17","port":"9201","type":["default","supl"]},
+ {"carrier":"Si.mobil MMS","apn":"mms.simobil.si","user":"simobil","password":"internet","mmsc":"http://mmc","mmsproxy":"80.95.224.46","mmsport":"9201","type":["mms"]}
+ ],
+ "41": [
+ {"carrier":"Planet","apn":"internet","user":"mobitel","password":"internet","proxy":"213.229.249.40","port":"8080","type":["default","supl"]},
+ {"carrier":"Mobitel MMS","apn":"internet","user":"mobitel","password":"internet","mmsc":"http://mms.mobitel.si/servlets/mms","mmsproxy":"213.229.249.40","mmsport":"8080","type":["mms"]}
+ ]
+},
+"294": {
+ "1": [
+ {"carrier":"T-Mobile MK Internet","apn":"internet","user":"internet","password":"t-mobile","type":["default","supl"]},
+ {"carrier":"T-Mobile MK MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mms.t-mobile.com.mk","mmsproxy":"62.162.155.227","mmsport":"8080","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Cosmofon","apn":"Internet","user":"Internet","password":"Internet","proxy":"http://wap.planet.mk","port":"8080","type":["default","supl"]},
+ {"carrier":"Cosmofon MMS","apn":"mms","mmsc":"http://195.167.65.220:8002","mmsproxy":"10.10.10.20","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Internet","apn":"vipoperator","user":"vipoperator","password":"vipoperator","proxy":"78.40.0.1","port":"8080","type":["default","supl"]},
+ {"carrier":"MMS","apn":"vipoperator.mms","user":"vipoperator","password":"vipoperator","mmsc":"http://mmsc.vipoperator.com.mk","mmsproxy":"78.40.0.1","mmsport":"8080","type":["mms"]}
+ ]
+},
+"297": {
+ "2": [
+ {"carrier":"T-Mobile MMS","apn":"mms","user":"38267","password":"38267","mmsc":"http://192.168.180.100/servlets/mms","mmsproxy":"10.0.5.19","mmsport":"8080","type":["mms"]},
+ {"carrier":"T-Mobile Internet","apn":"tmcg-wnw","user":"38267","password":"38267","proxy":"10.0.5.19","port":"8080","type":["default","supl"]}
+ ]
+},
+"302": {
+ "220": [
+ {"carrier":"TELUS","apn":"sp.telus.com","mmsc":"http://aliasredirect.net/proxy/mmsc","mmsproxy":"74.49.0.18","mmsport":"80","type":["default","supl","mms"]},
+ {"carrier":"Koodo","apn":"sp.koodo.com","proxy":"74.49.0.18","port":"80","mmsc":"http://aliasredirect.net/proxy/koodo/mmsc","mmsproxy":"74.49.0.18","mmsport":"80","type":["default","supl","mms"]}
+ ],
+ "320": [
+ {"carrier":"MOWAP","apn":"wap.davewireless.com","proxy":"10.100.3.4","port":"8080","type":["default","supl"]},
+ {"carrier":"MOMMS","apn":"mms.davewireless.com","mmsc":"http://mms.mobilicity.net","mmsproxy":"10.100.3.4","mmsport":"8080","type":["mms"]}
+ ],
+ "270": [
+ {"carrier":"MMS","apn":"mms.mobi.eastlink.ca","mmsc":"http://mmss.mobi.eastlink.ca","mmsproxy":"10.232.12.49","mmsport":"8080","type":["mms"]},
+ {"carrier":"Internet","apn":"wisp.mobi.eastlink.ca","type":["default","supl"]}
+ ],
+ "370": [
+ {"carrier":"Fido Internet","apn":"fido-core-appl1.apn","mmsc":"http://mms.fido.ca","mmsproxy":"205.151.11.13","mmsport":"80","type":["default","supl","mms"]},
+ {"carrier":"MTS-Roaming","apn":"sp.mts","mmsc":"http://mmsc2.mts.net/","mmsproxy":"209.4.229.90","mmsport":"9401","type":["default","supl","mms"]}
+ ],
+ "490": [
+ {"carrier":"Internet","apn":"internet.windmobile.ca","type":["default","supl"]},
+ {"carrier":"MMS","apn":"mms.windmobile.ca","mmsc":"http://mms.windmobile.ca","mmsproxy":"74.115.197.70","mmsport":"8080","type":["mms"]}
+ ],
+ "500": [
+ {"carrier":"Videotron","apn":"media.videotron","mmsc":"http://media.videotron.com","type":["default","supl","mms"]}
+ ],
+ "610": [
+ {"carrier":"Bell Internet","apn":"pda.bell.ca","mmsc":"http://mms.bell.ca/mms/wapenc","mmsproxy":"web.wireless.bell.ca","mmsport":"80","type":["default","supl","mms"]}
+ ],
+ "660": [
+ {"carrier":"MTS","apn":"sp.mts","mmsc":"http://mmsc2.mts.net/","mmsproxy":"209.4.229.90","mmsport":"9401","type":["default","supl","mms"]}
+ ],
+ "720": [
+ {"carrier":"Rogers","apn":"rogers-core-appl1.apn","mmsc":"http://mms.gprs.rogers.com","mmsproxy":"10.128.1.69","mmsport":"80","type":["default","supl","mms"]},
+ {"carrier":"Chatr Internet","apn":"chatrweb.apn","mmsc":"http://mms.chatrwireless.com","mmsproxy":"205.151.11.11","mmsport":"80","type":["default","mms"]},
+ {"carrier":"SpeakOut","apn":"goam.com","user":"wapuser1","password":"wap","proxy":"10.128.1.69","port":"80","mmsc":"http://mms.gprs.rogers.com","mmsproxy":"10.128.1.69","mmsport":"80","type":["default","mms"]}
+ ],
+ "780": [
+ {"carrier":"SaskTel","apn":"pda.stm.sk.ca","mmsc":"http://mms.sasktel.com","mmsproxy":"mig.sasktel.com","mmsport":"80","type":["default","supl","mms"]}
+ ]
+},
+"310": {
+ "30": [
+ {"carrier":"myBlue Pix","apn":"mmswap.centennialwireless.com","mmsc":"http://mms.myblue.com/servlets/mms","mmsproxy":"63.99.231.135","mmsport":"8080","type":["mms"]},
+ {"carrier":"Internet","apn":"private.centennialwireless.com","user":"privuser","password":"priv","type":["default","supl"]}
+ ],
+ "80": [
+ {"carrier":"CorrMMS","apn":"corrmms","mmsc":"http://mms.iot1.com/corr/mms.php","mmsproxy":"66.255.55.23","mmsport":"80","type":["mms"]}
+ ],
+ "90": [
+ {"carrier":"Internet","apn":"isp","type":["default","supl"]},
+ {"carrier":"MMS","apn":"mms","mmsc":"http://mms.edgemobile.net/mmsc","mmsproxy":"12.108.12.13","mmsport":"3128","type":["mms"]},
+ {"carrier":"Edge MMS Prepay","apn":"ppmms","mmsc":"http://mms.edgemobile.net/mmsc","mmsproxy":"12.108.12.13","mmsport":"3128","type":["mms"]}
+ ],
+ "100": [
+ {"carrier":"PLAT-OTA-MMS","apn":"plateaumms","password":"mmsc","mmsc":"208.254.124.11:8514","mmsproxy":"208.254.124.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"PLATWEB","apn":"plateauweb","type":["default","supl"]}
+ ],
+ "130": [
+ {"carrier":"My Multi Media","apn":"mms.c1.ama","user":"cell1mms","password":"cell1","mmsc":"http://mms.iot1.com/amarillo/mms.php","type":["mms"]}
+ ],
+ "160": [
+ {"carrier":"T-Mobile US 160","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "170": [
+ {"carrier":"DataConnect","apn":"isp.cingular","type":["default","supl"]},
+ {"carrier":"Cingular MMS","apn":"wap.cingular","user":"WAP@CINGULARGPRS.COM","password":"CINGULAR1","mmsc":"http://mmsc.cingular.com","mmsproxy":"66.209.11.32","mmsport":"8080","type":["mms"]}
+ ],
+ "200": [
+ {"carrier":"T-Mobile US 200","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "210": [
+ {"carrier":"T-Mobile US 210","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "220": [
+ {"carrier":"T-Mobile US 220","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "230": [
+ {"carrier":"T-Mobile US 230","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "240": [
+ {"carrier":"T-Mobile US 240","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "250": [
+ {"carrier":"T-Mobile US 250","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "260": [
+ {"carrier":"T-Mobile US","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "270": [
+ {"carrier":"T-Mobile US 270","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "310": [
+ {"carrier":"T-Mobile US 310","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "380": [
+ {"carrier":"Cingular 380 ATT","apn":"proxy","mmsc":"http://mmsc.cingular.com/","mmsproxy":"wireless.cingular.com","type":["default","supl","mms"]},
+ {"carrier":"AWS MMS","apn":"proxy","mmsc":"http://mmsc.mymmode.com","mmsproxy":"10.250.250.55","mmsport":"8080","type":["mms"]}
+ ],
+ "390": [
+ {"carrier":"Celloneet MMS","apn":"mms.celloneet.com","user":"user1@mms.celloneet.com","password":"celloneet","mmsc":"http://mms.celloneet.com/servlets/mms","mmsproxy":"63.99.231.135","mmsport":"8080","type":["mms"]}
+ ],
+ "410": [
+ {"carrier":"Cingular 410","apn":"wap.cingular","user":"WAP@CINGULARGPRS.COM","password":"CINGULAR1","server":"cingulargprs.com","mmsc":"http://mmsc.cingular.com/","mmsproxy":"wireless.cingular.com","type":["default","supl","mms"]}
+ ],
+ "420": [
+ {"carrier":"CBW MMS","apn":"wap.gocbw.com","mmsc":"http://mms.gocbw.com:8088/mms","mmsproxy":"216.68.79.202","mmsport":"80","type":["mms"]}
+ ],
+ "470": [
+ {"carrier":"DataConnect","apn":"isp.cingular","type":["default","supl"]},
+ {"carrier":"MediaNet","apn":"wap.cingular","user":"WAP@CINGULARGPRS.COM","password":"CINGULAR1","mmsc":"http://mmsc.cingular.com","mmsproxy":"66.209.11.32","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "480": [
+ {"carrier":"DataConnect","apn":"isp.cingular","type":["default","supl"]},
+ {"carrier":"MediaNet","apn":"wap.cingular","user":"WAP@CINGULARGPRS.COM","password":"CINGULAR1","mmsc":"http://mmsc.cingular.com","mmsproxy":"66.209.11.32","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "490": [
+ {"carrier":"T-Mobile US 490","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]},
+ {"carrier":"GoodCall Picture Message","apn":"good.call","mmsc":"http://mms.suncom.net:8088/mms","mmsproxy":"66.150.33.125","mmsport":"8080","type":["mms"]},
+ {"carrier":"Suncom MMS","apn":"mms","mmsc":"http://mms.suncom.net:8088/mms","mmsproxy":"66.150.33.125","mmsport":"8080","type":["mms"]}
+ ],
+ "560": [
+ {"carrier":"DobsonMMS","apn":"dobsoncellularwap","mmsc":"http://mmsc","mmsproxy":"172.23.1.252","mmsport":"8799","type":["mms"]}
+ ],
+ "570": [
+ {"carrier":"ChinookMMS","apn":"wapgw.chinookwireless.net","mmsc":"http://mms.cellonenation.net/mms/","mmsproxy":"204.181.155.195","mmsport":"8080","type":["mms"]}
+ ],
+ "580": [
+ {"carrier":"T-Mobile US 580","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "590": [
+ {"carrier":"CellularOne MMS","apn":"cellular1wap","mmsc":"http://mmsc","mmsproxy":"172.23.1.252","mmsport":"8799","type":["mms"]}
+ ],
+ "610": [
+ {"carrier":"EpicINT","apn":"internet.epictouch","type":["default","supl"]},
+ {"carrier":"EpicMMS","apn":"mms.epictouch","mmsc":"http://mmsc.westlinkcom.com/servlets/mms","mmsproxy":"63.99.231.135","mmsport":"8080","type":["mms"]}
+ ],
+ "660": [
+ {"carrier":"T-Mobile US 660","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "770": [
+ {"carrier":"WEB 2","apn":"i2.iwireless.com","type":["default","supl"]},
+ {"carrier":"Picture Messaging","apn":"wap1.iwireless.com","mmsc":"http://mmsc.iwireless.dataonair.net:6672","mmsproxy":"209.4.229.31","mmsport":"9401","type":["mms"]},
+ {"carrier":"PIAPicture Messaging","apn":"wap9.iwireless.com","mmsc":"http://mmsc.iwireless.dataonair.net:6672","mmsproxy":"209.4.229.32","mmsport":"9401","type":["mms"]}
+ ],
+ "800": [
+ {"carrier":"T-Mobile US 800","apn":"epc.tmobile.com","mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc","type":["default","supl","mms"]},
+ {"voicemail":"123","type":["operatorvariant"]}
+ ],
+ "840": [
+ {"carrier":"Internet","apn":"isp","type":["default","supl"]},
+ {"carrier":"MMS","apn":"mms","mmsc":"http://mms.edgemobile.net/mmsc","mmsproxy":"12.108.12.13","mmsport":"3128","type":["mms"]},
+ {"carrier":"Edge MMS Prepay","apn":"ppmms","mmsc":"http://mms.edgemobile.net/mmsc","mmsproxy":"12.108.12.13","mmsport":"3128","type":["mms"]}
+ ],
+ "880": [
+ {"carrier":"DTC MMS","apn":"mms.adv.com","mmsc":"http://mms.iot1.com/advantage/mms.php","type":["mms"]}
+ ],
+ "910": [
+ {"carrier":"WOW_WAP","apn":"wap.firstcellular.com","mmsc":"mms.firstcellular.net/mmsc","mmsproxy":"10.101.1.5","mmsport":"3128","type":["default","supl","mms"]}
+ ]
+},
+"311": {
+ "190": [
+ {"carrier":"MMS","apn":"wap.cellular1.net","mmsc":"http://mms.cellular1.net/ecit/mms.php","type":["mms"]}
+ ],
+ "210": [
+ {"carrier":"Farmers GPRS","apn":"internet.farmerswireless.com","type":["default","supl"]},
+ {"carrier":"Farmers MMS","apn":"mms.farmers.com","mmsc":"172.16.0.37:8514","type":["mms"]}
+ ]
+},
+"330": {
+ "110": [
+ {"carrier":"INTERNET CLARO","apn":"internet.claropr.com","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS CLARO","apn":"mms.claropr.com","user":"","password":"","mmsproxy":"10.50.38.3","mmsport":"8799","mmsc":"http://mmsg.claropr.com:10021/mmsc","authtype":"1","type":["mms"]}
+ ]
+},
+"334": {
+ "20": [
+ {"carrier":"Internet","apn":"internet.itelcel.com","user":"webgprs","password":"webgprs2002","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Mensajes Multimedia","apn":"mms.itelcel.com","user":"mmsgprs","password":"mmsgprs2003","mmsc":"http://mms.itelcel.com/servlets/mms","mmsproxy":"148.233.151.240","mmsport":"8080","authtype":"1","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"movistar Internet","apn":"internet.movistar.mx","user":"movistar","password":"movistar","authtype":"1","type":["default","supl","dun"]},
+ {"voicemail":"*86","enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"movistar MMS","apn":"mms.movistar.mx","user":"movistar","password":"movistar","mmsc":"http://mms.movistar.mx","mmsproxy":"10.2.20.1","mmsport":"80","authtype":"1","type":["mms"]}
+ ],
+ "30": [
+ {"carrier":"movistar Internet","apn":"internet.movistar.mx","user":"movistar","password":"movistar","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"movistar MMS","apn":"mms.movistar.mx","user":"movistar","password":"movistar","mmsc":"http://mms.movistar.mx","mmsproxy":"10.2.20.1","mmsport":"80","authtype":"1","type":["mms"]}
+ ],
+ "50": [
+ {"carrier":"Iusacell Internet","apn":"web.iusacellgsm.mx","user":"Iusacellgsm","password":"Iusacellgsm","authtype":"0","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Iusacell MMS","apn":"mms.iusacellgsm.mx","user":"mmsiusacellgsm","password":"mmsiusacellgsm","mmsc":"http://mms.iusacell3g.com/","mmsproxy":"192.200.1.40","mmsport":"80","authtype":"0","type":["mms"]}
+ ]
+},
+"338": {
+ "50": [
+ {"carrier":"INTERNET Digicel","apn":"web.digiceljamaica.com","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS Digicel","apn":"wap","user":"","password":"","mmsproxy":"172.16.7.12","mmsport":"8080","mmsc":"http://mms.digicelgroup.com","authtype":"1","type":["mms"]}
+ ],
+ "18": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","authtype":"1","type":["mms"]}
+ ],
+ "70": [
+ {"carrier":"Claro Web","apn":"internet.ideasclaro.com.jm","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Claro MMS","apn":"mms.ideasclaro.com.jm","user":"","password":"","mmsproxy":"190.80.147.118","mmsport":"8080","mmsc":"http://mms.ideasclaro.com.jm/mms/wapenc","authtype":"1","type":["mms"]}
+ ],
+ "180": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","authtype":"1","type":["mms"]}
+ ]
+},
+"340": {
+ "1": [
+ {"carrier":"Orange World Caraïbe","apn":"orangewap","user":"orange","password":"wap","proxy":"10.0.0.10","port":"8082","type":["default","supl"]},
+ {"carrier":"Orange MMS Caraïbe","apn":"orangewap","user":"orange","password":"orange","mmsc":"http://193.251.160.246/servlets/mms","mmsproxy":"10.0.0.10","mmsport":"8082","type":["mms"]},
+ {"carrier":"Orangeweb","apn":"orangeweb","user":"orange","password":"orange","type":["default"]}
+ ],
+ "20": [
+ {"carrier":"Digicel FR","apn":"wap.digicelfr.com","user":"wap","password":"wap","mmsc":"http://mmc.digicelfr.com/servlets/mms","mmsproxy":"172.20.6.12","mmsport":"8080","type":["default","supl","mms"]}
+ ]
+},
+"342": {
+ "60": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"344": {
+ "92": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"346": {
+ "14": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"348": {
+ "17": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"352": {
+ "11": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"354": {
+ "86": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"356": {
+ "11": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"358": {
+ "11": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"360": {
+ "11": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"363": {
+ "2": [
+ {"carrier":"INTERNET Aruba","apn":"web.digicelaruba.com","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS Digicel","apn":"wap","user":"","password":"","mmsproxy":"172.16.7.12","mmsport":"8080","mmsc":"http://mms.digicelgroup.com","authtype":"1","type":["mms"]}
+ ],
+ "20": [
+ {"carrier":"INTERNET Aruba","apn":"web.digicelaruba.com","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS Digicel","apn":"wap","user":"","password":"","mmsproxy":"172.16.7.12","mmsport":"8080","mmsc":"http://mms.digicelgroup.com","authtype":"1","type":["mms"]}
+ ]
+},
+"365": {
+ "84": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"366": {
+ "11": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"368": {
+ "1": [
+ {"carrier":"Internet","apn":"internet","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Cubacel MMS","apn":"mms","mmsproxy":"200.13.145.52","mmsport":"8080","mmsc":"http://mms.cubacel.cu/","authtype":"1","type":["mms"]}
+ ]
+},
+"370": {
+ "1": [
+ {"carrier":"Orange net","apn":"orangenet.com.do","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"voicemail":"*777","type":["operatorvariant"]},
+ {"carrier":"Orange MMS","apn":"orangeworld","user":"orange","password":"orange","mmsproxy":"172.16.126.70","mmsport":"8080","mmsc":"http://mms.orange.com.do/servlets/mms","authtype":"1","type":["mms"]},
+ {"carrier":"Orange DO MMS","apn":"orangeworld","mmsc":"http://mmr.orangewi.com/servlets/mms","mmsproxy":"172.16.126.70","mmsport":"8080","type":["mms"]},
+ {"carrier":"Orange DO","apn":"orangenet.com.do","type":["default"]}
+ ],
+ "2": [
+ {"carrier":"INTERNET CLARO","apn":"internet.ideasclaro.com.do","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"voicemail":"*99","type":["operatorvariant"]},
+ {"carrier":"MMS CLARO","apn":"mms.ideasclaro.com.do","user":"","password":"","mmsproxy":"190.80.147.8","mmsport":"8080","mmsc":"http://mms.ideasclaro.com.do/mms/wapenc","authtype":"1","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"Viva Edge","apn":"edge.viva.net.do","proxy":"192.168.16.10","port":"9401","user":"viva","password":"viva","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Viva MMS","apn":"mms.viva.net.do","user":"viva","password":"viva","mmsproxy":"192.168.16.10","mmsport":"9401","mmsc":"http://10.200.16.4/mms/wapenc","authtype":"1","type":["mms"]}
+ ]
+},
+"374": {
+ "12": [
+ {"carrier":"Bmobile internet","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Bmobile mms","apn":"mms","user":"","password":"","mmsproxy":"192.168.210.104","mmsport":"8080","mmsc":"http://192.168.210.104/mmrelay.app","authtype":"1","type":["mms"]}
+ ],
+ "120": [
+ {"carrier":"Bmobile internet","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Bmobile mms","apn":"mms","user":"","password":"","mmsproxy":"192.168.210.104","mmsport":"8080","mmsc":"http://192.168.210.104/mmrelay.app","authtype":"1","type":["mms"]}
+ ],
+ "121": [
+ {"carrier":"Bmobile internet","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Bmobile mms","apn":"mms","user":"","password":"","mmsproxy":"192.168.210.104","mmsport":"8080","mmsc":"http://192.168.210.104/mmrelay.app","authtype":"1","type":["mms"]}
+ ],
+ "122": [
+ {"carrier":"Bmobile internet","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Bmobile mms","apn":"mms","user":"","password":"","mmsproxy":"192.168.210.104","mmsport":"8080","mmsc":"http://192.168.210.104/mmrelay.app","authtype":"1","type":["mms"]}
+ ],
+ "123": [
+ {"carrier":"Bmobile internet","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Bmobile mms","apn":"mms","user":"","password":"","mmsproxy":"192.168.210.104","mmsport":"8080","mmsc":"http://192.168.210.104/mmrelay.app","authtype":"1","type":["mms"]}
+ ],
+ "124": [
+ {"carrier":"Bmobile internet","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Bmobile mms","apn":"mms","user":"","password":"","mmsproxy":"192.168.210.104","mmsport":"8080","mmsc":"http://192.168.210.104/mmrelay.app","authtype":"1","type":["mms"]}
+ ],
+ "125": [
+ {"carrier":"Bmobile internet","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Bmobile mms","apn":"mms","user":"","password":"","mmsproxy":"192.168.210.104","mmsport":"8080","mmsc":"http://192.168.210.104/mmrelay.app","authtype":"1","type":["mms"]}
+ ],
+ "126": [
+ {"carrier":"Bmobile internet","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Bmobile mms","apn":"mms","user":"","password":"","mmsproxy":"192.168.210.104","mmsport":"8080","mmsc":"http://192.168.210.104/mmrelay.app","authtype":"1","type":["mms"]}
+ ],
+ "127": [
+ {"carrier":"Bmobile internet","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Bmobile mms","apn":"mms","user":"","password":"","mmsproxy":"192.168.210.104","mmsport":"8080","mmsc":"http://192.168.210.104/mmrelay.app","authtype":"1","type":["mms"]}
+ ],
+ "128": [
+ {"carrier":"Bmobile internet","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Bmobile mms","apn":"mms","user":"","password":"","mmsproxy":"192.168.210.104","mmsport":"8080","mmsc":"http://192.168.210.104/mmrelay.app","authtype":"1","type":["mms"]}
+ ],
+ "129": [
+ {"carrier":"Bmobile internet","apn":"internet","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Bmobile mms","apn":"mms","user":"","password":"","mmsproxy":"192.168.210.104","mmsport":"8080","mmsc":"http://192.168.210.104/mmrelay.app","authtype":"1","type":["mms"]}
+ ],
+ "13": [
+ {"carrier":"INTERNET Trinidad","apn":"web.digiceltt.com","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS Trinidad","apn":"wap.digiceltt.com","user":"wap","password":"wap","mmsproxy":"172.20.6.12","mmsport":"8080","mmsc":"http://mmc.digiceltt.com/servlets/mms","authtype":"1","type":["mms"]}
+ ],
+ "130": [
+ {"carrier":"INTERNET Trinidad","apn":"web.digiceltt.com","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS Trinidad","apn":"wap.digiceltt.com","user":"wap","password":"wap","mmsproxy":"172.20.6.12","mmsport":"8080","mmsc":"http://mmc.digiceltt.com/servlets/mms","authtype":"1","type":["mms"]}
+ ]
+},
+"376": {
+ "35": [
+ {"carrier":"Lime Internet Postpaid","apn":"internet","user":"","password":"","type":["default","supl","dun"]},
+ {"carrier":"Lime Postpaid MMS","apn":"multimedia","user":"","password":"","mmsproxy":"10.20.5.34","mmsport":"8799","mmsc":"http://mmsc","type":["mms"]}
+ ]
+},
+"401": {
+ "1": [
+ {"carrier":"Beeline Internet","apn":"internet.beeline.kz","user":"@internet.beeline","password":"beeline","type":["default","supl"]},
+ {"carrier":"Beeline MMS","apn":"mms.beeline.kz","user":"@mms.beeline","password":"beeline","mmsc":"http://mms.beeline.kz/mms/wapenc","mmsproxy":"172.27.6.93","mmsport":"8080","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Kcell Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"Kcell MMS","apn":"mms","mmsc":"http://mms.kcell.kz/post","mmsproxy":"195.47.255.7","mmsport":"8080","type":["mms"]}
+ ],
+ "77": [
+ {"carrier":"Tele2 Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"Tele2 MMS","apn":"mms","mmsc":"http://mms.neogsm.kz/mms/wapenc","mmsproxy":"10.1.26.10","mmsport":"8080","type":["mms"]}
+ ]
+},
+"404": {
+ "1": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "2": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "5": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "7": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "9": [
+ {"carrier":"Reliance RTel MMS","apn":"MMS","mmsc":"http://10.239.221.47/mms/","mmsproxy":"10.239.221.7","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RTel","apn":"SMARTNET","type":["default","supl"]}
+ ],
+ "10": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "11": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "12": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "13": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "14": [
+ {"carrier":"IDEA Punjab MMS","apn":"mmsc","mmsc":"http://10.11.12.180/","mmsproxy":"10.11.12.13","mmsport":"9401","type":["mms"]},
+ {"carrier":"IDEA Punjab","apn":"internet","type":["default","supl"]}
+ ],
+ "15": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "16": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "17": [
+ {"carrier":"AIRCEL NE MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]},
+ {"carrier":"AIRCEL NE","apn":"aircelwebpost","type":["default","supl"]}
+ ],
+ "18": [
+ {"carrier":"Reliance RTel MMS","apn":"MMS","mmsc":"http://10.239.221.47/mms/","mmsproxy":"10.239.221.7","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RTel","apn":"SMARTNET","type":["default","supl"]}
+ ],
+ "19": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "20": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "21": [
+ {"carrier":"Loop Mobile MMS","apn":"mizone","password":"mmsc","mmsc":"http://mms.loopmobile.in:8080","mmsproxy":"10.0.0.10","mmsport":"9401","type":["mms"]},
+ {"carrier":"Loop Mobile","apn":"www","type":["default","supl"]}
+ ],
+ "22": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "24": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "25": [
+ {"carrier":"AIRCEL NE MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]},
+ {"carrier":"AIRCEL NE","apn":"aircelwebpost","type":["default","supl"]}
+ ],
+ "27": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "28": [
+ {"carrier":"AIRCEL NE MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]},
+ {"carrier":"AIRCEL NE","apn":"aircelwebpost","type":["default","supl"]}
+ ],
+ "29": [
+ {"carrier":"AIRCEL NE MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]},
+ {"carrier":"AIRCEL NE","apn":"aircelwebpost","type":["default","supl"]}
+ ],
+ "30": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "31": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "33": [
+ {"carrier":"AIRCEL NE MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]},
+ {"carrier":"AIRCEL NE","apn":"aircelwebpost","type":["default","supl"]}
+ ],
+ "34": [
+ {"carrier":"Cellone_North MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"Cellone_North","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "35": [
+ {"carrier":"AIRCEL NE MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]},
+ {"carrier":"AIRCEL NE","apn":"aircelwebpost","type":["default","supl"]}
+ ],
+ "36": [
+ {"carrier":"Reliance RTel MMS","apn":"MMS","mmsc":"http://10.239.221.47/mms/","mmsproxy":"10.239.221.7","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RTel","apn":"SMARTNET","type":["default","supl"]}
+ ],
+ "37": [
+ {"carrier":"AIRCEL NE MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]},
+ {"carrier":"AIRCEL NE","apn":"aircelwebpost","type":["default","supl"]}
+ ],
+ "38": [
+ {"carrier":"CellOne_Kolkata MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_Kolkata","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "40": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "41": [
+ {"carrier":"AIRCEL TN","apn":"aircelgprs.po","type":["default","supl"]},
+ {"carrier":"AIRCEL TN MMS","apn":"aircelmms.po","mmsc":"http://mmsc/mmrelay.app","mmsproxy":"192.168.35.196","mmsport":"8081","type":["mms"]}
+ ],
+ "42": [
+ {"carrier":"AIRCEL TN","apn":"aircelgprs.po","type":["default","supl"]},
+ {"carrier":"AIRCEL TN MMS","apn":"aircelmms.po","mmsc":"http://mmsc/mmrelay.app","mmsproxy":"192.168.35.196","mmsport":"8081","type":["mms"]}
+ ],
+ "43": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "44": [
+ {"carrier":"IDEA Karnataka","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA Karnataka MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "45": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "46": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "49": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "50": [
+ {"carrier":"Reliance RTel MMS","apn":"MMS","mmsc":"http://10.239.221.47/mms/","mmsproxy":"10.239.221.7","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RTel","apn":"SMARTNET","type":["default","supl"]}
+ ],
+ "51": [
+ {"carrier":"Cellone_North MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"Cellone_North","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "52": [
+ {"carrier":"Reliance RTel MMS","apn":"MMS","mmsc":"http://10.239.221.47/mms/","mmsproxy":"10.239.221.7","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RTel","apn":"SMARTNET","type":["default","supl"]}
+ ],
+ "53": [
+ {"carrier":"Cellone_North MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"Cellone_North","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "54": [
+ {"carrier":"Cellone_North MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"Cellone_North","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "55": [
+ {"carrier":"Cellone_North MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"Cellone_North","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "56": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "57": [
+ {"carrier":"Cellone_West MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"Cellone_West","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "58": [
+ {"carrier":"Cellone_West MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"Cellone_West","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "59": [
+ {"carrier":"Cellone_North MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"Cellone_North","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "60": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "62": [
+ {"carrier":"Cellone_North MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"Cellone_North","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "64": [
+ {"carrier":"CellOne_South MMS","apn":"bsnlmms","password":"mmsc","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_South","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "66": [
+ {"carrier":"Cellone_West MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"Cellone_West","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "67": [
+ {"carrier":"Reliance RTel MMS","apn":"MMS","mmsc":"http://10.239.221.47/mms/","mmsproxy":"10.239.221.7","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RTel","apn":"SMARTNET","type":["default","supl"]}
+ ],
+ "68": [
+ {"carrier":"Dolphin_Delhi MMS","apn":"gprsmtnldel","user":"mtnl","password":"mtnl123","mmsc":"http://172.16.31.136/mms/","mmsproxy":"172.16.31.10","mmsport":"80","type":["mms"]},
+ {"carrier":"Dolphin_Delhi","apn":"gprsmtnldel","user":"mtnl","password":"mtnl123","type":["default","supl"]},
+ {"carrier":"Dolphin_Delhi_3G MMS","apn":"mtnl3g","user":"mtnl","password":"mtnl123","mmsc":"http://172.16.31.165/mms/","mmsproxy":"172.16.31.10","mmsport":"9401","type":["mms"]},
+ {"carrier":"Dolphin_Delhi_3G","apn":"mtnl3g","user":"mtnl","password":"mtnl123","type":["default","supl"]}
+ ],
+ "69": [
+ {"carrier":"Dolphin_Mumbai MMS","apn":"gprsmtnlmum","user":"mtnl","password":"mtnl123","mmsc":"http://172.16.39.140/mms/","mmsproxy":"172.16.39.10","mmsport":"80","type":["mms"]},
+ {"carrier":"Dolphin_Mumbai","apn":"gprsmtnlmum","user":"mtnl","password":"mtnl123","type":["default","supl"]},
+ {"carrier":"Dolphin_Mumbai_3G MMS","apn":"mtnl3g","user":"mtnl","password":"mtnl123","mmsc":"http://172.16.31.165/mms/","mmsproxy":"172.16.39.10","mmsport":"9401","type":["mms"]},
+ {"carrier":"Dolphin_Mumbai_3G","apn":"mtnl3g","user":"mtnl","password":"mtnl123","type":["default","supl"]}
+ ],
+ "70": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "71": [
+ {"carrier":"CellOne_South MMS","apn":"bsnlmms","password":"mmsc","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_South","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "72": [
+ {"carrier":"CellOne_South MMS","apn":"bsnlmms","password":"mmsc","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_South","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "73": [
+ {"carrier":"CellOne_South MMS","apn":"bsnlmms","password":"mmsc","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_South","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "74": [
+ {"carrier":"CellOne_Kolkata MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_Kolkata","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "75": [
+ {"carrier":"CellOne_Kolkata MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_Kolkata","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "76": [
+ {"carrier":"CellOne_Kolkata MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_Kolkata","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "77": [
+ {"carrier":"CellOne_Kolkata MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_Kolkata","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "78": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "79": [
+ {"carrier":"CellOne_South MMS","apn":"bsnlmms","password":"mmsc","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_South","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "80": [
+ {"carrier":"CellOne_South MMS","apn":"bsnlmms","password":"mmsc","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_South","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "81": [
+ {"carrier":"CellOne_Kolkata MMS","apn":"bsnlmms","mmsc":"http://bsnlmmsc.in:8514","mmsproxy":"10.210.10.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"CellOne_Kolkata","apn":"bsnlnet","type":["default","supl"]}
+ ],
+ "82": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "83": [
+ {"carrier":"Reliance RTel MMS","apn":"MMS","mmsc":"http://10.239.221.47/mms/","mmsproxy":"10.239.221.7","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RTel","apn":"SMARTNET","type":["default","supl"]}
+ ],
+ "84": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "85": [
+ {"carrier":"Reliance RTel MMS","apn":"MMS","mmsc":"http://10.239.221.47/mms/","mmsproxy":"10.239.221.7","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RTel","apn":"SMARTNET","type":["default","supl"]}
+ ],
+ "86": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "87": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "88": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "89": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "90": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "91": [
+ {"carrier":"AIRCEL NE MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]},
+ {"carrier":"AIRCEL NE","apn":"aircelwebpost","type":["default","supl"]}
+ ],
+ "92": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "93": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "94": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "95": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "96": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "97": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "98": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ]
+},
+"405": {
+ "1": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "3": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "4": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "5": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "6": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "7": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "8": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "9": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "10": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "11": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "12": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "13": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "14": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "15": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "17": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "18": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "19": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "20": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "21": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "22": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "23": [
+ {"carrier":"Reliance RCOM MMS","apn":"rcommms","mmsc":"http://mmsc.rcom.co.in/mms/","mmsproxy":"10.239.221.5","mmsport":"8080","type":["mms"]},
+ {"carrier":"Reliance RCOM","apn":"rcomnet","type":["default","supl"]}
+ ],
+ "25": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "26": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "27": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "28": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "29": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "30": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "31": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "32": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "33": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "34": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "35": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "36": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "37": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "38": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "39": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "40": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "41": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "42": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "43": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "44": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "45": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "46": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "47": [
+ {"carrier":"TataDOCOMO","apn":"TATA.DOCOMO.INTERNET","type":["default","supl"]},
+ {"carrier":"TataDOCOMO MMS","apn":"TATA.DOCOMO.MMS","mmsc":"http://mmsc/","mmsproxy":"10.124.26.94","mmsport":"8799","type":["mms"]}
+ ],
+ "51": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "52": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "53": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "54": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "55": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "56": [
+ {"carrier":"Airtel","apn":"airtelgprs.com","type":["default","supl"]},
+ {"carrier":"Airtel MMS","apn":"airtelmms.com","mmsc":"http://100.1.201.171:10021/mmsc","mmsproxy":"100.1.201.172","mmsport":"8799","type":["mms"]}
+ ],
+ "66": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "67": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "70": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "750": [
+ {"carrier":"Vodafone MMS","apn":"vodafonelivejk","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"jkgprs","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"vodafonelivejk","proxy":"10.10.1.100","port":"9411","type":["default","supl"]}
+ ],
+ "751": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "752": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "753": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "754": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "755": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "756": [
+ {"carrier":"Vodafone MMS","apn":"portalnmms","mmsc":"http://mms1.live.vodafone.in/mms/","mmsproxy":"10.10.1.100","mmsport":"9401","type":["mms"]},
+ {"carrier":"Vodafone Connect","apn":"www","type":["default","supl"]},
+ {"carrier":"VodafoneLive!","apn":"portalnmms","proxy":"10.10.1.100","port":"9401","type":["default","supl"]}
+ ],
+ "799": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "800": [
+ {"carrier":"AIRCEL ROI","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL ROI MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]}
+ ],
+ "801": [
+ {"carrier":"AIRCEL South","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL South MMS","apn":"aircelmms","mmsc":"http://mmsc/mmrelay.app","mmsproxy":"192.168.35.196","mmsport":"8081","type":["mms"]}
+ ],
+ "802": [
+ {"carrier":"AIRCEL Central","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL Central MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]}
+ ],
+ "803": [
+ {"carrier":"AIRCEL South","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL South MMS","apn":"aircelmms","mmsc":"http://mmsc/mmrelay.app","mmsproxy":"192.168.35.196","mmsport":"8081","type":["mms"]}
+ ],
+ "804": [
+ {"carrier":"AIRCEL ROI","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL ROI MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]}
+ ],
+ "805": [
+ {"carrier":"AIRCEL ROI","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL ROI MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]}
+ ],
+ "806": [
+ {"carrier":"AIRCEL Central","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL Central MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]}
+ ],
+ "807": [
+ {"carrier":"AIRCEL Central","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL Central MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]}
+ ],
+ "808": [
+ {"carrier":"AIRCEL Central","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL Central MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]}
+ ],
+ "809": [
+ {"carrier":"AIRCEL South","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL South MMS","apn":"aircelmms","mmsc":"http://mmsc/mmrelay.app","mmsproxy":"192.168.35.196","mmsport":"8081","type":["mms"]}
+ ],
+ "810": [
+ {"carrier":"AIRCEL ROI","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL ROI MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]}
+ ],
+ "811": [
+ {"carrier":"AIRCEL ROI","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL ROI MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]}
+ ],
+ "812": [
+ {"carrier":"AIRCEL Central","apn":"aircelgprs","type":["default","supl"]},
+ {"carrier":"AIRCEL Central MMS","apn":"aircelmms","mmsc":"http://10.50.1.166/servlets/mms","mmsproxy":"172.17.83.69","mmsport":"8080","type":["mms"]}
+ ],
+ "813": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "814": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "815": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "816": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "817": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "818": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "819": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "820": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "821": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "822": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "823": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "824": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "825": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "826": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "827": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "828": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "829": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "830": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "831": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "832": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "833": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "834": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "835": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "836": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "837": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "838": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "839": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "840": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "841": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "842": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "843": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ],
+ "844": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "845": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "846": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "847": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "848": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "849": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "850": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "851": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "852": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "853": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "875": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "876": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "877": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "878": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "879": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "880": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "881": [
+ {"carrier":"STEL","apn":"gprs.stel.in","type":["default","supl"]}
+ ],
+ "882": [
+ {"carrier":"STEL","apn":"gprs.stel.in","type":["default","supl"]}
+ ],
+ "883": [
+ {"carrier":"STEL","apn":"gprs.stel.in","type":["default","supl"]}
+ ],
+ "884": [
+ {"carrier":"STEL","apn":"gprs.stel.in","type":["default","supl"]}
+ ],
+ "885": [
+ {"carrier":"STEL","apn":"gprs.stel.in","type":["default","supl"]}
+ ],
+ "886": [
+ {"carrier":"STEL","apn":"gprs.stel.in","type":["default","supl"]}
+ ],
+ "908": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "909": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "910": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "911": [
+ {"carrier":"IDEA","apn":"internet","type":["default","supl"]},
+ {"carrier":"IDEA MMS","apn":"mmsc","mmsc":"http://10.4.42.21:8002/","mmsproxy":"10.4.42.15","mmsport":"8080","type":["mms"]}
+ ],
+ "912": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "913": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "914": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "915": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "916": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "917": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "918": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "919": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "920": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "921": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "922": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "923": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "924": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "925": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "926": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "927": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "928": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "929": [
+ {"carrier":"Uninor GPRS","apn":"uninor","type":["default","supl"]},
+ {"carrier":"Uninor MMS","apn":"uninor","mmsc":"http://10.58.2.120","mmsproxy":"10.58.10.59","mmsport":"8080","type":["mms"]}
+ ],
+ "930": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "931": [
+ {"carrier":"Cheers","apn":"internet","type":["default","supl"]}
+ ],
+ "932": [
+ {"carrier":"Videocon MMS","apn":"vgprs.com","mmsc":"http://10.202.4.119:10021/mmsc/","mmsproxy":"10.202.5.145","mmsport":"8799","type":["mms"]},
+ {"carrier":"Videocon","apn":"vinternet.com","type":["default","supl"]}
+ ]
+},
+"410": {
+ "1": [
+ {"carrier":"Mobilink WAP GPRS","apn":"connect.mobilinkworld.com","user":"Mobilink","password":"Mobilink","type":["default","supl"]},
+ {"carrier":"Mobilink MMS","apn":"mms.mobilinkworld.com","user":"Mobilink","password":"Mobilink","mmsc":"http://mms/","mmsproxy":"172.25.20.12","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Ufone WAP","apn":"Ufone.internet","type":["default","supl"]},
+ {"carrier":"Ufone MMS","apn":"Ufone.mms","mmsc":"http://www.ufonemms.com:80/","mmsproxy":"172.16.13.27","mmsport":"8080","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"ZONG WAP","apn":"zonginternet","type":["default","supl"]},
+ {"carrier":"ZONG MMS","apn":"zongmms","mmsc":"http://10.81.6.11:8080","mmsproxy":"10.81.6.33","mmsport":"8000","type":["mms"]}
+ ],
+ "6": [
+ {"carrier":"Telenor WAP","apn":"internet","type":["default","supl"]},
+ {"carrier":"Telenor MMS","apn":"mms","user":"Telenor","password":"Telenor","mmsc":"http://mmstelenor","mmsproxy":"172.18.19.11","mmsport":"8080","type":["mms"]}
+ ],
+ "7": [
+ {"carrier":"Warid WAP","apn":"Wap.warid","type":["default","supl"]},
+ {"carrier":"Warid MMS","apn":"mms.warid","mmsc":"http://10.4.0.132/servlets/MMS","mmsproxy":"10.4.2.1","mmsport":"8080","type":["mms"]}
+ ]
+},
+"415": {
+ "1": [
+ {"carrier":"Alfa Internet","user":"mic1","password":"mic1","apn":"internet.mic1.com.lb","type":["default","supl"]},
+ {"carrier":"Alfa MMS","user":"mic1","password":"mic1","apn":"mms.mic1.com.lb","mmsc":"http://mms.mic1.com.lb","mmsproxy":"192.168.23.51","mmsport":"80","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"MTC Touch GPRS","apn":"gprs.mtctouch.com.lb","type":["default","supl"]},
+ {"carrier":"MTC MMS","user":"mtctouch","apn":"mms.mtctouch.com.lb","mmsc":"http://mms:8080/mms/","mmsproxy":"192.168.4.103","mmsport":"80","type":["mms"]}
+ ]
+},
+"416": {
+ "1": [
+ {"carrier":"Zain JO Internet Postpaid","apn":"internet","type":["default","supl"]},
+ {"carrier":"Zain JO Internet Prepaid","apn":"internetpre","user":"zain","password":"zain","type":["default","supl"]},
+ {"carrier":"Zain JO MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mms.jo.zain.com","mmsproxy":"192.168.55.10","mmsport":"80","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"umniahinternet Postpaid","apn":"internet","type":["default","supl"]},
+ {"carrier":"umniahmms","apn":"mms","mmsc":"http://mms.umniah.com","mmsproxy":"10.1.1.10","mmsport":"8080","type":["mms"]},
+ {"carrier":"umniah Prepaid","apn":"net","proxy":"0.0.0.0","port":"80","type":["default","supl"]}
+ ],
+ "77": [
+ {"carrier":"Orange MMS","apn":"mms.orange.jo","user":"mmc","password":"mmc","mmsc":"http://172.16.1.96/servlets/mms","mmsproxy":"172.16.1.2","mmsport":"8080","type":["mms"]},
+ {"carrier":"Orange Internet","apn":"net.orange.jo","user":"net","password":"net","type":["default","supl"]}
+ ]
+},
+"419": {
+ "2": [
+ {"carrier":"ZAIN MMS","apn":"pps","user":"annyway","password":"online","mmsc":"http://mms.zain","mmsproxy":"176.0.0.65","mmsport":"8080","type":["mms"]},
+ {"carrier":"ZAIN MI","apn":"pps","user":"pps","password":"pps","type":["default","supl"]}
+ ],
+ "3": [
+ {"carrier":"WATANIYA MMS","apn":"mms.wataniya.com","mmsc":"http://action.wataniya.com","mmsproxy":"194.126.53.64","mmsport":"8080","type":["mms"]},
+ {"carrier":"INTERNET ACTION","apn":"action.wataniya.com","type":["default","supl"]}
+ ],
+ "4": [
+ {"carrier":"VIVA MMS","apn":"VIVA","mmsc":"http://172.16.128.80:38090/was","mmsproxy":"172.16.128.228","mmsport":"8080","type":["mms"]},
+ {"carrier":"VIVA Internet","apn":"VIVA","type":["default","supl"]}
+ ]
+},
+"420": {
+ "1": [
+ {"carrier":"JAWALNet","apn":"jawalnet.com.sa","type":["default","supl"]},
+ {"carrier":"ALJAWAL MMS","apn":"mms.net.sa","mmsc":"http://mms.net.sa:8002","mmsproxy":"10.1.1.1","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"mobily Net Prepaid","apn":"web2","type":["default","supl"]},
+ {"carrier":"mobily MMS Prepaid","apn":"mms2","mmsc":"http://10.3.3.133:9090/was","mmsproxy":"10.3.2.133","mmsport":"8080","type":["mms"]},
+ {"carrier":"mobily Net Postpaid","apn":"web1","type":["default","supl"]},
+ {"carrier":"mobily MMS Postpaid","apn":"mms1","mmsc":"http://10.3.3.133:9090/was","mmsproxy":"10.3.2.133","mmsport":"8080","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"zain-gprs","apn":"zain","type":["default","supl"]},
+ {"carrier":"zain-mms","apn":"zain","mmsc":"http://10.122.200.12:8002/","mmsproxy":"10.122.200.10","mmsport":"8080","type":["mms"]}
+ ]
+},
+"422": {
+ "2": [
+ {"carrier":"Oman Mobile MMS","apn":"MMS","user":"MMS","password":"MMS","mmsc":"http://mmsc.omanmobile.om:10021/mmsc","mmsproxy":"192.168.203.35","mmsport":"8080","type":["mms"]},
+ {"carrier":"Oman Mobile Internet","apn":"taif","user":"taif","password":"taif","type":["default","supl"]}
+ ],
+ "3": [
+ {"carrier":"Nawras MMS","apn":"mms.nawras.com.om","user":"test","password":"test","mmsc":"http://10.128.240.16/servlets/mms","mmsproxy":"10.128.240.19","mmsport":"8080","type":["mms"]},
+ {"carrier":"Nawras GPRS","apn":"isp.nawras.com.om","type":["default","supl"]}
+ ]
+},
+"424": {
+ "2": [
+ {"carrier":"Etisalat MMS","apn":"etisalat","mmsc":"http://mms/servlets/mms","mmsproxy":"10.12.0.32","mmsport":"8080","type":["mms"]},
+ {"carrier":"DATA Package","apn":"etisalat.ae","type":["default","supl"]}
+ ],
+ "3": [
+ {"carrier":"du","apn":"du","type":["default","supl"]},
+ {"carrier":"du MMS","apn":"du","mmsc":"http://mms.du.ae","mmsproxy":"10.19.18.4","mmsport":"8080","type":["mms"]}
+ ]
+},
+"425": {
+ "1": [
+ {"carrier":"3G Portal","apn":"uwap.orange.co.il","port":"8080","type":["default","supl"]},
+ {"carrier":"MMS 3G","apn":"uwap.orange.co.il","mmsc":"http://192.168.220.15/servlets/mms","mmsport":"8080","type":["mms"]},
+ {"carrier":"Internet 3G","apn":"modem.orange.net.il","type":["default","supl"]}
+ ],
+ "2": [
+ {"carrier":"Cellcom Internet","apn":"Sphone","type":["default","supl"]},
+ {"carrier":"Cellcom MMS","apn":"mms","mmsc":"http://mms.cellcom.co.il","mmsproxy":"172.31.29.38","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Multimedia Pelephone","apn":"mms.pelephone.net.il","user":"pcl@3g","password":"pcl","mmsc":"http://mmsu.pelephone.net.il","mmsproxy":"10.170.252.104","mmsport":"9093","type":["mms"]},
+ {"carrier":"Sphone Pelephone","apn":"sphone.pelephone.net.il","user":"pcl@3g","password":"pcl","type":["default","supl"]}
+ ]
+},
+"426": {
+ "1": [
+ {"carrier":"Internet","apn":"internet.batelco.com","type":["default","supl"]},
+ {"carrier":"BAT MMS","apn":"mms.batelco.com","mmsc":"http://192.168.36.10/servlets/mms","mmsproxy":"192.168.1.2","mmsport":"80","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Zain Internet","apn":"connect.mobilinkworld.com","user":"Mobilink","password":"Mobilink","type":["default","supl"]},
+ {"carrier":"Zain MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://172.18.83.129","mmsproxy":"172.18.85.34","mmsport":"80","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"VIVAGPRS","apn":"viva.bh","type":["default","supl"]},
+ {"carrier":"VIVAMMS","apn":"vivawap.bh","mmsc":"http://mms.viva.com.bh:38090","mmsproxy":"172.18.142.36","mmsport":"8080","type":["mms"]}
+ ]
+},
+"427": {
+ "1": [
+ {"carrier":"Qtel MMS","apn":"mms.qtel","user":"mms","password":"mms","mmsc":"http://mmsr.qtelmms.qa","mmsproxy":"10.23.8.3","mmsport":"8080","type":["mms"]},
+ {"carrier":"Qtel GPRS","apn":"gprs.qtel","user":"gprs","password":"gprs","proxy":"10.23.8.3","port":"8080","type":["default","supl"]}
+ ],
+ "2": [
+ {"carrier":"VFQ MMS","apn":"vodafone.com.qa","mmsc":"http://mms.vodafone.com.qa/mmsc","mmsproxy":"10.101.97.102","mmsport":"80","type":["mms"]},
+ {"carrier":"VFQ Mobile Internet","apn":"web.vodafone.com.qa","type":["default","supl"]}
+ ]
+},
+"440": {
+ "10": [
+ {"carrier":"spモード","apn":"spmode.ne.jp","user":"","server":"","password":"","mmsc":""},
+ {"carrier":"mopera U(スマートフォン定額)","apn":"mpr2.bizho.net","user":"","server":"","password":"","mmsc":""},
+ {"carrier":"mopera U設定","apn":"0120.mopera.net","user":"","server":"","password":"","mmsc":""}
+ ]
+},
+"450": {
+ "5": [
+ {"carrier":"SK Telecom","apn":"web.sktelecom.com","mmsc":"http://omms.nate.com:9082/oma_mms","mmsproxy":"smart.nate.com","mmsport":"9093","type":["default","supl","mms"]},
+ {"carrier":"SK Telecom (Roaming)","apn":"roaming.sktelecom.com","mmsc":"http://omms.nate.com:9082/oma_mms","mmsproxy":"smart.nate.com","mmsport":"9093","type":["default","supl","mms"]}
+ ],
+ "8": [
+ {"carrier":"KT-HSDPA","apn":"alwayson-r6.ktfwing.com","mmsc":"http://mmsc.ktfwing.com:9082","type":["default","supl","mms"]}
+ ]
+},
+"452": {
+ "1": [
+ {"carrier":"VN MOBIFONE MMS","apn":"m-i090","user":"mms","password":"mms","mmsc":"http://203.162.21.114/mmsc","mmsproxy":"203.162.21.114","mmsport":"3130","type":["mms"]},
+ {"carrier":"VN MOBIFONE Email","apn":"m-wap","user":"mms","password":"mms","type":["default","supl"]}
+ ],
+ "2": [
+ {"carrier":"Vinaphone MMS","apn":"m3-mms","user":"mms","password":"mms","mmsc":"http://mms.vinaphone.com.vn","mmsproxy":"10.1.10.46","mmsport":"8000","type":["mms"]},
+ {"carrier":"Vinaphone Email","apn":"m3-world","user":"mms","password":"mms","type":["default","supl"]}
+ ],
+ "4": [
+ {"carrier":"Viettel Email","apn":"v-internet","type":["default","supl"]},
+ {"carrier":"Viettel MMS","apn":"v-mms","mmsc":"http://mms.viettelmobile.com.vn/mms/wapenc","mmsproxy":"192.168.233.10","mmsport":"8080","type":["mms"]}
+ ],
+ "5": [
+ {"carrier":"Vietnamobile Email","apn":"internet","type":["default","supl"]},
+ {"carrier":"Vietnamobile MMS","apn":"mms","mmsc":"http://10.10.128.58/servlets/mms","mmsproxy":"10.10.128.44","mmsport":"8080","type":["mms"]}
+ ],
+ "7": [
+ {"carrier":"BEELINE Email","apn":"internet","type":["default","supl"]},
+ {"carrier":"BEELINE MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://mms","mmsproxy":"10.16.70.199","mmsport":"8080","type":["mms"]}
+ ],
+ "8": [
+ {"carrier":"EVNTelecom Email","apn":"e-internet","type":["default","supl"]},
+ {"carrier":"EVNTelecom MMS","apn":"e-wap","mmsc":"http://10.18.2.172:38090","mmsproxy":"10.18.2.183","mmsport":"8080","type":["mms"]}
+ ]
+},
+"454": {
+ "0": [
+ {"carrier":"CSL Data","apn":"hkcsl","mmsc":"http://192.168.58.171:8002","mmsproxy":"192.168.59.51","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "2": [
+ {"carrier":"CSL Data","apn":"hkcsl","mmsc":"http://192.168.58.171:8002","mmsproxy":"192.168.59.51","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "3": [
+ {"carrier":"3","apn":"mobile.three.com.hk","mmsc":"http://mms.um.three.com.hk:10021/mmsc","mmsproxy":"172.20.97.116","mmsport":"8799","type":["default","supl","mms"]}
+ ],
+ "4": [
+ {"carrier":"3-DB-MMS","apn":"mms-g.three.com.hk","mmsc":"http://10.30.15.51:10021/mmsc","mmsproxy":"10.30.15.53","mmsport":"8080","type":["mms"]},
+ {"carrier":"3-DB-GPRS","apn":"web-g.three.com.hk","proxy":"10.30.15.53","port":"8080","type":["default","supl"]}
+ ],
+ "6": [
+ {"carrier":"SmarTone HK","apn":"SmarTone","mmsc":"http://mms.smartone.com/server","mmsproxy":"10.9.9.9","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "10": [
+ {"carrier":"CSL Data","apn":"hkcsl","mmsc":"http://192.168.58.171:8002","mmsproxy":"192.168.59.51","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "12": [
+ {"carrier":"CMHK MMS","apn":"peoples.mms","mmsc":"http://mms.hk.chinamobile.com/mms","mmsproxy":"172.31.31.36","mmsport":"8080","type":["mms"]},
+ {"carrier":"CMHK GPRS","apn":"peoples.net","proxy":"172.31.31.36","port":"8080","type":["default","supl"]}
+ ],
+ "16": [
+ {"carrier":"PCCW_GPRS","apn":"pccwdata","proxy":"10.131.2.8","port":"8080","type":["default","supl"]},
+ {"carrier":"PCCW_MMS","apn":"pccwmms","mmsc":"http://mmsc.mms.pccwmobile.com:8002/","mmsproxy":"10.131.2.8","mmsport":"8080","type":["mms"]}
+ ],
+ "18": [
+ {"carrier":"CSL Data","apn":"hkcsl","mmsc":"http://192.168.58.171:8002","mmsproxy":"192.168.59.51","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "19": [
+ {"carrier":"PCCW 3G","apn":"pccw","mmsc":"http://3gmms.pccwmobile.com:8080/was","mmsproxy":"10.140.14.10","mmsport":"8080","type":["default","supl","mms"]}
+ ]
+},
+"455": {
+ "0": [
+ {"carrier":"SmarTone MAC","apn":"smartgprs","proxy":"10.9.9.29","port":"8080","mmsc":"http://mms.smartone.com.mo/dmog/mo","mmsproxy":"10.9.9.29","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "1": [
+ {"carrier":"CTM","apn":"ctm-mobile","proxy":"192.168.99.2","port":"8080","type":["default","supl"]},
+ {"carrier":"CTM MMS","apn":"ctmmms","mmsc":"http://mms.wap.ctm.net:8002","mmsproxy":"192.168.99.3","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"3 Macau MMS","apn":"mms.hutchisonmacau.com","mmsc":"http://10.30.15.51:10021/mmsc","mmsproxy":"10.30.15.53","mmsport":"8080","type":["mms"]},
+ {"carrier":"3 Macau","apn":"web-g.three.com.hk","user":"hutchison","password":"1234","type":["default","supl"]}
+ ],
+ "4": [
+ {"carrier":"CTM","apn":"ctm-mobile","proxy":"192.168.99.2","port":"8080","type":["default","supl"]},
+ {"carrier":"CTM MMS","apn":"ctmmms","mmsc":"http://mms.wap.ctm.net:8002","mmsproxy":"192.168.99.3","mmsport":"8080","type":["mms"]}
+ ]
+},
+"460": {
+ "0": [
+ {"carrier":"中国移动 (China Mobile) GPRS","apn":"cmnet","type":["default","supl"]},
+ {"carrier":"中国移动 (China Mobile) WAP","apn":"cmwap","proxy":"10.0.0.172","port":"80","type":["default","supl"]},
+ {"carrier":"中国移动彩信 (China Mobile)","apn":"cmwap","proxy":"10.0.0.172","port":"80","mmsc":"http://mmsc.monternet.com","mmsproxy":"10.0.0.172","mmsport":"80","type":["mms"]}
+ ],
+ "1": [
+ {"carrier":"沃3G连接互联网 (China Unicom)","apn":"3gnet","type":["default","supl"]},
+ {"carrier":"沃3G手机上网 (China Unicom)","apn":"3gwap","proxy":"10.0.0.172","port":"80","type":["default","supl"]},
+ {"carrier":"联通2GNET上网 (China Unicom)","apn":"uninet","type":["default","supl"]},
+ {"carrier":"联通彩信 (China Unicom)","apn":"3gwap","mmsc":"http://mmsc.myuni.com.cn","mmsproxy":"10.0.0.172","mmsport":"80","type":["mms"]},
+ {"carrier":"联通2g彩信 (China Unicom)","apn":"uniwap","mmsc":"http://mmsc.myuni.com.cn","mmsproxy":"10.0.0.172","mmsport":"80","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"中国移动 (China Mobile) GPRS","apn":"cmnet","type":["default","supl"]},
+ {"carrier":"中国移动 (China Mobile) WAP","apn":"cmwap","proxy":"10.0.0.172","port":"80","type":["default","supl"]},
+ {"carrier":"中国移动彩信 (China Mobile)","apn":"cmwap","proxy":"10.0.0.172","port":"80","mmsc":"http://mmsc.monternet.com","mmsproxy":"10.0.0.172","mmsport":"80","type":["mms"]}
+ ],
+ "7": [
+ {"carrier":"中国移动 (China Mobile) GPRS","apn":"cmnet","type":["default","supl"]},
+ {"carrier":"中国移动 (China Mobile) WAP","apn":"cmwap","proxy":"10.0.0.172","port":"80","type":["default","supl"]},
+ {"carrier":"中国移动彩信 (China Mobile)","apn":"cmwap","proxy":"10.0.0.172","port":"80","mmsc":"http://mmsc.monternet.com","mmsproxy":"10.0.0.172","mmsport":"80","type":["mms"]}
+ ]
+},
+"466": {
+ "1": [
+ {"carrier":"遠傳電信(Far EasTone) (MMS)","apn":"fetnet01","mmsc":"http://mms","mmsproxy":"210.241.199.199","mmsport":"9201","type":["mms"]},
+ {"carrier":"遠傳電信(Far EasTone) (Internet)","apn":"internet","type":["default","supl"]}
+ ],
+ "88": [
+ {"carrier":"和信電訊(KGT-Online) (Internet)","apn":"internet","type":["default","supl"]},
+ {"carrier":"和信電訊(KGT-Online) (MMS)","apn":"kgtmms","mmsc":"http://mms.kgtmms.net.tw/mms/wapenc","mmsproxy":"172.28.33.5","mmsport":"8080","type":["mms"]}
+ ],
+ "89": [
+ {"carrier":"威寶電信(VIBO)","apn":"vibo","mmsc":"http://mms","mmsproxy":"172.24.128.36","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "92": [
+ {"carrier":"中華電信(Chunghwa) (Internet)","apn":"internet","type":["default","supl"]},
+ {"carrier":"中華電信(Chunghwa)","apn":"emome","mmsc":"http://mms.emome.net:8002","mmsproxy":"10.1.1.1","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "93": [
+ {"carrier":"台灣大哥大(TW Mobile) (Internet)","apn":"internet","type":["default","supl"]},
+ {"carrier":"台灣大哥大(TW Mobile) (twm)","apn":"TWM","type":["default","supl"]},
+ {"carrier":"台灣大哥大(TW Mobile) (MMS)","apn":"mms","mmsc":"http://mms.catch.net.tw","mmsproxy":"10.1.1.2","mmsport":"80","type":["mms"]}
+ ],
+ "97": [
+ {"carrier":"台灣大哥大(TW Mobile) (Internet)","apn":"internet","type":["default","supl"]},
+ {"carrier":"台灣大哥大(TW Mobile) (twm)","apn":"TWM","type":["default","supl"]},
+ {"carrier":"台灣大哥大(TW Mobile) (MMS)","apn":"mms","mmsc":"http://mms.catch.net.tw","mmsproxy":"10.1.1.2","mmsport":"80","type":["mms"]}
+ ],
+ "99": [
+ {"carrier":"台灣大哥大(TW Mobile) (Internet)","apn":"internet","type":["default","supl"]},
+ {"carrier":"台灣大哥大(TW Mobile) (twm)","apn":"TWM","type":["default","supl"]},
+ {"carrier":"台灣大哥大(TW Mobile) (MMS)","apn":"mms","mmsc":"http://mms.catch.net.tw","mmsproxy":"10.1.1.2","mmsport":"80","type":["mms"]}
+ ]
+},
+"502": {
+ "12": [
+ {"carrier":"Maxis MMS","apn":"net","user":"maxis","password":"wap","mmsc":"http://172.16.74.100:10021/mmsc","mmsproxy":"202.75.133.49","mmsport":"80","type":["mms"]},
+ {"carrier":"Maxis Internet","apn":"net","user":"maxis","password":"wap","type":["default","supl"]},
+ {"carrier":"Maxis 3G MMS","apn":"unet","user":"maxis","password":"wap","mmsc":"http://172.16.74.100:10021/mmsc","mmsproxy":"202.75.133.49","mmsport":"80","type":["mms"]},
+ {"carrier":"Maxis 3G Internet","apn":"unet","user":"maxis","password":"wap","type":["default","supl"]}
+ ],
+ "16": [
+ {"carrier":"DiGi MMS","apn":"digimms","user":"mms","password":"mms","mmsc":"http://mms.digi.com.my/servlets/mms","mmsproxy":"203.92.128.160","mmsport":"80","type":["mms"]},
+ {"carrier":"DiGi Internet","apn":"diginet","type":["default","supl"]}
+ ],
+ "18": [
+ {"carrier":"U Mobile MMS","apn":"my3g","mmsc":"http://10.30.3.11/servlets/mms","mmsproxy":"10.30.5.11","mmsport":"8080","type":["mms"]},
+ {"carrier":"U Mobile Internet","apn":"my3g","type":["default","supl"]}
+ ],
+ "19": [
+ {"carrier":"Celcom Internet","apn":"celcom.net.my","type":["default","supl"]},
+ {"carrier":"Celcom 3G MMS","apn":"celcom3g","mmsc":"http://mms.celcom.net.my","mmsproxy":"10.128.1.242","mmsport":"8080","type":["mms"]},
+ {"carrier":"Celcom 3G Internet","apn":"celcom3g","type":["default","supl"]},
+ {"carrier":"Celcom MMS","apn":"mms.celcom.net.my","mmsc":"http://mms.celcom.net.my","mmsproxy":"10.128.1.242","mmsport":"8080","type":["mms"]}
+ ]
+},
+"505": {
+ "1": [
+ {"carrier":"Telstra MMS","apn":"telstra.mms","mmsc":"http://mmsc.telstra.com:8002","mmsproxy":"10.1.1.180","mmsport":"80","type":["mms"]},
+ {"carrier":"Telstra Internet","apn":"telstra.wap","type":["default","supl"]}
+ ],
+ "2": [
+ {"carrier":"Optus Yes Internet","apn":"yesinternet","type":["default","supl"]},
+ {"carrier":"Optus MMS","apn":"mms","mmsc":"http://mmsc.optus.com.au:8002/","mmsproxy":"61.88.190.10","mmsport":"8070","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Vodafone live!","apn":"live.vodafone.com","mmsc":"http://pxt.vodafone.net.au/pxtsend","mmsproxy":"10.202.2.60","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "6": [
+ {"carrier":"Planet 3","apn":"3services","mmsc":"http://mmsc.three.net.au:10021/mmsc","mmsproxy":"10.176.57.25","mmsport":"8799","type":["default","supl","mms"]}
+ ],
+ "7": [
+ {"carrier":"VF AU PXT","apn":"live.vodafone.com","mmsc":"http://pxt.vodafone.net.au/pxtsend","mmsproxy":"10.202.2.60","mmsport":"8080","type":["mms"]},
+ {"carrier":"VF Internet","apn":"vfinternet.au","type":["default","supl"]}
+ ],
+ "11": [
+ {"carrier":"Telstra MMS","apn":"Telstra.mms","mmsc":"http://mmsc.telstra.com:8002","mmsproxy":"10.1.1.180","mmsport":"80","type":["mms"]},
+ {"carrier":"Telstra Internet","apn":"Telstra.wap","type":["default","supl"]}
+ ],
+ "12": [
+ {"carrier":"3Internet","apn":"3netaccess","type":["default","supl"]},
+ {"carrier":"3","apn":"3services","mmsc":"http://mmsc.three.net.au:10021/mmsc","mmsproxy":"10.176.57.25","mmsport":"8799","type":["default","supl","mms"]}
+ ],
+ "71": [
+ {"carrier":"Telstra MMS","apn":"Telstra.mms","mmsc":"http://mmsc.telstra.com:8002","mmsproxy":"10.1.1.180","mmsport":"80","type":["mms"]},
+ {"carrier":"Telstra Internet","apn":"Telstra.wap","type":["default","supl"]}
+ ],
+ "72": [
+ {"carrier":"Telstra MMS","apn":"Telstra.mms","mmsc":"http://mmsc.telstra.com:8002","mmsproxy":"10.1.1.180","mmsport":"80","type":["mms"]},
+ {"carrier":"Telstra Internet","apn":"Telstra.wap","type":["default","supl"]}
+ ],
+ "88": [
+ {"carrier":"VF AU PXT","apn":"live.vodafone.com","mmsc":"http://pxt.vodafone.net.au/pxtsend","mmsproxy":"10.202.2.60","mmsport":"8080","type":["mms"]},
+ {"carrier":"VF Internet","apn":"vfinternet.au","type":["default","supl"]}
+ ],
+ "90": [
+ {"carrier":"Optus Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"Optus MMS","apn":"mms","mmsc":"http://mmsc.optus.com.au:8002/","mmsproxy":"61.88.190.10","mmsport":"8070","type":["mms"]}
+ ]
+},
+"510": {
+ "1": [
+ {"carrier":"ISAT BB INTERNET","apn":"indosat3g","user":"indosat","password":"indosat","proxy":"10.19.19.19","port":"8080","type":["default","supl"]},
+ {"carrier":"ISAT WAP","apn":"indosatgprs","user":"indosat","password":"indosat","type":["default","supl"]},
+ {"carrier":"ISAT MMS","apn":"indosatmms","user":"indosat","password":"indosat","mmsc":"http://mmsc.indosat.com","mmsproxy":"10.19.19.19","mmsport":"8080","type":["mms"]},
+ {"carrier":"ISAT BB MMS","apn":"indosatmms","user":"indosat","password":"indosat","mmsc":"http://mmsc.indosat.com","mmsproxy":"10.19.19.19","mmsport":"8080","type":["mms"]}
+ ],
+ "8": [
+ {"carrier":"AXISinternet","apn":"AXIS","user":"AXIS","password":"123456","type":["default","supl"]},
+ {"carrier":"AXIS MMS","apn":"axismms","user":"axis","password":"123456","mmsc":"http://mmsc.axis","mmsproxy":"10.8.3.8","mmsport":"8080","type":["mms"]}
+ ],
+ "10": [
+ {"carrier":"Telkomsel GPRS WEB","apn":"internet","user":"wap","password":"wap123","type":["default","supl"]},
+ {"carrier":"TSEL MMS","apn":"mms","user":"wap","password":"wap123","mmsc":"http://mms.telkomsel.com","mmsproxy":"10.1.89.150","mmsport":"8000","type":["mms"]}
+ ],
+ "11": [
+ {"carrier":"XL GPRS","apn":"www.xlgprs.net","user":"xlgprs","password":"proxl","type":["default","supl"]},
+ {"carrier":"XL MMS","apn":"www.xlmms.net","user":"xlgprs","password":"proxl","mmsc":"http://mmc.xl.net.id/servlets/mms","mmsproxy":"202.152.240.50","mmsport":"8080","type":["mms"]},
+ {"carrier":"XL Unlimited","apn":"xlunlimited","type":["default","supl"]}
+ ],
+ "21": [
+ {"carrier":"ISAT M3 INTERNET","apn":"indosatgprs","user":"indosat","password":"indosat","type":["default","supl"]}
+ ],
+ "89": [
+ {"carrier":"3 GPRS","apn":"3gprs","user":"3gprs","password":"3gprs","type":["default","supl"]},
+ {"carrier":"3 MMS","apn":"3mms","user":"3mms","password":"3mms","mmsc":"http://mms.three.co.id","mmsproxy":"10.4.0.10","mmsport":"3128","type":["mms"]}
+ ]
+},
+"515": {
+ "2": [
+ {"carrier":"myGlobe Internet Postpaid","apn":"internet.globe.com.ph","type":["default","supl"]},
+ {"carrier":"myGlobe Internet Prepaid","apn":"http.globe.com.ph","type":["default","supl"]},
+ {"carrier":"myGlobe MMS","apn":"mms.globe.com.ph","mmsc":"http://192.40.100.22:10021/mmsc","mmsproxy":"203.177.42.214","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Smart Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"SmartMMS","apn":"mms","mmsc":"http://10.102.61.238:8002","mmsproxy":"10.102.61.46","mmsport":"8080","type":["mms"]}
+ ],
+ "5": [
+ {"carrier":"SUN INTERNET","apn":"minternet","type":["default","supl"]},
+ {"carrier":"SUN MMS","apn":"mms","mmsc":"http://mmscenter.suncellular.com.ph","mmsproxy":"202.138.159.78","mmsport":"8080","type":["mms"]}
+ ],
+ "18": [
+ {"carrier":"RED INTERNET","apn":"redinternet","type":["default","supl"]},
+ {"carrier":"RED MMS","apn":"redmms","mmsc":"http://10.102.61.193:8002/mmsc","mmsproxy":"10.138.3.35","mmsport":"8080","type":["mms"]}
+ ]
+},
+"520": {
+ "1": [
+ {"carrier":"AIS Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"AIS MMS","apn":"multimedia","mmsc":"http://mms.mobilelife.co.th","mmsproxy":"203.170.229.34","mmsport":"8080","type":["mms"]}
+ ],
+ "18": [
+ {"carrier":"DTAC MMS","apn":"mms","mmsc":"http://mms.dtac.co.th:8002/","mmsproxy":"203.155.200.133","mmsport":"8080","type":["mms"]},
+ {"carrier":"DTAC Internet","apn":"www.dtac.co.th","type":["default","supl"]}
+ ],
+ "99": [
+ {"carrier":"True GPRS Inet","apn":"internet","user":"true","password":"true","type":["default","supl"]},
+ {"carrier":"True GPRS MMS","apn":"mms","user":"true","password":"true","mmsc":"http://mms.trueworld.net:8002/","mmsproxy":"10.4.7.39","mmsport":"8080","type":["mms"]}
+ ]
+},
+"525": {
+ "1": [
+ {"carrier":"IDEAS E-mail","apn":"e-ideas","mmsc":"http://mms.singtel.com:10021/mmsc","mmsproxy":"165.21.42.84","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "2": [
+ {"carrier":"IDEAS E-mail","apn":"e-ideas","mmsc":"http://mms.singtel.com:10021/mmsc","mmsproxy":"165.21.42.84","mmsport":"8080","type":["default","supl","mms"]}
+ ],
+ "3": [
+ {"carrier":"M1 MMS","apn":"miworld","user":"65","password":"user123","mmsc":"http://mmsgw:8002","mmsproxy":"172.16.14.10","mmsport":"8080","type":["mms"]},
+ {"carrier":"M1 E-mail","apn":"sunsurf","user":"65","type":["default","supl"]}
+ ],
+ "5": [
+ {"carrier":"StarHub","apn":"internet","type":["default","supl"]},
+ {"carrier":"Gee! MMS","apn":"shmms","user":"star","password":"hub","mmsc":"http://mms.starhubgee.com.sg:8002","mmsproxy":"10.12.1.80","mmsport":"80","type":["mms"]},
+ {"carrier":"Gee!","apn":"shwap","user":"star","password":"hub","proxy":"10.12.1.2","port":"80","type":["default","supl"]},
+ {"carrier":"StarHub E-mail","apn":"shwap","type":["default","supl"]}
+ ]
+},
+"530": {
+ "1": [
+ {"carrier":"VFNZ PXT","apn":"live.vodafone.com","mmsc":"http://pxt.vodafone.net.nz/pxtsend","mmsproxy":"172.30.38.3","mmsport":"8080","type":["mms"]},
+ {"carrier":"VFNZ Internet","apn":"www.vodafone.net.nz","type":["default","supl"]}
+ ],
+ "5": [
+ {"carrier":"TelecomDefault","apn":"wap.telecom.co.nz","type":["default","supl"]},
+ {"carrier":"Telecom MMS","apn":"wap.telecom.co.nz","mmsc":"http://lsmmsc.xtra.co.nz","mmsproxy":"210.55.11.73","mmsport":"8080","type":["mms"]}
+ ],
+ "24": [
+ {"carrier":"2degrees Internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"2degrees MMS","apn":"mms","mmsc":"http://mms.2degreesmobile.net.nz:48090","mmsproxy":"118.148.1.118","mmsport":"8080","type":["mms"]}
+ ]
+},
+"602": {
+ "1": [
+ {"carrier":"Mobinil MMS","apn":"mobinilmms","mmsc":"http://10.7.13.24:8002","mmsproxy":"http://62.241.155.45","mmsport":"8205","type":["mms"]},
+ {"carrier":"Mobinil Internet","apn":"mobinilweb","type":["default"]},
+ {"carrier":"Mobinil Web","apn":"MobinilWeb","type":["default","supl"]},
+ {"carrier":"Mobinil MMS","apn":"mobinilmms","mmsc":"http://10.7.13.24:8002/","mmsproxy":"62.241.155.45","mmsport":"8080","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"VF internet","apn":"internet.vodafone.net","user":"internet","password":"internet","type":["default","supl"]},
+ {"carrier":"VF MMS","apn":"mms.vodafone.com.eg","user":"mms","password":"mms","mmsc":"http://mms.vodafone.com.eg/servlets/mms","mmsproxy":"163.121.178.2","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Etisalat internet","apn":"Etisalat","type":["default","supl"]},
+ {"carrier":"Etisalat MMS","apn":"Etisalat","mmsc":"http://10.71.131.7:38090","mmsproxy":"10.71.130.29","mmsport":"8080","type":["mms"]}
+ ]
+},
+"605": {
+ "1": [
+ {"carrier":"weborange","apn":"weborange","type":["default","supl"]},
+ {"carrier":"Orange MMS","apn":"mms.otun","mmsc":"http://mms.orange.tn","mmsproxy":"10.12.1.52","mmsport":"8080","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"mobinet","apn":"gprs.tn","user":"gprs","password":"gprs","type":["default","supl"]},
+ {"carrier":"MMS","apn":"mms.tn","user":"mms@tt1","password":"mms","mmsc":"http://","mmsproxy":"192.168.0.2","mmsport":"8080","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"internet Tunisiana","apn":"internet.tunisiana.com","user":"internet","password":"internet","proxy":"10.3.2.99","port":"80","type":["default","supl"]},
+ {"carrier":"MMS Tunisiana","apn":"mms.tunisiana.com","user":"mms","password":"mms","mmsc":"http://mmsc.tunisiana.com","mmsproxy":"10.3.2.100","mmsport":"80","type":["mms"]}
+ ]
+},
+"608": {
+ "1": [
+ {"carrier":"Orange MMS SN","apn":"mms","user":"mms","password":"mms","mmsc":"http://mmsalize/servlets/mms","mmsproxy":"172.16.30.9","mmsport":"8080","type":["mms"]},
+ {"carrier":"Orange Wap SN","apn":"wap","user":"wap","password":"wap","proxy":"172.16.30.9","port":"8080","type":["default"]},
+ {"carrier":"Orange Web SN","apn":"internet","user":"internet","password":"internet","type":["default"]}
+ ]
+},
+"610": {
+ "2": [
+ {"carrier":"Orange ML MMS","apn":"mms","user":"mms","password":"mms","mmsc":"http://10.109.6.2/servlets/mms","mmsproxy":"10.109.4.35","mmsport":"8080","type":["mms"]},
+ {"carrier":"Orange Wap ML","apn":"wap","user":"wap","password":"wap","proxy":"10.109.4.35","port":"8080","type":["default"]}
+ ]
+},
+"612": {
+ "3": [
+ {"carrier":"Omms CI","apn":"orangecimms","user":"mms","password":"mms","mmsc":"http://172.20.6.1/servlets/mms","mmsproxy":"172.20.4.33","mmsport":"8080","type":["mms"]},
+ {"carrier":"OWORLD CI","apn":"orangeciwap","user":"wap","password":"wap","proxy":"172.20.4.33","port":"8080","type":["default"]}
+ ]
+},
+"614": {
+ "4": [
+ {"carrier":"Orange MMS","apn":"orange.mms","user":"orange","password":"orange","mmsc":"http://10.10.10.35:38090/was","mmsproxy":"10.10.10.36","mmsport":"8080","type":["mms"]},
+ {"carrier":"Orange Internet","apn":"orange.ne","type":["default"]}
+ ]
+},
+"617": {
+ "1": [
+ {"carrier":"Orange MMS","apn":"orangemms","user":"mmsc","password":"mmsc","mmsc":"http://10.2.1.20:8514","mmsproxy":"10.2.1.20","mmsport":"8080","type":["mms"]},
+ {"carrier":"Orange Internet","apn":"orange","type":["default"]}
+ ]
+},
+"621": {
+ "20": [
+ {"carrier":"Zain Mobile Internet","apn":"internet.ng.Zain.com","type":["default","supl"]},
+ {"carrier":"Zain MMS","apn":"mms.ng.zain.com","user":"mms","password":"mms","mmsc":"http://172.23.1.12/mms/wapenc","mmsproxy":"172.18.254.5","mmsport":"8080","type":["mms"]}
+ ],
+ "30": [
+ {"carrier":"MTN GPRS","apn":"web.gprs.mtnnigeria.net","user":"web","password":"web","proxy":"10.199.212.2","port":"8080","type":["default","supl"]},
+ {"carrier":"MTN MMS","apn":"web.gprs.mtnnigeria.net","user":"web","password":"web","mmsc":"http://10.199.212.8/servlets/mms","mmsproxy":"10.199.212.2","mmsport":"8080","type":["mms"]}
+ ],
+ "50": [
+ {"carrier":"glo direct","apn":"glosecure","user":"gprs","password":"gprs","type":["default","supl"]},
+ {"carrier":"glo mms","apn":"glomms","user":"mms","password":"mms","mmsc":"http://mms.gloworld.com/mmsc","mmsproxy":"10.100.82.4","mmsport":"9201","type":["mms"]}
+ ],
+ "60": [
+ {"carrier":"Etisalat Internet","apn":"etisalat","type":["default","supl"]},
+ {"carrier":"Etisalat MMS","apn":"etisalat","mmsc":"http://10.71.170.30:38090/was","mmsproxy":"10.71.170.5","mmsport":"8080","type":["mms"]}
+ ]
+},
+"624": {
+ "2": [
+ {"carrier":"Orange CM","apn":"orangecmgprs","user":"orange","password":"orange","proxy":"192.168.122.101","port":"8080","mmsc":"http://mms.orange.cm","mmsproxy":"192.168.122.101","mmsport":"8080","type":["default","mms"]}
+ ]
+},
+"639": {
+ "2": [
+ {"carrier":"SafaricomBrowse","apn":"Safaricom","user":"saf","password":"data","proxy":"172.22.2.38","port":"8080","type":["default","supl"]},
+ {"carrier":"SafaricomMMS","apn":"Safaricom","user":"saf","password":"data","mmsc":"http://mms.gprs.safaricom.com","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Zain WAP","apn":"wap.ke.celtel.com","user":"wap","password":"wap","type":["default","supl"]},
+ {"carrier":"Zain MMS","apn":"mms.ke.celtel.com","user":"wap","password":"wap","mmsc":"http://mms.ke.celtel.com/servlets/mms","type":["mms"]}
+ ],
+ "7": [
+ {"carrier":"Orange Internet","apn":"wap.orange.co.ke","type":["default","supl"]},
+ {"carrier":"Orange MMS","apn":"mms.orange.co.ke","mmsproxy":"10.36.16.5","mmsport":"8080","mmsc":"http://10.36.16.5/servlets/mms","type":["mms"]},
+ {"carrier":"Orange net KE","apn":"bew.orange.co.ke","type":["default"]}
+ ]
+},
+"640": {
+ "4": [
+ {"carrier":"Vodacom WAP","apn":"Wap","proxy":"10.154.0.8","port":"9401","type":["default","supl"]},
+ {"carrier":"Vodacom MMS","apn":"mms","mmsc":"http://10.154.0.12/mms/","type":["mms"]}
+ ]
+},
+"641": {
+ "14": [
+ {"carrier":"Orange Internet UG","apn":"orange.ug","type":["default"]},
+ {"carrier":"Orange MMS","apn":"orangemms","mmsc":"http://mms/","type":["mms"]}
+ ]
+},
+"646": {
+ "2": [
+ {"carrier":"Orange MG MMS","apn":"orangemms","user":"mms","password":"orange","mmsc":"http://10.152.10.70.38090","mmsproxy":"10.150.0.115","mmsport":"8080","type":["mms"]},
+ {"carrier":"Orange World MG","apn":"orangeworld","user":"world","password":"orange","proxy":"10.150.0.115","port":"8080","type":["default"]}
+ ]
+},
+"647": {
+ "0": [
+ {"carrier":"Orange World re","apn":"orangerun","user":"orange","password":"orange","type":["default","supl"]},
+ {"carrier":"Orange MMS Réunion","apn":"orangerun.acte","user":"orange","password":"orange","mmsc":"http://mms.orange.re","mmsproxy":"192.168.10.200","mmsport":"8080","type":["mms"]},
+ {"carrier":"Orange RE","apn":"orangerun","user":"orange","password":"orange","type":["default"]}
+ ],
+ "10": [
+ {"carrier":"MMS","apn":"mmssfr","user":"mms","password":"mms","mmsc":"http://mms","mmsproxy":"10.0.224.145","mmsport":"8080","type":["mms"]},
+ {"carrier":"GPRS SRR","apn":"wapsfr","user":"wap","password":"wap","proxy":"10.0.224.161","port":"8080","type":["default","supl"]}
+ ]
+},
+"651": {
+ "1": [
+ {"carrier":"VCL Internet GPRS","apn":"internet","type":["default","supl"]},
+ {"carrier":"VCL MMS GPRS","apn":"mms","proxy":"10.113.63.11","port":"8080","mmsc":"http://mmsc.vodacom4me.co.ls","mmsproxy":"10.113.63.11","mmsport":"8080","type":["mms"]}
+ ]
+},
+"652": {
+ "2": [
+ {"carrier":"Orange BW MMS","apn":"mms.orange.co.bw","mmsc":"http://10.0.0.242/servlets/mms","mmsproxy":"10.0.0.226","mmsport":"8080","type":["mms"]},
+ {"carrier":"Orange WAP BW","apn":"internet.orange.co.bw","proxy":"10.0.0.226","port":"8080","type":["default"]}
+ ]
+},
+"655": {
+ "1": [
+ {"carrier":"Vodacom","apn":"internet","proxy":"196.6.128.12","port":"8080","type":["default","supl"]},
+ {"carrier":"MMS.Vodacom","apn":"mms.vodacom.net","proxy":"196.6.128.13","port":"8080","mmsc":"http://mmsc.vodacom4me.co.za/","mmsproxy":"196.6.128.13","mmsport":"8080","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"8.ta internet","apn":"internet","type":["default","supl"]},
+ {"carrier":"8.ta mms","apn":"mms","proxy":"41.151.254.162","port":"8080","mmsc":"http://mms.8ta.com:38090/was","mmsproxy":"41.151.254.162","mmsport":"8080","type":["mms"]}
+ ],
+ "7": [
+ {"carrier":"Smartdata","apn":"internet","proxy":"196.31.116.250","port":"8080","type":["default","supl"]},
+ {"carrier":"Cell C MMS","apn":"mms","proxy":"196.31.116.250","port":"8080","mmsc":"http://mms.cmobile.co.za","mmsproxy":"196.31.116.250","mmsport":"8080","type":["mms"]},
+ {"carrier":"virgin_internet","apn":"vdata","proxy":"196.31.116.241","port":"8080","type":["default","supl"]},
+ {"carrier":"virgin_mms","apn":"vmms","proxy":"196.31.116.242","port":"8080","mmsc":"http://mms.virginmobile.co.za","mmsproxy":"196.31.116.242","mmsport":"8080","type":["mms"]}
+ ],
+ "10": [
+ {"carrier":"MTN Data","apn":"myMTN","user":"mtn","password":"mtn","mmsc":"http://mms.mtn.co.za/mms/wapenc","mmsproxy":"196.11.240.241","mmsport":"8080","type":["default","supl","mms"]}
+ ]
+},
+"704": {
+ "1": [
+ {"carrier":"INTERNET CLARO","apn":"internet.ideasclaro","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS CLARO","apn":"mms.ideasclaro","user":"","password":"","mmsproxy":"216.230.133.66","mmsport":"8080","mmsc":"http://mms.ideasclaro.com:8002","authtype":"1","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"BROADBAND TIGO","apn":"broadband.tigo.gt","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS TIGO","apn":"mms.tigo.gt","user":"","password":"","mmsproxy":"10.16.17.12","mmsport":"8888","mmsc":"http://mms","authtype":"1","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Internet GT","apn":"internet.movistar.gt","user":"movistargt","password":"movistargt","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS2 GPRS","apn":"mms.movistar.gt","user":"movistargt","password":"movistargt","mmsproxy":"10.12.22.1","mmsport":"80","mmsc":"http://mms.movistar.gt","authtype":"1","type":["mms"]}
+ ],
+ "30": [
+ {"carrier":"Internet GT","apn":"internet.movistar.gt","user":"movistargt","password":"movistargt","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS2 GPRS","apn":"mms.movistar.gt","user":"movistargt","password":"movistargt","mmsproxy":"10.12.22.1","mmsport":"80","mmsc":"http://mms.movistar.gt","authtype":"1","type":["mms"]}
+ ]
+},
+"706": {
+ "1": [
+ {"carrier":"INTERNET CLARO","apn":"internet.ideasclaro","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS CLARO","apn":"mms.ideasclaro","user":"","password":"","mmsproxy":"216.230.133.66","mmsport":"8080","mmsc":"http://mms.ideasclaro.com:8002","authtype":"1","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"El Salvaldor Digicel","apn":"web.digicelsv.com","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS El Salvador","apn":"wap.digicelsv.com","user":"","password":"","mmsproxy":"172.26.5.12","mmsport":"8080","mmsc":"http://172.26.5.132/servlets/mms","authtype":"1","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"BROADBAND TIGO","apn":"broadband.tigo.sv","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS TIGO","apn":"mms.tigo.sv","user":"","password":"","mmsproxy":"10.16.17.12","mmsport":"8888","mmsc":"http://mms","authtype":"1","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"Internet SV","apn":"internet.movistar.sv","user":"movistarsv","password":"movistarsv","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS2 GPRS","apn":"mms.movistar.sv","user":"movistarsv","password":"movistarsv","mmsproxy":"10.12.20.1","mmsport":"80","mmsc":"http://mms.movistar.sv","authtype":"1","type":["mms"]}
+ ],
+ "40": [
+ {"carrier":"Internet SV","apn":"internet.movistar.sv","user":"movistarsv","password":"movistarsv","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS2 GPRS","apn":"mms.movistar.sv","user":"movistarsv","password":"movistarsv","mmsproxy":"10.12.20.1","mmsport":"80","mmsc":"http://mms.movistar.sv","authtype":"1","type":["mms"]}
+ ]
+},
+"708": {
+ "1": [
+ {"carrier":"Internet Claro","apn":"web.megatel.hn","user":"webmegatel","password":"webmegatel","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS Claro","apn":"mms.megatel.hn","user":"mmsmegatel","password":"mmsmegatel","mmsproxy":"10.6.32.2","mmsport":"8080","mmsc":"http://10.6.32.27/servlets/mms","authtype":"1","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"INTERNET TIGO","apn":"internet.tigo.hn","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS TIGO","apn":"mms.tigo.hn","user":"","password":"","mmsproxy":"10.16.17.12","mmsport":"8888","mmsc":"http://mms","authtype":"1","type":["mms"]}
+ ],
+ "20": [
+ {"carrier":"INTERNET TIGO","apn":"internet.tigo.hn","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS TIGO","apn":"mms.tigo.hn","user":"","password":"","mmsproxy":"10.16.17.12","mmsport":"8888","mmsc":"http://mms","authtype":"1","type":["mms"]}
+ ]
+},
+"710": {
+ "21": [
+ {"carrier":"INTERNET","apn":"web.emovil","user":"webemovil","password":"webemovil","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS","apn":"mms.emovil","user":"mmsemovil","password":"mmsemovil","mmsproxy":"10.6.32.2","mmsport":"8080","mmsc":"http://10.6.32.27/servlets/mms","authtype":"1","type":["mms"]}
+ ],
+ "300": [
+ {"carrier":"Internet GPRS","apn":"internet.movistar.ni","user":"movistarni","password":"movistarni","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"movistar MMS","apn":"mms.movistar.ni","user":"movistarni","password":"movistarni","mmsproxy":"10.12.23.1","mmsport":"80","mmsc":"http://mms.movistar.ni","authtype":"1","type":["mms"]}
+ ],
+ "730": [
+ {"carrier":"INTERNET","apn":"web.emovil","user":"webemovil","password":"webemovil","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS","apn":"mms.emovil","user":"mmsemovil","password":"mmsemovil","mmsproxy":"10.6.32.2","mmsport":"8080","mmsc":"http://10.6.32.27/servlets/mms","authtype":"1","type":["mms"]}
+ ]
+},
+"712": {
+ "1": [
+ {"carrier":"Kolbi","apn":"kolbi3g","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Multimedia","apn":"kolbi3g","user":"","password":"","mmsproxy":"10.184.202.24","mmsport":"8080","mmsc":"http://mmsice","authtype":"1","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Kolbi","apn":"kolbi3g","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Multimedia","apn":"kolbi3g","user":"","password":"","mmsproxy":"10.184.202.24","mmsport":"8080","mmsc":"http://mmsice","authtype":"1","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"INTERNET CLARO","apn":"internet.ideasclaro","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"voicemail":"190","type":["operatorvariant"]},
+ {"carrier":"MMS CLARO","apn":"mms.ideasclaro","user":"","password":"","mmsproxy":"216.230.133.66","mmsport":"8080","mmsc":"http://mms.ideasclaro.com:8002","authtype":"1","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"movistar INTERNET","apn":"internet.movistar.cr","user":"movistarcr","password":"movistarcr","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"movistar MMS","apn":"mms.movistar.cr","user":"movistarcr","password":"movistarcr","mmsproxy":"10.221.79.83","mmsport":"80","mmsc":"http://mms.movistar.cr","authtype":"1","type":["mms"]}
+ ]
+},
+"714": {
+ "1": [
+ {"carrier":"Wap","apn":"apn01.cwpanama.com.pa","proxy":"172.25.3.5","port":"8080","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Mms","apn":"apn02.cwpanama.com.pa","user":"","password":"","mmsproxy":"172.25.3.5","mmsport":"8080","mmsc":"http://mms.zonamovil.com.pa","authtype":"1","type":["mms"]}
+ ],
+ "20": [
+ {"carrier":"movistar INTERNET","apn":"internet.movistar.pa","user":"movistarpa","password":"movistarpa","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"movistar MMS","apn":"mms.movistar.pa","user":"movistarpamms","password":"movistarpa","mmsproxy":"10.12.21.1","mmsport":"80","mmsc":"http://mms.movistar.pa","authtype":"1","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"WEB Claro","apn":"web.claro.com.pa","user":"CLAROWEB","password":"CLAROWEB","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS Claro","apn":"mms.claro.com.pa","user":"CLAROMMS","password":"CLAROMMS","mmsproxy":"10.240.3.129","mmsport":"8799","mmsc":"http://www.claro.com.pa/mms/","authtype":"1","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"INTERNET Panama","apn":"web.digicelpanama.com","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS Panama","apn":"wap.digicelpanama.com","user":"","password":"","mmsproxy":"172.27.99.99","mmsport":"8080","mmsc":"http://mmc.digicelpanama.com/servlets/mms","authtype":"1","type":["mms"]}
+ ]
+},
+"716": {
+ "6": [
+ {"carrier":"movistar Internet","apn":"movistar.pe","user":"movistar@datos","password":"movistar","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"movistar MMS","apn":"mms.movistar.pe","user":"movistar@mms","password":"movistar","mmsproxy":"200.4.196.118","mmsport":"8080","mmsc":"http://mmsc.telefonicamovistar.com.pe:8088/mms/","authtype":"1","type":["mms"]}
+ ],
+ "10": [
+ {"carrier":"CLARO DATOS","apn":"claro.pe","user":"claro","password":"claro","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"CLARO MMS","apn":"mms.claro.pe","user":"claro","password":"claro","mmsproxy":"192.168.231.30","mmsport":"80","mmsc":"http://claro/servlets/mms","authtype":"1","type":["mms"]}
+ ]
+},
+"722": {
+ "7": [
+ {"carrier":"Movistar Emoción","apn":"wap.gprs.unifon.com.ar","user":"wap","password":"wap","proxy":"200.5.68.10","port":"8080","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Movistar MMS","apn":"mms.gprs.unifon.com.ar","user":"mms","password":"mms","mmsproxy":"200.68.32.239","mmsport":"8080","mmsc":"http://mms.movistar.com.ar","authtype":"1","type":["mms"]}
+ ],
+ "31": [
+ {"carrier":"Claro AR","apn":"igprs.claro.com.ar","user":"ctigprs","password":"ctigprs999","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS GPRS AR","apn":"mms.ctimovil.com.ar","user":"ctimms","password":"ctimms999","mmsproxy":"170.51.255.240","mmsport":"8080","mmsc":"http://mms.ctimovil.com.ar","authtype":"1","type":["mms"]}
+ ],
+ "310": [
+ {"carrier":"Claro AR","apn":"igprs.claro.com.ar","user":"ctigprs","password":"ctigprs999","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS GPRS AR","apn":"mms.ctimovil.com.ar","user":"ctimms","password":"ctimms999","mmsproxy":"170.51.255.240","mmsport":"8080","mmsc":"http://mms.ctimovil.com.ar","authtype":"1","type":["mms"]}
+ ],
+ "34": [
+ {"carrier":"Personal Datos","apn":"datos.personal.com","user":"gprs","password":"adgj","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Personal MMS","apn":"mms","user":"mms","password":"mms","mmsproxy":"172.25.7.31","mmsport":"8080","mmsc":"http://mms.personal.com","authtype":"1","type":["mms"]}
+ ],
+ "341": [
+ {"carrier":"Personal Datos","apn":"datos.personal.com","user":"gprs","password":"adgj","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Personal MMS","apn":"mms","user":"mms","password":"mms","mmsproxy":"172.25.7.31","mmsport":"8080","mmsc":"http://mms.personal.com","authtype":"1","type":["mms"]}
+ ]
+},
+"724": {
+ "2": [
+ {"carrier":"TIM Connect","apn":"timbrasil.br","user":"tim","password":"tim","mmsc":"http://mms.tim.br","mmsproxy":"200.179.66.242","mmsport":"8080","authtype":"1","type":["default","supl","mms"]},
+ {"voicemail":"*100","enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]}
+ ],
+ "3": [
+ {"carrier":"TIM Connect","apn":"timbrasil.br","user":"tim","password":"tim","mmsc":"http://mms.tim.br","mmsproxy":"200.179.66.242","mmsport":"8080","authtype":"1","type":["default","supl","mms"]},
+ {"voicemail":"*100","enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]}
+ ],
+ "4": [
+ {"carrier":"TIM Connect","apn":"timbrasil.br","user":"tim","password":"tim","mmsc":"http://mms.tim.br","mmsproxy":"200.179.66.242","mmsport":"8080","authtype":"1","type":["default","supl","mms"]},
+ {"voicemail":"*100","enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]}
+ ],
+ "5": [
+ {"carrier":"Java Session","apn":"java.claro.com.br","user":"claro","password":"claro","authtype":"1","type":["default","supl"]},
+ {"voicemail":"*100","enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Claro Foto","apn":"mms.claro.com.br","user":"claro","password":"claro","mmsc":"http://mms.claro.com.br","mmsproxy":"200.169.126.10","mmsport":"8799","authtype":"1","type":["mms"]}
+ ],
+ "6": [
+ {"carrier":"Vivo MMS","apn":"mms.vivo.com.br","user":"vivo","password":"vivo","mmsc":"http://termnat.vivomms.com.br:8088/mms","mmsproxy":"200.142.130.104","mmsport":"80","authtype":"1","type":["mms"]},
+ {"voicemail":"*555","enableStrict7BitEncodingForSms":true,"cellBroadcastSearchList":"50","type":["operatorvariant"]},
+ {"carrier":"Vivo Internet","apn":"zap.vivo.com.br","user":"vivo","password":"vivo","authtype":"1","type":["default","supl"]}
+ ],
+ "7": [
+ {"carrier":"SCTL MMS","apn":"mms.sercomtel.com.br","user":"sercomtel","password":"sercomtel","mmsc":"http://mms.claro.com.br","mmsproxy":"200.169.126.10","mmsport":"8799","type":["mms"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"SCTL GPRS","apn":"sercomtel.com.br","user":"sercomtel","password":"sercomtel","type":["default","supl"]}
+ ],
+ "10": [
+ {"carrier":"Vivo Internet","apn":"zap.vivo.com.br","user":"vivo","password":"vivo","type":["default","supl"]},
+ {"voicemail":"*555","enableStrict7BitEncodingForSms":true,"cellBroadcastSearchList":"50","type":["operatorvariant"]},
+ {"carrier":"Vivo MMS","apn":"mms.vivo.com.br","user":"vivo","password":"vivo","mmsc":"http://termnat.vivomms.com.br:8088/mms","mmsproxy":"200.142.130.104","mmsport":"80","authtype":"1","type":["mms"]}
+ ],
+ "11": [
+ {"carrier":"Vivo MMS","apn":"mms.vivo.com.br","user":"vivo","password":"vivo","mmsc":"http://termnat.vivomms.com.br:8088/mms","mmsproxy":"200.142.130.104","mmsport":"80","authtype":"1","type":["mms"]},
+ {"voicemail":"*555","enableStrict7BitEncodingForSms":true,"cellBroadcastSearchList":"50","type":["operatorvariant"]},
+ {"carrier":"Vivo Internet","apn":"zap.vivo.com.br","user":"vivo","password":"vivo","authtype":"1","type":["default","supl"]}
+ ],
+ "16": [
+ {"carrier":"BrT Modem","apn":"brt.br","user":"brt","password":"brt","authtype":"1","type":["default","supl"]},
+ {"voicemail":"*100","enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"BrT MMS","apn":"mms.brt.br","user":"brt","password":"brt","mmsc":"http://mms.brasiltelecom.com.br/","mmsproxy":"200.96.8.29","mmsport":"8080","authtype":"1","type":["mms"]}
+ ],
+ "19": [
+ {"carrier":"TelemigC GPRS","apn":"gprs.telemigcelular.com.br","user":"celular","password":"celular","type":["default","supl"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS Telemig","apn":"mmsgprs.telemigcelular.com.br","user":"celular","password":"celular","mmsc":"http://mms.telemigcelular.com.br","mmsproxy":"200.192.230.142","mmsport":"8080","type":["mms"]}
+ ],
+ "23": [
+ {"carrier":"Vivo Internet","apn":"zap.vivo.com.br","user":"vivo","password":"vivo","authtype":"1","type":["default","supl"]},
+ {"voicemail":"*555","enableStrict7BitEncodingForSms":true,"cellBroadcastSearchList":"50","type":["operatorvariant"]},
+ {"carrier":"Vivo MMS","apn":"mms.vivo.com.br","user":"vivo","password":"vivo","mmsc":"http://termnat.vivomms.com.br:8088/mms","mmsproxy":"200.142.130.104","mmsport":"80","authtype":"1","type":["mms"]}
+ ],
+ "24": [
+ {"carrier":"AmazôniaC GPRS","apn":"gprs.amazoniacelular.com.br","user":"celular","password":"celular","authtype":"1","type":["default","supl","dun"]},
+ {"voicemail":"*100","enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"AmazôniaC MMS","apn":"mmsgprs.amazoniacelular.com.br","user":"celular","password":"celular","mmsc":"http://mms.amazoniacelular.com.br","mmsproxy":"200.192.230.142","mmsport":"8080","authtype":"1","type":["mms"]}
+ ],
+ "31": [
+ {"carrier":"OI GPRS","apn":"gprs.oi.com.br","authtype":"1","type":["default","supl"]},
+ {"voicemail":"*100","enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"OI MMS","apn":"mmsgprs.oi.com.br","user":"oimms","password":"oimms","mmsc":"http://200.222.42.204:8002","mmsproxy":"192.168.10.50","mmsport":"3128","authtype":"1","type":["mms"]}
+ ]
+},
+"730": {
+ "1": [
+ {"carrier":"Internet Movil","apn":"bam.entelpcs.cl","user":"entelpcs","password":"entelpcs","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS Entel","apn":"mms.entelpcs.cl","user":"entelpcs","password":"entelpcs","mmsproxy":"10.99.0.10","mmsport":"8080","mmsc":"http://mmsc.entelpcs.cl","authtype":"1","type":["mms"]}
+ ],
+ "10": [
+ {"carrier":"Internet Movil","apn":"bam.entelpcs.cl","user":"entelpcs","password":"entelpcs","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS Entel","apn":"mms.entelpcs.cl","user":"entelpcs","password":"entelpcs","mmsproxy":"10.99.0.10","mmsport":"8080","mmsc":"http://mmsc.entelpcs.cl","authtype":"1","type":["mms"]},
+ {"carrier":"Internet Movil","apn":"bam.entelpcs.cl","user":"entelpcs","password":"entelpcs","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS Entel PCS","apn":"mms.entelpcs.cl","user":"entelpcs","password":"entelpcs","mmsc":"http://mmsc.entelpcs.cl","mmsproxy":"10.99.0.10","mmsport":"8080","authtype":"1","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"NEM","apn":"wap.tmovil.cl","proxy":"172.17.8.11","port":"8080","user":"wap","password":"wap","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS","apn":"mms.tmovil.cl","user":"mms","password":"mms","mmsproxy":"172.17.8.10","mmsport":"8080","mmsc":"http://mms.movistar.cl","authtype":"1","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"BAM Claro","apn":"bam.clarochile.cl","user":"clarochile","password":"clarochile","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS Claro","apn":"mms.clarochile.cl","user":"clarochile","password":"clarochile","mmsproxy":"172.23.200.200","mmsport":"8080","mmsc":"http://mms.clarochile.cl","authtype":"1","type":["mms"]}
+ ],
+ "7": [
+ {"carrier":"web","apn":"web.gtdmovil.cl","user":"webgtd","password":"webgtd","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]}
+ ],
+ "8": [
+ {"carrier":"Internet","apn":"movil.vtr.com","user":"vtrmovil","password":"vtrmovil","authtype":"2","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"Wap","apn":"wap.vtr.com","proxy":"192.168.94.210","port":"9028","user":"","password":"","authtype":"0","type":["default","supl","dun"]},
+ {"carrier":"Bam","apn":"bam.vtr.com","user":"vtr","password":"vtr","authtype":"2","type":["default","supl","dun"]},
+ {"carrier":"MMS","apn":"mms.vtr.com","user":"mms","password":"","mmsc":"http://192.168.94.162:19090/was","mmsproxy":"192.168.94.210","mmsport":"9028","authtype":"0","type":["mms"]}
+ ]
+},
+"732": {
+ "101": [
+ {"carrier":"WEB Comcel 3GSM","apn":"internet.comcel.com.co","user":"COMCELWEB","password":"COMCELWEB","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS Comcel 3GSM","apn":"mms.comcel.com.co","user":"COMCELMMS","password":"COMCELMMS","mmsproxy":"198.228.90.225","mmsport":"8799","mmsc":"http://www.comcel.com.co/mms/","authtype":"1","type":["mms"]}
+ ],
+ "103": [
+ {"carrier":"TIGO WEB","apn":"web.colombiamovil.com.co","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"TIGO Multimedia","apn":"mms.colombiamovil.com.co","user":"mms-cm1900","password":"mms-cm1900","mmsproxy":"190.102.206.48","mmsport":"8080","mmsc":"http://mms.ola.com.co","authtype":"1","type":["mms"]}
+ ],
+ "111": [
+ {"carrier":"TIGO WEB","apn":"web.colombiamovil.com.co","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"TIGO Multimedia","apn":"mms.colombiamovil.com.co","user":"mms-cm1900","password":"mms-cm1900","mmsproxy":"190.102.206.48","mmsport":"8080","mmsc":"http://mms.ola.com.co","authtype":"1","type":["mms"]}
+ ],
+ "123": [
+ {"carrier":"movistar INTERNET","apn":"internet.movistar.com.co","user":"movistar","password":"movistar","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"movistar MMS","apn":"mms.movistar.com.co","user":"movistar","password":"movistar","mmsproxy":"192.168.222.7","mmsport":"9001","mmsc":"http://mms.movistar.com.co","authtype":"1","type":["mms"]}
+ ]
+},
+"734": {
+ "1": [
+ {"carrier":"Digitel GSM","apn":"gprsweb.digitel.ve","type":["default","supl","dun"],"authtype":"1"},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS","apn":"expresate.digitel.ve","mmsproxy":"10.99.0.10","mmsport":"8080","mmsc":"http://mms.412.com.ve/servlets/mms","authtype":"1","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Digitel GSM","apn":"gprsweb.digitel.ve","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS","apn":"expresate.digitel.ve","mmsproxy":"10.99.0.10","mmsport":"8080","mmsc":"http://mms.412.com.ve/servlets/mms","authtype":"1","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"Digitel GSM","apn":"gprsweb.digitel.ve","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS","apn":"expresate.digitel.ve","mmsproxy":"10.99.0.10","mmsport":"8080","mmsc":"http://mms.412.com.ve/servlets/mms","authtype":"1","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"movistar INTERNET","apn":"internet.movistar.ve","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"movistar MMS","apn":"mms.movistar.ve","mmsproxy":"200.35.64.73","mmsport":"9001","mmsc":"http://mms.movistar.com.ve:8088/mms","authtype":"1","type":["mms"]},
+ {"carrier":"movistar WAP","apn":"wap.movistar.ve","mmsproxy":"200.35.64.73","mmsport":"9001","authtype":"1","type":["default","supl","dun"]}
+ ],
+ "6": [
+ {"carrier":"MODEM","apn":"int.movilnet.com.ve","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS","apn":"mm.movilnet.com.ve","mmsproxy":"192.168.16.12","mmsport":"8080","mmsc":"http://mms2.movilnet.com.ve/servlets/mms","authtype":"1","type":["mms"]}
+ ]
+},
+"736": {
+ "1": [
+ {"carrier":"VIVA3G","apn":"internet.nuevatel.com","user":"","password":"","proxy":"192.168.101.004","port":"3128","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"VIVAMMS","apn":"mms.nuevatel.com","user":"","password":"","mmsproxy":"192.168.101.004","mmsport":"3128","mmsc":"http://mmsgw.nuevatel.com:1981","authtype":"1","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"ENTEL WAP GPRS","apn":"wap.movil.com.bo","user":"","password":"","proxy":"172.27.7.10","port":"8080","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"ENTEL MMS GPRS","apn":"mms.movil.com.bo","user":"","password":"","mmsproxy":"172.27.7.10","mmsport":"8080","mmsc":"http://mms.movil.com.bo/servlets/mms","authtype":"1","type":["mms"]}
+ ],
+ "3": [
+ {"carrier":"WAPTIGO","apn":"wap.tigo.bo","user":"","password":"","proxy":"172.25.100.8","port":"8080","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMSTIGO","apn":"mms.tigo.bo","user":"","password":"","mmsproxy":"172.25.100.8","mmsport":"8080","mmsc":"http://mms","authtype":"1","type":["mms"]}
+ ]
+},
+"740": {
+ "0": [
+ {"carrier":"movistar INTERNET","apn":"internet.movistar.com.ec","user":"movistar","password":"movistar","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"movistar MMS","apn":"mms.movistar.com.ec","user":"movistar","password":"movistar","mmsproxy":"10.3.5.50","mmsport":"9001","mmsc":"http://mms.movistar.com.ec:8088/mms/","authtype":"1","type":["mms"]}
+ ],
+ "1": [
+ {"carrier":"Claro Internet","apn":"internet.porta.com.ec","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS Claro","apn":"mms.porta.com.ec","user":"portamms","password":"portamms2003","mmsproxy":"216.250.208.94","mmsport":"8799","mmsc":"http://iesmms.porta.com.ec","authtype":"1","type":["mms"]}
+ ],
+ "10": [
+ {"carrier":"Claro Internet","apn":"internet.porta.com.ec","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS Claro","apn":"mms.porta.com.ec","user":"portamms","password":"portamms2003","mmsproxy":"216.250.208.94","mmsport":"8799","mmsc":"http://iesmms.porta.com.ec","authtype":"1","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"ALEGRO 3G","apn":"internet3gsp.alegro.net.ec","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS Alegro","apn":"mms.alegro.net.ec","user":"","password":"","mmsproxy":"10.4.85.3","mmsport":"8080","mmsc":"http://mms.alegro.net.ec/mms/","authtype":"1","type":["mms"]}
+ ]
+},
+"744": {
+ "1": [
+ {"carrier":"VOX INTERNET","apn":"vox.internet","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"VOX MMS","apn":"vox.mms","user":"vox","password":"vox","mmsproxy":"172.24.97.29","mmsport":"8080","mmsc":"http://mms.vox.com.py/mmsc","authtype":"1","type":["mms"]}
+ ],
+ "2": [
+ {"carrier":"Claro PY","apn":"igprs.claro.com.py","user":"ctigprs","password":"ctigprs999","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS GPRS PY","apn":"mms.ctimovil.com.py","user":"ctimms","password":"ctimms999","mmsproxy":"170.51.255.240","mmsport":"8080","mmsc":"http://mms.ctimovil.com.py","authtype":"1","type":["mms"]}
+ ],
+ "4": [
+ {"carrier":"TIGO PY","apn":"internet.tigo.py","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"MMS Tigo","apn":"mms.tigo.py","user":"tigo","password":"tigo","mmsproxy":"10.16.17.12","mmsport":"8888","mmsc":"http://mms","authtype":"1","type":["mms"]}
+ ],
+ "5": [
+ {"carrier":"Personal Datos Py","apn":"internet","user":"personal","password":"personal","authtype":"1","type":["default","supl","dun"]},
+ {"carrier":"Personal MMS Py","apn":"mms","user":"mms","password":"mms","mmsproxy":"172.16.192.7","mmsport":"8080","mmsc":"http://mms","authtype":"1","type":["mms"]}
+ ]
+},
+"748": {
+ "1": [
+ {"carrier":"wapANCEL","apn":"wap","proxy":"200.40.246.2","port":"3128","user":"","password":"","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"mmsANCEL","apn":"mms","user":"","password":"","mmsproxy":"200.40.246.2","mmsport":"3128","mmsc":"http://mmsc.mms.ancelutil.com.uy","authtype":"1","type":["mms"]},
+ {"carrier":"gprsANCEL","apn":"gprs.ancel","authtype":"1","type":["default","supl","dun"]}
+ ],
+ "7": [
+ {"carrier":"Movistar Emoción","apn":"webapn.movistar.com.uy","user":"movistar","password":"movistar","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"FOTOS MMS","apn":"apnmms.movistar.com.uy","user":"mmsuy","password":"mmsuy","mmsproxy":"10.0.2.29","mmsport":"8080","mmsc":"http://mmsc.movistar.com.uy","authtype":"1","type":["mms"]}
+ ],
+ "10": [
+ {"carrier":"Claro UY","apn":"igprs.claro.com.uy","user":"ctigprs","password":"ctigprs999","authtype":"1","type":["default","supl","dun"]},
+ {"enableStrict7BitEncodingForSms":true,"type":["operatorvariant"]},
+ {"carrier":"MMS GPRS UY","apn":"mms.ctimovil.com.uy","user":"ctimms","password":"ctimms999","mmsproxy":"170.51.255.240","mmsport":"8080","mmsc":"http://mms.ctimovil.com.uy","authtype":"1","type":["mms"]}
+ ]
+}
+}
diff --git a/shared/resources/apn/README.md b/shared/resources/apn/README.md
new file mode 100644
index 0000000..b839ef3
--- /dev/null
+++ b/shared/resources/apn/README.md
@@ -0,0 +1,20 @@
+Three APN (Access Point Name) databases are used:
+
+* the Android database `/shared/resources/apn/apns_conf.xml` is the *de facto* standard we rely on;
+* a local database `/shared/resources/apn/apns_conf-local.xml` with the same format we merge with the above, used for where Google is lacking. Ideally this file should be empty as everything should be put upstream;
+* the Gnome database `/shared/resources/apn/serviceproviders.xml` is probably less up-to-date but has a bit more information.
+
+A fourth file `/shared/resources/apn/operator-variant.xml` is also used.
+
+These files are only used to test and merge these APN databases.
+
+The `/shared/resources/apn.json` file is a JSON version of the Android database, with a few additional informations from the Gnome APN database (e.g. voicemail number).
+
+To regenerate the .json file, start from the parent directory a webserver. Like this:
+
+ cd .. ; python -m SimpleHTTPServer 4104
+
+Then load http://0.0.0.0:4104/apn
+This should regenerate the .json file into the left part of the page, and you can cut & paste this to your editor.
+
+TODO: make this automatic. Patches Welcome™ \ No newline at end of file
diff --git a/shared/resources/apn/apns_conf.xml b/shared/resources/apn/apns_conf.xml
new file mode 100644
index 0000000..2178818
--- /dev/null
+++ b/shared/resources/apn/apns_conf.xml
@@ -0,0 +1,13517 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+/*
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- use empty string to specify no proxy or port -->
+<!-- This version must agree with that in apps/common/res/apns.xml -->
+<apns version="7">
+ <apn carrier="Cosmote Wireless Internet"
+ mcc="202"
+ mnc="01"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cosmote Mms"
+ mcc="202"
+ mnc="01"
+ apn="mms"
+ mmsc="http://mmsc.cosmote.gr:8002"
+ mmsproxy="10.10.10.20"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vf Mobile Internet"
+ mcc="202"
+ mnc="05"
+ apn="internet.vodafone.gr"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Vf MMS"
+ mcc="202"
+ mnc="05"
+ apn="mms.vodafone.net"
+ user="user"
+ password="pass"
+ mmsc="http://mms.vodafone.gr"
+ mmsproxy="213.249.19.49"
+ mmsport="5080"
+ type="mms"
+ />
+
+ <apn carrier="Q-Telecom MMS GPRS"
+ mcc="202"
+ mnc="09"
+ apn="q-mms.myq.gr"
+ mmsc="http://mms.myq.gr"
+ mmsproxy="192.168.80.134"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Wind Internet"
+ mcc="202"
+ mnc="10"
+ apn="gint.b-online.gr"
+ type="default,supl"
+ />
+
+ <apn carrier="Wind MMS"
+ mcc="202"
+ mnc="10"
+ apn="mnet.b-online.gr"
+ mmsc="http://192.168.200.95/servlets/mms"
+ mmsproxy="192.168.200.11"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone NL"
+ mcc="204"
+ mnc="04"
+ apn="live.vodafone.com"
+ user="vodafone"
+ password="vodafone"
+ mmsc="http://mmsc.mms.vodafone.nl"
+ mmsproxy="192.168.251.150"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="KPN Internet"
+ mcc="204"
+ mnc="08"
+ apn="portalmmm.nl"
+ mmsc="http://mp.mobiel.kpn/mmsc"
+ mmsproxy="10.10.100.20"
+ mmsport="5080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Telfort Internet"
+ mcc="204"
+ mnc="12"
+ apn="internet"
+ mmsc="http://mms"
+ mmsproxy="193.113.200.195"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile Internet"
+ mcc="204"
+ mnc="16"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="T-Mobile MMS"
+ mcc="204"
+ mnc="16"
+ apn="mms"
+ user="tmobilemms"
+ password="tmobilemms"
+ mmsc="http://t-mobilemms"
+ mmsproxy="10.10.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Rabo Mobiel"
+ mcc="204"
+ mnc="20"
+ apn="rabo.plus"
+ type="default,supl"
+ />
+
+ <apn carrier="Proximus MMS"
+ mcc="206"
+ mnc="01"
+ apn="event.proximus.be"
+ user="mms"
+ password="mms"
+ mmsc="http://mmsc.proximus.be/mms"
+ mmsproxy="10.55.14.75"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Proximus Internet"
+ mcc="206"
+ mnc="01"
+ apn="internet.proximus.be"
+ type="default,supl"
+ />
+
+ <apn carrier="Telenet Internet"
+ mcc="206"
+ mnc="01"
+ apn="telenetwap.be"
+ type="default,supl"
+ />
+
+ <apn carrier="Telenet MMS"
+ mcc="206"
+ mnc="01"
+ apn="mms.be"
+ mmsc="http://mmsc.telenet.be"
+ mmsproxy="195.130.149.100"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Telenet"
+ mcc="206"
+ mnc="05"
+ apn="telenetwap.be"
+ type="default,supl"
+ />
+
+ <apn carrier="Telenet MMS"
+ mcc="206"
+ mnc="05"
+ apn="mms.be"
+ mmsc="http://mmsc.telenet.be"
+ mmsproxy="195.130.149.100"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Mobistar MMS"
+ mcc="206"
+ mnc="10"
+ apn="mms.be"
+ mmsc="http://mmsc.mobistar.be"
+ mmsproxy="212.65.63.143"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Mobistar"
+ mcc="206"
+ mnc="10"
+ apn="mworld.be"
+ user="mobistar"
+ password="mobistar"
+ proxy="212.65.63.143"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Base"
+ mcc="206"
+ mnc="20"
+ apn="gprs.base.be"
+ user="base"
+ password="base"
+ proxy="172.31.198.37"
+ port="5080"
+ type="default,supl"
+ />
+
+ <apn carrier="BASE MMS"
+ mcc="206"
+ mnc="20"
+ apn="mms.base.be"
+ user="base"
+ password="base"
+ mmsc="http://mmsc.base.be"
+ mmsproxy="217.72.235.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Orange World"
+ mcc="208"
+ mnc="01"
+ apn="orange"
+ user="orange"
+ password="orange"
+ authtype="2"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="208"
+ mnc="01"
+ apn="orange.acte"
+ user="orange"
+ password="orange"
+ mmsc="http://mms.orange.fr"
+ mmsproxy="192.168.10.200"
+ mmsport="8080"
+ authtype="2"
+ type="mms"
+ />
+
+ <apn carrier="Orange Entreprise"
+ mcc="208"
+ mnc="01"
+ apn="orange-mib"
+ proxy="172.16.2.8"
+ port="8000"
+ user="orange"
+ password="orange"
+ authtype="2"
+ type="default"
+ />
+
+ <apn carrier="SFR webphone"
+ mcc="208"
+ mnc="10"
+ apn="sl2sfr"
+ type="default,supl"
+ />
+
+ <apn carrier="SFR Mobile"
+ mcc="208"
+ mnc="10"
+ apn="wapsfr"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS"
+ mcc="208"
+ mnc="10"
+ apn="mmssfr"
+ mmsc="http://mms1"
+ mmsproxy="10.151.0.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Bouygues Telecom"
+ mcc="208"
+ mnc="20"
+ apn="mmsbouygtel.com"
+ mmsc="http://mms.bouyguestelecom.fr/mms/wapenc"
+ mmsproxy="62.201.129.226"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="NRJWEB"
+ mcc="208"
+ mnc="10"
+ apn="fnetnrj"
+ type="default,supl"
+ />
+
+ <apn carrier="NRJMMS"
+ mcc="208"
+ mnc="10"
+ mmsc="http://mmsnrj"
+ mmsproxy="10.143.156.5"
+ mmsport="8080"
+ apn="mmsnrj"
+ type="mms"
+ />
+
+ <apn carrier="VM WAP"
+ mcc="208"
+ mnc="01"
+ apn="ofnew.fr"
+ user="orange"
+ password="orange"
+ type="default,supl"
+ />
+
+ <apn carrier="VM MMS"
+ mcc="208"
+ mnc="01"
+ apn="orange.acte"
+ user="orange"
+ password="orange"
+ mmsc="http://mms.orange.fr"
+ mmsproxy="192.168.10.200"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Tele2 WAP"
+ mcc="208"
+ mnc="01"
+ apn="ofnew.fr"
+ user="orange"
+ password="orange"
+ type="default,supl"
+ />
+
+ <apn carrier="Tele2 MMS"
+ mcc="208"
+ mnc="01"
+ apn="orange.acte"
+ user="orange"
+ password="orange"
+ mmsc="http://mms.orange.fr"
+ mmsproxy="192.168.10.200"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Carrefour WAP"
+ mcc="208"
+ mnc="01"
+ apn="ofnew.fr"
+ user="orange"
+ password="orange"
+ type="default,supl"
+ />
+
+ <apn carrier="Carrefour MMS"
+ mcc="208"
+ mnc="01"
+ apn="orange.acte"
+ user="orange"
+ password="orange"
+ mmsc="http://mms.orange.fr"
+ mmsproxy="192.168.10.200"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Auchan WAP"
+ mcc="208"
+ mnc="10"
+ proxy="192.168.21.8"
+ port="8080"
+ apn="wap65"
+ type="default,supl"
+ />
+
+ <apn carrier="Auchan MMS"
+ mcc="208"
+ mnc="10"
+ mmsc="http://mms65"
+ mmsproxy="10.143.156.8"
+ mmsport="8080"
+ apn="mms65"
+ type="mms"
+ />
+
+ <apn carrier="NRJWEB"
+ mcc="208"
+ mnc="01"
+ apn="ofnew.fr"
+ user="orange"
+ password="orange"
+ type="default,supl"
+ />
+
+ <apn carrier="NRJMMS"
+ mcc="208"
+ mnc="01"
+ apn="orange.acte"
+ user="orange"
+ password="orange"
+ mmsc="http://mms.orange.fr"
+ mmsproxy="192.168.10.200"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="WAP Simplicime"
+ mcc="208"
+ mnc="10"
+ proxy="192.168.21.3"
+ port="8080"
+ apn="wapdebitel"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS Simplicime"
+ mcc="208"
+ mnc="10"
+ mmsc="http://mmsdebitel"
+ mmsproxy="10.143.156.3"
+ mmsport="8080"
+ apn="mmsdebitel"
+ type="mms"
+ />
+
+ <apn carrier="WAP LeclercMobile"
+ mcc="208"
+ mnc="10"
+ proxy="192.168.21.9"
+ port="8080"
+ apn="wap66"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS LeclercMobile"
+ mcc="208"
+ mnc="10"
+ mmsc="http://mms66"
+ mmsproxy="10.143.156.9"
+ mmsport="8080"
+ apn="mms66"
+ type="mms"
+ />
+
+ <apn carrier="Coriolis WAP"
+ mcc="208"
+ mnc="10"
+ proxy="192.168.21.6"
+ port="8080"
+ apn="wapcoriolis"
+ type="default,supl"
+ />
+
+ <apn carrier="Coriolis MMS"
+ mcc="208"
+ mnc="10"
+ mmsc="http://mmscoriolis"
+ mmsproxy="10.143.156.6"
+ mmsport="8080"
+ apn="mmscoriolis"
+ type="mms"
+ />
+
+ <apn carrier="Keyyo Mobile Internet"
+ mcc="208"
+ mnc="10"
+ apn="internet68"
+ type="default,supl"
+ />
+
+ <apn carrier="Keyyo Mobile MMS"
+ mcc="208"
+ mnc="10"
+ mmsc="http://mms68"
+ mmsproxy="10.143.156.11"
+ mmsport="8080"
+ apn="mms68"
+ type="mms"
+ />
+
+ <apn carrier="WEB La Poste Mobile"
+ mcc="208"
+ mnc="10"
+ proxy="192.168.21.3"
+ port="8080"
+ apn="wapdebitel"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS La Poste Mobile"
+ mcc="208"
+ mnc="10"
+ mmsc="http://mmsdebitel"
+ mmsproxy="10.143.156.3"
+ mmsport="8080"
+ apn="mmsdebitel"
+ type="mms"
+ />
+
+ <apn carrier="Free"
+ mcc="208"
+ mnc="15"
+ apn="free"
+ type="default,supl"
+ />
+
+ <apn carrier="Free MMS"
+ mcc="208"
+ mnc="15"
+ mmsc="http://mms.free.fr"
+ apn="mmsfree"
+ type="mms"
+ />
+
+ <apn carrier="Internet movil"
+ mcc="214"
+ mnc="01"
+ apn="airtelwap.es"
+ user="wap@wap"
+ password="wap125"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS VODAFONE"
+ mcc="214"
+ mnc="01"
+ apn="mms.vodafone.net"
+ user="wap@wap"
+ password="wap125"
+ mmsc="http://mmsc.vodafone.es/servlets/mms"
+ mmsproxy="212.73.32.10"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Orange Internet Móvil"
+ mcc="214"
+ mnc="03"
+ apn="orangeworld"
+ user="orange"
+ password="orange"
+ authtype="1"
+ type="default"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="214"
+ mnc="03"
+ apn="orangemms"
+ proxy="172.22.188.25"
+ port="8080"
+ user="orange"
+ password="orange"
+ mmsc="http://mms.orange.es"
+ mmsproxy="172.22.188.25"
+ mmsport="8080"
+ authtype="2"
+ type="mms"
+ />
+
+ <apn carrier="Yoigo Navegador"
+ mcc="214"
+ mnc="04"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Yoigo MMS"
+ mcc="214"
+ mnc="04"
+ apn="mms"
+ mmsc="http://mmss/"
+ mmsproxy="193.209.134.141"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET GPRS"
+ mcc="214"
+ mnc="06"
+ apn="airtelnet.es"
+ user="vodafone"
+ password="vodafone"
+ type="default,supl"
+ />
+
+ <apn carrier="Euskaltel MMS"
+ mcc="214"
+ mnc="06"
+ apn="euskaltelmms.euskaltel.mobi"
+ user="MMS"
+ password="EUSKALTEL"
+ mmsc="http://mms.euskaltel.mobi"
+ mmsproxy="172.16.18.74"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Euskaltel Internet"
+ mcc="214"
+ mnc="06"
+ apn="internet.euskaltel.mobi"
+ user="CLIENTE"
+ password="EUSKALTEL"
+ type="default,supl"
+ />
+
+ <apn carrier="Internet R"
+ mcc="214"
+ mnc="06"
+ apn="internet.mundo-r.com"
+ type="default,supl"
+ />
+
+ <apn carrier="TeleCable Internet"
+ mcc="214"
+ mnc="06"
+ apn="internet.telecable.es"
+ user="telecable"
+ password="telecable"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS R"
+ mcc="214"
+ mnc="06"
+ apn="euskaltelmms.euskaltel.mobi"
+ mmsc="http://mms.mundo-r.com"
+ mmsproxy="10.0.157.169"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="TeleCable MMS"
+ mcc="214"
+ mnc="06"
+ apn="mms.telecable.es"
+ user="telecable"
+ password="telecable"
+ mmsc="http://mms.telecable.es/mms/"
+ mmsproxy="212.89.0.84"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="MMS Vodafone"
+ mcc="214"
+ mnc="06"
+ apn="mms.vodafone.net"
+ user="wap@wap"
+ password="wap125"
+ mmsc="http://mmsc.vodafone.es/servlets/mms"
+ mmsproxy="212.73.32.10"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Movistar MMS"
+ mcc="214"
+ mnc="07"
+ apn="telefonica.es"
+ user="telefonica"
+ password="telefonica"
+ mmsc="http://mms.movistar.com"
+ mmsproxy="10.138.255.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Movistar"
+ mcc="214"
+ mnc="07"
+ apn="telefonica.es"
+ user="telefonica"
+ password="telefonica"
+ proxy="10.138.255.133"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Euskaltel MMS"
+ mcc="214"
+ mnc="08"
+ apn="euskaltelmms.euskaltel.mobi"
+ user="MMS"
+ password="EUSKALTEL"
+ mmsc="http://mms.euskaltel.mobi"
+ mmsproxy="172.16.18.74"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Euskaltel Internet"
+ mcc="214"
+ mnc="08"
+ apn="internet.euskaltel.mobi"
+ user="CLIENTE"
+ password="EUSKALTEL"
+ type="default,supl"
+ />
+
+ <apn carrier="TeleCable Internet"
+ mcc="214"
+ mnc="16"
+ apn="internet.telecable.es"
+ user="telecable"
+ password="telecable"
+ type="default,supl"
+ />
+
+ <apn carrier="TeleCable MMS"
+ mcc="214"
+ mnc="16"
+ apn="mms.telecable.es"
+ user="telecable"
+ password="telecable"
+ mmsc="http://mms.telecable.es/mms/"
+ mmsproxy="212.89.0.84"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Telenor MMS"
+ mcc="216"
+ mnc="01"
+ apn="mms"
+ mmsc="http://mmsc.telenor.hu/"
+ mmsproxy="84.225.255.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Telenor Online"
+ mcc="216"
+ mnc="01"
+ apn="online"
+ type="default,supl"
+ />
+
+ <apn carrier="T-Mobile MMS"
+ mcc="216"
+ mnc="30"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.t-mobile.hu/servlets/mms"
+ mmsproxy="212.51.126.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Web"
+ mcc="216"
+ mnc="30"
+ apn="wnw"
+ type="default,supl"
+ />
+
+ <apn carrier="VF internet"
+ mcc="216"
+ mnc="70"
+ apn="internet.vodafone.net"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="216"
+ mnc="70"
+ apn="mms.vodafone.net"
+ mmsc="http://mms.vodafone.hu/servlets/mms"
+ mmsproxy="80.244.97.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="VMAX Internet"
+ mcc="216"
+ mnc="70"
+ apn="vitamax.internet.vodafone.net"
+ type="default,supl"
+ />
+
+ <apn carrier="HT Eronet WAP"
+ mcc="218"
+ mnc="03"
+ apn="wap.eronet.ba"
+ proxy="10.12.3.10"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="HT Eronet GPRS"
+ mcc="218"
+ mnc="03"
+ apn="gprs.eronet.ba"
+ type="default,supl"
+ />
+
+ <apn carrier="Ht Eronet MMS"
+ mcc="218"
+ mnc="03"
+ apn="mms.eronet.ba"
+ mmsc="http://mms.gprs.eronet.ba/mms/wapenc"
+ mmsproxy="10.12.3.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="m:tel"
+ mcc="218"
+ mnc="05"
+ apn="3g1"
+ proxy="192.168.61.10"
+ port="80"
+ type="default,supl"
+ />
+
+ <apn carrier="mtelmms"
+ mcc="218"
+ mnc="05"
+ apn="mtelmms"
+ mmsc="http://mmsc.mtel.ba/mms/wapenc"
+ mmsproxy="192.168.61.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Bh Mobile"
+ mcc="218"
+ mnc="90"
+ apn="active.bhmobile.ba"
+ type="default,supl"
+ />
+
+ <apn carrier="BHMobileMMS"
+ mcc="218"
+ mnc="90"
+ apn="mms.bhmobile.ba"
+ mmsc="http://mms.bhmobile.ba/cmmsc/post"
+ mmsproxy="195.222.56.041"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile MMS"
+ mcc="219"
+ mnc="01"
+ apn="mms.htgprs"
+ mmsc="http://mms.t-mobile.hr/servlets/mms"
+ mmsproxy="10.12.0.4"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile"
+ mcc="219"
+ mnc="01"
+ apn="web.htgprs"
+ type="default,supl"
+ />
+
+
+ <apn carrier="Tele2"
+ mcc="219"
+ mnc="02"
+ apn="internet.tele2.hr"
+ mmsc="http://mmsc.tele2.hr"
+ mmsproxy="193.12.40.66"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Broadband"
+ mcc="219"
+ mnc="10"
+ apn="data.vip.hr"
+ user="38591"
+ password="38591"
+ type="default,supl"
+ />
+
+ <apn carrier="VIP.mms"
+ mcc="219"
+ mnc="10"
+ apn="mms.vipnet.hr"
+ user="38591"
+ password="38591"
+ mmsc="http://mms.vipnet.hr/servlets/mms"
+ mmsproxy="212.91.99.91"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Telenor WAP"
+ mcc="220"
+ mnc="01"
+ apn="internet"
+ user="telenor"
+ password="gprs"
+ proxy="217.65.192.33"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Telenor MMS"
+ mcc="220"
+ mnc="01"
+ apn="mms"
+ mmsc="http://mms.telenor.rs/servlets/mms"
+ mmsproxy="217.65.192.33"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Telenor MNE internet"
+ mcc="220"
+ mnc="02"
+ apn="internet"
+ user="gprs"
+ password="gprs"
+ proxy="192.168.246.5"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Telenor MNE mms"
+ mcc="220"
+ mnc="02"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mm.vor.telenor.me"
+ mmsproxy="192.168.246.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="mt:s wap"
+ mcc="220"
+ mnc="03"
+ apn="gprswap"
+ user="mts"
+ password="064"
+ proxy="172.17.88.198"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="mt:s mms"
+ mcc="220"
+ mnc="03"
+ apn="mms"
+ user="mts"
+ password="064"
+ mmsc="http://mms.mts064.telekom.rs/mms/wapenc"
+ mmsproxy="172.17.85.131"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile MMS"
+ mcc="220"
+ mnc="04"
+ apn="mms"
+ user="38267"
+ password="38267"
+ mmsc="http://192.168.180.100/servlets/mms"
+ mmsproxy="10.0.5.19"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile Internet"
+ mcc="220"
+ mnc="04"
+ apn="tmcg-wnw"
+ user="38267"
+ password="38267"
+ proxy="10.0.5.19"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Vip GPRS"
+ mcc="220"
+ mnc="05"
+ apn="vipmobile"
+ user="vipmobile"
+ password="vipmobile"
+ proxy="212.15.182.82"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Vip MMS"
+ mcc="220"
+ mnc="05"
+ apn="vipmobile.mms"
+ user="vipmobile"
+ password="vipmobile"
+ mmsc="http://mmsc.vipmobile.rs"
+ mmsproxy="212.15.182.82"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="TIM WAP"
+ mcc="222"
+ mnc="01"
+ apn="wap.tim.it"
+ user="WAPTIM"
+ password="WAPTIM"
+ authtype="1"
+ type="default,supl"
+ />
+
+ <apn carrier="TIM WEB"
+ mcc="222"
+ mnc="01"
+ apn="ibox.tim.it"
+ type="default,supl"
+ />
+
+ <apn carrier="TIM MMS"
+ mcc="222"
+ mnc="01"
+ apn="unico.tim.it"
+ mmsc="http://mms.tim.it/servlets/mms"
+ mmsproxy="213.230.130.89"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="MMS Vodafone"
+ mcc="222"
+ mnc="10"
+ apn="mms.vodafone.it"
+ mmsc="http://mms.vodafone.it/servlets/mms"
+ mmsproxy="10.128.224.10"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Acc. Internet da cell"
+ mcc="222"
+ mnc="10"
+ apn="mobile.vodafone.it"
+ type="default,supl"
+ />
+
+ <apn carrier="WIND WEB"
+ mcc="222"
+ mnc="88"
+ apn="internet.wind"
+ type="default,supl"
+ />
+
+ <apn carrier="WIND BIZ WEB"
+ mcc="222"
+ mnc="88"
+ apn="internet.wind.biz"
+ type="default,supl"
+ />
+
+ <apn carrier="WIND MMS"
+ mcc="222"
+ mnc="88"
+ apn="mms.wind"
+ mmsc="http://mms.wind.it"
+ mmsproxy="212.245.244.100"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="3"
+ mcc="222"
+ mnc="99"
+ apn="tre.it"
+ mmsc="http://10.216.59.240:10021/mmsc"
+ mmsproxy="62.13.171.3"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Fastweb WEB"
+ mcc="222"
+ mnc="99"
+ apn="apn.fastweb.it"
+ mmsc="http://mms.fastweb.it/mms/wapenc"
+ mmsproxy="10.0.65.9"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Vodafone live!"
+ mcc="226"
+ mnc="01"
+ apn="live.vodafone.com"
+ user="live"
+ password="vodafone"
+ proxy="193.230.161.231"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone live! PRE"
+ mcc="226"
+ mnc="01"
+ apn="live.pre.vodafone.com"
+ user="live"
+ password="vodafone"
+ proxy="193.230.161.231"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="226"
+ mnc="01"
+ apn="mms.vodafone.ro"
+ user="mms"
+ password="vodafone"
+ mmsc="http://multimedia/servlets/mms"
+ mmsproxy="193.230.161.231"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone MMS PRE"
+ mcc="226"
+ mnc="01"
+ apn="mms.pre.vodafone.ro"
+ user="mms"
+ password="vodafone"
+ mmsc="http://multimedia/servlets/mms"
+ mmsproxy="193.230.161.231"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cosmote Internet"
+ mcc="226"
+ mnc="03"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cosmote MMS"
+ mcc="226"
+ mnc="03"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mmsc1.mms.cosmote.ro:8002"
+ mmsproxy="10.252.1.62"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="web'n'walk"
+ mcc="226"
+ mnc="03"
+ apn="wnw"
+ user="wnw"
+ password="wnw"
+ proxy="10.252.1.62"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Cosmote MMS"
+ mcc="226"
+ mnc="06"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mmsc1.mms.cosmote.ro:8002"
+ mmsproxy="10.252.1.62"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="web'n'walk"
+ mcc="226"
+ mnc="06"
+ apn="wnw"
+ user="wnw"
+ password="wnw"
+ proxy="10.252.1.62"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="226"
+ mnc="10"
+ apn="mms"
+ mmsc="http://wap.mms.orange.ro:8002"
+ mmsproxy="62.217.247.252"
+ mmsport="9201"
+ type="mms"
+ />
+
+ <apn carrier="Orange WAP"
+ mcc="226"
+ mnc="10"
+ apn="wap"
+ proxy="62.217.247.252"
+ port="8799"
+ type="default"
+ />
+
+ <apn carrier="Orange Internet"
+ mcc="226"
+ mnc="10"
+ apn="net"
+ type="default"
+ />
+
+ <apn carrier="Orange MMS SN"
+ mcc="608"
+ mnc="01"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mmsalize/servlets/mms"
+ mmsproxy="172.16.30.9"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Orange Wap SN"
+ mcc="608"
+ mnc="01"
+ apn="wap"
+ user="wap"
+ password="wap"
+ proxy="172.16.30.9"
+ port="8080"
+ type="default"
+ />
+
+ <apn carrier="Orange Web SN"
+ mcc="608"
+ mnc="01"
+ apn="internet"
+ user="internet"
+ password="internet"
+ type="default"
+ />
+
+ <apn carrier="Swisscom MMS"
+ mcc="228"
+ mnc="01"
+ apn="event.swisscom.ch"
+ mmsc="http://mms.natel.ch:8079"
+ mmsproxy="192.168.210.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Swisscom Services"
+ mcc="228"
+ mnc="01"
+ apn="gprs.swisscom.ch"
+ proxy="192.168.210.1"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Sunrise live"
+ mcc="228"
+ mnc="02"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Sunrise MMS"
+ mcc="228"
+ mnc="02"
+ apn="mms.sunrise.ch"
+ mmsc="http://mmsc.sunrise.ch"
+ mmsproxy="212.35.34.75"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Orange Internet"
+ mcc="228"
+ mnc="03"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="228"
+ mnc="03"
+ apn="mms"
+ mmsc="http://192.168.151.3:8002"
+ mmsproxy="192.168.151.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile CZ"
+ mcc="230"
+ mnc="01"
+ apn="internet.t-mobile.cz"
+ user="wap"
+ password="wap"
+ type="default,supl"
+ />
+
+ <apn carrier="T-Mobile MMS"
+ mcc="230"
+ mnc="01"
+ apn="mms.t-mobile.cz"
+ user="mms"
+ password="mms"
+ mmsc="http://mms"
+ mmsproxy="10.0.0.10"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="O2 internet"
+ mcc="230"
+ mnc="02"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="O2 MMS"
+ mcc="230"
+ mnc="02"
+ apn="mms"
+ mmsc="http://mms.o2active.cz:8002"
+ mmsproxy="160.218.160.218"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="GPRS Web"
+ mcc="230"
+ mnc="03"
+ apn="internet"
+ type="default,supl"
+ />
+
+
+ <apn carrier="Vodafone MMS"
+ mcc="230"
+ mnc="03"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms"
+ mmsproxy="10.11.10.111"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Orange SK"
+ mcc="231"
+ mnc="01"
+ apn="internet"
+ type="default"
+ />
+
+ <apn carrier="Orange SK MMS"
+ mcc="231"
+ mnc="01"
+ apn="mms"
+ user="wap"
+ password="wap"
+ mmsc="http://imms.orange.sk"
+ mmsproxy="213.151.208.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Orange World"
+ mcc="231"
+ mnc="01"
+ apn="orangewap"
+ user="wap"
+ password="wap"
+ proxy="213.151.208.156"
+ port="8799"
+ type="default,supl"
+ />
+
+ <apn carrier="T-Mobile internet"
+ mcc="231"
+ mnc="02"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="T-Mobile MMS"
+ mcc="231"
+ mnc="02"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms"
+ mmsproxy="192.168.1.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="O2 internet"
+ mcc="231"
+ mnc="06"
+ apn="o2internet"
+ type="default,supl"
+ />
+
+ <apn carrier="O2 MMS"
+ mcc="231"
+ mnc="06"
+ apn="o2mms"
+ mmsc="http://mms.o2world.sk:8002"
+ mmsproxy="10.97.1.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="A1"
+ mcc="232"
+ mnc="01"
+ apn="a1.net"
+ user="ppp@a1plus.at"
+ password="ppp"
+ type="default,supl"
+ />
+
+ <apn carrier="aonMobil"
+ mcc="232"
+ mnc="01"
+ apn="aon.at"
+ user="mobil@aon.at"
+ password="ppp"
+ type="default,supl"
+ />
+
+ <apn carrier="A1 MMS"
+ mcc="232"
+ mnc="01"
+ apn="free.a1.net"
+ user="ppp@a1plus.at"
+ password="ppp"
+ mmsc="http://mmsc.a1.net"
+ mmsproxy="194.48.124.71"
+ mmsport="8001"
+ type="mms"
+ />
+
+ <apn carrier="aonMobil MMS"
+ mcc="232"
+ mnc="01"
+ apn="mms.aon.at"
+ user="mobil@aon.at"
+ password="ppp"
+ mmsc="http://mmsc.aon.at"
+ mmsproxy="194.48.124.134"
+ mmsport="8001"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile Internet"
+ mcc="232"
+ mnc="03"
+ apn="gprsinternet"
+ user="t-mobile"
+ password="tm"
+ type="default,supl"
+ />
+
+ <apn carrier="T-Mobile MMS"
+ mcc="232"
+ mnc="03"
+ apn="gprsmms"
+ user="t-mobile"
+ password="tm"
+ mmsc="http://mmsc.t-mobile.at/servlets/mms"
+ mmsproxy="10.12.0.20"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="232"
+ mnc="05"
+ apn="orange.mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mmsc.orange.at/mms/wapenc"
+ mmsproxy="194.24.128.118"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="Orange Smartphone"
+ mcc="232"
+ mnc="05"
+ apn="orange.smartphone"
+ user="web"
+ password="web"
+ type="default,supl"
+ />
+
+ <apn carrier="tele.ring mms"
+ mcc="232"
+ mnc="07"
+ apn="mms"
+ user="wap@telering.at"
+ password="wap"
+ mmsc="http://relay.mms.telering.at"
+ mmsproxy="212.95.31.50"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="tele.ring web"
+ mcc="232"
+ mnc="07"
+ apn="web"
+ user="web@telering.at"
+ password="web"
+ type="default,supl"
+ />
+
+ <apn carrier="Planet3"
+ mcc="232"
+ mnc="10"
+ apn="drei.at"
+ mmsc="http://mmsc"
+ mmsproxy="213.94.78.133"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+
+ <apn carrier="data.bob"
+ mcc="232"
+ mnc="11"
+ apn="bob.at"
+ user="data@bob.at"
+ password="ppp"
+ type="default,supl"
+ />
+
+ <apn carrier="data.bob MMS"
+ mcc="232"
+ mnc="11"
+ apn="mms.bob.at"
+ user="data@bob.at"
+ password="ppp"
+ mmsc="http://mmsc.bob.at"
+ mmsproxy="194.48.124.7"
+ mmsport="8001"
+ type="mms"
+ />
+
+ <apn carrier="YESSS! GPRS"
+ mcc="232"
+ mnc="12"
+ apn="web.yesss.at"
+ type="default,supl"
+ />
+
+ <apn carrier="UBIQUISYS"
+ mcc="234"
+ mnc="01"
+ apn="internet"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="O2 MOBILE WEB"
+ mcc="234"
+ mnc="02"
+ apn="mobile.o2.co.uk"
+ user="O2web"
+ password="O2web"
+ type="default,supl"
+ />
+
+ <apn carrier="O2 MMS Prepay"
+ mcc="234"
+ mnc="02"
+ apn="payandgo.o2.co.uk"
+ user="payandgo"
+ password="password"
+ mmsc="http://mmsc.mms.o2.co.uk:8002"
+ mmsproxy="82.132.254.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="O2 MMS Postpay"
+ mcc="234"
+ mnc="02"
+ apn="wap.o2.co.uk"
+ user="o2wap"
+ password="password"
+ mmsc="http://mmsc.mms.o2.co.uk:8002"
+ mmsproxy="82.132.254.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="O2 Mobile Web"
+ mcc="234"
+ mnc="10"
+ apn="mobile.o2.co.uk"
+ user="o2web"
+ password="password"
+ type="default,supl"
+ />
+
+ <apn carrier="O2 MMS"
+ mcc="234"
+ mnc="10"
+ apn="wap.o2.co.uk"
+ user="o2wap"
+ password="password"
+ proxy="193.113.200.195"
+ port="8080"
+ mmsc="http://mmsc.mms.o2.co.uk:8002"
+ mmsproxy="82.132.254.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="O2 PREPAY"
+ mcc="234"
+ mnc="10"
+ apn="payandgo.o2.co.uk"
+ proxy="193.113.200.195"
+ port="8080"
+ user="payandgo"
+ password="password"
+ mmsc="http://mmsc.mms.o2.co.uk:8002"
+ mmsproxy="82.132.254.1"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="TESCO"
+ mcc="234"
+ mnc="10"
+ apn="prepay.tesco-mobile.com"
+ user="tescowap"
+ password="password"
+ mmsc="http://mmsc.mms.o2.co.uk:8002"
+ mmsproxy="82.132.254.1"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="O2 MOBILE WEB"
+ mcc="234"
+ mnc="11"
+ apn="mobile.o2.co.uk"
+ user="O2web"
+ password="O2web"
+ type="default,supl"
+ />
+
+ <apn carrier="O2 MMS Prepay"
+ mcc="234"
+ mnc="11"
+ apn="payandgo.o2.co.uk"
+ user="payandgo"
+ password="password"
+ mmsc="http://mmsc.mms.o2.co.uk:8002"
+ mmsproxy="82.132.254.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="O2 MMS Postpay"
+ mcc="234"
+ mnc="11"
+ apn="wap.o2.co.uk"
+ user="o2wap"
+ password="password"
+ mmsc="http://mmsc.mms.o2.co.uk:8002"
+ mmsproxy="82.132.254.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="O2 MOBILE WEB"
+ mcc="234"
+ mnc="11"
+ apn="mobile.o2.co.uk"
+ user="O2web"
+ password="O2web"
+ type="default,supl"
+ />
+
+ <apn carrier="O2 MMS Prepay"
+ mcc="234"
+ mnc="11"
+ apn="payandgo.o2.co.uk"
+ user="payandgo"
+ password="password"
+ mmsc="http://mmsc.mms.02.co.uk:8002"
+ mmsproxy="82.132.254.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="O2 MMS Postpay"
+ mcc="234"
+ mnc="11"
+ apn="wap.o2.co.uk"
+ user="o2wap"
+ password="password"
+ mmsc="http://mmsc.mms.02.co.uk:8002"
+ mmsproxy="82.132.254.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone UK"
+ mcc="234"
+ mnc="15"
+ apn="wap.vodafone.co.uk"
+ user="wap"
+ password="wap"
+ mmsc="http://mms.vodafone.co.uk/servlets/mms"
+ mmsproxy="212.183.137.12"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Vodafone UK Prepay"
+ mcc="234"
+ mnc="15"
+ apn="pp.vodafone.co.uk"
+ user="wap"
+ password="wap"
+ mmsc="http://mms.vodafone.co.uk/servlets/mms"
+ mmsproxy="212.183.137.12"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="3"
+ mcc="234"
+ mnc="20"
+ apn="three.co.uk"
+ mmsc="http://mms.um.three.co.uk:10021/mmsc"
+ mmsproxy="mms.three.co.uk"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile UK"
+ mcc="234"
+ mnc="30"
+ apn="general.t-mobile.uk"
+ user="t-mobile"
+ password="tm"
+ mmsc="http://mmsc.t-mobile.co.uk:8002"
+ mmsproxy="149.254.201.135"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Virgin Media"
+ mcc="234"
+ mnc="30"
+ apn="goto.virginmobile.uk"
+ user="user"
+ mmsc="http://mms.virginmobile.co.uk:8002"
+ mmsproxy="193.30.166.2"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile Internet"
+ mcc="234"
+ mnc="31"
+ apn="general.t-mobile.uk"
+ user="t-mobile"
+ password="tm"
+ type="default,supl"
+ />
+
+ <apn carrier="T-Mobile Picture Message"
+ mcc="234"
+ mnc="31"
+ apn="general.t-mobile.uk"
+ user="t-mobile"
+ password="tm"
+ mmsc="http://mmsc.t-mobile.co.uk:8002"
+ mmsproxy="149.254.201.135"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile Internet"
+ mcc="234"
+ mnc="32"
+ apn="general.t-mobile.uk"
+ user="t-mobile"
+ password="tm"
+ type="default,supl"
+ />
+
+ <apn carrier="T-Mobile Picture Message"
+ mcc="234"
+ mnc="32"
+ apn="general.t-mobile.uk"
+ user="t-mobile"
+ password="tm"
+ mmsc="http://mmsc.t-mobile.co.uk:8002"
+ mmsproxy="149.254.201.135"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Orange Internet"
+ mcc="234"
+ mnc="33"
+ apn="orangeinternet"
+ authtype="2"
+ type="default"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="234"
+ mnc="33"
+ apn="orangemms"
+ mmsc="http://mms.orange.co.uk/"
+ mmsproxy="192.168.224.10"
+ mmsport="8080"
+ authtype="2"
+ type="mms"
+ />
+
+ <apn carrier="Orange internet"
+ mcc="234"
+ mnc="34"
+ apn="orangeinternet"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="234"
+ mnc="34"
+ apn="orangemms"
+ mmsc="http://mms.orange.co.uk/"
+ mmsproxy="192.168.224.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Jersey Telecom"
+ mcc="234"
+ mnc="50"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.surfmail.com/mmsc"
+ mmsproxy="212.9.19.199"
+ mmsport="3130"
+ type="mms"
+ />
+
+ <apn carrier="pepperWEB (Jersey)"
+ mcc="234"
+ mnc="50"
+ apn="pepper"
+ type="default,supl"
+ />
+
+ <apn carrier="C&amp;W Guernsey Internet"
+ mcc="234"
+ mnc="55"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Sure Picture Messaging"
+ mcc="234"
+ mnc="55"
+ apn="mms"
+ mmsc="http://mmsc.gprs.cw.com/"
+ mmsproxy="10.0.3.101"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="3G HSDPA"
+ mcc="234"
+ mnc="58"
+ apn="3gpronto"
+ type="default,supl"
+ />
+
+ <apn carrier="Manx Telecom Contract MMS"
+ mcc="234"
+ mnc="58"
+ apn="mms.manxpronto.net"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.manxpronto.net:8002"
+ mmsproxy="195.10.99.46"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Manx Telecom Prepay MMS"
+ mcc="234"
+ mnc="58"
+ apn="mms.prontogo.net"
+ user="mmsgo"
+ password="mmsgo"
+ mmsc="http://mms.manxpronto.net:8002"
+ mmsproxy="195.10.99.41"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Manx Telecom Contract WEB"
+ mcc="234"
+ mnc="58"
+ apn="web.manxpronto.net"
+ user="gprs"
+ password="gprs"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange internet"
+ mcc="234"
+ mnc="86"
+ apn="orangeinternet"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="234"
+ mnc="86"
+ apn="orangemms"
+ mmsc="http://mms.orange.co.uk/"
+ mmsproxy="192.168.224.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="TDC"
+ mcc="238"
+ mnc="01"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="TDC MMS"
+ mcc="238"
+ mnc="01"
+ apn="mms"
+ mmsc="http://mmsc.tdc.dk:8002"
+ mmsproxy="194.182.251.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Telenor Internet"
+ mcc="238"
+ mnc="02"
+ apn="Internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Telenor MMS"
+ mcc="238"
+ mnc="02"
+ apn="telenor"
+ mmsc="http://mms.telenor.dk"
+ mmsproxy="212.88.64.8"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="3"
+ mcc="238"
+ mnc="06"
+ apn="data.tre.dk"
+ mmsc="http://mms.3.dk/"
+ mmsproxy="mmsproxy.3.dk"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Telia Internet"
+ mcc="238"
+ mnc="20"
+ apn="www.internet.mtelia.dk"
+ type="default,supl"
+ />
+
+ <apn carrier="Telia MMS"
+ mcc="238"
+ mnc="20"
+ apn="www.mms.mtelia.dk"
+ mmsc="http://mms.telia.dk"
+ mmsproxy="193.209.134.131"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Telenor Internet"
+ mcc="238"
+ mnc="77"
+ apn="Internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Telenor MMS"
+ mcc="238"
+ mnc="77"
+ apn="telenor"
+ mmsc="http://mms.telenor.dk"
+ mmsproxy="212.88.64.8"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Telia SE MMS"
+ mcc="240"
+ mnc="01"
+ apn="mms.telia.se"
+ mmsc="http://mmss/"
+ mmsproxy="193.209.134.132"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Telia SE WAP"
+ mcc="240"
+ mnc="01"
+ apn="online.telia.se"
+ proxy="10.254.254.254"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Halebop Internet"
+ mcc="240"
+ mnc="017"
+ apn="halebop.telia.se"
+ type="default,supl"
+ />
+
+ <apn carrier="Halebop MMS"
+ mcc="240"
+ mnc="017"
+ apn="mms.telia.se"
+ user="mms"
+ password="telia"
+ mmsc="http://mmss"
+ mmsproxy="193.209.134.132"
+ mmsport="9201"
+ type="mms"
+ />
+
+ <apn carrier="3"
+ mcc="240"
+ mnc="02"
+ apn="data.tre.se"
+ mmsc="http://mms.tre.se"
+ mmsproxy="mmsproxy.tre.se"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Telenor Mobilsurf"
+ mcc="240"
+ mnc="04"
+ apn="services.telenor.se"
+ proxy="172.30.253.241"
+ port="8799"
+ mmsc="http://mms"
+ mmsproxy="172.30.253.241"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Telenor MMS"
+ mcc="240"
+ mnc="06"
+ apn="services.telenor.se"
+ mmsc="http://mms"
+ mmsproxy="173.30.253.241"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Telenor Mobilsurf"
+ mcc="240"
+ mnc="06"
+ apn="services.telenor.se"
+ proxy="173.30.253.241"
+ port="8799"
+ type="default,supl"
+ />
+
+ <apn carrier="Tele2"
+ mcc="240"
+ mnc="07"
+ apn="internet.tele2.se"
+ mmsc="http://mmsc.tele2.se"
+ mmsproxy="130.244.202.30"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Telenor Mobilsurf"
+ mcc="240"
+ mnc="08"
+ apn="services.telenor.se"
+ proxy="172.30.253.241"
+ port="8799"
+ type="default,supl"
+ />
+
+ <apn carrier="Telenor MMS"
+ mcc="240"
+ mnc="08"
+ apn="services.telenor.se"
+ mmsc="http://mms"
+ mmsproxy="172.30.253.241"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Telenor MMS"
+ mcc="240"
+ mnc="09"
+ apn="services.telenor.se"
+ mmsc="http://mms"
+ mmsproxy="173.30.253.241"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TelenorMobilsurf"
+ mcc="240"
+ mnc="09"
+ apn="services.telenor.se"
+ proxy="173.30.253.241"
+ port="8799"
+ type="default,supl"
+ />
+
+ <apn carrier="Spring data"
+ mcc="240"
+ mnc="10"
+ apn="data.springmobil.se"
+ type="default,supl"
+ />
+
+ <apn carrier="Spring MMS"
+ mcc="240"
+ mnc="10"
+ apn="mms.springmobil.se"
+ mmsc="http://mms.springmobil.se"
+ mmsproxy="213.88.184.37"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Ventelo Internett"
+ mcc="242"
+ mnc="01"
+ apn="internet.ventelo.no"
+ type="default,supl"
+ />
+
+ <apn carrier="Ventelo MMS"
+ mcc="242"
+ mnc="01"
+ apn="mms.ventelo.no"
+ user="ventelo"
+ password="1111"
+ mmsc="http://mmsc/"
+ mmsproxy="10.10.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Telenor"
+ mcc="242"
+ mnc="01"
+ apn="telenor"
+ mmsc="http://mmsc"
+ mmsproxy="10.10.10.11"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="NetCom MMS"
+ mcc="242"
+ mnc="02"
+ apn="mms.netcom.no"
+ mmsc="http://mm/"
+ mmsproxy="212.169.66.4"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="NetCom Internett"
+ mcc="242"
+ mnc="02"
+ apn="wap"
+ type="default,supl"
+ />
+
+ <apn carrier="Tele2 Internett"
+ mcc="242"
+ mnc="04"
+ apn="internet.tele2.no"
+ mmsc="http://mmsc.tele2.no"
+ mmsproxy="193.12.40.14"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="NwN Internet"
+ mcc="242"
+ mnc="05"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="NwN MMS"
+ mcc="242"
+ mnc="05"
+ apn="mms"
+ mmsc="http://mms.nwn.no"
+ mmsproxy="188.149.250.10"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="DNA Internet"
+ mcc="244"
+ mnc="03"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="DNA MMS"
+ mcc="244"
+ mnc="03"
+ apn="mms"
+ mmsc="http://mmsc.dnafinland.fi/"
+ mmsproxy="10.1.1.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="DNA Internet"
+ mcc="244"
+ mnc="04"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="DNA MMS"
+ mcc="244"
+ mnc="04"
+ apn="mms"
+ user="dna"
+ password="mms"
+ mmsc="http://mmsc.dnafinland.fi/"
+ mmsproxy="10.1.1.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Elisa Internet"
+ mcc="244"
+ mnc="05"
+ apn="internet"
+ type="default,supl"
+ />
+
+
+ <apn carrier="Elisa MMS"
+ mcc="244"
+ mnc="05"
+ apn="mms"
+ mmsc="http://mms.elisa.fi"
+ mmsproxy="213.161.41.57"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="TDC Internet"
+ mcc="244"
+ mnc="10"
+ apn="internet.song.fi"
+ user="song@internet"
+ password="songnet"
+ type="default,supl"
+ />
+
+ <apn carrier="TDC MMS"
+ mcc="244"
+ mnc="10"
+ apn="mms.song.fi"
+ mmsc="http://mms.song.fi"
+ mmsproxy="213.161.41.58"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="DNA Internet"
+ mcc="244"
+ mnc="12"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="DNA MMS"
+ mcc="244"
+ mnc="12"
+ apn="mms"
+ mmsc="http://mmsc.dnafinland.fi/"
+ mmsproxy="10.1.1.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="DNA Pro Internet"
+ mcc="244"
+ mnc="12"
+ apn="dnapro.fi"
+ authtype="1"
+ type="default,supl"
+ />
+
+ <apn carrier="DNA Pro MMS"
+ mcc="244"
+ mnc="12"
+ apn="mms.dnapro.fi"
+ mmsc="http://mmsc.dnapro.fi/"
+ mmsproxy="10.1.1.21"
+ mmsport="8080"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="TDC Internet Finland"
+ mcc="244"
+ mnc="12"
+ apn="inet.tdc.fi"
+ authtype="1"
+ type="default,supl"
+ />
+
+ <apn carrier="TDC MMS Finland"
+ mcc="244"
+ mnc="12"
+ apn="mms.tdc.fi"
+ mmsc="http://mmsc.tdc.fi"
+ mmsproxy="10.1.12.2"
+ mmsport="8080"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="DNA Internet"
+ mcc="244"
+ mnc="13"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="DNA MMS"
+ mcc="244"
+ mnc="13"
+ apn="mms"
+ user="dna"
+ password="mms"
+ mmsc="http://mmsc.dnafinland.fi/"
+ mmsproxy="10.1.1.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Saunalahti Internet"
+ mcc="244"
+ mnc="21"
+ apn="internet.saunalahti"
+ type="default,supl"
+ />
+
+ <apn carrier="Saunalahti MMS"
+ mcc="244"
+ mnc="21"
+ apn="mms.saunalahti.fi"
+ mmsc="http://mms.saunalahti.fi:8002/"
+ mmsproxy="62.142.4.197"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="SONERA Internet"
+ mcc="244"
+ mnc="91"
+ apn="internet"
+ type="default,supl"
+ />
+
+
+ <apn carrier="SONERA MMS"
+ mcc="244"
+ mnc="91"
+ apn="wap.sonera.net"
+ mmsc="http://mms.sonera.fi:8002"
+ mmsproxy="195.156.25.33"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Omnitel MMS"
+ mcc="246"
+ mnc="01"
+ apn="gprs.mms.lt"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.omnitel.net:8002/"
+ mmsproxy="194.176.32.149"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Omnitel Internet"
+ mcc="246"
+ mnc="01"
+ apn="omnitel"
+ user="omni"
+ password="omni"
+ type="default,supl"
+ />
+
+ <apn carrier="Bite LT Internet"
+ mcc="246"
+ mnc="02"
+ apn="internet"
+ user="mms@mms"
+ password="mms"
+ mmsc="http://mmsc/servlets/mms"
+ mmsproxy="192.168.150.2"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Tele2 Internet LT"
+ mcc="246"
+ mnc="03"
+ apn="internet.tele2.lt"
+ user="wap"
+ password="wap"
+ proxy="130.244.196.90"
+ port="8080"
+ mmsc="http://mmsc.tele2.lt/"
+ mmsproxy="193.12.40.29"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="LMT Internet"
+ mcc="247"
+ mnc="01"
+ apn="internet.lmt.lv"
+ type="default,supl"
+ />
+
+ <apn carrier="LMT MMS"
+ mcc="247"
+ mnc="01"
+ apn="mms.lmt.lv"
+ mmsc="http://mmsc.lmt.lv/mmsc"
+ mmsproxy="212.93.97.201"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Tele2 LV Internet"
+ mcc="247"
+ mnc="02"
+ apn="internet.tele2.lv"
+ user="wap"
+ password="wap"
+ type="default,supl"
+ />
+
+ <apn carrier="Tele2 LV MMS"
+ mcc="247"
+ mnc="02"
+ apn="mms.tele2.lv"
+ user="wap"
+ password="wap"
+ mmsc="http://mmsc.tele2.lv/"
+ mmsproxy="193.12.40.38"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Bite LV Internet"
+ mcc="247"
+ mnc="05"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Bite LV MMS"
+ mcc="247"
+ mnc="05"
+ apn="mms"
+ user="mms@mms"
+ password="mms"
+ mmsc="http://mmsc/servlets/mms"
+ mmsproxy="192.168.150.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Bite LV WAP"
+ mcc="247"
+ mnc="05"
+ apn="wap"
+ proxy="213.226.131.133"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="EMT Internet"
+ mcc="248"
+ mnc="01"
+ apn="internet.emt.ee"
+ type="default,supl"
+ />
+
+ <apn carrier="EMT MMS"
+ mcc="248"
+ mnc="01"
+ apn="mms.emt.ee"
+ mmsc="http://mms.emt.ee/servlets/mms"
+ mmsproxy="217.71.32.82"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="EMT WAP"
+ mcc="248"
+ mnc="01"
+ apn="wap.emt.ee"
+ proxy="217.71.32.236"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Elisa Internet"
+ mcc="248"
+ mnc="02"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Elisa MMS"
+ mcc="248"
+ mnc="02"
+ apn="mms"
+ mmsc="http://194.204.2.10"
+ mmsproxy="194.204.2.6"
+ mmsport="8000"
+ type="mms"
+ />
+
+ <apn carrier="Elisa WAP"
+ mcc="248"
+ mnc="02"
+ apn="wap"
+ proxy="194.204.2.6"
+ port="8000"
+ type="default,supl"
+ />
+
+ <apn carrier="Tele2 Internet"
+ mcc="248"
+ mnc="03"
+ apn="internet.tele2.ee"
+ type="default,supl"
+ />
+
+ <apn carrier="Tele2 MMS"
+ mcc="248"
+ mnc="03"
+ apn="mms.tele2.ee"
+ mmsc="http://mmsc.tele2.ee"
+ mmsproxy="193.12.40.6"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="MTS Internet"
+ mcc="250"
+ mnc="01"
+ apn="internet.mts.ru"
+ user="mts"
+ password="mts"
+ type="default,supl"
+ />
+
+ <apn carrier="MTS MMS"
+ mcc="250"
+ mnc="01"
+ apn="mms.mts.ru"
+ user="mts"
+ password="mts"
+ mmsc="http://mmsc"
+ mmsproxy="192.168.192.192"
+ mmsport="9201"
+ type="mms"
+ />
+
+ <apn carrier="Megafon Internet"
+ mcc="250"
+ mnc="02"
+ apn="internet"
+ user="gdata"
+ password="gdata"
+ type="default,supl"
+ />
+
+ <apn carrier="Megafon MMS"
+ mcc="250"
+ mnc="02"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mmsc:8002"
+ mmsproxy="10.10.10.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Beeline Internet"
+ mcc="250"
+ mnc="99"
+ apn="internet.beeline.ru"
+ user="beeline"
+ password="beeline"
+ type="default,supl"
+ />
+
+ <apn carrier="Beeline MMS"
+ mcc="250"
+ mnc="99"
+ apn="mms.beeline.ru"
+ user="beeline"
+ password="beeline"
+ mmsc="http://mms/"
+ mmsproxy="192.168.94.23"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="TELE2 Internet"
+ mcc="250"
+ mnc="20"
+ apn="internet.tele2.ru"
+ type="default,supl"
+ />
+
+ <apn carrier="TELE2 MMS"
+ mcc="250"
+ mnc="20"
+ apn="mms.tele2.ru"
+ mmsc="http://mmsc.tele2.ru"
+ mmsproxy="193.12.40.65"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Jeans MMS"
+ mcc="255"
+ mnc="01"
+ apn="mms.jeans.ua"
+ mmsc="http://mmsc:8002/"
+ mmsproxy="192.168.10.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="MTS MMS"
+ mcc="255"
+ mnc="01"
+ apn="mms"
+ mmsc="http://mms/"
+ mmsproxy="192.168.10.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="MTS-internet"
+ mcc="255"
+ mnc="01"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Beeline-internet"
+ mcc="255"
+ mnc="02"
+ apn="internet.beeline.ua"
+ type="default,supl"
+ />
+
+ <apn carrier="Beeline MMS"
+ mcc="255"
+ mnc="02"
+ apn="mms.beeline.ua"
+ mmsc="http://mms/"
+ mmsproxy="172.29.18.192"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Djuice MMS"
+ mcc="255"
+ mnc="03"
+ apn="mms.djuice.com.ua"
+ user="djuice"
+ password="mms"
+ mmsc="http://mms.kyivstar.net"
+ mmsproxy="10.10.10.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Kyivstar MMS"
+ mcc="255"
+ mnc="03"
+ apn="mms.kyivstar.net"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.kyivstar.net"
+ mmsproxy="10.10.10.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Kyivstar Internet"
+ mcc="255"
+ mnc="03"
+ apn="www.kyivstar.net"
+ type="default,supl"
+ />
+
+ <apn carrier="life:) internet"
+ mcc="255"
+ mnc="06"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="life:) MMS"
+ mcc="255"
+ mnc="06"
+ apn="mms"
+ mmsc="http://mms.life.com.ua/cmmsc/post"
+ mmsproxy="212.58.162.230"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Utel Internet"
+ mcc="255"
+ mnc="07"
+ apn="3g.utel.ua"
+ type="default,supl"
+ />
+
+ <apn carrier="Utel MMS"
+ mcc="255"
+ mnc="07"
+ apn="3g.utel.ua"
+ mmsc="http://10.212.1.4/mms/wapenc"
+ mmsproxy="10.212.3.148"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Plus Internet"
+ mcc="260"
+ mnc="01"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Plus MMS"
+ mcc="260"
+ mnc="01"
+ apn="mms"
+ mmsc="http://mms.plusgsm.pl:8002"
+ mmsproxy="212.2.96.16"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-mobile.pl"
+ mcc="260"
+ mnc="02"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="T-mobile.pl"
+ mcc="260"
+ mnc="02"
+ apn="mms"
+ mmsc="http://mms/servlets/mms"
+ mmsproxy="213.158.194.226"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="heyahinternet"
+ mcc="260"
+ mnc="02"
+ apn="heyah.pl"
+ type="default,supl"
+ />
+
+ <apn carrier="heyahmms"
+ mcc="260"
+ mnc="02"
+ apn="heyahmms"
+ mmsc="http://mms.heyah.pl/servlets/mms"
+ mmsproxy="213.158.194.226"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Internet"
+ mcc="260"
+ mnc="03"
+ apn="Internet"
+ user="internet"
+ password="internet"
+ type="default"
+ />
+
+ <apn carrier="MMS Orange"
+ mcc="260"
+ mnc="03"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.orange.pl"
+ mmsproxy="192.168.6.104"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="P4 Internet"
+ mcc="260"
+ mnc="06"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="P4 MMS"
+ mcc="260"
+ mnc="06"
+ apn="mms"
+ mmsc="http://10.10.28.164/mms/wapenc"
+ mmsproxy="10.10.25.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="T-Mobile Internet"
+ mcc="262"
+ mnc="01"
+ apn="internet.t-mobile"
+ user="t-mobile"
+ password="tm"
+ mmsc="http://mms.t-mobile.de/servlets/mms"
+ mmsproxy="172.28.23.131"
+ mmsport="8008"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Vodafone DE-MMS"
+ mcc="262"
+ mnc="02"
+ apn="event.vodafone.de"
+ mmsc="http://139.7.24.1/servlets/mms"
+ mmsproxy="139.7.29.17"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone DE"
+ mcc="262"
+ mnc="02"
+ apn="web.vodafone.de"
+ type="default,supl"
+ />
+
+ <apn carrier="E-Plus Web GPRS"
+ mcc="262"
+ mnc="03"
+ apn="internet.eplus.de"
+ user="eplus"
+ password="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="E-Plus MMS"
+ mcc="262"
+ mnc="03"
+ apn="mms.eplus.de"
+ user="mms"
+ password="eplus"
+ mmsc="http://mms/eplus/"
+ mmsproxy="212.23.97.153"
+ mmsport="5080"
+ type="mms"
+ />
+
+ <apn carrier="o2"
+ mcc="262"
+ mnc="07"
+ apn="internet"
+ mmsc="http://10.81.0.7:8002"
+ mmsproxy="82.113.100.5"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="o2 Internet Prepaid"
+ mcc="262"
+ mnc="07"
+ apn="pinternet.interkom.de"
+ proxy="82.113.100.6"
+ port="8080"
+ mmsc="http://10.81.0.7:8002"
+ mmsproxy="82.113.100.6"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Vodafone Net2"
+ mcc="268"
+ mnc="01"
+ apn="net2.vodafone.pt"
+ user="vodafone"
+ password="vodafone"
+ proxy="iproxy.vodafone.pt"
+ port="80"
+ mmsc="http://mms.vodafone.pt/servlets/mms"
+ mmsproxy="iproxy.vodafone.pt"
+ mmsport="80"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Optimus Internet"
+ mcc="268"
+ mnc="03"
+ apn="umts"
+ type="default"
+ />
+
+ <apn carrier="Optimus MMS"
+ mcc="268"
+ mnc="03"
+ apn="mms"
+ mmsc="http://mmsc:10021/mmsc"
+ mmsproxy="62.169.66.1"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="tmn internet"
+ mcc="268"
+ mnc="06"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="mms tmn"
+ mcc="268"
+ mnc="06"
+ apn="mmsc.tmn.pt"
+ user="tmn"
+ password="tmnnet"
+ mmsc="http://mmsc/"
+ mmsproxy="10.111.2.16"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="LUXGSM MMS"
+ mcc="270"
+ mnc="01"
+ apn="mms.pt.lu"
+ user="mms"
+ password="mms"
+ mmsc="http://mmsc.pt.lu"
+ mmsproxy="194.154.192.88"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="LUXGSM WAP"
+ mcc="270"
+ mnc="01"
+ apn="wap.pt.lu"
+ user="wap"
+ password="wap"
+ proxy="194.154.192.98"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Tango WAP"
+ mcc="270"
+ mnc="77"
+ apn="internet"
+ user="tango"
+ password="tango"
+ proxy="130.244.196.90"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Tango MMS"
+ mcc="270"
+ mnc="77"
+ apn="mms"
+ user="tango"
+ password="tango"
+ mmsc="http://mms.tango.lu"
+ mmsproxy="212.66.75.3"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vox Mobile"
+ mcc="270"
+ mnc="99"
+ apn="vox.lu"
+ mmsc="http://mms.vox.lu"
+ mmsproxy="212.88.139.44"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Vodafone IE"
+ mcc="272"
+ mnc="01"
+ apn="live.vodafone.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone IE-MMS"
+ mcc="272"
+ mnc="01"
+ apn="mms.vodafone.net"
+ mmsc="http://www.vodafone.ie/mms"
+ mmsproxy="10.24.59.200"
+ mmsport="80"
+ type="mms"
+ />
+
+
+ <apn carrier="O2 Ireland"
+ mcc="272"
+ mnc="02"
+ apn="internet"
+ proxy="62.40.32.40"
+ port="8080"
+ mmsc="http://mmsc.mms.o2.ie:8002"
+ mmsproxy="62.40.32.40"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Meteor Data"
+ mcc="272"
+ mnc="03"
+ apn="data.mymeteor.ie"
+ type="default,supl"
+ />
+
+ <apn carrier="Meteor"
+ mcc="272"
+ mnc="03"
+ apn="mms.mymeteor.ie"
+ user="my"
+ password="wap"
+ mmsc="http://mms.mymeteor.ie"
+ mmsproxy="10.85.85.85"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="3"
+ mcc="272"
+ mnc="05"
+ apn="3ireland.ie"
+ mmsc="http://mms.um.3ireland.ie:10021/mmsc"
+ mmsproxy="mms.3ireland.ie"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Tesco"
+ mcc="272"
+ mnc="11"
+ apn="tescomobile.liffeytelecom.com"
+ mmsc="http://10.1.11.68/servlets/mms"
+ mmsproxy="10.1.11.19"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Siminn Internet"
+ mcc="274"
+ mnc="01"
+ apn="internet"
+ proxy="213.167.138.200"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Siminn MMS"
+ mcc="274"
+ mnc="01"
+ apn="mms.simi.is"
+ mmsc="http://mms.simi.is/servlets/mms"
+ mmsproxy="213.167.138.200"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Internet"
+ mcc="274"
+ mnc="02"
+ apn="gprs.is"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="274"
+ mnc="02"
+ apn="mms.gprs.is"
+ mmsc="http://mmsc.vodafone.is"
+ mmsproxy="10.22.0.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="MMS Nova"
+ mcc="274"
+ mnc="11"
+ apn="mms.nova.is"
+ mmsc="http://mmsc.nova.is"
+ mmsproxy="10.10.2.60"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Net Nova"
+ mcc="274"
+ mnc="11"
+ apn="net.nova.is"
+ proxy="10.10.2.60"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MT"
+ mcc="278"
+ mnc="01"
+ apn="internet"
+ user="internet"
+ password="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MT-MMS"
+ mcc="278"
+ mnc="01"
+ apn="mms.vodafone.com.mt"
+ mmsc="http://mms.vodafone.com.mt/servlets/mms"
+ mmsproxy="10.12.0.3"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CYTA"
+ mcc="280"
+ mnc="01"
+ apn="cytamobile"
+ user="user"
+ password="pass"
+ mmsc="http://mmsc.cyta.com.cy"
+ mmsproxy="212.31.96.161"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="MTN MMS"
+ mcc="280"
+ mnc="10"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.mtn.com.cy/mmsc"
+ mmsproxy="172.24.97.1"
+ mmsport="3130"
+ type="mms"
+ />
+
+ <apn carrier="MTN Wap"
+ mcc="280"
+ mnc="10"
+ apn="wap"
+ user="wap"
+ password="wap"
+ proxy="172.24.97.3"
+ port="3130"
+ type="default,supl"
+ />
+
+ <apn carrier="M-Tel"
+ mcc="284"
+ mnc="01"
+ apn="wap-gprs.mtel.bg"
+ type="default,supl"
+ />
+
+ <apn carrier="M-Tel MMS"
+ mcc="284"
+ mnc="01"
+ apn="mms-gprs.mtel.bg"
+ user="mtel"
+ password="mtel"
+ mmsc="http://mmsc/"
+ mmsproxy="10.150.0.33"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vivacom WAP"
+ mcc="284"
+ mnc="03"
+ apn="wap.vivacom.bg"
+ user="wap"
+ password="wap"
+ proxy="192.168.123.123"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Vivacom MMS"
+ mcc="284"
+ mnc="03"
+ apn="mms.vivacom.bg"
+ user="mms"
+ password="mms"
+ mmsc="http://mmsc.vivacom.bg"
+ mmsproxy="192.168.123.123"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="GPRS GLOBUL"
+ mcc="284"
+ mnc="05"
+ apn="globul"
+ type="default,supl"
+ />
+
+ <apn carrier="GLOBUL MMS GPRS"
+ mcc="284"
+ mnc="05"
+ apn="mms.globul.bg"
+ user="mms"
+ mmsc="http://mmsc1.mms.globul.bg:8002"
+ mmsproxy="192.168.87.11"
+ mmsport="8004"
+ type="mms"
+ />
+
+ <apn carrier="Turkcell Internet"
+ mcc="286"
+ mnc="01"
+ apn="internet"
+ user="gprs"
+ password="gprs"
+ type="default,supl"
+ />
+
+ <apn carrier="Turkcell MMS"
+ mcc="286"
+ mnc="01"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.turkcell.com.tr/servlets/mms"
+ mmsproxy="212.252.169.217"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Internet"
+ mcc="286"
+ mnc="02"
+ apn="internet"
+ user="vodafone"
+ password="vodafone"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="286"
+ mnc="02"
+ apn="mms"
+ mmsc="http://217.31.233.18:6001/MM1Servlet"
+ mmsproxy="217.31.233.18"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Avea Internet"
+ mcc="286"
+ mnc="03"
+ apn="internet"
+ user="wap"
+ password="wap"
+ type="default,supl"
+ />
+
+ <apn carrier="Avea MMS"
+ mcc="286"
+ mnc="03"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.avea.com.tr/servlets/mms"
+ mmsproxy="213.161.151.201"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Tele Internet"
+ mcc="290"
+ mnc="01"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Tele MMS"
+ mcc="290"
+ mnc="01"
+ apn="mms"
+ mmsc="http://mms.tele.gl/mms/wapenc"
+ mmsproxy="10.112.222.37"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone live!"
+ mcc="293"
+ mnc="40"
+ apn="internet.simobil.si"
+ user="simobil"
+ password="internet"
+ proxy="80.95.224.17"
+ port="9201"
+ type="default,supl"
+ />
+
+ <apn carrier="Si.mobil MMS"
+ mcc="293"
+ mnc="40"
+ apn="mms.simobil.si"
+ user="simobil"
+ password="internet"
+ mmsc="http://mmc"
+ mmsproxy="80.95.224.46"
+ mmsport="9201"
+ type="mms"
+ />
+
+ <apn carrier="Planet"
+ mcc="293"
+ mnc="41"
+ apn="internet"
+ user="mobitel"
+ password="internet"
+ proxy="213.229.249.40"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Mobitel MMS"
+ mcc="293"
+ mnc="41"
+ apn="internet"
+ user="mobitel"
+ password="internet"
+ mmsc="http://mms.mobitel.si/servlets/mms"
+ mmsproxy="213.229.249.40"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile MK Internet"
+ mcc="294"
+ mnc="01"
+ apn="internet"
+ user="internet"
+ password="t-mobile"
+ type="default,supl"
+ />
+
+ <apn carrier="T-Mobile MK MMS"
+ mcc="294"
+ mnc="01"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.t-mobile.com.mk"
+ mmsproxy="62.162.155.227"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cosmofon"
+ mcc="294"
+ mnc="02"
+ apn="Internet"
+ user="Internet"
+ password="Internet"
+ proxy="http://wap.planet.mk"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Cosmofon MMS"
+ mcc="294"
+ mnc="02"
+ apn="mms"
+ mmsc="http://195.167.65.220:8002"
+ mmsproxy="10.10.10.20"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Internet"
+ mcc="294"
+ mnc="03"
+ apn="vipoperator"
+ user="vipoperator"
+ password="vipoperator"
+ proxy="78.40.0.1"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS"
+ mcc="294"
+ mnc="03"
+ apn="vipoperator.mms"
+ user="vipoperator"
+ password="vipoperator"
+ mmsc="http://mmsc.vipoperator.com.mk"
+ mmsproxy="78.40.0.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile MMS"
+ mcc="297"
+ mnc="02"
+ apn="mms"
+ user="38267"
+ password="38267"
+ mmsc="http://192.168.180.100/servlets/mms"
+ mmsproxy="10.0.5.19"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile Internet"
+ mcc="297"
+ mnc="02"
+ apn="tmcg-wnw"
+ user="38267"
+ password="38267"
+ proxy="10.0.5.19"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="TELUS"
+ mcc="302"
+ mnc="220"
+ apn="sp.telus.com"
+ mmsc="http://aliasredirect.net/proxy/mmsc"
+ mmsproxy="74.49.0.18"
+ mmsport="80"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Koodo"
+ mcc="302"
+ mnc="220"
+ apn="sp.koodo.com"
+ proxy="74.49.0.18"
+ port="80"
+ mmsc="http://aliasredirect.net/proxy/koodo/mmsc"
+ mmsproxy="74.49.0.18"
+ mmsport="80"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="MOWAP"
+ mcc="302"
+ mnc="320"
+ apn="wap.davewireless.com"
+ proxy="10.100.3.4"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="MOMMS"
+ mcc="302"
+ mnc="320"
+ apn="mms.davewireless.com"
+ mmsc="http://mms.mobilicity.net"
+ mmsproxy="10.100.3.4"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="MMS"
+ mcc="302"
+ mnc="270"
+ apn="mms.mobi.eastlink.ca"
+ mmsc="http://mmss.mobi.eastlink.ca"
+ mmsproxy="10.232.12.49"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Internet"
+ mcc="302"
+ mnc="270"
+ apn="wisp.mobi.eastlink.ca"
+ type="default,supl"
+ />
+
+ <apn carrier="Fido Internet"
+ mcc="302"
+ mnc="370"
+ apn="fido-core-appl1.apn"
+ mmsc="http://mms.fido.ca"
+ mmsproxy="205.151.11.13"
+ mmsport="80"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Internet"
+ mcc="302"
+ mnc="490"
+ apn="internet.windmobile.ca"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS"
+ mcc="302"
+ mnc="490"
+ apn="mms.windmobile.ca"
+ mmsc="http://mms.windmobile.ca"
+ mmsproxy="74.115.197.70"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Videotron"
+ mcc="302"
+ mnc="500"
+ apn="media.videotron"
+ mmsc="http://media.videotron.com"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Bell Internet"
+ mcc="302"
+ mnc="610"
+ apn="pda.bell.ca"
+ mmsc="http://mms.bell.ca/mms/wapenc"
+ mmsproxy="web.wireless.bell.ca"
+ mmsport="80"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="MTS"
+ mcc="302"
+ mnc="660"
+ apn="sp.mts"
+ mmsc="http://mmsc2.mts.net/"
+ mmsproxy="209.4.229.90"
+ mmsport="9401"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="MTS-Roaming"
+ mcc="302"
+ mnc="370"
+ apn="sp.mts"
+ mmsc="http://mmsc2.mts.net/"
+ mmsproxy="209.4.229.90"
+ mmsport="9401"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Rogers"
+ mcc="302"
+ mnc="720"
+ apn="rogers-core-appl1.apn"
+ mmsc="http://mms.gprs.rogers.com"
+ mmsproxy="10.128.1.69"
+ mmsport="80"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Chatr Internet"
+ mcc="302"
+ mnc="720"
+ apn="chatrweb.apn"
+ mmsc="http://mms.chatrwireless.com"
+ mmsproxy="205.151.11.11"
+ mmsport="80"
+ type="default,mms"
+ />
+
+ <apn carrier="SaskTel"
+ mcc="302"
+ mnc="780"
+ apn="pda.stm.sk.ca"
+ mmsc="http://mms.sasktel.com"
+ mmsproxy="mig.sasktel.com"
+ mmsport="80"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="myBlue Pix"
+ mcc="310"
+ mnc="030"
+ apn="mmswap.centennialwireless.com"
+ mmsc="http://mms.myblue.com/servlets/mms"
+ mmsproxy="63.99.231.135"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Internet"
+ mcc="310"
+ mnc="030"
+ apn="private.centennialwireless.com"
+ user="privuser"
+ password="priv"
+ type="default,supl"
+ />
+
+ <apn carrier="CorrMMS"
+ mcc="310"
+ mnc="080"
+ apn="corrmms"
+ mmsc="http://mms.iot1.com/corr/mms.php"
+ mmsproxy="66.255.55.23"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Internet"
+ mcc="310"
+ mnc="090"
+ apn="isp"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS"
+ mcc="310"
+ mnc="090"
+ apn="mms"
+ mmsc="http://mms.edgemobile.net/mmsc"
+ mmsproxy="12.108.12.13"
+ mmsport="3128"
+ type="mms"
+ />
+
+ <apn carrier="Edge MMS Prepay"
+ mcc="310"
+ mnc="090"
+ apn="ppmms"
+ mmsc="http://mms.edgemobile.net/mmsc"
+ mmsproxy="12.108.12.13"
+ mmsport="3128"
+ type="mms"
+ />
+
+ <apn carrier="PLAT-OTA-MMS"
+ mcc="310"
+ mnc="100"
+ apn="plateaumms"
+ password="mmsc"
+ mmsc="208.254.124.11:8514"
+ mmsproxy="208.254.124.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="PLATWEB"
+ mcc="310"
+ mnc="100"
+ apn="plateauweb"
+ type="default,supl"
+ />
+
+ <apn carrier="My Multi Media"
+ mcc="310"
+ mnc="130"
+ apn="mms.c1.ama"
+ user="cell1mms"
+ password="cell1"
+ mmsc="http://mms.iot1.com/amarillo/mms.php"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile US 160"
+ mcc="310"
+ mnc="160"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="DataConnect"
+ mcc="310"
+ mnc="170"
+ apn="isp.cingular"
+ type="default,supl"
+ />
+
+ <apn carrier="Cingular MMS"
+ mcc="310"
+ mnc="170"
+ apn="wap.cingular"
+ user="WAP@CINGULARGPRS.COM"
+ password="CINGULAR1"
+ mmsc="http://mmsc.cingular.com"
+ mmsproxy="66.209.11.32"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile US 200"
+ mcc="310"
+ mnc="200"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile US 210"
+ mcc="310"
+ mnc="210"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile US 220"
+ mcc="310"
+ mnc="220"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile US 230"
+ mcc="310"
+ mnc="230"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile US 240"
+ mcc="310"
+ mnc="240"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile US 250"
+ mcc="310"
+ mnc="250"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile US"
+ mcc="310"
+ mnc="260"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile US 270"
+ mcc="310"
+ mnc="270"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile US 310"
+ mcc="310"
+ mnc="310"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Cingular 380 ATT"
+ mcc="310"
+ mnc="380"
+ apn="proxy"
+ mmsc="http://mmsc.cingular.com/"
+ mmsproxy="wireless.cingular.com"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="AWS MMS"
+ mcc="310"
+ mnc="380"
+ apn="proxy"
+ mmsc="http://mmsc.mymmode.com"
+ mmsproxy="10.250.250.55"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Celloneet MMS"
+ mcc="310"
+ mnc="390"
+ apn="mms.celloneet.com"
+ user="user1@mms.celloneet.com"
+ password="celloneet"
+ mmsc="http://mms.celloneet.com/servlets/mms"
+ mmsproxy="63.99.231.135"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cingular 410"
+ mcc="310"
+ mnc="410"
+ apn="wap.cingular"
+ user="WAP@CINGULARGPRS.COM"
+ password="CINGULAR1"
+ server="cingulargprs.com"
+ mmsc="http://mmsc.cingular.com/"
+ mmsproxy="wireless.cingular.com"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="CBW MMS"
+ mcc="310"
+ mnc="420"
+ apn="wap.gocbw.com"
+ mmsc="http://mms.gocbw.com:8088/mms"
+ mmsproxy="216.68.79.202"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="DataConnect"
+ mcc="310"
+ mnc="470"
+ apn="isp.cingular"
+ type="default,supl"
+ />
+
+ <apn carrier="MediaNet"
+ mcc="310"
+ mnc="470"
+ apn="wap.cingular"
+ user="WAP@CINGULARGPRS.COM"
+ password="CINGULAR1"
+ mmsc="http://mmsc.cingular.com"
+ mmsproxy="66.209.11.32"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="DataConnect"
+ mcc="310"
+ mnc="480"
+ apn="isp.cingular"
+ type="default,supl"
+ />
+
+ <apn carrier="MediaNet"
+ mcc="310"
+ mnc="480"
+ apn="wap.cingular"
+ user="WAP@CINGULARGPRS.COM"
+ password="CINGULAR1"
+ mmsc="http://mmsc.cingular.com"
+ mmsproxy="66.209.11.32"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="T-Mobile US 490"
+ mcc="310"
+ mnc="490"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="GoodCall Picture Message"
+ mcc="310"
+ mnc="490"
+ apn="good.call"
+ mmsc="http://mms.suncom.net:8088/mms"
+ mmsproxy="66.150.33.125"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Suncom MMS"
+ mcc="310"
+ mnc="490"
+ apn="mms"
+ mmsc="http://mms.suncom.net:8088/mms"
+ mmsproxy="66.150.33.125"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="DobsonMMS"
+ mcc="310"
+ mnc="560"
+ apn="dobsoncellularwap"
+ mmsc="http://mmsc"
+ mmsproxy="172.23.1.252"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="ChinookMMS"
+ mcc="310"
+ mnc="570"
+ apn="wapgw.chinookwireless.net"
+ mmsc="http://mms.cellonenation.net/mms/"
+ mmsproxy="204.181.155.195"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile US 580"
+ mcc="310"
+ mnc="580"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="CellularOne MMS"
+ mcc="310"
+ mnc="590"
+ apn="cellular1wap"
+ mmsc="http://mmsc"
+ mmsproxy="172.23.1.252"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="EpicINT"
+ mcc="310"
+ mnc="610"
+ apn="internet.epictouch"
+ type="default,supl"
+ />
+
+ <apn carrier="EpicMMS"
+ mcc="310"
+ mnc="610"
+ apn="mms.epictouch"
+ mmsc="http://mmsc.westlinkcom.com/servlets/mms"
+ mmsproxy="63.99.231.135"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile US 660"
+ mcc="310"
+ mnc="660"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="WEB 2"
+ mcc="310"
+ mnc="770"
+ apn="i2.iwireless.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Picture Messaging"
+ mcc="310"
+ mnc="770"
+ apn="wap1.iwireless.com"
+ mmsc="http://mmsc.iwireless.dataonair.net:6672"
+ mmsproxy="209.4.229.31"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="PIAPicture Messaging"
+ mcc="310"
+ mnc="770"
+ apn="wap9.iwireless.com"
+ mmsc="http://mmsc.iwireless.dataonair.net:6672"
+ mmsproxy="209.4.229.32"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="T-Mobile US 800"
+ mcc="310"
+ mnc="800"
+ apn="epc.tmobile.com"
+ mmsc="http://mms.msg.eng.t-mobile.com/mms/wapenc"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Internet"
+ mcc="310"
+ mnc="840"
+ apn="isp"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS"
+ mcc="310"
+ mnc="840"
+ apn="mms"
+ mmsc="http://mms.edgemobile.net/mmsc"
+ mmsproxy="12.108.12.13"
+ mmsport="3128"
+ type="mms"
+ />
+
+ <apn carrier="Edge MMS Prepay"
+ mcc="310"
+ mnc="840"
+ apn="ppmms"
+ mmsc="http://mms.edgemobile.net/mmsc"
+ mmsproxy="12.108.12.13"
+ mmsport="3128"
+ type="mms"
+ />
+
+ <apn carrier="DTC MMS"
+ mcc="310"
+ mnc="880"
+ apn="mms.adv.com"
+ mmsc="http://mms.iot1.com/advantage/mms.php"
+ type="mms"
+ />
+
+ <apn carrier="WOW_WAP"
+ mcc="310"
+ mnc="910"
+ apn="wap.firstcellular.com"
+ mmsc="mms.firstcellular.net/mmsc"
+ mmsproxy="10.101.1.5"
+ mmsport="3128"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="MMS"
+ mcc="311"
+ mnc="190"
+ apn="wap.cellular1.net"
+ mmsc="http://mms.cellular1.net/ecit/mms.php"
+ type="mms"
+ />
+
+ <apn carrier="Farmers GPRS"
+ mcc="311"
+ mnc="210"
+ apn="internet.farmerswireless.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Farmers MMS"
+ mcc="311"
+ mnc="210"
+ apn="mms.farmers.com"
+ mmsc="172.16.0.37:8514"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET CLARO"
+ mcc="330"
+ mnc="110"
+ apn="internet.claropr.com"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS CLARO"
+ mcc="330"
+ mnc="110"
+ apn="mms.claropr.com"
+ user=""
+ password=""
+ mmsproxy="10.50.38.3"
+ mmsport="8799"
+ mmsc="http://mmsg.claropr.com:10021/mmsc"
+ authtype="1"
+ type="mms"
+ />
+
+
+ <apn carrier="Internet"
+ mcc="334"
+ mnc="020"
+ apn="internet.itelcel.com"
+ user="webgprs"
+ password="webgprs2002"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+
+ <apn carrier="Mensajes Multimedia"
+ mcc="334"
+ mnc="020"
+ apn="mms.itelcel.com"
+ user="mmsgprs"
+ password="mmsgprs2003"
+ mmsc="http://mms.itelcel.com/servlets/mms"
+ mmsproxy="148.233.151.240"
+ mmsport="8080"
+ authtype="1"
+ type="mms"
+ />
+
+
+ <apn carrier="movistar Internet"
+ mcc="334"
+ mnc="03"
+ apn="internet.movistar.mx"
+ user="movistar"
+ password="movistar"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="movistar MMS"
+ mcc="334"
+ mnc="03"
+ apn="mms.movistar.mx"
+ user="movistar"
+ password="movistar"
+ mmsc="http://mms.movistar.mx"
+ mmsproxy="10.2.20.1"
+ mmsport="80"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="movistar Internet"
+ mcc="334"
+ mnc="030"
+ apn="internet.movistar.mx"
+ user="movistar"
+ password="movistar"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="movistar MMS"
+ mcc="334"
+ mnc="030"
+ apn="mms.movistar.mx"
+ user="movistar"
+ password="movistar"
+ mmsc="http://mms.movistar.mx"
+ mmsproxy="10.2.20.1"
+ mmsport="80"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Iusacell Internet"
+ mcc="334"
+ mnc="050"
+ apn="web.iusacellgsm.mx"
+ user="Iusacellgsm"
+ password="Iusacellgsm"
+ authtype="0"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Iusacell MMS"
+ mcc="334"
+ mnc="050"
+ apn="mms.iusacellgsm.mx"
+ user="mmsiusacellgsm"
+ password="mmsiusacellgsm"
+ mmsc="http://mms.iusacell3g.com/"
+ mmsproxy="192.200.1.40"
+ mmsport="80"
+ authtype="0"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET Digicel"
+ mcc="338"
+ mnc="050"
+ apn="web.digiceljamaica.com"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+
+ <apn carrier="MMS Digicel"
+ mcc="338"
+ mnc="050"
+ apn="wap"
+ user=""
+ password=""
+ mmsproxy="172.16.7.12"
+ mmsport="8080"
+ mmsc="http://mms.digicelgroup.com"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="338"
+ mnc="18"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="338"
+ mnc="18"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Claro Web"
+ mcc="338"
+ mnc="070"
+ apn="internet.ideasclaro.com.jm"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Claro MMS"
+ mcc="338"
+ mnc="070"
+ apn="mms.ideasclaro.com.jm"
+ user=""
+ password=""
+ mmsproxy="190.80.147.118"
+ mmsport="8080"
+ mmsc="http://mms.ideasclaro.com.jm/mms/wapenc"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="338"
+ mnc="180"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="338"
+ mnc="180"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Orange World Caraïbe"
+ mcc="340"
+ mnc="01"
+ apn="orangewap"
+ user="orange"
+ password="wap"
+ proxy="10.0.0.10"
+ port="8082"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange MMS Caraïbe"
+ mcc="340"
+ mnc="01"
+ apn="orangewap"
+ user="orange"
+ password="orange"
+ mmsc="http://193.251.160.246/servlets/mms"
+ mmsproxy="10.0.0.10"
+ mmsport="8082"
+ type="mms"
+ />
+
+ <apn carrier="Digicel FR"
+ mcc="340"
+ mnc="20"
+ apn="wap.digicelfr.com"
+ user="wap"
+ password="wap"
+ mmsc="http://mmc.digicelfr.com/servlets/mms"
+ mmsproxy="172.20.6.12"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="342"
+ mnc="60"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="342"
+ mnc="60"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="344"
+ mnc="92"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="344"
+ mnc="92"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="346"
+ mnc="14"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="346"
+ mnc="14"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="348"
+ mnc="17"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="348"
+ mnc="17"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="352"
+ mnc="11"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="352"
+ mnc="11"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="354"
+ mnc="86"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="354"
+ mnc="86"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="356"
+ mnc="11"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="356"
+ mnc="11"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="358"
+ mnc="11"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="358"
+ mnc="11"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="360"
+ mnc="11"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="360"
+ mnc="11"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET Aruba"
+ mcc="363"
+ mnc="02"
+ apn="web.digicelaruba.com"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Digicel"
+ mcc="363"
+ mnc="02"
+ apn="wap"
+ user=""
+ password=""
+ mmsproxy="172.16.7.12"
+ mmsport="8080"
+ mmsc="http://mms.digicelgroup.com"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET Aruba"
+ mcc="363"
+ mnc="020"
+ apn="web.digicelaruba.com"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Digicel"
+ mcc="363"
+ mnc="020"
+ apn="wap"
+ user=""
+ password=""
+ mmsproxy="172.16.7.12"
+ mmsport="8080"
+ mmsc="http://mms.digicelgroup.com"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="365"
+ mnc="84"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="365"
+ mnc="84"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="366"
+ mnc="11"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="366"
+ mnc="11"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+
+ <apn carrier="Internet"
+ mcc="368"
+ mnc="01"
+ apn="internet"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+
+ <apn carrier="Cubacel MMS"
+ mcc="368"
+ mnc="01"
+ apn="mms"
+ mmsproxy="200.13.145.52"
+ mmsport="8080"
+ mmsc="http://mms.cubacel.cu/"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Orange net"
+ mcc="370"
+ mnc="01"
+ apn="orangenet.com.do"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="370"
+ mnc="01"
+ apn="orangeworld"
+ user="orange"
+ password="orange"
+ mmsproxy="172.16.126.70"
+ mmsport="8080"
+ mmsc="http://mms.orange.com.do/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET CLARO"
+ mcc="370"
+ mnc="02"
+ apn="internet.ideasclaro.com.do"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS CLARO"
+ mcc="370"
+ mnc="02"
+ apn="mms.ideasclaro.com.do"
+ user=""
+ password=""
+ mmsproxy="190.80.147.8"
+ mmsport="8080"
+ mmsc="http://mms.ideasclaro.com.do/mms/wapenc"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Viva Edge"
+ mcc="370"
+ mnc="04"
+ apn="edge.viva.net.do"
+ proxy="192.168.16.10"
+ port="9401"
+ user="viva"
+ password="viva"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Viva MMS"
+ mcc="370"
+ mnc="04"
+ apn="mms.viva.net.do"
+ user="viva"
+ password="viva"
+ mmsproxy="192.168.16.10"
+ mmsport="9401"
+ mmsc="http://10.200.16.4/mms/wapenc"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Bmobile internet"
+ mcc="374"
+ mnc="12"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bmobile mms"
+ mcc="374"
+ mnc="12"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="192.168.210.104"
+ mmsport="8080"
+ mmsc="http://192.168.210.104/mmrelay.app"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Bmobile internet"
+ mcc="374"
+ mnc="120"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bmobile mms"
+ mcc="374"
+ mnc="120"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="192.168.210.104"
+ mmsport="8080"
+ mmsc="http://192.168.210.104/mmrelay.app"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Bmobile internet"
+ mcc="374"
+ mnc="121"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bmobile mms"
+ mcc="374"
+ mnc="121"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="192.168.210.104"
+ mmsport="8080"
+ mmsc="http://192.168.210.104/mmrelay.app"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Bmobile internet"
+ mcc="374"
+ mnc="122"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bmobile mms"
+ mcc="374"
+ mnc="122"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="192.168.210.104"
+ mmsport="8080"
+ mmsc="http://192.168.210.104/mmrelay.app"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Bmobile internet"
+ mcc="374"
+ mnc="123"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bmobile mms"
+ mcc="374"
+ mnc="123"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="192.168.210.104"
+ mmsport="8080"
+ mmsc="http://192.168.210.104/mmrelay.app"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Bmobile internet"
+ mcc="374"
+ mnc="124"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bmobile mms"
+ mcc="374"
+ mnc="124"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="192.168.210.104"
+ mmsport="8080"
+ mmsc="http://192.168.210.104/mmrelay.app"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Bmobile internet"
+ mcc="374"
+ mnc="125"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bmobile mms"
+ mcc="374"
+ mnc="125"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="192.168.210.104"
+ mmsport="8080"
+ mmsc="http://192.168.210.104/mmrelay.app"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Bmobile internet"
+ mcc="374"
+ mnc="126"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bmobile mms"
+ mcc="374"
+ mnc="126"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="192.168.210.104"
+ mmsport="8080"
+ mmsc="http://192.168.210.104/mmrelay.app"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Bmobile internet"
+ mcc="374"
+ mnc="127"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bmobile mms"
+ mcc="374"
+ mnc="127"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="192.168.210.104"
+ mmsport="8080"
+ mmsc="http://192.168.210.104/mmrelay.app"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Bmobile internet"
+ mcc="374"
+ mnc="128"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bmobile mms"
+ mcc="374"
+ mnc="128"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="192.168.210.104"
+ mmsport="8080"
+ mmsc="http://192.168.210.104/mmrelay.app"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Bmobile internet"
+ mcc="374"
+ mnc="129"
+ apn="internet"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bmobile mms"
+ mcc="374"
+ mnc="129"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="192.168.210.104"
+ mmsport="8080"
+ mmsc="http://192.168.210.104/mmrelay.app"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET Trinidad"
+ mcc="374"
+ mnc="13"
+ apn="web.digiceltt.com"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Trinidad"
+ mcc="374"
+ mnc="13"
+ apn="wap.digiceltt.com"
+ user="wap"
+ password="wap"
+ mmsproxy="172.20.6.12"
+ mmsport="8080"
+ mmsc="http://mmc.digiceltt.com/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET Trinidad"
+ mcc="374"
+ mnc="130"
+ apn="web.digiceltt.com"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Trinidad"
+ mcc="374"
+ mnc="130"
+ apn="wap.digiceltt.com"
+ user="wap"
+ password="wap"
+ mmsproxy="172.20.6.12"
+ mmsport="8080"
+ mmsc="http://mmc.digiceltt.com/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Lime Internet Postpaid"
+ mcc="376"
+ mnc="35"
+ apn="internet"
+ user=""
+ password=""
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Lime Postpaid MMS"
+ mcc="376"
+ mnc="35"
+ apn="multimedia"
+ user=""
+ password=""
+ mmsproxy="10.20.5.34"
+ mmsport="8799"
+ mmsc="http://mmsc"
+ type="mms"
+ />
+
+ <apn carrier="Beeline Internet"
+ mcc="401"
+ mnc="01"
+ apn="internet.beeline.kz"
+ user="@internet.beeline"
+ password="beeline"
+ type="default,supl"
+ />
+
+ <apn carrier="Beeline MMS"
+ mcc="401"
+ mnc="01"
+ apn="mms.beeline.kz"
+ user="@mms.beeline"
+ password="beeline"
+ mmsc="http://mms.beeline.kz/mms/wapenc"
+ mmsproxy="172.27.6.93"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Kcell Internet"
+ mcc="401"
+ mnc="02"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Kcell MMS"
+ mcc="401"
+ mnc="02"
+ apn="mms"
+ mmsc="http://mms.kcell.kz/post"
+ mmsproxy="195.47.255.7"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Tele2 Internet"
+ mcc="401"
+ mnc="77"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Tele2 MMS"
+ mcc="401"
+ mnc="77"
+ apn="mms"
+ mmsc="http://mms.neogsm.kz/mms/wapenc"
+ mmsproxy="10.1.26.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="01"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="01"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="01"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="02"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="02"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="03"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="03"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="404"
+ mnc="04"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="404"
+ mnc="04"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="05"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="05"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="05"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="404"
+ mnc="07"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="404"
+ mnc="07"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RTel MMS"
+ mcc="404"
+ mnc="09"
+ apn="MMS"
+ mmsc="http://10.239.221.47/mms/"
+ mmsproxy="10.239.221.7"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RTel"
+ mcc="404"
+ mnc="09"
+ apn="SMARTNET"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="10"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="10"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="11"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="11"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="11"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="404"
+ mnc="12"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="404"
+ mnc="12"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="13"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="13"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="13"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA Punjab MMS"
+ mcc="404"
+ mnc="14"
+ apn="mmsc"
+ mmsc="http://10.11.12.180/"
+ mmsproxy="10.11.12.13"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="IDEA Punjab"
+ mcc="404"
+ mnc="14"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="15"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="15"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="15"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="16"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="16"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE MMS"
+ mcc="404"
+ mnc="17"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE"
+ mcc="404"
+ mnc="17"
+ apn="aircelwebpost"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RTel MMS"
+ mcc="404"
+ mnc="18"
+ apn="MMS"
+ mmsc="http://10.239.221.47/mms/"
+ mmsproxy="10.239.221.7"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RTel"
+ mcc="404"
+ mnc="18"
+ apn="SMARTNET"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="404"
+ mnc="19"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="404"
+ mnc="19"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="20"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="20"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="20"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Loop Mobile MMS"
+ mcc="404"
+ mnc="21"
+ apn="mizone"
+ password="mmsc"
+ mmsc="http://mms.loopmobile.in:8080"
+ mmsproxy="10.0.0.10"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Loop Mobile"
+ mcc="404"
+ mnc="21"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="404"
+ mnc="22"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="404"
+ mnc="22"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="404"
+ mnc="24"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="404"
+ mnc="24"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE MMS"
+ mcc="404"
+ mnc="25"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE"
+ mcc="404"
+ mnc="25"
+ apn="aircelwebpost"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="27"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="27"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="27"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL NE MMS"
+ mcc="404"
+ mnc="28"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE"
+ mcc="404"
+ mnc="28"
+ apn="aircelwebpost"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL NE MMS"
+ mcc="404"
+ mnc="29"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE"
+ mcc="404"
+ mnc="29"
+ apn="aircelwebpost"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="30"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="30"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="30"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="31"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="31"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE MMS"
+ mcc="404"
+ mnc="33"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE"
+ mcc="404"
+ mnc="33"
+ apn="aircelwebpost"
+ type="default,supl"
+ />
+
+ <apn carrier="Cellone_North MMS"
+ mcc="404"
+ mnc="34"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cellone_North"
+ mcc="404"
+ mnc="34"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL NE MMS"
+ mcc="404"
+ mnc="35"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE"
+ mcc="404"
+ mnc="35"
+ apn="aircelwebpost"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RTel MMS"
+ mcc="404"
+ mnc="36"
+ apn="MMS"
+ mmsc="http://10.239.221.47/mms/"
+ mmsproxy="10.239.221.7"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RTel"
+ mcc="404"
+ mnc="36"
+ apn="SMARTNET"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL NE MMS"
+ mcc="404"
+ mnc="37"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE"
+ mcc="404"
+ mnc="37"
+ apn="aircelwebpost"
+ type="default,supl"
+ />
+
+ <apn carrier="CellOne_Kolkata MMS"
+ mcc="404"
+ mnc="38"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_Kolkata"
+ mcc="404"
+ mnc="38"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="40"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="40"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL TN"
+ mcc="404"
+ mnc="41"
+ apn="aircelgprs.po"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL TN MMS"
+ mcc="404"
+ mnc="41"
+ apn="aircelmms.po"
+ mmsc="http://mmsc/mmrelay.app"
+ mmsproxy="192.168.35.196"
+ mmsport="8081"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL TN"
+ mcc="404"
+ mnc="42"
+ apn="aircelgprs.po"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL TN MMS"
+ mcc="404"
+ mnc="42"
+ apn="aircelmms.po"
+ mmsc="http://mmsc/mmrelay.app"
+ mmsproxy="192.168.35.196"
+ mmsport="8081"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="43"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="43"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="43"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA Karnataka"
+ mcc="404"
+ mnc="44"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA Karnataka MMS"
+ mcc="404"
+ mnc="44"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="45"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="45"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="46"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="46"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="46"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="49"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="49"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RTel MMS"
+ mcc="404"
+ mnc="50"
+ apn="MMS"
+ mmsc="http://10.239.221.47/mms/"
+ mmsproxy="10.239.221.7"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RTel"
+ mcc="404"
+ mnc="50"
+ apn="SMARTNET"
+ type="default,supl"
+ />
+
+ <apn carrier="Cellone_North MMS"
+ mcc="404"
+ mnc="51"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cellone_North"
+ mcc="404"
+ mnc="51"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RTel MMS"
+ mcc="404"
+ mnc="52"
+ apn="MMS"
+ mmsc="http://10.239.221.47/mms/"
+ mmsproxy="10.239.221.7"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RTel"
+ mcc="404"
+ mnc="52"
+ apn="SMARTNET"
+ type="default,supl"
+ />
+
+ <apn carrier="Cellone_North MMS"
+ mcc="404"
+ mnc="53"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cellone_North"
+ mcc="404"
+ mnc="53"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cellone_North MMS"
+ mcc="404"
+ mnc="54"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cellone_North"
+ mcc="404"
+ mnc="54"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cellone_North MMS"
+ mcc="404"
+ mnc="55"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cellone_North"
+ mcc="404"
+ mnc="55"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="404"
+ mnc="56"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="404"
+ mnc="56"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cellone_West MMS"
+ mcc="404"
+ mnc="57"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cellone_West"
+ mcc="404"
+ mnc="57"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cellone_West MMS"
+ mcc="404"
+ mnc="58"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cellone_West"
+ mcc="404"
+ mnc="58"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cellone_North MMS"
+ mcc="404"
+ mnc="59"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cellone_North"
+ mcc="404"
+ mnc="59"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="60"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="60"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="60"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Cellone_North MMS"
+ mcc="404"
+ mnc="62"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cellone_North"
+ mcc="404"
+ mnc="62"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="CellOne_South MMS"
+ mcc="404"
+ mnc="64"
+ apn="bsnlmms"
+ password="mmsc"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_South"
+ mcc="404"
+ mnc="64"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cellone_West MMS"
+ mcc="404"
+ mnc="66"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cellone_West"
+ mcc="404"
+ mnc="66"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RTel MMS"
+ mcc="404"
+ mnc="67"
+ apn="MMS"
+ mmsc="http://10.239.221.47/mms/"
+ mmsproxy="10.239.221.7"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RTel"
+ mcc="404"
+ mnc="67"
+ apn="SMARTNET"
+ type="default,supl"
+ />
+
+ <apn carrier="Dolphin_Delhi MMS"
+ mcc="404"
+ mnc="68"
+ apn="gprsmtnldel"
+ user="mtnl"
+ password="mtnl123"
+ mmsc="http://172.16.31.136/mms/"
+ mmsproxy="172.16.31.10"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Dolphin_Delhi"
+ mcc="404"
+ mnc="68"
+ apn="gprsmtnldel"
+ user="mtnl"
+ password="mtnl123"
+ type="default,supl"
+ />
+
+ <apn carrier="Dolphin_Delhi_3G MMS"
+ mcc="404"
+ mnc="68"
+ apn="mtnl3g"
+ user="mtnl"
+ password="mtnl123"
+ mmsc="http://172.16.31.165/mms/"
+ mmsproxy="172.16.31.10"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Dolphin_Delhi_3G"
+ mcc="404"
+ mnc="68"
+ apn="mtnl3g"
+ user="mtnl"
+ password="mtnl123"
+ type="default,supl"
+ />
+
+ <apn carrier="Dolphin_Mumbai MMS"
+ mcc="404"
+ mnc="69"
+ apn="gprsmtnlmum"
+ user="mtnl"
+ password="mtnl123"
+ mmsc="http://172.16.39.140/mms/"
+ mmsproxy="172.16.39.10"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Dolphin_Mumbai"
+ mcc="404"
+ mnc="69"
+ apn="gprsmtnlmum"
+ user="mtnl"
+ password="mtnl123"
+ type="default,supl"
+ />
+
+ <apn carrier="Dolphin_Mumbai_3G MMS"
+ mcc="404"
+ mnc="69"
+ apn="mtnl3g"
+ user="mtnl"
+ password="mtnl123"
+ mmsc="http://172.16.31.165/mms/"
+ mmsproxy="172.16.39.10"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Dolphin_Mumbai_3G"
+ mcc="404"
+ mnc="69"
+ apn="mtnl3g"
+ user="mtnl"
+ password="mtnl123"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="70"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="70"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_South MMS"
+ mcc="404"
+ mnc="71"
+ apn="bsnlmms"
+ password="mmsc"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_South"
+ mcc="404"
+ mnc="71"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="CellOne_South MMS"
+ mcc="404"
+ mnc="72"
+ apn="bsnlmms"
+ password="mmsc"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_South"
+ mcc="404"
+ mnc="72"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="CellOne_South MMS"
+ mcc="404"
+ mnc="73"
+ apn="bsnlmms"
+ password="mmsc"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_South"
+ mcc="404"
+ mnc="73"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="CellOne_Kolkata MMS"
+ mcc="404"
+ mnc="74"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_Kolkata"
+ mcc="404"
+ mnc="74"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="CellOne_Kolkata MMS"
+ mcc="404"
+ mnc="75"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_Kolkata"
+ mcc="404"
+ mnc="75"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="CellOne_Kolkata MMS"
+ mcc="404"
+ mnc="76"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_Kolkata"
+ mcc="404"
+ mnc="76"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="CellOne_Kolkata MMS"
+ mcc="404"
+ mnc="77"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_Kolkata"
+ mcc="404"
+ mnc="77"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="404"
+ mnc="78"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="404"
+ mnc="78"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_South MMS"
+ mcc="404"
+ mnc="79"
+ apn="bsnlmms"
+ password="mmsc"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_South"
+ mcc="404"
+ mnc="79"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="CellOne_South MMS"
+ mcc="404"
+ mnc="80"
+ apn="bsnlmms"
+ password="mmsc"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_South"
+ mcc="404"
+ mnc="80"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="CellOne_Kolkata MMS"
+ mcc="404"
+ mnc="81"
+ apn="bsnlmms"
+ mmsc="http://bsnlmmsc.in:8514"
+ mmsproxy="10.210.10.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CellOne_Kolkata"
+ mcc="404"
+ mnc="81"
+ apn="bsnlnet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="404"
+ mnc="82"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="404"
+ mnc="82"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RTel MMS"
+ mcc="404"
+ mnc="83"
+ apn="MMS"
+ mmsc="http://10.239.221.47/mms/"
+ mmsproxy="10.239.221.7"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RTel"
+ mcc="404"
+ mnc="83"
+ apn="SMARTNET"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="84"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="84"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="84"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RTel MMS"
+ mcc="404"
+ mnc="85"
+ apn="MMS"
+ mmsc="http://10.239.221.47/mms/"
+ mmsproxy="10.239.221.7"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RTel"
+ mcc="404"
+ mnc="85"
+ apn="SMARTNET"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="86"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="86"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="86"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="404"
+ mnc="87"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="404"
+ mnc="87"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="404"
+ mnc="88"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="404"
+ mnc="88"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="404"
+ mnc="88"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="404"
+ mnc="89"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="404"
+ mnc="89"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="90"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="90"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE MMS"
+ mcc="404"
+ mnc="91"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL NE"
+ mcc="404"
+ mnc="91"
+ apn="aircelwebpost"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="92"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="92"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="93"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="93"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="94"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="94"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="95"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="95"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="96"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="96"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="97"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="97"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="404"
+ mnc="98"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="404"
+ mnc="98"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="01"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="01"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="03"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="03"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="04"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="04"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="05"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="05"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="06"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="06"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="07"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="07"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="08"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="08"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="09"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="09"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="10"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="10"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="11"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="11"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="12"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="12"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="13"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="13"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="14"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="14"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="15"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="15"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="17"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="17"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="18"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="18"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="19"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="19"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="20"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="20"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="21"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="21"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="22"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="22"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="Reliance RCOM MMS"
+ mcc="405"
+ mnc="23"
+ apn="rcommms"
+ mmsc="http://mmsc.rcom.co.in/mms/"
+ mmsproxy="10.239.221.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Reliance RCOM"
+ mcc="405"
+ mnc="23"
+ apn="rcomnet"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="025"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="025"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="026"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="026"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="027"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="027"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="028"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="028"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="029"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="029"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="030"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="030"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="031"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="031"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="032"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="032"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="033"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="033"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="034"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="034"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="035"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="035"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="036"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="036"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="037"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="037"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="038"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="038"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="039"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="039"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="040"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="040"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="041"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="041"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="042"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="042"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="043"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="043"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="044"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="044"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="045"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="045"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="046"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="046"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="TataDOCOMO"
+ mcc="405"
+ mnc="047"
+ apn="TATA.DOCOMO.INTERNET"
+ type="default,supl"
+ />
+
+ <apn carrier="TataDOCOMO MMS"
+ mcc="405"
+ mnc="047"
+ apn="TATA.DOCOMO.MMS"
+ mmsc="http://mmsc/"
+ mmsproxy="10.124.26.94"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="405"
+ mnc="51"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="405"
+ mnc="51"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="405"
+ mnc="52"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="405"
+ mnc="52"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="405"
+ mnc="53"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="405"
+ mnc="53"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="405"
+ mnc="54"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="405"
+ mnc="54"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="405"
+ mnc="55"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="405"
+ mnc="55"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Airtel"
+ mcc="405"
+ mnc="56"
+ apn="airtelgprs.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Airtel MMS"
+ mcc="405"
+ mnc="56"
+ apn="airtelmms.com"
+ mmsc="http://100.1.201.171:10021/mmsc"
+ mmsproxy="100.1.201.172"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="405"
+ mnc="66"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="405"
+ mnc="66"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="405"
+ mnc="66"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="405"
+ mnc="67"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="405"
+ mnc="67"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="405"
+ mnc="67"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="70"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="70"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="405"
+ mnc="750"
+ apn="vodafonelivejk"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="405"
+ mnc="750"
+ apn="jkgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="405"
+ mnc="750"
+ apn="vodafonelivejk"
+ proxy="10.10.1.100"
+ port="9411"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="405"
+ mnc="751"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="405"
+ mnc="751"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="405"
+ mnc="751"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="405"
+ mnc="752"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="405"
+ mnc="752"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="405"
+ mnc="752"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="405"
+ mnc="753"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="405"
+ mnc="753"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="405"
+ mnc="753"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="405"
+ mnc="754"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="405"
+ mnc="754"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="405"
+ mnc="754"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="405"
+ mnc="755"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="405"
+ mnc="755"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="405"
+ mnc="755"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodafone MMS"
+ mcc="405"
+ mnc="756"
+ apn="portalnmms"
+ mmsc="http://mms1.live.vodafone.in/mms/"
+ mmsproxy="10.10.1.100"
+ mmsport="9401"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone Connect"
+ mcc="405"
+ mnc="756"
+ apn="www"
+ type="default,supl"
+ />
+
+ <apn carrier="VodafoneLive!"
+ mcc="405"
+ mnc="756"
+ apn="portalnmms"
+ proxy="10.10.1.100"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="799"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="799"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL ROI"
+ mcc="405"
+ mnc="800"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL ROI MMS"
+ mcc="405"
+ mnc="800"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL South"
+ mcc="405"
+ mnc="801"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL South MMS"
+ mcc="405"
+ mnc="801"
+ apn="aircelmms"
+ mmsc="http://mmsc/mmrelay.app"
+ mmsproxy="192.168.35.196"
+ mmsport="8081"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL Central"
+ mcc="405"
+ mnc="802"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL Central MMS"
+ mcc="405"
+ mnc="802"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL South"
+ mcc="405"
+ mnc="803"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL South MMS"
+ mcc="405"
+ mnc="803"
+ apn="aircelmms"
+ mmsc="http://mmsc/mmrelay.app"
+ mmsproxy="192.168.35.196"
+ mmsport="8081"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL ROI"
+ mcc="405"
+ mnc="804"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL ROI MMS"
+ mcc="405"
+ mnc="804"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL ROI"
+ mcc="405"
+ mnc="805"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL ROI MMS"
+ mcc="405"
+ mnc="805"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL Central"
+ mcc="405"
+ mnc="806"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL Central MMS"
+ mcc="405"
+ mnc="806"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL Central"
+ mcc="405"
+ mnc="807"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL Central MMS"
+ mcc="405"
+ mnc="807"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL Central"
+ mcc="405"
+ mnc="808"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL Central MMS"
+ mcc="405"
+ mnc="808"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL South"
+ mcc="405"
+ mnc="809"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL South MMS"
+ mcc="405"
+ mnc="809"
+ apn="aircelmms"
+ mmsc="http://mmsc/mmrelay.app"
+ mmsproxy="192.168.35.196"
+ mmsport="8081"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL ROI"
+ mcc="405"
+ mnc="810"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL ROI MMS"
+ mcc="405"
+ mnc="810"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL ROI"
+ mcc="405"
+ mnc="811"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL ROI MMS"
+ mcc="405"
+ mnc="811"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIRCEL Central"
+ mcc="405"
+ mnc="812"
+ apn="aircelgprs"
+ type="default,supl"
+ />
+
+ <apn carrier="AIRCEL Central MMS"
+ mcc="405"
+ mnc="812"
+ apn="aircelmms"
+ mmsc="http://10.50.1.166/servlets/mms"
+ mmsproxy="172.17.83.69"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="813"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="813"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="814"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="814"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="815"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="815"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="816"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="816"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="817"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="817"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="818"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="818"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="819"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="819"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="820"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="820"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="821"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="821"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="822"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="822"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="823"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="823"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="824"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="824"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="825"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="825"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="826"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="826"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="827"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="827"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="828"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="828"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="829"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="829"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="830"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="830"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="831"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="831"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="832"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="832"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="833"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="833"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="834"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="834"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="835"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="835"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="836"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="836"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="837"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="837"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="838"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="838"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="839"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="839"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="840"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="840"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="841"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="841"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="842"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="842"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="843"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="843"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="844"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="844"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="845"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="845"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="846"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="846"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="847"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="847"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="848"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="848"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="849"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="849"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="850"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="850"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="851"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="851"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="852"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="852"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="853"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="853"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="875"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="875"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="876"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="876"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="877"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="877"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="878"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="878"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="879"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="879"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="880"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="880"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="STEL"
+ mcc="405"
+ mnc="881"
+ apn="gprs.stel.in"
+ type="default,supl"
+ />
+
+ <apn carrier="STEL"
+ mcc="405"
+ mnc="882"
+ apn="gprs.stel.in"
+ type="default,supl"
+ />
+
+ <apn carrier="STEL"
+ mcc="405"
+ mnc="883"
+ apn="gprs.stel.in"
+ type="default,supl"
+ />
+
+ <apn carrier="STEL"
+ mcc="405"
+ mnc="884"
+ apn="gprs.stel.in"
+ type="default,supl"
+ />
+
+ <apn carrier="STEL"
+ mcc="405"
+ mnc="885"
+ apn="gprs.stel.in"
+ type="default,supl"
+ />
+
+ <apn carrier="STEL"
+ mcc="405"
+ mnc="886"
+ apn="gprs.stel.in"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="908"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="908"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="909"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="909"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="910"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="910"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="IDEA"
+ mcc="405"
+ mnc="911"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="IDEA MMS"
+ mcc="405"
+ mnc="911"
+ apn="mmsc"
+ mmsc="http://10.4.42.21:8002/"
+ mmsproxy="10.4.42.15"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="912"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="913"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="914"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="915"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="916"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="917"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="918"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="919"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="920"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="921"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="922"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="923"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="924"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="925"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="925"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="926"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="926"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="927"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="927"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="928"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="928"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Uninor GPRS"
+ mcc="405"
+ mnc="929"
+ apn="uninor"
+ type="default,supl"
+ />
+
+ <apn carrier="Uninor MMS"
+ mcc="405"
+ mnc="929"
+ apn="uninor"
+ mmsc="http://10.58.2.120"
+ mmsproxy="10.58.10.59"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="930"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Cheers"
+ mcc="405"
+ mnc="931"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Videocon MMS"
+ mcc="405"
+ mnc="932"
+ apn="vgprs.com"
+ mmsc="http://10.202.4.119:10021/mmsc/"
+ mmsproxy="10.202.5.145"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="Videocon"
+ mcc="405"
+ mnc="932"
+ apn="vinternet.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Mobilink WAP GPRS"
+ mcc="410"
+ mnc="01"
+ apn="connect.mobilinkworld.com"
+ user="Mobilink"
+ password="Mobilink"
+ type="default,supl"
+ />
+
+ <apn carrier="Mobilink MMS"
+ mcc="410"
+ mnc="01"
+ apn="mms.mobilinkworld.com"
+ user="Mobilink"
+ password="Mobilink"
+ mmsc="http://mms/"
+ mmsproxy="172.25.20.12"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Ufone WAP"
+ mcc="410"
+ mnc="03"
+ apn="Ufone.internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Ufone MMS"
+ mcc="410"
+ mnc="03"
+ apn="Ufone.mms"
+ mmsc="http://www.ufonemms.com:80/"
+ mmsproxy="172.16.13.27"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="ZONG WAP"
+ mcc="410"
+ mnc="04"
+ apn="zonginternet"
+ type="default,supl"
+ />
+
+ <apn carrier="ZONG MMS"
+ mcc="410"
+ mnc="04"
+ apn="zongmms"
+ mmsc="http://10.81.6.11:8080"
+ mmsproxy="10.81.6.33"
+ mmsport="8000"
+ type="mms"
+ />
+
+ <apn carrier="Telenor WAP"
+ mcc="410"
+ mnc="06"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Telenor MMS"
+ mcc="410"
+ mnc="06"
+ apn="mms"
+ user="Telenor"
+ password="Telenor"
+ mmsc="http://mmstelenor"
+ mmsproxy="172.18.19.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Warid WAP"
+ mcc="410"
+ mnc="07"
+ apn="Wap.warid"
+ type="default,supl"
+ />
+
+ <apn carrier="Warid MMS"
+ mcc="410"
+ mnc="07"
+ apn="mms.warid"
+ mmsc="http://10.4.0.132/servlets/MMS"
+ mmsproxy="10.4.2.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Alfa Internet"
+ mcc="415"
+ mnc="01"
+ user="mic1"
+ password="mic1"
+ apn="internet.mic1.com.lb"
+ type="default,supl"
+ />
+
+ <apn carrier="Alfa MMS"
+ mcc="415"
+ mnc="01"
+ user="mic1"
+ password="mic1"
+ apn="mms.mic1.com.lb"
+ mmsc="http://mms.mic1.com.lb"
+ mmsproxy="192.168.23.51"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="MTC Touch GPRS"
+ mcc="415"
+ mnc="03"
+ apn="gprs.mtctouch.com.lb"
+ type="default,supl"
+ />
+
+ <apn carrier="MTC MMS"
+ mcc="415"
+ mnc="03"
+ user="mtctouch"
+ apn="mms.mtctouch.com.lb"
+ mmsc="http://mms:8080/mms/"
+ mmsproxy="192.168.4.103"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Zain JO Internet Postpaid"
+ mcc="416"
+ mnc="01"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Zain JO Internet Prepaid"
+ mcc="416"
+ mnc="01"
+ apn="internetpre"
+ user="zain"
+ password="zain"
+ type="default,supl"
+ />
+
+ <apn carrier="Zain JO MMS"
+ mcc="416"
+ mnc="01"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.jo.zain.com"
+ mmsproxy="192.168.55.10"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="umniahinternet Postpaid"
+ mcc="416"
+ mnc="03"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="umniahmms"
+ mcc="416"
+ mnc="03"
+ apn="mms"
+ mmsc="http://mms.umniah.com"
+ mmsproxy="10.1.1.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="umniah Prepaid"
+ mcc="416"
+ mnc="03"
+ apn="net"
+ proxy="0.0.0.0"
+ port="80"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="416"
+ mnc="77"
+ apn="mms.orange.jo"
+ user="mmc"
+ password="mmc"
+ mmsc="http://172.16.1.96/servlets/mms"
+ mmsproxy="172.16.1.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Orange Internet"
+ mcc="416"
+ mnc="77"
+ apn="net.orange.jo"
+ user="net"
+ password="net"
+ type="default,supl"
+ />
+
+
+ <apn carrier="ZAIN MMS"
+ mcc="419"
+ mnc="02"
+ apn="pps"
+ user="annyway"
+ password="online"
+ mmsc="http://mms.zain"
+ mmsproxy="176.0.0.65"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="ZAIN MI"
+ mcc="419"
+ mnc="02"
+ apn="pps"
+ user="pps"
+ password="pps"
+ type="default,supl"
+ />
+
+
+ <apn carrier="WATANIYA MMS"
+ mcc="419"
+ mnc="03"
+ apn="mms.wataniya.com"
+ mmsc="http://action.wataniya.com"
+ mmsproxy="194.126.53.64"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="INTERNET ACTION"
+ mcc="419"
+ mnc="03"
+ apn="action.wataniya.com"
+ type="default,supl"
+ />
+
+
+ <apn carrier="VIVA MMS"
+ mcc="419"
+ mnc="04"
+ apn="VIVA"
+ mmsc="http://172.16.128.80:38090/was"
+ mmsproxy="172.16.128.228"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="VIVA Internet"
+ mcc="419"
+ mnc="04"
+ apn="VIVA"
+ type="default,supl"
+ />
+
+
+ <apn carrier="JAWALNet"
+ mcc="420"
+ mnc="01"
+ apn="jawalnet.com.sa"
+ type="default,supl"
+ />
+
+
+ <apn carrier="ALJAWAL MMS"
+ mcc="420"
+ mnc="01"
+ apn="mms.net.sa"
+ mmsc="http://mms.net.sa:8002"
+ mmsproxy="10.1.1.1"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="mobily Net Prepaid"
+ mcc="420"
+ mnc="03"
+ apn="web2"
+ type="default,supl"
+ />
+
+
+ <apn carrier="mobily MMS Prepaid"
+ mcc="420"
+ mnc="03"
+ apn="mms2"
+ mmsc="http://10.3.3.133:9090/was"
+ mmsproxy="10.3.2.133"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="mobily Net Postpaid"
+ mcc="420"
+ mnc="03"
+ apn="web1"
+ type="default,supl"
+ />
+
+
+ <apn carrier="mobily MMS Postpaid"
+ mcc="420"
+ mnc="03"
+ apn="mms1"
+ mmsc="http://10.3.3.133:9090/was"
+ mmsproxy="10.3.2.133"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="zain-gprs"
+ mcc="420"
+ mnc="04"
+ apn="zain"
+ type="default,supl"
+ />
+
+
+ <apn carrier="zain-mms"
+ mcc="420"
+ mnc="04"
+ apn="zain"
+ mmsc="http://10.122.200.12:8002/"
+ mmsproxy="10.122.200.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="Oman Mobile MMS"
+ mcc="422"
+ mnc="02"
+ apn="MMS"
+ user="MMS"
+ password="MMS"
+ mmsc="http://mmsc.omanmobile.om:10021/mmsc"
+ mmsproxy="192.168.203.35"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="Oman Mobile Internet"
+ mcc="422"
+ mnc="02"
+ apn="taif"
+ user="taif"
+ password="taif"
+ type="default,supl"
+ />
+
+
+ <apn carrier="Nawras MMS"
+ mcc="422"
+ mnc="03"
+ apn="mms.nawras.com.om"
+ user="test"
+ password="test"
+ mmsc="http://10.128.240.16/servlets/mms"
+ mmsproxy="10.128.240.19"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="Nawras GPRS"
+ mcc="422"
+ mnc="03"
+ apn="isp.nawras.com.om"
+ type="default,supl"
+ />
+
+ <apn carrier="Etisalat MMS"
+ mcc="424"
+ mnc="02"
+ apn="etisalat"
+ mmsc="http://mms/servlets/mms"
+ mmsproxy="10.12.0.32"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="DATA Package"
+ mcc="424"
+ mnc="02"
+ apn="etisalat.ae"
+ type="default,supl"
+ />
+
+
+ <apn carrier="du"
+ mcc="424"
+ mnc="03"
+ apn="du"
+ type="default,supl"
+ />
+
+ <apn carrier="du MMS"
+ mcc="424"
+ mnc="03"
+ apn="du"
+ mmsc="http://mms.du.ae"
+ mmsproxy="10.19.18.4"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="3G Portal"
+ mcc="425"
+ mnc="01"
+ apn="uwap.orange.co.il"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS 3G"
+ mcc="425"
+ mnc="01"
+ apn="uwap.orange.co.il"
+ mmsc="http://192.168.220.15/servlets/mms"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Internet 3G"
+ mcc="425"
+ mnc="01"
+ apn="modem.orange.net.il"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange Internet UG"
+ mcc="641"
+ mnc="14"
+ apn="orange.ug"
+ type="default"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="641"
+ mnc="14"
+ apn="orangemms"
+ mmsc="http://mms/"
+ type="mms"
+ />
+
+ <apn carrier="Mobinil MMS"
+ apn="mobinilmms"
+ mmsc="http://10.7.13.24:8002"
+ mmsproxy="http://62.241.155.45"
+ mmsport="8205"
+ mcc="602"
+ mnc="01"
+ type="mms"
+ />
+
+ <apn carrier="Mobinil Internet"
+ apn="mobinilweb"
+ mcc="602"
+ mnc="01"
+ type="default"
+ />
+
+ <apn carrier="Orange MMS"
+ apn="orangemms"
+ user="mmsc"
+ password="mmsc"
+ mmsc="http://10.2.1.20:8514"
+ mmsproxy="10.2.1.20"
+ mmsport="8080"
+ mcc="617"
+ mnc="01"
+ type="mms"
+ />
+
+ <apn carrier="Orange Internet"
+ apn="orange"
+ mcc="617"
+ mnc="01"
+ type="default"
+ />
+
+ <apn carrier="Orange MMS"
+ apn="mms.orange.md"
+ mmsc="http://mms/mms"
+ mmsproxy="192.168.127.125"
+ mmsport="3128"
+ mcc="259"
+ mnc="01"
+ type="mms"
+ />
+
+ <apn carrier="Orange IMO"
+ apn="wap.orange.md"
+ proxy="192.168.127.124"
+ mmsport="3128"
+ mcc="259"
+ mnc="01"
+ type="mms"
+ />
+
+ <apn carrier="Orange MMS"
+ apn="orange.mms"
+ user="orange"
+ password="orange"
+ mmsc="http://10.10.10.35:38090/was"
+ mmsproxy="10.10.10.36"
+ mmsport="8080"
+ mcc="614"
+ mnc="04"
+ type="mms"
+ />
+
+ <apn carrier="Orange Internet"
+ apn="orange.ne"
+ mcc="614"
+ mnc="04"
+ type="default"
+ />
+
+ <apn carrier="Cellcom Internet"
+ mcc="425"
+ mnc="02"
+ apn="Sphone"
+ type="default,supl"
+ />
+
+ <apn carrier="Cellcom MMS"
+ mcc="425"
+ mnc="02"
+ apn="mms"
+ mmsc="http://mms.cellcom.co.il"
+ mmsproxy="172.31.29.38"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Multimedia Pelephone"
+ mcc="425"
+ mnc="03"
+ apn="mms.pelephone.net.il"
+ user="pcl@3g"
+ password="pcl"
+ mmsc="http://mmsu.pelephone.net.il"
+ mmsproxy="10.170.252.104"
+ mmsport="9093"
+ type="mms"
+ />
+
+ <apn carrier="Sphone Pelephone"
+ mcc="425"
+ mnc="03"
+ apn="sphone.pelephone.net.il"
+ user="pcl@3g"
+ password="pcl"
+ type="default,supl"
+ />
+
+
+ <apn carrier="Internet"
+ mcc="426"
+ mnc="01"
+ apn="internet.batelco.com"
+ type="default,supl"
+ />
+
+ <apn carrier="BAT MMS"
+ mcc="426"
+ mnc="01"
+ apn="mms.batelco.com"
+ mmsc="http://192.168.36.10/servlets/mms"
+ mmsproxy="192.168.1.2"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Zain Internet"
+ mcc="426"
+ mnc="02"
+ apn="connect.mobilinkworld.com"
+ user="Mobilink"
+ password="Mobilink"
+ type="default,supl"
+ />
+
+ <apn carrier="Zain MMS"
+ mcc="426"
+ mnc="02"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://172.18.83.129"
+ mmsproxy="172.18.85.34"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="VIVAGPRS"
+ mcc="426"
+ mnc="04"
+ apn="viva.bh"
+ type="default,supl"
+ />
+
+ <apn carrier="VIVAMMS"
+ mcc="426"
+ mnc="04"
+ apn="vivawap.bh"
+ mmsc="http://mms.viva.com.bh:38090"
+ mmsproxy="172.18.142.36"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Qtel MMS"
+ mcc="427"
+ mnc="01"
+ apn="mms.qtel"
+ user="mms"
+ password="mms"
+ mmsc="http://mmsr.qtelmms.qa"
+ mmsproxy="10.23.8.3"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Qtel GPRS"
+ mcc="427"
+ mnc="01"
+ apn="gprs.qtel"
+ user="gprs"
+ password="gprs"
+ proxy="10.23.8.3"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="VFQ MMS"
+ mcc="427"
+ mnc="02"
+ apn="vodafone.com.qa"
+ mmsc="http://mms.vodafone.com.qa/mmsc"
+ mmsproxy="10.101.97.102"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="VFQ Mobile Internet"
+ mcc="427"
+ mnc="02"
+ apn="web.vodafone.com.qa"
+ type="default,supl"
+ />
+
+ <!-- APNs for Japanese phone carriers -->
+ <apn carrier="spモード"
+ mcc="440"
+ mnc="10"
+ apn="spmode.ne.jp"
+ user=""
+ server=""
+ password=""
+ mmsc=""
+ />
+
+ <apn carrier="mopera U(スマートフォン定額)"
+ mcc="440"
+ mnc="10"
+ apn="mpr2.bizho.net"
+ user=""
+ server=""
+ password=""
+ mmsc=""
+ />
+
+ <apn carrier="mopera U設定"
+ mcc="440"
+ mnc="10"
+ apn="0120.mopera.net"
+ user=""
+ server=""
+ password=""
+ mmsc=""
+ />
+
+ <apn carrier="SK Telecom"
+ mcc="450"
+ mnc="05"
+ apn="web.sktelecom.com"
+ mmsc="http://omms.nate.com:9082/oma_mms"
+ mmsproxy="smart.nate.com"
+ mmsport="9093"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="SK Telecom (Roaming)"
+ mcc="450"
+ mnc="05"
+ apn="roaming.sktelecom.com"
+ mmsc="http://omms.nate.com:9082/oma_mms"
+ mmsproxy="smart.nate.com"
+ mmsport="9093"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="KT-HSDPA"
+ mcc="450"
+ mnc="08"
+ apn="alwayson-r6.ktfwing.com"
+ mmsc="http://mmsc.ktfwing.com:9082"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="VN MOBIFONE MMS"
+ mcc="452"
+ mnc="01"
+ apn="m-i090"
+ user="mms"
+ password="mms"
+ mmsc="http://203.162.21.114/mmsc"
+ mmsproxy="203.162.21.114"
+ mmsport="3130"
+ type="mms"
+ />
+
+ <apn carrier="VN MOBIFONE Email"
+ mcc="452"
+ mnc="01"
+ apn="m-wap"
+ user="mms"
+ password="mms"
+ type="default,supl"
+ />
+
+ <apn carrier="Vinaphone MMS"
+ mcc="452"
+ mnc="02"
+ apn="m3-mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.vinaphone.com.vn"
+ mmsproxy="10.1.10.46"
+ mmsport="8000"
+ type="mms"
+ />
+
+ <apn carrier="Vinaphone Email"
+ mcc="452"
+ mnc="02"
+ apn="m3-world"
+ user="mms"
+ password="mms"
+ type="default,supl"
+ />
+
+ <apn carrier="Viettel Email"
+ mcc="452"
+ mnc="04"
+ apn="v-internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Viettel MMS"
+ mcc="452"
+ mnc="04"
+ apn="v-mms"
+ mmsc="http://mms.viettelmobile.com.vn/mms/wapenc"
+ mmsproxy="192.168.233.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vietnamobile Email"
+ mcc="452"
+ mnc="05"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Vietnamobile MMS"
+ mcc="452"
+ mnc="05"
+ apn="mms"
+ mmsc="http://10.10.128.58/servlets/mms"
+ mmsproxy="10.10.128.44"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="BEELINE Email"
+ mcc="452"
+ mnc="07"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="BEELINE MMS"
+ mcc="452"
+ mnc="07"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms"
+ mmsproxy="10.16.70.199"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="EVNTelecom Email"
+ mcc="452"
+ mnc="08"
+ apn="e-internet"
+ type="default,supl"
+ />
+
+ <apn carrier="EVNTelecom MMS"
+ mcc="452"
+ mnc="08"
+ apn="e-wap"
+ mmsc="http://10.18.2.172:38090"
+ mmsproxy="10.18.2.183"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CSL Data"
+ mcc="454"
+ mnc="00"
+ apn="hkcsl"
+ mmsc="http://192.168.58.171:8002"
+ mmsproxy="192.168.59.51"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="CSL Data"
+ mcc="454"
+ mnc="02"
+ apn="hkcsl"
+ mmsc="http://192.168.58.171:8002"
+ mmsproxy="192.168.59.51"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="3"
+ mcc="454"
+ mnc="03"
+ apn="mobile.three.com.hk"
+ mmsc="http://mms.um.three.com.hk:10021/mmsc"
+ mmsproxy="172.20.97.116"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="3-DB-MMS"
+ mcc="454"
+ mnc="04"
+ apn="mms-g.three.com.hk"
+ mmsc="http://10.30.15.51:10021/mmsc"
+ mmsproxy="10.30.15.53"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="3-DB-GPRS"
+ mcc="454"
+ mnc="04"
+ apn="web-g.three.com.hk"
+ proxy="10.30.15.53"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="SmarTone HK"
+ mcc="454"
+ mnc="06"
+ apn="SmarTone"
+ mmsc="http://mms.smartone.com/server"
+ mmsproxy="10.9.9.9"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="CSL Data"
+ mcc="454"
+ mnc="10"
+ apn="hkcsl"
+ mmsc="http://192.168.58.171:8002"
+ mmsproxy="192.168.59.51"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="CMHK MMS"
+ mcc="454"
+ mnc="12"
+ apn="peoples.mms"
+ mmsc="http://mms.hk.chinamobile.com/mms"
+ mmsproxy="172.31.31.36"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CMHK GPRS"
+ mcc="454"
+ mnc="12"
+ apn="peoples.net"
+ proxy="172.31.31.36"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="PCCW_GPRS"
+ mcc="454"
+ mnc="16"
+ apn="pccwdata"
+ proxy="10.131.2.8"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="PCCW_MMS"
+ mcc="454"
+ mnc="16"
+ apn="pccwmms"
+ mmsc="http://mmsc.mms.pccwmobile.com:8002/"
+ mmsproxy="10.131.2.8"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="CSL Data"
+ mcc="454"
+ mnc="18"
+ apn="hkcsl"
+ mmsc="http://192.168.58.171:8002"
+ mmsproxy="192.168.59.51"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="PCCW 3G"
+ mcc="454"
+ mnc="19"
+ apn="pccw"
+ mmsc="http://3gmms.pccwmobile.com:8080/was"
+ mmsproxy="10.140.14.10"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="SmarTone MAC"
+ mcc="455"
+ mnc="00"
+ apn="smartgprs"
+ proxy="10.9.9.29"
+ port="8080"
+ mmsc="http://mms.smartone.com.mo/dmog/mo"
+ mmsproxy="10.9.9.29"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="CTM"
+ mcc="455"
+ mnc="01"
+ apn="ctm-mobile"
+ proxy="192.168.99.2"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="CTM MMS"
+ mcc="455"
+ mnc="01"
+ apn="ctmmms"
+ mmsc="http://mms.wap.ctm.net:8002"
+ mmsproxy="192.168.99.3"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="3 Macau MMS"
+ mcc="455"
+ mnc="03"
+ apn="mms.hutchisonmacau.com"
+ mmsc="http://10.30.15.51:10021/mmsc"
+ mmsproxy="10.30.15.53"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+
+ <apn carrier="3 Macau"
+ mcc="455"
+ mnc="03"
+ apn="web-g.three.com.hk"
+ user="hutchison"
+ password="1234"
+ type="default,supl"
+ />
+
+ <apn carrier="CTM"
+ mcc="455"
+ mnc="04"
+ apn="ctm-mobile"
+ proxy="192.168.99.2"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="CTM MMS"
+ mcc="455"
+ mnc="04"
+ apn="ctmmms"
+ mmsc="http://mms.wap.ctm.net:8002"
+ mmsproxy="192.168.99.3"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="中国移动 (China Mobile) GPRS"
+ mcc="460"
+ mnc="00"
+ apn="cmnet"
+ type="default,supl"
+ />
+
+ <apn carrier="中国移动 (China Mobile) WAP"
+ mcc="460"
+ mnc="00"
+ apn="cmwap"
+ proxy="10.0.0.172"
+ port="80"
+ type="default,supl"
+ />
+
+ <apn carrier="中国移动彩信 (China Mobile)"
+ mcc="460"
+ mnc="00"
+ apn="cmwap"
+ proxy="10.0.0.172"
+ port="80"
+ mmsc="http://mmsc.monternet.com"
+ mmsproxy="10.0.0.172"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="沃3G连接互联网 (China Unicom)"
+ mcc="460"
+ mnc="01"
+ apn="3gnet"
+ type="default,supl"
+ />
+
+ <apn carrier="沃3G手机上网 (China Unicom)"
+ mcc="460"
+ mnc="01"
+ apn="3gwap"
+ proxy="10.0.0.172"
+ port="80"
+ type="default,supl"
+ />
+
+ <apn carrier="联通2GNET上网 (China Unicom)"
+ mcc="460"
+ mnc="01"
+ apn="uninet"
+ type="default,supl"
+ />
+
+ <apn carrier="联通彩信 (China Unicom)"
+ mcc="460"
+ mnc="01"
+ apn="3gwap"
+ mmsc="http://mmsc.myuni.com.cn"
+ mmsproxy="10.0.0.172"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="联通2g彩信 (China Unicom)"
+ mcc="460"
+ mnc="01"
+ apn="uniwap"
+ mmsc="http://mmsc.myuni.com.cn"
+ mmsproxy="10.0.0.172"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="中国移动 (China Mobile) GPRS"
+ mcc="460"
+ mnc="02"
+ apn="cmnet"
+ type="default,supl"
+ />
+
+ <apn carrier="中国移动 (China Mobile) WAP"
+ mcc="460"
+ mnc="02"
+ apn="cmwap"
+ proxy="10.0.0.172"
+ port="80"
+ type="default,supl"
+ />
+
+ <apn carrier="中国移动彩信 (China Mobile)"
+ mcc="460"
+ mnc="02"
+ apn="cmwap"
+ proxy="10.0.0.172"
+ port="80"
+ mmsc="http://mmsc.monternet.com"
+ mmsproxy="10.0.0.172"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="中国移动 (China Mobile) GPRS"
+ mcc="460"
+ mnc="07"
+ apn="cmnet"
+ type="default,supl"
+ />
+
+ <apn carrier="中国移动 (China Mobile) WAP"
+ mcc="460"
+ mnc="07"
+ apn="cmwap"
+ proxy="10.0.0.172"
+ port="80"
+ type="default,supl"
+ />
+
+ <apn carrier="中国移动彩信 (China Mobile)"
+ mcc="460"
+ mnc="07"
+ apn="cmwap"
+ proxy="10.0.0.172"
+ port="80"
+ mmsc="http://mmsc.monternet.com"
+ mmsproxy="10.0.0.172"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="遠傳電信(Far EasTone) (MMS)"
+ mcc="466"
+ mnc="01"
+ apn="fetnet01"
+ mmsc="http://mms"
+ mmsproxy="210.241.199.199"
+ mmsport="9201"
+ type="mms"
+ />
+
+ <apn carrier="遠傳電信(Far EasTone) (Internet)"
+ mcc="466"
+ mnc="01"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="和信電訊(KGT-Online) (Internet)"
+ mcc="466"
+ mnc="88"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="和信電訊(KGT-Online) (MMS)"
+ mcc="466"
+ mnc="88"
+ apn="kgtmms"
+ mmsc="http://mms.kgtmms.net.tw/mms/wapenc"
+ mmsproxy="172.28.33.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="威寶電信(VIBO)"
+ mcc="466"
+ mnc="89"
+ apn="vibo"
+ mmsc="http://mms"
+ mmsproxy="172.24.128.36"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="中華電信(Chunghwa) (Internet)"
+ mcc="466"
+ mnc="92"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="中華電信(Chunghwa)"
+ mcc="466"
+ mnc="92"
+ apn="emome"
+ mmsc="http://mms.emome.net:8002"
+ mmsproxy="10.1.1.1"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="台灣大哥大(TW Mobile) (Internet)"
+ mcc="466"
+ mnc="93"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="台灣大哥大(TW Mobile) (twm)"
+ mcc="466"
+ mnc="93"
+ apn="TWM"
+ type="default,supl"
+ />
+
+ <apn carrier="台灣大哥大(TW Mobile) (MMS)"
+ mcc="466"
+ mnc="93"
+ apn="mms"
+ mmsc="http://mms.catch.net.tw"
+ mmsproxy="10.1.1.2"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="台灣大哥大(TW Mobile) (Internet)"
+ mcc="466"
+ mnc="97"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="台灣大哥大(TW Mobile) (twm)"
+ mcc="466"
+ mnc="97"
+ apn="TWM"
+ type="default,supl"
+ />
+
+ <apn carrier="台灣大哥大(TW Mobile) (MMS)"
+ mcc="466"
+ mnc="97"
+ apn="mms"
+ mmsc="http://mms.catch.net.tw"
+ mmsproxy="10.1.1.2"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="台灣大哥大(TW Mobile) (Internet)"
+ mcc="466"
+ mnc="99"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="台灣大哥大(TW Mobile) (twm)"
+ mcc="466"
+ mnc="99"
+ apn="TWM"
+ type="default,supl"
+ />
+
+ <apn carrier="台灣大哥大(TW Mobile) (MMS)"
+ mcc="466"
+ mnc="99"
+ apn="mms"
+ mmsc="http://mms.catch.net.tw"
+ mmsproxy="10.1.1.2"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Maxis MMS"
+ mcc="502"
+ mnc="12"
+ apn="net"
+ user="maxis"
+ password="wap"
+ mmsc="http://172.16.74.100:10021/mmsc"
+ mmsproxy="202.75.133.49"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Maxis Internet"
+ mcc="502"
+ mnc="12"
+ apn="net"
+ user="maxis"
+ password="wap"
+ type="default,supl"
+ />
+
+ <apn carrier="Maxis 3G MMS"
+ mcc="502"
+ mnc="12"
+ apn="unet"
+ user="maxis"
+ password="wap"
+ mmsc="http://172.16.74.100:10021/mmsc"
+ mmsproxy="202.75.133.49"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Maxis 3G Internet"
+ mcc="502"
+ mnc="12"
+ apn="unet"
+ user="maxis"
+ password="wap"
+ type="default,supl"
+ />
+
+ <apn carrier="DiGi MMS"
+ mcc="502"
+ mnc="16"
+ apn="digimms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.digi.com.my/servlets/mms"
+ mmsproxy="203.92.128.160"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="DiGi Internet"
+ mcc="502"
+ mnc="16"
+ apn="diginet"
+ type="default,supl"
+ />
+
+ <apn carrier="U Mobile MMS"
+ mcc="502"
+ mnc="18"
+ apn="my3g"
+ mmsc="http://10.30.3.11/servlets/mms"
+ mmsproxy="10.30.5.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="U Mobile Internet"
+ mcc="502"
+ mnc="18"
+ apn="my3g"
+ type="default,supl"
+ />
+
+ <apn carrier="Celcom Internet"
+ mcc="502"
+ mnc="19"
+ apn="celcom.net.my"
+ type="default,supl"
+ />
+
+ <apn carrier="Celcom 3G MMS"
+ mcc="502"
+ mnc="19"
+ apn="celcom3g"
+ mmsc="http://mms.celcom.net.my"
+ mmsproxy="10.128.1.242"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Celcom 3G Internet"
+ mcc="502"
+ mnc="19"
+ apn="celcom3g"
+ type="default,supl"
+ />
+
+ <apn carrier="Celcom MMS"
+ mcc="502"
+ mnc="19"
+ apn="mms.celcom.net.my"
+ mmsc="http://mms.celcom.net.my"
+ mmsproxy="10.128.1.242"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Telstra MMS"
+ mcc="505"
+ mnc="01"
+ apn="telstra.mms"
+ mmsc="http://mmsc.telstra.com:8002"
+ mmsproxy="10.1.1.180"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Telstra Internet"
+ mcc="505"
+ mnc="01"
+ apn="telstra.wap"
+ type="default,supl"
+ />
+
+ <apn carrier="Optus Yes Internet"
+ mcc="505"
+ mnc="02"
+ apn="yesinternet"
+ type="default,supl"
+ />
+
+ <apn carrier="Optus MMS"
+ mcc="505"
+ mnc="02"
+ apn="mms"
+ mmsc="http://mmsc.optus.com.au:8002/"
+ mmsproxy="61.88.190.10"
+ mmsport="8070"
+ type="mms"
+ />
+
+ <apn carrier="Vodafone live!"
+ mcc="505"
+ mnc="03"
+ apn="live.vodafone.com"
+ mmsc="http://pxt.vodafone.net.au/pxtsend"
+ mmsproxy="10.202.2.60"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Planet 3"
+ mcc="505"
+ mnc="06"
+ apn="3services"
+ mmsc="http://mmsc.three.net.au:10021/mmsc"
+ mmsproxy="10.176.57.25"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="VF AU PXT"
+ mcc="505"
+ mnc="07"
+ apn="live.vodafone.com"
+ mmsc="http://pxt.vodafone.net.au/pxtsend"
+ mmsproxy="10.202.2.60"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="VF Internet"
+ mcc="505"
+ mnc="07"
+ apn="vfinternet.au"
+ type="default,supl"
+ />
+
+ <apn carrier="Telstra MMS"
+ mcc="505"
+ mnc="11"
+ apn="Telstra.mms"
+ mmsc="http://mmsc.telstra.com:8002"
+ mmsproxy="10.1.1.180"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Telstra Internet"
+ mcc="505"
+ mnc="11"
+ apn="Telstra.wap"
+ type="default,supl"
+ />
+
+ <apn carrier="3Internet"
+ mcc="505"
+ mnc="12"
+ apn="3netaccess"
+ type="default,supl"
+ />
+
+ <apn carrier="3"
+ mcc="505"
+ mnc="12"
+ apn="3services"
+ mmsc="http://mmsc.three.net.au:10021/mmsc"
+ mmsproxy="10.176.57.25"
+ mmsport="8799"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Telstra MMS"
+ mcc="505"
+ mnc="71"
+ apn="Telstra.mms"
+ mmsc="http://mmsc.telstra.com:8002"
+ mmsproxy="10.1.1.180"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Telstra Internet"
+ mcc="505"
+ mnc="71"
+ apn="Telstra.wap"
+ type="default,supl"
+ />
+
+ <apn carrier="Telstra MMS"
+ mcc="505"
+ mnc="72"
+ apn="Telstra.mms"
+ mmsc="http://mmsc.telstra.com:8002"
+ mmsproxy="10.1.1.180"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Telstra Internet"
+ mcc="505"
+ mnc="72"
+ apn="Telstra.wap"
+ type="default,supl"
+ />
+
+ <apn carrier="VF AU PXT"
+ mcc="505"
+ mnc="88"
+ apn="live.vodafone.com"
+ mmsc="http://pxt.vodafone.net.au/pxtsend"
+ mmsproxy="10.202.2.60"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="VF Internet"
+ mcc="505"
+ mnc="88"
+ apn="vfinternet.au"
+ type="default,supl"
+ />
+
+ <apn carrier="Optus Internet"
+ mcc="505"
+ mnc="90"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Optus MMS"
+ mcc="505"
+ mnc="90"
+ apn="mms"
+ mmsc="http://mmsc.optus.com.au:8002/"
+ mmsproxy="61.88.190.10"
+ mmsport="8070"
+ type="mms"
+ />
+
+ <apn carrier="ISAT BB INTERNET"
+ mcc="510"
+ mnc="01"
+ apn="indosat3g"
+ user="indosat"
+ password="indosat"
+ proxy="10.19.19.19"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="ISAT WAP"
+ mcc="510"
+ mnc="01"
+ apn="indosatgprs"
+ user="indosat"
+ password="indosat"
+ type="default,supl"
+ />
+
+ <apn carrier="ISAT MMS"
+ mcc="510"
+ mnc="01"
+ apn="indosatmms"
+ user="indosat"
+ password="indosat"
+ mmsc="http://mmsc.indosat.com"
+ mmsproxy="10.19.19.19"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AXISinternet"
+ mcc="510"
+ mnc="08"
+ apn="AXIS"
+ user="AXIS"
+ password="123456"
+ type="default,supl"
+ />
+
+ <apn carrier="AXIS MMS"
+ mcc="510"
+ mnc="08"
+ apn="axismms"
+ user="axis"
+ password="123456"
+ mmsc="http://mmsc.axis"
+ mmsproxy="10.8.3.8"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Telkomsel GPRS WEB"
+ mcc="510"
+ mnc="10"
+ apn="internet"
+ user="wap"
+ password="wap123"
+ type="default,supl"
+ />
+
+ <apn carrier="TSEL MMS"
+ mcc="510"
+ mnc="10"
+ apn="mms"
+ user="wap"
+ password="wap123"
+ mmsc="http://mms.telkomsel.com"
+ mmsproxy="10.1.89.150"
+ mmsport="8000"
+ type="mms"
+ />
+
+ <apn carrier="XL GPRS"
+ mcc="510"
+ mnc="11"
+ apn="www.xlgprs.net"
+ user="xlgprs"
+ password="proxl"
+ type="default,supl"
+ />
+
+ <apn carrier="XL MMS"
+ mcc="510"
+ mnc="11"
+ apn="www.xlmms.net"
+ user="xlgprs"
+ password="proxl"
+ mmsc="http://mmc.xl.net.id/servlets/mms"
+ mmsproxy="202.152.240.50"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="XL Unlimited"
+ mcc="510"
+ mnc="11"
+ apn="xlunlimited"
+ type="default,supl"
+ />
+
+ <apn carrier="ISAT M3 INTERNET"
+ mcc="510"
+ mnc="21"
+ apn="indosatgprs"
+ user="indosat"
+ password="indosat"
+ type="default,supl"
+ />
+
+
+ <apn carrier="ISAT BB MMS"
+ mcc="510"
+ mnc="01"
+ apn="indosatmms"
+ user="indosat"
+ password="indosat"
+ mmsc="http://mmsc.indosat.com"
+ mmsproxy="10.19.19.19"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="3 GPRS"
+ mcc="510"
+ mnc="89"
+ apn="3gprs"
+ user="3gprs"
+ password="3gprs"
+ type="default,supl"
+ />
+
+ <apn carrier="3 MMS"
+ mcc="510"
+ mnc="89"
+ apn="3mms"
+ user="3mms"
+ password="3mms"
+ mmsc="http://mms.three.co.id"
+ mmsproxy="10.4.0.10"
+ mmsport="3128"
+ type="mms"
+ />
+
+ <apn carrier="myGlobe Internet Postpaid"
+ mcc="515"
+ mnc="02"
+ apn="internet.globe.com.ph"
+ type="default,supl"
+ />
+
+ <apn carrier="myGlobe Internet Prepaid"
+ mcc="515"
+ mnc="02"
+ apn="http.globe.com.ph"
+ type="default,supl"
+ />
+
+ <apn carrier="myGlobe MMS"
+ mcc="515"
+ mnc="02"
+ apn="mms.globe.com.ph"
+ mmsc="http://192.40.100.22:10021/mmsc"
+ mmsproxy="203.177.42.214"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Smart Internet"
+ mcc="515"
+ mnc="03"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="SmartMMS"
+ mcc="515"
+ mnc="03"
+ apn="mms"
+ mmsc="http://10.102.61.238:8002"
+ mmsproxy="10.102.61.46"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="SUN INTERNET"
+ mcc="515"
+ mnc="05"
+ apn="minternet"
+ type="default,supl"
+ />
+
+ <apn carrier="SUN MMS"
+ mcc="515"
+ mnc="05"
+ apn="mms"
+ mmsc="http://mmscenter.suncellular.com.ph"
+ mmsproxy="202.138.159.78"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="RED INTERNET"
+ mcc="515"
+ mnc="18"
+ apn="redinternet"
+ type="default,supl"
+ />
+
+ <apn carrier="RED MMS"
+ mcc="515"
+ mnc="18"
+ apn="redmms"
+ mmsc="http://10.102.61.193:8002/mmsc"
+ mmsproxy="10.138.3.35"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="AIS Internet"
+ mcc="520"
+ mnc="01"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="AIS MMS"
+ mcc="520"
+ mnc="01"
+ apn="multimedia"
+ mmsc="http://mms.mobilelife.co.th"
+ mmsproxy="203.170.229.34"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="DTAC MMS"
+ mcc="520"
+ mnc="18"
+ apn="mms"
+ mmsc="http://mms.dtac.co.th:8002/"
+ mmsproxy="203.155.200.133"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="DTAC Internet"
+ mcc="520"
+ mnc="18"
+ apn="www.dtac.co.th"
+ type="default,supl"
+ />
+
+ <apn carrier="True GPRS Inet"
+ mcc="520"
+ mnc="99"
+ apn="internet"
+ user="true"
+ password="true"
+ type="default,supl"
+ />
+
+ <apn carrier="True GPRS MMS"
+ mcc="520"
+ mnc="99"
+ apn="mms"
+ user="true"
+ password="true"
+ mmsc="http://mms.trueworld.net:8002/"
+ mmsproxy="10.4.7.39"
+ mmsport="8080"
+ type="mms"
+ />
+
+
+ <apn carrier="IDEAS E-mail"
+ mcc="525"
+ mnc="01"
+ apn="e-ideas"
+ mmsc="http://mms.singtel.com:10021/mmsc"
+ mmsproxy="165.21.42.84"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="IDEAS E-mail"
+ mcc="525"
+ mnc="02"
+ apn="e-ideas"
+ mmsc="http://mms.singtel.com:10021/mmsc"
+ mmsproxy="165.21.42.84"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="M1 MMS"
+ mcc="525"
+ mnc="03"
+ apn="miworld"
+ user="65"
+ password="user123"
+ mmsc="http://mmsgw:8002"
+ mmsproxy="172.16.14.10"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="M1 E-mail"
+ mcc="525"
+ mnc="03"
+ apn="sunsurf"
+ user="65"
+ type="default,supl"
+ />
+
+ <apn carrier="StarHub"
+ mcc="525"
+ mnc="05"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="Gee! MMS"
+ mcc="525"
+ mnc="05"
+ apn="shmms"
+ user="star"
+ password="hub"
+ mmsc="http://mms.starhubgee.com.sg:8002"
+ mmsproxy="10.12.1.80"
+ mmsport="80"
+ type="mms"
+ />
+
+
+ <apn carrier="Gee!"
+ mcc="525"
+ mnc="05"
+ apn="shwap"
+ user="star"
+ password="hub"
+ proxy="10.12.1.2"
+ port="80"
+ type="default,supl"
+ />
+
+ <apn carrier="StarHub E-mail"
+ mcc="525"
+ mnc="05"
+ apn="shwap"
+ type="default,supl"
+ />
+
+ <apn carrier="VFNZ PXT"
+ mcc="530"
+ mnc="01"
+ apn="live.vodafone.com"
+ mmsc="http://pxt.vodafone.net.nz/pxtsend"
+ mmsproxy="172.30.38.3"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="VFNZ Internet"
+ mcc="530"
+ mnc="01"
+ apn="www.vodafone.net.nz"
+ type="default,supl"
+ />
+
+ <apn carrier="TelecomDefault"
+ mcc="530"
+ mnc="05"
+ apn="wap.telecom.co.nz"
+ type="default,supl"
+ />
+
+ <apn carrier="Telecom MMS"
+ mcc="530"
+ mnc="05"
+ apn="wap.telecom.co.nz"
+ mmsc="http://lsmmsc.xtra.co.nz"
+ mmsproxy="210.55.11.73"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="2degrees Internet"
+ mcc="530"
+ mnc="24"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="2degrees MMS"
+ mcc="530"
+ mnc="24"
+ apn="mms"
+ mmsc="http://mms.2degreesmobile.net.nz:48090"
+ mmsproxy="118.148.1.118"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Mobinil Web"
+ mcc="602"
+ mnc="01"
+ apn="MobinilWeb"
+ type="default,supl"
+ />
+
+ <apn carrier="Mobinil MMS"
+ mcc="602"
+ mnc="01"
+ apn="mobinilmms"
+ mmsc="http://10.7.13.24:8002/"
+ mmsproxy="62.241.155.45"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="VF internet"
+ mcc="602"
+ mnc="02"
+ apn="internet.vodafone.net"
+ user="internet"
+ password="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="VF MMS"
+ mcc="602"
+ mnc="02"
+ apn="mms.vodafone.com.eg"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.vodafone.com.eg/servlets/mms"
+ mmsproxy="163.121.178.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Etisalat internet"
+ mcc="602"
+ mnc="03"
+ apn="Etisalat"
+ type="default,supl"
+ />
+
+ <apn carrier="Etisalat MMS"
+ mcc="602"
+ mnc="03"
+ apn="Etisalat"
+ mmsc="http://10.71.131.7:38090"
+ mmsproxy="10.71.130.29"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="weborange"
+ mcc="605"
+ mnc="01"
+ apn="weborange"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="605"
+ mnc="01"
+ apn="mms.otun"
+ mmsc="http://mms.orange.tn"
+ mmsproxy="10.12.1.52"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="mobinet"
+ mcc="605"
+ mnc="02"
+ apn="gprs.tn"
+ user="gprs"
+ password="gprs"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS"
+ mcc="605"
+ mnc="02"
+ apn="mms.tn"
+ user="mms@tt1"
+ password="mms"
+ mmsc="http://"
+ mmsproxy="192.168.0.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="internet Tunisiana"
+ mcc="605"
+ mnc="03"
+ apn="internet.tunisiana.com"
+ user="internet"
+ password="internet"
+ proxy="10.3.2.99"
+ port="80"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS Tunisiana"
+ mcc="605"
+ mnc="03"
+ apn="mms.tunisiana.com"
+ user="mms"
+ password="mms"
+ mmsc="http://mmsc.tunisiana.com"
+ mmsproxy="10.3.2.100"
+ mmsport="80"
+ type="mms"
+ />
+
+ <apn carrier="Zain Mobile Internet"
+ mcc="621"
+ mnc="20"
+ apn="internet.ng.Zain.com"
+ type="default,supl"
+ />
+
+ <apn carrier="Zain MMS"
+ mcc="621"
+ mnc="20"
+ apn="mms.ng.zain.com"
+ user="mms"
+ password="mms"
+ mmsc="http://172.23.1.12/mms/wapenc"
+ mmsproxy="172.18.254.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="MTN GPRS"
+ mcc="621"
+ mnc="30"
+ apn="web.gprs.mtnnigeria.net"
+ user="web"
+ password="web"
+ proxy="10.199.212.2"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="MTN MMS"
+ mcc="621"
+ mnc="30"
+ apn="web.gprs.mtnnigeria.net"
+ user="web"
+ password="web"
+ mmsc="http://10.199.212.8/servlets/mms"
+ mmsproxy="10.199.212.2"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="glo direct"
+ mcc="621"
+ mnc="50"
+ apn="glosecure"
+ user="gprs"
+ password="gprs"
+ type="default,supl"
+ />
+
+ <apn carrier="glo mms"
+ mcc="621"
+ mnc="50"
+ apn="glomms"
+ user="mms"
+ password="mms"
+ mmsc="http://mms.gloworld.com/mmsc"
+ mmsproxy="10.100.82.4"
+ mmsport="9201"
+ type="mms"
+ />
+
+ <apn carrier="Etisalat Internet"
+ mcc="621"
+ mnc="60"
+ apn="etisalat"
+ type="default,supl"
+ />
+
+ <apn carrier="Etisalat MMS"
+ mcc="621"
+ mnc="60"
+ apn="etisalat"
+ mmsc="http://10.71.170.30:38090/was"
+ mmsproxy="10.71.170.5"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="SafaricomBrowse"
+ mcc="639"
+ mnc="02"
+ apn="Safaricom"
+ user="saf"
+ password="data"
+ proxy="172.22.2.38"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="SafaricomMMS"
+ mcc="639"
+ mnc="02"
+ apn="Safaricom"
+ user="saf"
+ password="data"
+ mmsc="http://mms.gprs.safaricom.com"
+ type="mms"
+ />
+
+ <apn carrier="Zain WAP"
+ mcc="639"
+ mnc="03"
+ apn="wap.ke.celtel.com"
+ user="wap"
+ password="wap"
+ type="default,supl"
+ />
+
+ <apn carrier="Zain MMS"
+ mcc="639"
+ mnc="03"
+ apn="mms.ke.celtel.com"
+ user="wap"
+ password="wap"
+ mmsc="http://mms.ke.celtel.com/servlets/mms"
+ type="mms"
+ />
+
+ <apn carrier="Orange Internet"
+ mcc="639"
+ mnc="07"
+ apn="wap.orange.co.ke"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange MMS"
+ mcc="639"
+ mnc="07"
+ apn="mms.orange.co.ke"
+ mmsproxy="10.36.16.5"
+ mmsport="8080"
+ mmsc="http://10.36.16.5/servlets/mms"
+ type="mms"
+ />
+
+ <apn carrier="Vodacom WAP"
+ mcc="640"
+ mnc="04"
+ apn="Wap"
+ proxy="10.154.0.8"
+ port="9401"
+ type="default,supl"
+ />
+
+ <apn carrier="Vodacom MMS"
+ mcc="640"
+ mnc="04"
+ apn="mms"
+ mmsc="http://10.154.0.12/mms/"
+ type="mms"
+ />
+
+ <apn carrier="Orange World re"
+ mcc="647"
+ mnc="00"
+ apn="orangerun"
+ user="orange"
+ password="orange"
+ type="default,supl"
+ />
+
+ <apn carrier="Orange MMS Réunion"
+ mcc="647"
+ mnc="00"
+ apn="orangerun.acte"
+ user="orange"
+ password="orange"
+ mmsc="http://mms.orange.re"
+ mmsproxy="192.168.10.200"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="MMS"
+ mcc="647"
+ mnc="10"
+ apn="mmssfr"
+ user="mms"
+ password="mms"
+ mmsc="http://mms"
+ mmsproxy="10.0.224.145"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="GPRS SRR"
+ mcc="647"
+ mnc="10"
+ apn="wapsfr"
+ user="wap"
+ password="wap"
+ proxy="10.0.224.161"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="VCL Internet GPRS"
+ mcc="651"
+ mnc="01"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="VCL MMS GPRS"
+ mcc="651"
+ mnc="01"
+ apn="mms"
+ proxy="10.113.63.11"
+ port="8080"
+ mmsc="http://mmsc.vodacom4me.co.ls"
+ mmsproxy="10.113.63.11"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vodacom"
+ mcc="655"
+ mnc="01"
+ apn="internet"
+ proxy="196.6.128.12"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS.Vodacom"
+ mcc="655"
+ mnc="01"
+ apn="mms.vodacom.net"
+ proxy="196.6.128.13"
+ port="8080"
+ mmsc="http://mmsc.vodacom4me.co.za/"
+ mmsproxy="196.6.128.13"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="8.ta internet"
+ mcc="655"
+ mnc="02"
+ apn="internet"
+ type="default,supl"
+ />
+
+ <apn carrier="8.ta mms"
+ mcc="655"
+ mnc="02"
+ apn="mms"
+ proxy="41.151.254.162"
+ port="8080"
+ mmsc="http://mms.8ta.com:38090/was"
+ mmsproxy="41.151.254.162"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Smartdata"
+ mcc="655"
+ mnc="07"
+ apn="internet"
+ proxy="196.31.116.250"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="Cell C MMS"
+ mcc="655"
+ mnc="07"
+ apn="mms"
+ proxy="196.31.116.250"
+ port="8080"
+ mmsc="http://mms.cmobile.co.za"
+ mmsproxy="196.31.116.250"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="virgin_internet"
+ mcc="655"
+ mnc="07"
+ apn="vdata"
+ proxy="196.31.116.241"
+ port="8080"
+ type="default,supl"
+ />
+
+ <apn carrier="virgin_mms"
+ mcc="655"
+ mnc="07"
+ apn="vmms"
+ proxy="196.31.116.242"
+ port="8080"
+ mmsc="http://mms.virginmobile.co.za"
+ mmsproxy="196.31.116.242"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="MTN Data"
+ mcc="655"
+ mnc="10"
+ apn="myMTN"
+ user="mtn"
+ password="mtn"
+ mmsc="http://mms.mtn.co.za/mms/wapenc"
+ mmsproxy="196.11.240.241"
+ mmsport="8080"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="INTERNET CLARO"
+ mcc="704"
+ mnc="01"
+ apn="internet.ideasclaro"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS CLARO"
+ mcc="704"
+ mnc="01"
+ apn="mms.ideasclaro"
+ user=""
+ password=""
+ mmsproxy="216.230.133.66"
+ mmsport="8080"
+ mmsc="http://mms.ideasclaro.com:8002"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="BROADBAND TIGO"
+ mcc="704"
+ mnc="02"
+ apn="broadband.tigo.gt"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS TIGO"
+ mcc="704"
+ mnc="02"
+ apn="mms.tigo.gt"
+ user=""
+ password=""
+ mmsproxy="10.16.17.12"
+ mmsport="8888"
+ mmsc="http://mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Internet GT"
+ mcc="704"
+ mnc="03"
+ apn="internet.movistar.gt"
+ user="movistargt"
+ password="movistargt"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS2 GPRS"
+ mcc="704"
+ mnc="03"
+ apn="mms.movistar.gt"
+ user="movistargt"
+ password="movistargt"
+ mmsproxy="10.12.22.1"
+ mmsport="80"
+ mmsc="http://mms.movistar.gt"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Internet GT"
+ mcc="704"
+ mnc="030"
+ apn="internet.movistar.gt"
+ user="movistargt"
+ password="movistargt"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS2 GPRS"
+ mcc="704"
+ mnc="030"
+ apn="mms.movistar.gt"
+ user="movistargt"
+ password="movistargt"
+ mmsproxy="10.12.22.1"
+ mmsport="80"
+ mmsc="http://mms.movistar.gt"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET CLARO"
+ mcc="706"
+ mnc="01"
+ apn="internet.ideasclaro"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS CLARO"
+ mcc="706"
+ mnc="01"
+ apn="mms.ideasclaro"
+ user=""
+ password=""
+ mmsproxy="216.230.133.66"
+ mmsport="8080"
+ mmsc="http://mms.ideasclaro.com:8002"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="El Salvaldor Digicel"
+ mcc="706"
+ mnc="02"
+ apn="web.digicelsv.com"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS El Salvador"
+ mcc="706"
+ mnc="02"
+ apn="wap.digicelsv.com"
+ user=""
+ password=""
+ mmsproxy="172.26.5.12"
+ mmsport="8080"
+ mmsc="http://172.26.5.132/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="BROADBAND TIGO"
+ mcc="706"
+ mnc="03"
+ apn="broadband.tigo.sv"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS TIGO"
+ mcc="706"
+ mnc="03"
+ apn="mms.tigo.sv"
+ user=""
+ password=""
+ mmsproxy="10.16.17.12"
+ mmsport="8888"
+ mmsc="http://mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Internet SV"
+ mcc="706"
+ mnc="04"
+ apn="internet.movistar.sv"
+ user="movistarsv"
+ password="movistarsv"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS2 GPRS"
+ mcc="706"
+ mnc="04"
+ apn="mms.movistar.sv"
+ user="movistarsv"
+ password="movistarsv"
+ mmsproxy="10.12.20.1"
+ mmsport="80"
+ mmsc="http://mms.movistar.sv"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Internet SV"
+ mcc="706"
+ mnc="040"
+ apn="internet.movistar.sv"
+ user="movistarsv"
+ password="movistarsv"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS2 GPRS"
+ mcc="706"
+ mnc="040"
+ apn="mms.movistar.sv"
+ user="movistarsv"
+ password="movistarsv"
+ mmsproxy="10.12.20.1"
+ mmsport="80"
+ mmsc="http://mms.movistar.sv"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Internet Claro"
+ mcc="708"
+ mnc="001"
+ apn="web.megatel.hn"
+ user="webmegatel"
+ password="webmegatel"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Claro"
+ mcc="708"
+ mnc="001"
+ apn="mms.megatel.hn"
+ user="mmsmegatel"
+ password="mmsmegatel"
+ mmsproxy="10.6.32.2"
+ mmsport="8080"
+ mmsc="http://10.6.32.27/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET TIGO"
+ mcc="708"
+ mnc="02"
+ apn="internet.tigo.hn"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS TIGO"
+ mcc="708"
+ mnc="02"
+ apn="mms.tigo.hn"
+ user=""
+ password=""
+ mmsproxy="10.16.17.12"
+ mmsport="8888"
+ mmsc="http://mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET TIGO"
+ mcc="708"
+ mnc="020"
+ apn="internet.tigo.hn"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS TIGO"
+ mcc="708"
+ mnc="020"
+ apn="mms.tigo.hn"
+ user=""
+ password=""
+ mmsproxy="10.16.17.12"
+ mmsport="8888"
+ mmsc="http://mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET"
+ mcc="710"
+ mnc="21"
+ apn="web.emovil"
+ user="webemovil"
+ password="webemovil"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+
+ <apn carrier="MMS"
+ mcc="710"
+ mnc="21"
+ apn="mms.emovil"
+ user="mmsemovil"
+ password="mmsemovil"
+ mmsproxy="10.6.32.2"
+ mmsport="8080"
+ mmsc="http://10.6.32.27/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Internet GPRS"
+ mcc="710"
+ mnc="300"
+ apn="internet.movistar.ni"
+ user="movistarni"
+ password="movistarni"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="movistar MMS"
+ mcc="710"
+ mnc="300"
+ apn="mms.movistar.ni"
+ user="movistarni"
+ password="movistarni"
+ mmsproxy="10.12.23.1"
+ mmsport="80"
+ mmsc="http://mms.movistar.ni"
+ authtype="1"
+ type="mms"
+ />
+
+
+ <apn carrier="INTERNET"
+ mcc="710"
+ mnc="730"
+ apn="web.emovil"
+ user="webemovil"
+ password="webemovil"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS"
+ mcc="710"
+ mnc="730"
+ apn="mms.emovil"
+ user="mmsemovil"
+ password="mmsemovil"
+ mmsproxy="10.6.32.2"
+ mmsport="8080"
+ mmsc="http://10.6.32.27/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Kolbi"
+ mcc="712"
+ mnc="01"
+ apn="kolbi3g"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Multimedia"
+ mcc="712"
+ mnc="01"
+ apn="kolbi3g"
+ user=""
+ password=""
+ mmsproxy="10.184.202.24"
+ mmsport="8080"
+ mmsc="http://mmsice"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Kolbi"
+ mcc="712"
+ mnc="02"
+ apn="kolbi3g"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Multimedia"
+ mcc="712"
+ mnc="02"
+ apn="kolbi3g"
+ user=""
+ password=""
+ mmsproxy="10.184.202.24"
+ mmsport="8080"
+ mmsc="http://mmsice"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET CLARO"
+ mcc="712"
+ mnc="03"
+ apn="internet.ideasclaro"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS CLARO"
+ mcc="712"
+ mnc="03"
+ apn="mms.ideasclaro"
+ user=""
+ password=""
+ mmsproxy="216.230.133.66"
+ mmsport="8080"
+ mmsc="http://mms.ideasclaro.com:8002"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="movistar INTERNET"
+ mcc="712"
+ mnc="04"
+ apn="internet.movistar.cr"
+ user="movistarcr"
+ password="movistarcr"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="movistar MMS"
+ mcc="712"
+ mnc="04"
+ apn="mms.movistar.cr"
+ user="movistarcr"
+ password="movistarcr"
+ mmsproxy="10.221.79.83"
+ mmsport="80"
+ mmsc="http://mms.movistar.cr"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Wap"
+ mcc="714"
+ mnc="01"
+ apn="apn01.cwpanama.com.pa"
+ proxy="172.25.3.5"
+ port="8080"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Mms"
+ mcc="714"
+ mnc="01"
+ apn="apn02.cwpanama.com.pa"
+ user=""
+ password=""
+ mmsproxy="172.25.3.5"
+ mmsport="8080"
+ mmsc="http://mms.zonamovil.com.pa"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="movistar INTERNET"
+ mcc="714"
+ mnc="020"
+ apn="internet.movistar.pa"
+ user="movistarpa"
+ password="movistarpa"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="movistar MMS"
+ mcc="714"
+ mnc="020"
+ apn="mms.movistar.pa"
+ user="movistarpamms"
+ password="movistarpa"
+ mmsproxy="10.12.21.1"
+ mmsport="80"
+ mmsc="http://mms.movistar.pa"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="WEB Claro"
+ mcc="714"
+ mnc="03"
+ apn="web.claro.com.pa"
+ user="CLAROWEB"
+ password="CLAROWEB"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Claro"
+ mcc="714"
+ mnc="03"
+ apn="mms.claro.com.pa"
+ user="CLAROMMS"
+ password="CLAROMMS"
+ mmsproxy="10.240.3.129"
+ mmsport="8799"
+ mmsc="http://www.claro.com.pa/mms/"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="INTERNET Panama"
+ mcc="714"
+ mnc="04"
+ apn="web.digicelpanama.com"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Panama"
+ mcc="714"
+ mnc="04"
+ apn="wap.digicelpanama.com"
+ user=""
+ password=""
+ mmsproxy="172.27.99.99"
+ mmsport="8080"
+ mmsc="http://mmc.digicelpanama.com/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="movistar Internet"
+ mcc="716"
+ mnc="06"
+ apn="movistar.pe"
+ user="movistar@datos"
+ password="movistar"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="movistar MMS"
+ mcc="716"
+ mnc="06"
+ apn="mms.movistar.pe"
+ user="movistar@mms"
+ password="movistar"
+ mmsproxy="200.4.196.118"
+ mmsport="8080"
+ mmsc="http://mmsc.telefonicamovistar.com.pe:8088/mms/"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="CLARO DATOS"
+ mcc="716"
+ mnc="10"
+ apn="claro.pe"
+ user="claro"
+ password="claro"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="CLARO MMS"
+ mcc="716"
+ mnc="10"
+ apn="mms.claro.pe"
+ user="claro"
+ password="claro"
+ mmsproxy="192.168.231.30"
+ mmsport="80"
+ mmsc="http://claro/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Movistar Emoción"
+ mcc="722"
+ mnc="07"
+ apn="wap.gprs.unifon.com.ar"
+ user="wap"
+ password="wap"
+ proxy="200.5.68.10"
+ port="8080"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Movistar MMS"
+ mcc="722"
+ mnc="07"
+ apn="mms.gprs.unifon.com.ar"
+ user="mms"
+ password="mms"
+ mmsproxy="200.68.32.239"
+ mmsport="8080"
+ mmsc="http://mms.movistar.com.ar"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Claro AR"
+ mcc="722"
+ mnc="31"
+ apn="igprs.claro.com.ar"
+ user="ctigprs"
+ password="ctigprs999"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS GPRS AR"
+ mcc="722"
+ mnc="31"
+ apn="mms.ctimovil.com.ar"
+ user="ctimms"
+ password="ctimms999"
+ mmsproxy="170.51.255.240"
+ mmsport="8080"
+ mmsc="http://mms.ctimovil.com.ar"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Claro AR"
+ mcc="722"
+ mnc="310"
+ apn="igprs.claro.com.ar"
+ user="ctigprs"
+ password="ctigprs999"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+
+ <apn carrier="MMS GPRS AR"
+ mcc="722"
+ mnc="310"
+ apn="mms.ctimovil.com.ar"
+ user="ctimms"
+ password="ctimms999"
+ mmsproxy="170.51.255.240"
+ mmsport="8080"
+ mmsc="http://mms.ctimovil.com.ar"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Personal Datos"
+ mcc="722"
+ mnc="34"
+ apn="datos.personal.com"
+ user="gprs"
+ password="adgj"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Personal MMS"
+ mcc="722"
+ mnc="34"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsproxy="172.25.7.31"
+ mmsport="8080"
+ mmsc="http://mms.personal.com"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Personal Datos"
+ mcc="722"
+ mnc="341"
+ apn="datos.personal.com"
+ user="gprs"
+ password="adgj"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Personal MMS"
+ mcc="722"
+ mnc="341"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsproxy="172.25.7.31"
+ mmsport="8080"
+ mmsc="http://mms.personal.com"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="TIM Connect"
+ mcc="724"
+ mnc="02"
+ apn="timbrasil.br"
+ user="tim"
+ password="tim"
+ mmsc="http://mms.tim.br"
+ mmsproxy="200.179.66.242"
+ mmsport="8080"
+ authtype="1"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="TIM Connect"
+ mcc="724"
+ mnc="03"
+ apn="timbrasil.br"
+ user="tim"
+ password="tim"
+ mmsc="http://mms.tim.br"
+ mmsproxy="200.179.66.242"
+ mmsport="8080"
+ authtype="1"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="TIM Connect"
+ mcc="724"
+ mnc="04"
+ apn="timbrasil.br"
+ user="tim"
+ password="tim"
+ mmsc="http://mms.tim.br"
+ mmsproxy="200.179.66.242"
+ mmsport="8080"
+ authtype="1"
+ type="default,supl,mms"
+ />
+
+ <apn carrier="Java Session"
+ mcc="724"
+ mnc="05"
+ apn="java.claro.com.br"
+ user="claro"
+ password="claro"
+ authtype="1"
+ type="default,supl"
+ />
+
+ <apn carrier="Claro Foto"
+ mcc="724"
+ mnc="05"
+ apn="mms.claro.com.br"
+ user="claro"
+ password="claro"
+ mmsc="http://mms.claro.com.br"
+ mmsproxy="200.169.126.10"
+ mmsport="8799"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Vivo MMS"
+ mcc="724"
+ mnc="06"
+ apn="mms.vivo.com.br"
+ user="vivo"
+ password="vivo"
+ mmsc="http://termnat.vivomms.com.br:8088/mms"
+ mmsproxy="200.142.130.104"
+ mmsport="80"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Vivo Internet"
+ mcc="724"
+ mnc="06"
+ apn="zap.vivo.com.br"
+ user="vivo"
+ password="vivo"
+ authtype="1"
+ type="default,supl"
+ />
+
+ <apn carrier="SCTL MMS"
+ mcc="724"
+ mnc="07"
+ apn="mms.sercomtel.com.br"
+ user="sercomtel"
+ password="sercomtel"
+ mmsc="http://mms.claro.com.br"
+ mmsproxy="200.169.126.10"
+ mmsport="8799"
+ type="mms"
+ />
+
+ <apn carrier="SCTL GPRS"
+ mcc="724"
+ mnc="07"
+ apn="sercomtel.com.br"
+ user="sercomtel"
+ password="sercomtel"
+ type="default,supl"
+ />
+
+
+ <apn carrier="Vivo Internet"
+ mcc="724"
+ mnc="10"
+ apn="zap.vivo.com.br"
+ user="vivo"
+ password="vivo"
+ type="default,supl"
+ />
+
+ <apn carrier="Vivo MMS"
+ mcc="724"
+ mnc="10"
+ apn="mms.vivo.com.br"
+ user="vivo"
+ password="vivo"
+ mmsc="http://termnat.vivomms.com.br:8088/mms"
+ mmsproxy="200.142.130.104"
+ mmsport="80"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Vivo MMS"
+ mcc="724"
+ mnc="11"
+ apn="mms.vivo.com.br"
+ user="vivo"
+ password="vivo"
+ mmsc="http://termnat.vivomms.com.br:8088/mms"
+ mmsproxy="200.142.130.104"
+ mmsport="80"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Vivo Internet"
+ mcc="724"
+ mnc="11"
+ apn="zap.vivo.com.br"
+ user="vivo"
+ password="vivo"
+ authtype="1"
+ type="default,supl"
+ />
+
+
+ <apn carrier="BrT Modem"
+ mcc="724"
+ mnc="16"
+ apn="brt.br"
+ user="brt"
+ password="brt"
+ authtype="1"
+ type="default,supl"
+ />
+
+ <apn carrier="BrT MMS"
+ mcc="724"
+ mnc="16"
+ apn="mms.brt.br"
+ user="brt"
+ password="brt"
+ mmsc="http://mms.brasiltelecom.com.br/"
+ mmsproxy="200.96.8.29"
+ mmsport="8080"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="TelemigC GPRS"
+ mcc="724"
+ mnc="19"
+ apn="gprs.telemigcelular.com.br"
+ user="celular"
+ password="celular"
+ type="default,supl"
+ />
+
+ <apn carrier="MMS Telemig"
+ mcc="724"
+ mnc="19"
+ apn="mmsgprs.telemigcelular.com.br"
+ user="celular"
+ password="celular"
+ mmsc="http://mms.telemigcelular.com.br"
+ mmsproxy="200.192.230.142"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Vivo Internet"
+ mcc="724"
+ mnc="23"
+ apn="zap.vivo.com.br"
+ user="vivo"
+ password="vivo"
+ authtype="1"
+ type="default,supl"
+ />
+
+
+ <apn carrier="Vivo MMS"
+ mcc="724"
+ mnc="23"
+ apn="mms.vivo.com.br"
+ user="vivo"
+ password="vivo"
+ mmsc="http://termnat.vivomms.com.br:8088/mms"
+ mmsproxy="200.142.130.104"
+ mmsport="80"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="AmazôniaC GPRS"
+ mcc="724"
+ mnc="24"
+ apn="gprs.amazoniacelular.com.br"
+ user="celular"
+ password="celular"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="AmazôniaC MMS"
+ mcc="724"
+ mnc="24"
+ apn="mmsgprs.amazoniacelular.com.br"
+ user="celular"
+ password="celular"
+ mmsc="http://mms.amazoniacelular.com.br"
+ mmsproxy="200.192.230.142"
+ mmsport="8080"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="OI GPRS"
+ mcc="724"
+ mnc="31"
+ apn="gprs.oi.com.br"
+ authtype="1"
+ type="default,supl"
+ />
+
+ <apn carrier="OI MMS"
+ mcc="724"
+ mnc="31"
+ apn="mmsgprs.oi.com.br"
+ user="oimms"
+ password="oimms"
+ mmsc="http://200.222.42.204:8002"
+ mmsproxy="192.168.10.50"
+ mmsport="3128"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Internet Movil"
+ mcc="730"
+ mnc="01"
+ apn="bam.entelpcs.cl"
+ user="entelpcs"
+ password="entelpcs"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Entel"
+ mcc="730"
+ mnc="01"
+ apn="mms.entelpcs.cl"
+ user="entelpcs"
+ password="entelpcs"
+ mmsproxy="10.99.0.10"
+ mmsport="8080"
+ mmsc="http://mmsc.entelpcs.cl"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Internet Movil"
+ mcc="730"
+ mnc="10"
+ apn="bam.entelpcs.cl"
+ user="entelpcs"
+ password="entelpcs"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Entel"
+ mcc="730"
+ mnc="10"
+ apn="mms.entelpcs.cl"
+ user="entelpcs"
+ password="entelpcs"
+ mmsproxy="10.99.0.10"
+ mmsport="8080"
+ mmsc="http://mmsc.entelpcs.cl"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="NEM"
+ mcc="730"
+ mnc="02"
+ apn="wap.tmovil.cl"
+ proxy="172.17.8.11"
+ port="8080"
+ user="wap"
+ password="wap"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS"
+ mcc="730"
+ mnc="02"
+ apn="mms.tmovil.cl"
+ user="mms"
+ password="mms"
+ mmsproxy="172.17.8.10"
+ mmsport="8080"
+ mmsc="http://mms.movistar.cl"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="BAM Claro"
+ mcc="730"
+ mnc="03"
+ apn="bam.clarochile.cl"
+ user="clarochile"
+ password="clarochile"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Claro"
+ mcc="730"
+ mnc="03"
+ apn="mms.clarochile.cl"
+ user="clarochile"
+ password="clarochile"
+ mmsproxy="172.23.200.200"
+ mmsport="8080"
+ mmsc="http://mms.clarochile.cl"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="web"
+ mcc="730"
+ mnc="07"
+ apn="web.gtdmovil.cl"
+ user="webgtd"
+ password="webgtd"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Internet"
+ mcc="730"
+ mnc="08"
+ apn="movil.vtr.com"
+ user="vtrmovil"
+ password="vtrmovil"
+ authtype="2"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Wap"
+ mcc="730"
+ mnc="08"
+ apn="wap.vtr.com"
+ proxy="192.168.94.210"
+ port="9028"
+ user=""
+ password=""
+ authtype="0"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Bam"
+ mcc="730"
+ mnc="08"
+ apn="bam.vtr.com"
+ user="vtr"
+ password="vtr"
+ authtype="2"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS"
+ mcc="730"
+ mnc="08"
+ apn="mms.vtr.com"
+ user="mms"
+ password=""
+ mmsc="http://192.168.94.162:19090/was"
+ mmsproxy="192.168.94.210"
+ mmsport="9028"
+ authtype="0"
+ type="mms"
+ />
+
+ <apn carrier="Internet Movil"
+ mcc="730"
+ mnc="10"
+ apn="bam.entelpcs.cl"
+ user="entelpcs"
+ password="entelpcs"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Entel PCS"
+ mcc="730"
+ mnc="10"
+ apn="mms.entelpcs.cl"
+ user="entelpcs"
+ password="entelpcs"
+ mmsc="http://mmsc.entelpcs.cl"
+ mmsproxy="10.99.0.10"
+ mmsport="8080"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="WEB Comcel 3GSM"
+ mcc="732"
+ mnc="101"
+ apn="internet.comcel.com.co"
+ user="COMCELWEB"
+ password="COMCELWEB"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Comcel 3GSM"
+ mcc="732"
+ mnc="101"
+ apn="mms.comcel.com.co"
+ user="COMCELMMS"
+ password="COMCELMMS"
+ mmsproxy="198.228.90.225"
+ mmsport="8799"
+ mmsc="http://www.comcel.com.co/mms/"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="TIGO WEB"
+ mcc="732"
+ mnc="103"
+ apn="web.colombiamovil.com.co"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="TIGO Multimedia"
+ mcc="732"
+ mnc="103"
+ apn="mms.colombiamovil.com.co"
+ user="mms-cm1900"
+ password="mms-cm1900"
+ mmsproxy="190.102.206.48"
+ mmsport="8080"
+ mmsc="http://mms.ola.com.co"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="TIGO WEB"
+ mcc="732"
+ mnc="111"
+ apn="web.colombiamovil.com.co"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="TIGO Multimedia"
+ mcc="732"
+ mnc="111"
+ apn="mms.colombiamovil.com.co"
+ user="mms-cm1900"
+ password="mms-cm1900"
+ mmsproxy="190.102.206.48"
+ mmsport="8080"
+ mmsc="http://mms.ola.com.co"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="movistar INTERNET"
+ mcc="732"
+ mnc="123"
+ apn="internet.movistar.com.co"
+ user="movistar"
+ password="movistar"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="movistar MMS"
+ mcc="732"
+ mnc="123"
+ apn="mms.movistar.com.co"
+ user="movistar"
+ password="movistar"
+ mmsproxy="192.168.222.7"
+ mmsport="9001"
+ mmsc="http://mms.movistar.com.co"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Digitel GSM"
+ mcc="734"
+ mnc="01"
+ apn="gprsweb.digitel.ve"
+ type="default,supl,dun"
+ authtype="1"
+ />
+
+ <apn carrier="MMS"
+ mcc="734"
+ mnc="01"
+ apn="expresate.digitel.ve"
+ mmsproxy="10.99.0.10"
+ mmsport="8080"
+ mmsc="http://mms.412.com.ve/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Digitel GSM"
+ mcc="734"
+ mnc="02"
+ apn="gprsweb.digitel.ve"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS"
+ mcc="734"
+ mnc="02"
+ apn="expresate.digitel.ve"
+ mmsproxy="10.99.0.10"
+ mmsport="8080"
+ mmsc="http://mms.412.com.ve/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Digitel GSM"
+ mcc="734"
+ mnc="03"
+ apn="gprsweb.digitel.ve"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS"
+ mcc="734"
+ mnc="03"
+ apn="expresate.digitel.ve"
+ mmsproxy="10.99.0.10"
+ mmsport="8080"
+ mmsc="http://mms.412.com.ve/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="movistar INTERNET"
+ mcc="734"
+ mnc="04"
+ apn="internet.movistar.ve"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="movistar MMS"
+ mcc="734"
+ mnc="04"
+ apn="mms.movistar.ve"
+ mmsproxy="200.35.64.73"
+ mmsport="9001"
+ mmsc="http://mms.movistar.com.ve:8088/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="movistar WAP"
+ mcc="734"
+ mnc="04"
+ apn="wap.movistar.ve"
+ mmsproxy="200.35.64.73"
+ mmsport="9001"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MODEM"
+ mcc="734"
+ mnc="06"
+ apn="int.movilnet.com.ve"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS"
+ mcc="734"
+ mnc="06"
+ apn="mm.movilnet.com.ve"
+ mmsproxy="192.168.16.12"
+ mmsport="8080"
+ mmsc="http://mms2.movilnet.com.ve/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="VIVA3G"
+ mcc="736"
+ mnc="01"
+ apn="internet.nuevatel.com"
+ user=""
+ password=""
+ proxy="192.168.101.004"
+ port="3128"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="VIVAMMS"
+ mcc="736"
+ mnc="01"
+ apn="mms.nuevatel.com"
+ user=""
+ password=""
+ mmsproxy="192.168.101.004"
+ mmsport="3128"
+ mmsc="http://mmsgw.nuevatel.com:1981"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="ENTEL WAP GPRS"
+ mcc="736"
+ mnc="02"
+ apn="wap.movil.com.bo"
+ user=""
+ password=""
+ proxy="172.27.7.10"
+ port="8080"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="ENTEL MMS GPRS"
+ mcc="736"
+ mnc="02"
+ apn="mms.movil.com.bo"
+ user=""
+ password=""
+ mmsproxy="172.27.7.10"
+ mmsport="8080"
+ mmsc="http://mms.movil.com.bo/servlets/mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="WAPTIGO"
+ mcc="736"
+ mnc="03"
+ apn="wap.tigo.bo"
+ user=""
+ password=""
+ proxy="172.25.100.8"
+ port="8080"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMSTIGO"
+ mcc="736"
+ mnc="03"
+ apn="mms.tigo.bo"
+ user=""
+ password=""
+ mmsproxy="172.25.100.8"
+ mmsport="8080"
+ mmsc="http://mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="movistar INTERNET"
+ mcc="740"
+ mnc="00"
+ apn="internet.movistar.com.ec"
+ user="movistar"
+ password="movistar"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="movistar MMS"
+ mcc="740"
+ mnc="00"
+ apn="mms.movistar.com.ec"
+ user="movistar"
+ password="movistar"
+ mmsproxy="10.3.5.50"
+ mmsport="9001"
+ mmsc="http://mms.movistar.com.ec:8088/mms/"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Claro Internet"
+ mcc="740"
+ mnc="01"
+ apn="internet.porta.com.ec"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Claro"
+ mcc="740"
+ mnc="01"
+ apn="mms.porta.com.ec"
+ user="portamms"
+ password="portamms2003"
+ mmsproxy="216.250.208.94"
+ mmsport="8799"
+ mmsc="http://iesmms.porta.com.ec"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Claro Internet"
+ mcc="740"
+ mnc="010"
+ apn="internet.porta.com.ec"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Claro"
+ mcc="740"
+ mnc="010"
+ apn="mms.porta.com.ec"
+ user="portamms"
+ password="portamms2003"
+ mmsproxy="216.250.208.94"
+ mmsport="8799"
+ mmsc="http://iesmms.porta.com.ec"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="ALEGRO 3G"
+ mcc="740"
+ mnc="02"
+ apn="internet3gsp.alegro.net.ec"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Alegro"
+ mcc="740"
+ mnc="02"
+ apn="mms.alegro.net.ec"
+ user=""
+ password=""
+ mmsproxy="10.4.85.3"
+ mmsport="8080"
+ mmsc="http://mms.alegro.net.ec/mms/"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="VOX INTERNET"
+ mcc="744"
+ mnc="01"
+ apn="vox.internet"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="VOX MMS"
+ mcc="744"
+ mnc="01"
+ apn="vox.mms"
+ user="vox"
+ password="vox"
+ mmsproxy="172.24.97.29"
+ mmsport="8080"
+ mmsc="http://mms.vox.com.py/mmsc"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Claro PY"
+ mcc="744"
+ mnc="02"
+ apn="igprs.claro.com.py"
+ user="ctigprs"
+ password="ctigprs999"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS GPRS PY"
+ mcc="744"
+ mnc="02"
+ apn="mms.ctimovil.com.py"
+ user="ctimms"
+ password="ctimms999"
+ mmsproxy="170.51.255.240"
+ mmsport="8080"
+ mmsc="http://mms.ctimovil.com.py"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="TIGO PY"
+ mcc="744"
+ mnc="04"
+ apn="internet.tigo.py"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS Tigo"
+ mcc="744"
+ mnc="04"
+ apn="mms.tigo.py"
+ user="tigo"
+ password="tigo"
+ mmsproxy="10.16.17.12"
+ mmsport="8888"
+ mmsc="http://mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Personal Datos Py"
+ mcc="744"
+ mnc="05"
+ apn="internet"
+ user="personal"
+ password="personal"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Personal MMS Py"
+ mcc="744"
+ mnc="05"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsproxy="172.16.192.7"
+ mmsport="8080"
+ mmsc="http://mms"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="wapANCEL"
+ mcc="748"
+ mnc="01"
+ apn="wap"
+ proxy="200.40.246.2"
+ port="3128"
+ user=""
+ password=""
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="mmsANCEL"
+ mcc="748"
+ mnc="01"
+ apn="mms"
+ user=""
+ password=""
+ mmsproxy="200.40.246.2"
+ mmsport="3128"
+ mmsc="http://mmsc.mms.ancelutil.com.uy"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="gprsANCEL"
+ mcc="748"
+ mnc="01"
+ apn="gprs.ancel"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="Movistar Emoción"
+ mcc="748"
+ mnc="07"
+ apn="webapn.movistar.com.uy"
+ user="movistar"
+ password="movistar"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="FOTOS MMS"
+ mcc="748"
+ mnc="07"
+ apn="apnmms.movistar.com.uy"
+ user="mmsuy"
+ password="mmsuy"
+ mmsproxy="10.0.2.29"
+ mmsport="8080"
+ mmsc="http://mmsc.movistar.com.uy"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Claro UY"
+ mcc="748"
+ mnc="10"
+ apn="igprs.claro.com.uy"
+ user="ctigprs"
+ password="ctigprs999"
+ authtype="1"
+ type="default,supl,dun"
+ />
+
+ <apn carrier="MMS GPRS UY"
+ mcc="748"
+ mnc="10"
+ apn="mms.ctimovil.com.uy"
+ user="ctimms"
+ password="ctimms999"
+ mmsproxy="170.51.255.240"
+ mmsport="8080"
+ mmsc="http://mms.ctimovil.com.uy"
+ authtype="1"
+ type="mms"
+ />
+
+ <apn carrier="Orange Armenia MMS"
+ mcc="283"
+ mnc="10"
+ apn="mms"
+ mmsc="http://mms/"
+ mmsproxy="192.168.220.251"
+ mmsport="3128"
+ type="mms"
+ authtype="1"
+ />
+
+ <apn carrier="Orange Armenia Internet"
+ mcc="283"
+ mnc="10"
+ apn="Internet"
+ type="default"
+ authtype="1"
+ />
+
+ <apn carrier="Orange BW MMS"
+ mcc="652"
+ mnc="02"
+ apn="mms.orange.co.bw"
+ mmsc="http://10.0.0.242/servlets/mms"
+ mmsproxy="10.0.0.226"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Orange WAP BW"
+ mcc="652"
+ mnc="02"
+ apn="internet.orange.co.bw"
+ proxy="10.0.0.226"
+ port="8080"
+ type="default"
+ />
+
+ <apn carrier="Orangeweb"
+ mcc="340"
+ mnc="01"
+ apn="orangeweb"
+ user="orange"
+ password="orange"
+ type="default"
+ />
+
+ <apn carrier="Omms CI"
+ mcc="612"
+ mnc="03"
+ apn="orangecimms"
+ user="mms"
+ password="mms"
+ mmsc="http://172.20.6.1/servlets/mms"
+ mmsproxy="172.20.4.33"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="OWORLD CI"
+ mcc="612"
+ mnc="03"
+ apn="orangeciwap"
+ user="wap"
+ password="wap"
+ proxy="172.20.4.33"
+ port="8080"
+ type="default"
+ />
+
+ <apn carrier="Orange DO MMS"
+ mcc="370"
+ mnc="01"
+ apn="orangeworld"
+ mmsc="http://mmr.orangewi.com/servlets/mms"
+ mmsproxy="172.16.126.70"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Orange DO"
+ mcc="370"
+ mnc="01"
+ apn="orangenet.com.do"
+ type="default"
+ />
+
+ <apn carrier="Orange CM"
+ mcc="624"
+ mnc="02"
+ apn="orangecmgprs"
+ user="orange"
+ password="orange"
+ proxy="192.168.122.101"
+ port="8080"
+ mmsc="http://mms.orange.cm"
+ mmsproxy="192.168.122.101"
+ mmsport="8080"
+ type="default,mms"
+ />
+
+ <apn carrier="Orange net KE"
+ mcc="639"
+ mnc="07"
+ apn="bew.orange.co.ke"
+ type="default"
+ />
+
+ <apn carrier="Orange RE"
+ mcc="647"
+ mnc="00"
+ apn="orangerun"
+ user="orange"
+ password="orange"
+ type="default"
+ />
+
+ <apn carrier="Orange MG MMS"
+ mcc="646"
+ mnc="02"
+ apn="orangemms"
+ user="mms"
+ password="orange"
+ mmsc="http://10.152.10.70.38090"
+ mmsproxy="10.150.0.115"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Orange World MG"
+ mcc="646"
+ mnc="02"
+ apn="orangeworld"
+ user="world"
+ password="orange"
+ proxy="10.150.0.115"
+ port="8080"
+ type="default"
+ />
+
+ <apn carrier="Orange ML MMS"
+ mcc="610"
+ mnc="02"
+ apn="mms"
+ user="mms"
+ password="mms"
+ mmsc="http://10.109.6.2/servlets/mms"
+ mmsproxy="10.109.4.35"
+ mmsport="8080"
+ type="mms"
+ />
+
+ <apn carrier="Orange Wap ML"
+ mcc="610"
+ mnc="02"
+ apn="wap"
+ user="wap"
+ password="wap"
+ proxy="10.109.4.35"
+ port="8080"
+ type="default"
+ />
+</apns>
diff --git a/shared/resources/apn/apns_conf_local.xml b/shared/resources/apn/apns_conf_local.xml
new file mode 100644
index 0000000..dba6e2c
--- /dev/null
+++ b/shared/resources/apn/apns_conf_local.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<!-- use empty string to specify no proxy or port -->
+<!-- This version must agree with that in apps/common/res/apns.xml -->
+<apns version="7">
+ <apn carrier="SpeakOut"
+ mcc="302"
+ mnc="720"
+ apn="goam.com"
+ user="wapuser1"
+ password="wap"
+ proxy="10.128.1.69"
+ port="80"
+ mmsc="http://mms.gprs.rogers.com"
+ mmsproxy="10.128.1.69"
+ mmsport="80"
+ type="default,mms"
+ />
+
+</apns>
diff --git a/shared/resources/apn/index.html b/shared/resources/apn/index.html
new file mode 100644
index 0000000..354c3d6
--- /dev/null
+++ b/shared/resources/apn/index.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title> APN Database </title>
+ <script type="application/javascript" src="query.js"></script>
+ <style type="text/css">
+ html, body {
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ overflow: hidden;
+ }
+ textarea {
+ margin: 2px;
+ }
+ body > textarea {
+ position: absolute;
+ width: 50%;
+ height: -moz-calc(100% - 10px);
+ height: -webkit-calc(100% - 10px);
+ }
+ form {
+ position: absolute;
+ right: 2px;
+ width: -moz-calc(50% - 10px);
+ width: -webkit-calc(50% - 10px);
+ height: 90%;
+ }
+ form label {
+ display: block;
+ text-align: center;
+ height: 25px;
+ margin: 0;
+ }
+ form textarea {
+ width: 100%;
+ height: -moz-calc(50% - 2px);
+ height: -webkit-calc(50% - 2px);
+ }
+ </style>
+ </head>
+ <body>
+ <textarea readonly></textarea>
+ <form>
+ <label> MCC: <input name="mcc" value="208"/> </label>
+ <label> MNC: <input name="mnc" value="15" /> </label>
+ <textarea readonly id="selection"></textarea>
+ <textarea readonly id="preferences"></textarea>
+ </form>
+ </body>
+</html>
+
diff --git a/shared/resources/apn/operator_variant.xml b/shared/resources/apn/operator_variant.xml
new file mode 100644
index 0000000..0180aa4
--- /dev/null
+++ b/shared/resources/apn/operator_variant.xml
@@ -0,0 +1,499 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+-->
+<variant version="1">
+ <operator
+ name="Internet movil"
+ mcc="214"
+ mnc="01"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Orange Internet Móvil"
+ mcc="214"
+ mnc="03"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Yoigo Navegador"
+ mcc="214"
+ mnc="04"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="INTERNET GPRS"
+ mcc="214"
+ mnc="06"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Euskaltel Internet"
+ mcc="214"
+ mnc="06"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Internet R"
+ mcc="214"
+ mnc="06"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="TeleCable Internet"
+ mcc="214"
+ mnc="06"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Movistar"
+ mcc="214"
+ mnc="07"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Euskaltel Internet"
+ mcc="214"
+ mnc="08"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="TeleCable Internet"
+ mcc="214"
+ mnc="16"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Internet"
+ mcc="334"
+ mnc="020"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Mensajes Multimedia"
+ mcc="334"
+ mnc="020"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="movistar Internet"
+ mcc="334"
+ mnc="03"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="movistar Internet"
+ mcc="334"
+ mnc="030"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Iusacell Internet"
+ mcc="334"
+ mnc="050"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="INTERNET CLARO"
+ mcc="704"
+ mnc="01"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="BROADBAND TIGO"
+ mcc="704"
+ mnc="02"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Internet GT"
+ mcc="704"
+ mnc="03"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Internet GT"
+ mcc="704"
+ mnc="030"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="INTERNET CLARO"
+ mcc="706"
+ mnc="01"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="El Salvaldor Digicel"
+ mcc="706"
+ mnc="02"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="BROADBAND TIGO"
+ mcc="706"
+ mnc="03"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Internet SV"
+ mcc="706"
+ mnc="04"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Internet SV"
+ mcc="706"
+ mnc="040"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="INTERNET"
+ mcc="710"
+ mnc="21"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Internet GPRS"
+ mcc="710"
+ mnc="300"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="INTERNET"
+ mcc="710"
+ mnc="730"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Wap"
+ mcc="714"
+ mnc="01"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="movistar INTERNET"
+ mcc="714"
+ mnc="020"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="WEB Claro"
+ mcc="714"
+ mnc="03"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="INTERNET Panama"
+ mcc="714"
+ mnc="04"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="movistar Internet"
+ mcc="716"
+ mnc="06"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="CLARO DATOS"
+ mcc="716"
+ mnc="10"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Movistar Emoción"
+ mcc="722"
+ mnc="07"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Claro AR"
+ mcc="722"
+ mnc="31"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Claro AR"
+ mcc="722"
+ mnc="310"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Personal Datos"
+ mcc="722"
+ mnc="34"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Personal Datos"
+ mcc="722"
+ mnc="341"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="TIM Connect"
+ mcc="724"
+ mnc="02"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="TIM Connect"
+ mcc="724"
+ mnc="03"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="TIM Connect"
+ mcc="724"
+ mnc="04"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Java Session"
+ mcc="724"
+ mnc="05"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Claro Foto"
+ mcc="724"
+ mnc="05"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Vivo Internet"
+ mcc="724"
+ mnc="06"
+ enableStrict7BitEncodingForSms="true"
+ cellBroadcastSearchList="50"
+ />
+ <operator
+ name="SCTL GPRS"
+ mcc="724"
+ mnc="07"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Vivo Internet"
+ mcc="724"
+ mnc="10"
+ enableStrict7BitEncodingForSms="true"
+ cellBroadcastSearchList="50"
+ />
+ <operator
+ name="Vivo Internet"
+ mcc="724"
+ mnc="11"
+ enableStrict7BitEncodingForSms="true"
+ cellBroadcastSearchList="50"
+ />
+ <operator
+ name="BrT Modem"
+ mcc="724"
+ mnc="16"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="TelemigC GPRS"
+ mcc="724"
+ mnc="19"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Vivo Internet"
+ mcc="724"
+ mnc="23"
+ enableStrict7BitEncodingForSms="true"
+ cellBroadcastSearchList="50"
+ />
+ <operator
+ name="AmazôniaC GPRS"
+ mcc="724"
+ mnc="24"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="OI GPRS"
+ mcc="724"
+ mnc="31"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Internet Movil"
+ mcc="730"
+ mnc="01"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Internet Movil"
+ mcc="730"
+ mnc="10"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="NEM"
+ mcc="730"
+ mnc="02"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="BAM Claro"
+ mcc="730"
+ mnc="03"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="web"
+ mcc="730"
+ mnc="07"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Internet"
+ mcc="730"
+ mnc="08"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Wap"
+ mcc="730"
+ mnc="08"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Bam"
+ mcc="730"
+ mnc="08"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Internet Movil"
+ mcc="730"
+ mnc="10"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="WEB Comcel 3GSM"
+ mcc="732"
+ mnc="101"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="TIGO WEB"
+ mcc="732"
+ mnc="103"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="TIGO Multimedia"
+ mcc="732"
+ mnc="103"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="TIGO WEB"
+ mcc="732"
+ mnc="111"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="TIGO Multimedia"
+ mcc="732"
+ mnc="111"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="movistar INTERNET"
+ mcc="732"
+ mnc="123"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Digitel GSM"
+ mcc="734"
+ mnc="01"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Digitel GSM"
+ mcc="734"
+ mnc="02"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Digitel GSM"
+ mcc="734"
+ mnc="03"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="movistar INTERNET"
+ mcc="734"
+ mnc="04"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="movistar WAP"
+ mcc="734"
+ mnc="04"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="MODEM"
+ mcc="734"
+ mnc="06"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="movistar INTERNET"
+ mcc="740"
+ mnc="00"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Claro Internet"
+ mcc="740"
+ mnc="01"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Claro Internet"
+ mcc="740"
+ mnc="010"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="ALEGRO 3G"
+ mcc="740"
+ mnc="02"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="wapANCEL"
+ mcc="748"
+ mnc="01"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="gprsANCEL"
+ mcc="748"
+ mnc="01"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Movistar Emoción"
+ mcc="748"
+ mnc="07"
+ enableStrict7BitEncodingForSms="true"
+ />
+ <operator
+ name="Claro UY"
+ mcc="748"
+ mnc="10"
+ enableStrict7BitEncodingForSms="true"
+ />
+</variant>
diff --git a/shared/resources/apn/query.js b/shared/resources/apn/query.js
new file mode 100644
index 0000000..e667b74
--- /dev/null
+++ b/shared/resources/apn/query.js
@@ -0,0 +1,288 @@
+/* -*- Mode: js; js-indent-level: 2; indent-tabs-mode: nil -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function onload() {
+ var DEBUG = false;
+
+ var OPERATOR_VARIANT_FILE = '../apn.json';
+ var GNOME_DB_FILE = 'service_providers.xml';
+ var ANDROID_DB_FILE = 'apns_conf.xml';
+ var LOCAL_ANDROID_DB_FILE = 'apns_conf_local.xml';
+ var OPERATOR_VARIANT_DB_FILE = 'operator_variant.xml';
+
+ var gGnomeDB = null;
+ var gAndroidDB = null;
+ var gOperatorVariantDB = null;
+
+
+ /**
+ * XML helpers: load & query XML databases
+ */
+
+ function loadXML(url) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', url, false);
+ xhr.send();
+ return xhr.responseXML;
+ }
+
+ function queryXML(xmlDocument, query) {
+ var xpe = new XPathEvaluator();
+ var nsResolver = xpe.createNSResolver(xmlDocument);
+ return xpe.evaluate(query, xmlDocument, nsResolver, 0, null);
+ }
+
+
+ /**
+ * Merge the Android and Gnome APN and the Operator Variant databases
+ */
+
+ function queryAndroidDB(mcc, mnc) {
+ var query = '//apn';
+ if (mcc) {
+ query += '[@mcc=' + mcc + ']'; // Mobile Country Code
+ }
+ if (mnc) {
+ query += '[@mnc=' + mnc + ']'; // Mobile Network Code
+ }
+
+ var result = queryXML(gAndroidDB, query);
+ var res = result.iterateNext();
+ var found = [];
+
+ while (res) { // turn each resulting XML element into a JS object
+ var apn = {};
+ for (var i = 0; i < res.attributes.length; i++) {
+ var name = res.attributes[i].name;
+ var value = res.attributes[i].value;
+ if (name == 'type') { // array of comma-separated values
+ apn.type = value.split(',');
+ } else { // all other attributes are plain strings
+ apn[name] = value;
+ }
+ }
+ found.push(apn);
+ res = result.iterateNext();
+ }
+
+ return found;
+ }
+
+ function queryGnomeDB(mcc, mnc, setting) {
+ var query = '//gsm[network-id' + '[@mcc=' + mcc + '][@mnc=' + mnc + ']' +
+ ']/' + setting;
+ var result = queryXML(gGnomeDB, query);
+ var node = result.iterateNext();
+ return node ? node.textContent : '';
+ }
+
+ function queryOperatorVariantDB(mcc, mnc) {
+ var query = '//operator' + '[@mcc=' + mcc + '][@mnc=' + mnc + ']';
+ var result = queryXML(gOperatorVariantDB, query);
+ var res = result.iterateNext();
+ var found = [];
+
+ while (res) { // turn each resulting XML element into a JS object
+ var operatorSettings = {};
+ for (var i = 0; i < res.attributes.length; i++) {
+ var name = res.attributes[i].name;
+ var value = res.attributes[i].value;
+ operatorSettings[name] = value;
+ }
+ found.push(operatorSettings);
+ res = result.iterateNext();
+ }
+
+ return found.length ? found[0] : null;
+ }
+
+ function mergeDBs() {
+ var apn = {};
+
+ for (var mcc = 1; mcc < 999; mcc++) {
+ var country = {};
+ var result = queryAndroidDB(mcc);
+
+ if (result && result.length) {
+ result.sort(function(a, b) {
+ return parseInt(result.mnc, 10) < parseInt(result.mnc, 10);
+ });
+ for (var i = 0; i < result.length; i++) {
+ var mnc = parseInt(result[i].mnc, 10);
+
+ var operatorVariantSettings = {};
+ var voicemail = queryGnomeDB(mcc, mnc, 'voicemail');
+ if (voicemail) {
+ operatorVariantSettings.voicemail = voicemail;
+ if (DEBUG) {
+ console.log(operatorVariantSettings.voicemail + ': ' + voicemail);
+ }
+ }
+ var otherSettings = queryOperatorVariantDB(mcc, mnc);
+ if (otherSettings) {
+ if (DEBUG) {
+ console.log("Other operator settng: " + JSON.stringify(otherSettings));
+ }
+ var enableStrict7BitEncodingForSms =
+ otherSettings['enableStrict7BitEncodingForSms'];
+ if (enableStrict7BitEncodingForSms) {
+ operatorVariantSettings.enableStrict7BitEncodingForSms =
+ enableStrict7BitEncodingForSms == 'true';
+ }
+ var cellBroadcastSearchList =
+ otherSettings['cellBroadcastSearchList'];
+ if (cellBroadcastSearchList) {
+ operatorVariantSettings.cellBroadcastSearchList =
+ cellBroadcastSearchList;
+ }
+ }
+
+ delete(result[i].mcc);
+ delete(result[i].mnc);
+ if (country[mnc]) {
+ if (DEBUG) { // warn about the duplicate (mcc, mnc) tuple
+ if (country[mnc].length == 1) {
+ console.log('duplicate mcc/mnc: ' + mcc + '/' + mnc);
+ console.log(' - ' + country[mnc][0].carrier);
+ }
+ console.log(' - ' + result[i].carrier);
+ }
+ country[mnc].push(result[i]);
+ } else {
+ country[mnc] = [result[i]];
+ if (voicemail || otherSettings || cellBroadcastSearchList) {
+ operatorVariantSettings.type = [];
+ operatorVariantSettings.type.push('operatorvariant');
+ country[mnc].push(operatorVariantSettings);
+ }
+ }
+ }
+ apn[mcc] = country;
+ }
+ }
+
+ return apn;
+ }
+
+
+ /**
+ * User Interface
+ */
+
+ var gAPN;
+ var apnPrefNames = {
+ 'default': {
+ 'ril.data.carrier': 'carrier',
+ 'ril.data.apn': 'apn',
+ 'ril.data.user': 'user',
+ 'ril.data.passwd': 'password',
+ 'ril.data.httpProxyHost': 'proxy',
+ 'ril.data.httpProxyPort': 'port'
+ },
+ 'supl': {
+ 'ril.supl.carrier': 'carrier',
+ 'ril.supl.apn': 'apn',
+ 'ril.supl.user': 'user',
+ 'ril.supl.passwd': 'password',
+ 'ril.supl.httpProxyHost': 'proxy',
+ 'ril.supl.httpProxyPort': 'port'
+ },
+ 'mms': {
+ 'ril.mms.carrier': 'carrier',
+ 'ril.mms.apn': 'apn',
+ 'ril.mms.user': 'user',
+ 'ril.mms.passwd': 'password',
+ 'ril.mms.httpProxyHost': 'proxy',
+ 'ril.mms.httpProxyPort': 'port',
+ 'ril.mms.mmsc': 'mmsc',
+ 'ril.mms.mmsproxy': 'mmsproxy',
+ 'ril.mms.mmsport': 'mmsport'
+ },
+ 'operatorvariant': {
+ 'ril.iccInfo.mbdn': 'voicemail',
+ 'ril.sms.strict7BitEncoding.enabled': 'enableStrict7BitEncodingForSms',
+ 'ril.cellbroadcast.searchlist': 'cellBroadcastSearchList'
+ }
+ };
+
+ var booleanPrefNames = [
+ 'ril.sms.strict7BitEncoding.enabled'
+ ];
+
+ function loadDB(output, callback) {
+ output.textContent = '\n loading database...';
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', OPERATOR_VARIANT_FILE, true);
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200 || xhr.status === 0) {
+ // the JSON database is already available -- we don't use
+ // xhr.responseType = 'json' to be compatible with Chrome... sigh.
+ gAPN = JSON.parse(xhr.responseText);
+ } else {
+ // the JSON database is not available, merge the three XML databases
+ output.textContent = '\n merging databases, this takes a while...';
+ gAndroidDB = loadXML(ANDROID_DB_FILE);
+ // First merge the local DB
+ var localAndroidDB = loadXML(LOCAL_ANDROID_DB_FILE);
+ var localApns = localAndroidDB.documentElement.getElementsByTagName("apn");
+ for (var i = 0; i < localApns.length; ++i) {
+ gAndroidDB.documentElement.appendChild(localApns[i]);
+ }
+ // Then the Gnome DB
+ gGnomeDB = loadXML(GNOME_DB_FILE);
+ gOperatorVariantDB = loadXML(OPERATOR_VARIANT_DB_FILE);
+ gAPN = mergeDBs();
+ }
+ output.textContent = DEBUG ?
+ JSON.stringify(gAPN, true, 2) :
+ JSON.stringify(gAPN, true, 0)
+ .replace(/("[0-9]+"):{/g, '\n$1: {')
+ .replace(/("[0-9]+"):\[/g, '\n $1: [')
+ .replace(/},\n/g, '\n},\n')
+ .replace(/\[{/g, '[\n {')
+ .replace(/},{/g, '},\n {')
+ .replace(/}(],?)/g, '}\n $1')
+ .replace(/]}}$/, ']\n}\n}');
+ callback();
+ }
+ };
+ xhr.send();
+ }
+
+ function update() {
+ var selection = document.getElementById('selection');
+ var mcc = parseInt(document.querySelector('input[name=mcc]').value, 10);
+ var mnc = parseInt(document.querySelector('input[name=mnc]').value, 10);
+ var res = gAPN[mcc] ? (gAPN[mcc][mnc] || []) : [];
+ selection.textContent = JSON.stringify(res, true, 2);
+
+ var preferences = document.getElementById('preferences');
+ var prefs = {};
+ for (var type in apnPrefNames) {
+ var apn = {};
+ for (var i = 0; i < res.length; i++) {
+ if (res[i].type.indexOf(type) != -1) {
+ apn = res[i];
+ break;
+ }
+ }
+ var prefNames = apnPrefNames[type];
+ for (var key in prefNames) {
+ var name = apnPrefNames[type][key];
+ if (booleanPrefNames.indexOf(key) != -1) {
+ prefs[key] = apn[name] || false;
+ } else {
+ prefs[key] = apn[name] || '';
+ }
+ }
+ }
+ preferences.textContent = JSON.stringify(prefs, true, 2);
+ }
+
+ document.querySelector('form').oninput = update;
+ loadDB(document.querySelector('textarea'), update);
+});
+
diff --git a/shared/resources/apn/service_providers.xml b/shared/resources/apn/service_providers.xml
new file mode 100644
index 0000000..d2d8101
--- /dev/null
+++ b/shared/resources/apn/service_providers.xml
@@ -0,0 +1,11021 @@
+<?xml version="1.0"?>
+<!-- -*- Mode: XML; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- -->
+<!DOCTYPE serviceproviders SYSTEM "serviceproviders.2.dtd">
+
+<!-- Authors:
+ 2008 Antti Kaijanmäki <antti@kaijanmaki.net>
+ 2009 Dan Williams <dcbw@redhat.com>
+ 2011 Antti Kaijanmäki <antti@canonical.com>
+-->
+
+<!-- THIS WORK IS IN PUBLIC DOMAIN:
+The person or persons who have associated work with this document
+(the "Dedicator" or "Certifier") hereby either (a) certifies that, to the best
+of his knowledge, the work of authorship identified is in the public domain of
+the country from which the work is published, or (b) hereby dedicates whatever
+copyright the dedicators holds in the work of authorship identified below
+(the "Work") to the public domain. A certifier, moreover, dedicates any
+copyright interest he may have in the associated work, and for these purposes,
+is described as a "dedicator" below.
+
+A certifier has taken reasonable steps to verify the copyright status of this
+work. Certifier recognizes that his good faith efforts may not shield him from
+liability if in fact the work certified is not in the public domain.
+
+Dedicator makes this dedication for the benefit of the public at large and to
+the detriment of the Dedicator's heirs and successors. Dedicator intends this
+dedication to be an overt act of relinquishment in perpetuity of all present
+and future rights under copyright law, whether vested or contingent, in the
+Work. Dedicator understands that such relinquishment of all rights includes the
+relinquishment of all rights to enforce (by lawsuit or otherwise) those
+copyrights in the Work.
+
+Dedicator recognizes that, once placed in the public domain, the Work may be
+freely reproduced, distributed, transmitted, used, modified, built upon, or
+otherwise exploited by anyone for any purpose, commercial or non-commercial,
+and in any way, including by methods that have not yet been invented or
+conceived.
+-->
+
+<serviceproviders format="2.0">
+
+<!-- United Arab Emirates -->
+<country code="ae">
+ <provider>
+ <name>Etisalat</name>
+ <gsm>
+ <network-id mcc="424" mnc="02"/>
+ <apn value="mnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Etisalat</name>
+ <username>mnet</username>
+ <password>mnet</password>
+ <dns>194.170.1.6</dns>
+ <dns>194.170.1.7</dns>
+ </apn>
+ <apn value="etisalat.ae">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Etisalat 3G</name>
+ <username>etisalat.ae</username>
+ <password>etisalat.ae</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>du</name>
+ <gsm>
+ <network-id mcc="424" mnc="03"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <apn value="du">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Afghanistan -->
+<country code="af">
+ <provider>
+ <name>AWCC</name>
+ <gsm>
+ <network-id mcc="412" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>awcc</username>
+ <password>1111</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Albania -->
+<country code="al">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="276" mnc="02"/>
+ <apn value="Twa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>TWA</name>
+ </apn>
+ <apn value="vodafoneweb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone Web</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Armenia -->
+<country code="am">
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="283" mnc="01"/>
+ <apn value="internet.beeline.am">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="283" mnc="10"/>
+ <apn value="internet.orange">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Hima (USB)</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>VivaCell/MTS</name>
+ <gsm>
+ <network-id mcc="283" mnc="05"/>
+ <apn value="connect.vivacell.am">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>MTS connect</name>
+ </apn>
+ <apn value="inet.vivacell.am">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+
+<!-- Angola -->
+<country code="ao">
+ <provider>
+ <name>Movinet</name>
+ <cdma>
+ <username>uname</username>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Unitel</name>
+ <gsm>
+ <network-id mcc="631" mnc="02"/>
+ <apn value="internet.unitel.co.ao" >
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Argentina -->
+<country code="ar">
+ <provider>
+ <name>Personal</name>
+ <gsm>
+ <network-id mcc="722" mnc="341"/>
+ <apn value="gprs.personal.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>gprs</username>
+ <password>adgj</password>
+ <dns>172.25.7.6</dns>
+ <dns>172.25.7.7</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Arnet</name>
+ <gsm>
+ <network-id mcc="722" mnc="340"/>
+ <apn value="arnet.personal.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>172.25.7.6</dns>
+ <dns>172.25.7.7</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="722" mnc="310"/>
+ <network-id mcc="722" mnc="320"/>
+ <network-id mcc="722" mnc="330"/>
+ <apn value="gprs.claro.com.ar">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G Internet</name>
+ <username>clarogprs</username>
+ <password>clarogprs999</password>
+ <dns>170.51.255.100</dns>
+ <dns>170.51.242.18</dns>
+ </apn>
+ <apn value="internet.ctimovil.com.ar">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <username>clarogprs</username>
+ <password>clarogprs999</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="722" mnc="010"/>
+ <network-id mcc="722" mnc="070"/>
+ <apn value="internet.gprs.unifon.com.ar">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Austria -->
+<country code="at">
+ <provider>
+ <name>A1/Telekom Austria</name>
+ <gsm>
+ <!-- Vodafone Broadband Connect version 10.1.0.23908 2010-06-07T17:47:01 -->
+ <network-id mcc="232" mnc="01"/>
+ <apn value="a1.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>A1 Breitband</name>
+ <username>ppp@a1plus.at</username>
+ <password>ppp</password>
+ <dns>194.48.124.202</dns>
+ <dns>194.48.124.200</dns>
+ </apn>
+ <!-- https://www.aon.at/export/sites/default/residential/pdf/produktfolder/aonFlex_Mobiltelefon.pdf-->
+ <apn value="aon.data">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>aon (Flex, Breitband-Duo, BusinessFlex)</name>
+ <username>mobile@aon.at</username>
+ <password>ppp</password>
+ </apn>
+ <!-- http://konfigurator.aon.at/otauseraon/templates/user/aon/manuals/AON_Installation.pdf -->
+ <apn value="aon.at">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>aonMobile</name>
+ <username>mobile@aon.at</username>
+ <password>ppp</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ABroadband</name>
+ <gsm>
+ <network-id mcc="232" mnc="01"/>
+ <apn value="mdata.com">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>International Roaming</name>
+ <username>mdata@mdata.com</username>
+ <password>ppp</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bob</name>
+ <gsm>
+ <network-id mcc="232" mnc="11"/>
+ <apn value="bob.at">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>data@bob.at</username>
+ <password>ppp</password>
+ </apn>
+ <apn value="bob.at">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>ppp@bob.at</username>
+ <password>ppp</password>
+ <dns>194.48.139.254</dns>
+ <dns>194.48.124.200</dns>
+ </apn>
+ <apn value="mms.bob.at">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>data@bob.at</username>
+ <password>ppp</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="232" mnc="03"/>
+ <apn value="gprswap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>t-mobile</username>
+ <password>tm</password>
+ </apn>
+ <apn value="gprsinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <username>t-mobile</username>
+ <password>tm</password>
+ <dns>213.162.69.169</dns>
+ <dns>213.162.65.1</dns>
+ </apn>
+ <apn value="business.gprsinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business Internet</name>
+ <username>t-mobile</username>
+ <password>tm</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>tele.ring</name>
+ <gsm>
+ <network-id mcc="232" mnc="07"/>
+ <apn value="web">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Ge org:)</name>
+ <username>web@telering.at</username>
+ <password>web</password>
+ <dns>213.162.69.170</dns>
+ <dns>213.162.65.2</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="232" mnc="05"/>
+ <apn value="web.one.at">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>OneNet Web</name>
+ <username>web</username>
+ <password>web</password>
+ <dns>194.24.128.100</dns>
+ <dns>194.24.128.102</dns>
+ </apn>
+ <apn value="wap.one.at">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Orange WAP</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="mms.one.at">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ <apn value="fullspeed">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web (no filtering)</name>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <apn value="orange.web">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Orange Web</name>
+ <username>Orange</username>
+ <password>Orange</password>
+ <dns>81.3.216.100</dns>
+ <dns>194.24.128.100</dns>
+ </apn>
+ <apn value="orange.mms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Orange Web</name>
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Drei (3)</name>
+ <name xml:lang="de">Drei</name>
+ <gsm>
+ <network-id mcc="232" mnc="10"/>
+ <apn value="drei.at">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.94.78.17</dns>
+ <dns>213.94.78.16</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Yesss</name>
+ <gsm>
+ <network-id mcc="232" mnc="12"/>
+ <apn value="web.yesss.at">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Australia -->
+<!-- http://whirlpool.net.au/wiki/mobiles_apn
+ http://ausdroid.net/apns/ -->
+<country code="au">
+ <provider>
+ <name>Amaysim</name>
+ <!-- http://www.amaysim.com.au/help-support/amaysim-mobile-broadband.html/ -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="internet"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Apex Telecom</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns357"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Beagle</name>
+ <!-- http://www.beagle.com.au/support/faq/wireless.html -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns357"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>BLiNK</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns888a1">
+ <name>BLiNK (services after 04/08/09)</name>
+ </apn>
+ <apn value="connect">
+ <name>BLiNK (services prior to 04/08/09)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Crazy John's</name>
+ <gsm>
+ <network-id mcc="505" mnc="03"/>
+ <network-id mcc="505" mnc="38"/>
+ <apn value="purtona.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Crazy NET</name>
+ <dns>203.21.112.40</dns>
+ <dns>203.21.113.40</dns>
+ </apn>
+ <apn value="purtona.wap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Crazy WAP/MMS</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Dodo</name>
+ <!-- http://www.dodo.com/top-right-navigation/support/technical-support/wireless-broadband/wireless-broadband-settings/ -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="WirelessBroadband">
+ <name>Postpaid</name>
+ </apn>
+ <apn value="DODOLNS1">
+ <name>Prepaid</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Escape Net</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns357"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Exetel</name>
+ <!-- http://www.exetel.com.au/mobile_faq.php -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="exetel1">
+ <name>Exetel (Optus Based HSPA plans)</name>
+ </apn>
+ <apn value="INTERNET">
+ <name>Exetel (Optus Based CAP Plans) not iPhone</name>
+ </apn>
+ <apn value="OPTUSWAP">
+ <name>Exetel (Optus Based CAP Plans) not iPhone</name>
+ </apn>
+ <apn value="YesINTERNET">
+ <name>Exetel (Optus Based CAP Plans) iPhone</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Exetel (Vodafone based)</name>
+ <gsm>
+ <network-id mcc="505" mnc="03"/>
+ <apn value="vfinternet.au">
+ <name>Exetel (Vodafone Based)</name>
+ </apn>
+ </gsm>
+ </provider>
+<!-- Not validated yet
+ <provider>
+ <name>GRL / Red Bull Mobile</name>
+ <gsm>
+ <network-id mcc="505" mnc="03"/>
+ <apn value="purtona.net"/>
+ </gsm>
+ </provider>
+-->
+ <provider>
+ <name>Highway1</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns357"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>iiNet</name>
+ <!-- https://iihelp.iinet.net.au/BoB_MBB -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="iinet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Internode</name>
+ <gsm>
+ <!-- http://www.internode.on.net/residential/broadband/3g_wireless/nodemobile_data/faq/#What_is_the_APN -->
+ <network-id mcc="505" mnc="02"/>
+ <apn value="internode">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>NodeMobile Data</name>
+ </apn>
+ <apn value="splns333a1">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old NodeMobile Data (before 2009-08-26)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>iPrimus</name>
+ <!-- http://support.iprimus.com.au/index.php?option=com_content&task=view&id=559&Itemid=203 -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="primuslns1"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Optus</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet (handsets)</name>
+ <dns>211.29.132.12</dns>
+ <dns>198.142.0.51</dns>
+ </apn>
+ <apn value="yesinternet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Optus Yes Internet</name>
+ <dns>211.29.132.12</dns>
+ <dns>198.142.0.51</dns>
+ </apn>
+ <apn value="connect">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Wireless Broadband</name>
+ <dns>211.29.132.12</dns>
+ <dns>198.142.0.51</dns>
+ </apn>
+ <apn value="connectcap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Post-Paid Mobile Broadband</name>
+ <dns>211.29.132.12</dns>
+ <dns>198.142.0.51</dns>
+ </apn>
+ <apn value="preconnect">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pre-Paid Mobile Broadband</name>
+ <dns>211.29.132.12</dns>
+ <dns>198.142.0.51</dns>
+ </apn>
+ <apn value="mms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Optus MMS</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TPG Mobile</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="yesinternet">
+ <name>TPG (iPhone)</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>TPG (all except iPhone)</name>
+ </apn>
+ <apn value="mms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>MMS</name>
+ </apn>
+ </gsm>
+ </provider>
+<!-- not yet validated
+ <provider>
+ <name>Pacnet – Optus</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="pacnet"/>
+ <apn value="internet"/>
+ </gsm>
+ </provider>
+-->
+ <provider>
+ <name>Pennytel</name>
+ <!-- https://www.pennytel.com.au/faqs?f-answer-search=apn&x=0&y=0 -->
+ <gsm>
+ <network-id mcc="505" mnc="03"/>
+ <apn value="live.vodafone.com">
+ <name>Pennytel (Vodafone) live.vodafone.com</name>
+ </apn>
+ <apn value="vfinternet.au">
+ <name>Pennytel (Vodafone) vfinternet.au</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Smelly Black Dog</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns357"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telstra</name>
+ <gsm>
+ <network-id mcc="505" mnc="01"/>
+ <balance-check>
+ <dtmf>125111</dtmf>
+ <dtmf>1258888</dtmf>
+ <ussd-response>*100#</ussd-response>
+ </balance-check>
+ <apn value="telstra.wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>139.130.4.4</dns>
+ <dns>203.50.2.71</dns>
+ </apn>
+ <apn value="telstra.datapack">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telstra (3G data pack)</name>
+ <password>Telstra</password>
+ <dns>139.130.4.4</dns>
+ <dns>203.50.2.71</dns>
+ </apn>
+ <apn value="telstra.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telstra (Next G)</name>
+ <dns>10.4.85.138</dns>
+ <dns>10.4.176.234</dns>
+ </apn>
+ <apn value="telstra.pcpack">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telstra (3G PC pack - pay by time)</name>
+ <password>Telstra</password>
+ <dns>139.130.4.4</dns>
+ <dns>203.50.2.71</dns>
+ </apn>
+ <apn value="telstra.iph">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Telstra Internet/Wap</name>
+ </apn>
+ <apn value="telstra.mms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Telstra MMS</name>
+ </apn>
+ <apn value="telstra.bigpond">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telstra BigPond</name>
+ <!-- username/password per-user -->
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Three</name>
+ <gsm>
+ <network-id mcc="505" mnc="06"/>
+ <apn value="3netaccess">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>a</username>
+ <password>a</password>
+ <dns>202.124.68.130</dns>
+ <dns>202.124.76.66</dns>
+ </apn>
+ <apn value="3services">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Three Prepaid</name>
+ <username>a</username>
+ <password>a</password>
+ <dns>202.124.68.130</dns>
+ <dns>202.124.76.66</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Virgin Mobile</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="VirginInternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ <username>guest</username>
+ <password>guest</password>
+ <dns>61.88.88.88</dns>
+ </apn>
+ <apn value="VirginBroadband">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <!-- http://www.vodafone.com.au/personal/mobile-broadband/modem-setup/index.htm -->
+ <network-id mcc="505" mnc="03"/>
+ <apn value="vfinternet.au">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid and some prepaid phone plans</name>
+ </apn>
+ <!-- username/password included in Vodafone Broadband Connect version 10.1.0.23908 2010-06-07T17:47:01 -->
+ <!-- username/password not on site http://www.vodafone.com.au/personal/mobile-broadband/modem-setup/index.htm -->
+ <apn value="vfprepaymbb">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <!-- username>web</username -->
+ <!-- password>web</password -->
+ <dns>203.21.112.40</dns>
+ <dns>203.21.113.40</dns>
+ </apn>
+ <apn value="live.vodafone.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Westnet</name>
+ <!-- http://myhelp.westnet.com.au/pages/releaseview.action;jsessionid=2C8E8DAB3826667BAA24105E467B31DF?pageId=17073209#FAQs-WestnetMobilePhone-link31 -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="yesinternet">
+ <name>Westnet (iPhone)</name>
+ </apn>
+ <apn value="internet">
+ <name>Westnet (all except iPhone)</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Azerbaijan -->
+<country code="az">
+ <provider>
+ <name>Azercell</name>
+ <gsm>
+ <network-id mcc="400" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bakcell</name>
+ <gsm>
+ <network-id mcc="400" mnc="02"/>
+ <apn value="mms">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Azerfon</name>
+ <gsm>
+ <network-id mcc="400" mnc="04"/>
+ <msisdn-query>
+ <ussd>*100#3#</ussd>
+ </msisdn-query>
+ <apn value="azerfon">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Bosnia & Herzegovina -->
+<country code="ba">
+ <provider>
+ <name>BH GSM</name>
+ <gsm>
+ <network-id mcc="218" mnc="90"/>
+ <apn value="mms.bhmobile.ba">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>m:tel</name>
+ <gsm>
+ <network-id mcc="218" mnc="05"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <apn value="mtelgprs1">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Package 1</name>
+ <dns>81.93.67.2</dns>
+ <dns>81.93.67.3</dns>
+ </apn>
+ <apn value="mtelgprs2">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Package 2</name>
+ <dns>81.93.67.2</dns>
+ <dns>81.93.67.3</dns>
+ </apn>
+ <apn value="mtelgprs3">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Package 3</name>
+ <dns>81.93.67.2</dns>
+ <dns>81.93.67.3</dns>
+ </apn>
+ <apn value="mtelgprs4">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Package 4</name>
+ <dns>81.93.67.2</dns>
+ <dns>81.93.67.3</dns>
+ </apn>
+ <apn value="mtelfun">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <dns>81.93.67.2</dns>
+ <dns>81.93.67.3</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>HT-ERONET</name>
+ <gsm>
+ <network-id mcc="218" mnc="03"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <apn value="gprs.eronet.ba">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Barbados -->
+<country code="bb">
+ <provider>
+ <name>Digicel</name>
+ <gsm>
+ <network-id mcc="342" mnc="750"/>
+ <apn value="isp.digicelbarbados.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Bangladesh -->
+<country code="bd">
+ <provider>
+ <name>Robi (AKTel)</name>
+ <gsm>
+ <network-id mcc="470" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <dns>192.168.23.7</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Banglalink</name>
+ <gsm>
+ <network-id mcc="470" mnc="03"/>
+ <apn value="blweb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web</name>
+ <dns>10.10.55.34</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>GrameenPhone</name>
+ <gsm>
+ <network-id mcc="470" mnc="01"/>
+ <apn value="gpinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>202.56.4.120</dns>
+ <dns>202.56.4.121</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Warid</name>
+ <gsm>
+ <network-id mcc="470" mnc="07"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <dns>10.6.0.2</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Citycell</name>
+ <cdma>
+ <username>waps</username>
+ <password>waps</password>
+ <dns>117.18.224.146</dns>
+ <dns>117.18.224.147</dns>
+ <sid value="13480"/>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Belgium -->
+<country code="be">
+ <provider>
+ <name>Mobistar</name>
+ <gsm>
+ <network-id mcc="206" mnc="10"/>
+ <voicemail>5555</voicemail>
+ <balance-check>
+ <ussd>#123#</ussd>
+ </balance-check>
+ <apn value="web.pro.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business</name>
+ <username>mobistar</username>
+ <password>mobistar</password>
+ <dns>212.65.63.10</dns>
+ <dns>212.65.63.145</dns>
+ </apn>
+ <apn value="internet.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Personal</name>
+ <username>mobistar</username>
+ <password>mobistar</password>
+ <dns>212.65.63.10</dns>
+ <dns>212.65.63.145</dns>
+ </apn>
+ <apn value="iew.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere</name>
+ <username>mobistar</username>
+ <password>mobistar</password>
+ <dns>212.224.255.252</dns>
+ <dns>212.65.63.217</dns>
+ </apn>
+ <apn value="mworld.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mobistar</username>
+ <password>mobistar</password>
+ <dns>212.65.63.10</dns>
+ <dns>212.65.63.145</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telenet Mobile</name>
+ <gsm>
+ <network-id mcc="206" mnc="10"/>
+ <apn value="mobile.internet.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old Walk &amp; Surf</name>
+ </apn>
+ <apn value="telenetwap.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Walk &amp; Talk</name>
+ </apn>
+ <apn value="telenetwap.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Walk &amp; Surf</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="206" mnc="10"/>
+ <apn value="orangeinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Proximus</name>
+ <gsm>
+ <network-id mcc="206" mnc="01"/>
+ <voicemail>1230</voicemail>
+ <!-- no balancecheck method ('auto-recharge') -->
+ <apn value="internet.proximus.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Inter</name>
+ <dns>195.238.2.21</dns>
+ <dns>81.169.60.107</dns>
+ </apn>
+ <apn value="intraprox.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Intra</name>
+ <dns>195.238.2.21</dns>
+ <dns>195.238.2.22</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Base</name>
+ <gsm>
+ <network-id mcc="206" mnc="20"/>
+ <voicemail>1933</voicemail>
+ <!-- no balancecheck method ('auto-recharge') -->
+ <apn value="gprs.base.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>base</username>
+ <password>base</password>
+ <dns>195.130.131.139</dns>
+ <dns>212.53.4.4</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Bulgaria -->
+<country code="bg">
+ <provider>
+ <name>GloBul</name>
+ <gsm>
+ <network-id mcc="284" mnc="05"/>
+ <voicemail>120</voicemail>
+ <balance-check>
+ <ussd>*125#</ussd>
+ </balance-check>
+ <apn value="internet.globul.bg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>globul</username>
+ <dns>192.168.88.11</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>M-Tel</name>
+ <gsm>
+ <network-id mcc="284" mnc="01"/>
+ <voicemail>131</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <!-- username/password not included in Vodafone Broadband Connect version 10.1.0.23908 2010-06-07T17:47:01 -->
+ <apn value="inet-gprs.mtel.bg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.226.7.34</dns>
+ <dns>213.226.7.35</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vivacom</name>
+ <gsm>
+ <network-id mcc="284" mnc="03"/>
+ <voicemail>110</voicemail>
+ <balance-check>
+ <ussd>*102#</ussd>
+ </balance-check>
+ <apn value="internet.vivacom.bg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <!-- http://www.vivacom.bg/en/residential/help_and_advice/common_questions/mobile_postpaid/8/ -->
+ <name>Vivacom Internet (Postpaid)</name>
+ <username>vivacom</username>
+ <password>vivacom</password>
+ </apn>
+ <apn value="internet.vivatel.bg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vivatel (old)</name>
+ <username>vivatel</username>
+ <password>vivatel</password>
+ <dns>192.168.123.123</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Bahrain -->
+<country code="bh">
+ <provider>
+ <name>Batelco</name>
+ <gsm>
+ <network-id mcc="426" mnc="01"/>
+ <apn value="internet.batelco.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>oNet</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zain BH</name>
+ <gsm>
+ <network-id mcc="426" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ <apn value="hsdpa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>eGO</name>
+ <username>hsdpa</username>
+ <password>hsdpa</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>STC</name>
+ <gsm>
+ <network-id mcc="426" mnc="04"/>
+ <apn value="viva.bh">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Viva</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Brazil -->
+<country code="br">
+ <provider>
+ <!-- Brasil Telecom was bought by Oi on 2009-01-09 and will be phased
+ out and transitioned to Oi.
+ -->
+ <name>Brasil Telecom</name>
+ <gsm>
+ <network-id mcc="724" mnc="16"/>
+ <apn value="brt.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>BrT</username>
+ <password>BrT</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="724" mnc="05"/>
+ <voicemail>*100</voicemail>
+ <balance-check>
+ <ussd>*544#</ussd>
+ <ussd>*545#</ussd>
+ <ussd>*546#</ussd>
+ </balance-check>
+ <apn value="claro.com.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>claro</username>
+ <password>claro</password>
+ </apn>
+ <apn value="bandalarga.claro.com.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G</name>
+ <username>claro</username>
+ <password>claro</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CTBC</name>
+ <gsm>
+ <network-id mcc="724" mnc="07"/>
+ <network-id mcc="724" mnc="32"/>
+ <network-id mcc="724" mnc="33"/>
+ <network-id mcc="724" mnc="34"/>
+ <balance-check>
+ <dtmf>*22</dtmf>
+ </balance-check>
+ <apn value="ctbc.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>ctbc</username>
+ <password>1212</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Oi</name>
+ <gsm>
+ <network-id mcc="724" mnc="16"/>
+ <network-id mcc="724" mnc="31"/>
+ <network-id mcc="724" mnc="24"/>
+ <voicemail>*100</voicemail>
+ <balance-check>
+ <dtmf>*804</dtmf>
+ <dtmf>*805</dtmf>
+ </balance-check>
+ <apn value="gprs.oi.com.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <password>oioioi</password>
+ </apn>
+ <apn value="wapgprs.oi.com.br">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>oiwap</username>
+ <password>oioioi</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TIM</name>
+ <gsm>
+ <network-id mcc="724" mnc="02"/>
+ <network-id mcc="724" mnc="03"/>
+ <network-id mcc="724" mnc="04"/>
+ <network-id mcc="724" mnc="08"/>
+ <voicemail>*100</voicemail>
+ <balance-check>
+ <ussd>*222#</ussd>
+ <dtmf>*222</dtmf>
+ </balance-check>
+ <apn value="tim.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>tim</username>
+ <password>tim</password>
+ <dns>10.223.246.102</dns>
+ <dns>10.223.246.103</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Velox</name>
+ <gsm>
+ <apn value="wap.telcel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>iesgprs</username>
+ <password>iesgprs2002</password>
+ <dns>66.36.250.14</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vivo</name>
+ <gsm>
+ <network-id mcc="724" mnc="06"/>
+ <network-id mcc="724" mnc="10"/>
+ <network-id mcc="724" mnc="11"/>
+ <network-id mcc="724" mnc="23"/>
+ <voicemail>*555</voicemail>
+ <balance-check>
+ <dtmf>*8000</dtmf>
+ <dtmf>*5005</dtmf>
+ </balance-check>
+ <apn value="zap.vivo.com.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vivo</username>
+ <password>vivo</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Bahamas -->
+<country code="bs">
+ <provider>
+ <name>Batelco</name>
+ <gsm>
+ <network-id mcc="364" mnc="390"/>
+ <apn value="internet.btcbahamas.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Brunei -->
+<country code="bn">
+ <provider>
+ <name>B-Mobile</name>
+ <gsm>
+ <network-id mcc="528" mnc="02"/>
+ <apn value="bmobilewap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>DSTCOM</name>
+ <gsm>
+ <network-id mcc="528" mnc="11"/>
+ <apn value="dst.wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Belarus -->
+<country code="by">
+ <provider>
+ <!-- http://www.velcom.by/ru/services/gprs/settings/ -->
+ <name>velcom</name>
+ <gsm>
+ <network-id mcc="257" mnc="01"/>
+ <apn value="wap.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>GPRS WAP</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="web.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS WEB</name>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <apn value="plus.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS WEB PLUS</name>
+ <username>plus</username>
+ <password>plus</password>
+ </apn>
+ <apn value="privet.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS PRIVET</name>
+ <username>privet</username>
+ <password>privet</password>
+ </apn>
+ <apn value="web1.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB BASIC</name>
+ <username>web1</username>
+ <password>web1</password>
+ </apn>
+ <apn value="web2.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB 25</name>
+ <username>web2</username>
+ <password>web2</password>
+ </apn>
+ <apn value="web3.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB 150</name>
+ <username>web3</username>
+ <password>web3</password>
+ </apn>
+ <apn value="vmi.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB 500</name>
+ <username>vmi</username>
+ <password>vmi</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTS</name>
+ <gsm>
+ <network-id mcc="257" mnc="02"/>
+ <apn value="internet.mts.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mts</username>
+ <password>mts</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- http://life.com.by/en/services/internet-105.html -->
+ <name>life:)</name>
+ <gsm>
+ <network-id mcc="257" mnc="03"/>
+ <apn value="internet.life.com.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Botswana -->
+<country code="bw">
+ <provider>
+ <name>Mascom Wireless</name>
+ <gsm>
+ <network-id mcc="652" mnc="01"/>
+ <apn value="internet.mascom">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Burundi -->
+<country code="bi">
+ <provider>
+ <name>Leo/UCom</name>
+ <gsm>
+ <network-id mcc="642" mnc="03"/>
+ <apn value="ucnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tempo/Africell</name>
+ <gsm>
+ <network-id mcc="642" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Canada -->
+<country code="ca">
+ <provider>
+ <name>Fido</name>
+ <gsm>
+ <network-id mcc="302" mnc="370"/>
+ <apn value="internet.fido.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>fido</username>
+ <password>fido</password>
+ <dns>204.92.15.211</dns>
+ <dns>207.181.101.4</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Rogers</name>
+ <gsm>
+ <network-id mcc="302" mnc="720"/>
+ <apn value="internet.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wapuser1</username>
+ <password>wap</password>
+ <dns>207.181.101.4</dns>
+ <dns>207.181.101.5</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bell Mobility</name>
+ <gsm>
+ <network-id mcc="302" mnc="610"/>
+ <network-id mcc="302" mnc="640"/>
+ <network-id mcc="302" mnc="651"/>
+ <network-id mcc="302" mnc="880"/>
+ <apn value="inet.bell.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="pda.bell.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Web</name>
+ </apn>
+ <apn value="pda2.bell.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Fast Web</name>
+ </apn>
+ </gsm>
+ <cdma>
+ <sid value="16420"/>
+ <sid value="16440"/>
+ <sid value="16456"/>
+ <sid value="16410"/>
+ <sid value="16444"/>
+ <sid value="16390"/>
+ <sid value="16394"/>
+ <sid value="16402"/>
+ <sid value="16414"/>
+ <sid value="16416"/>
+ <sid value="16418"/>
+ <sid value="16462"/>
+ <sid value="16472"/>
+ <sid value="16408"/>
+ <sid value="16404"/>
+ <sid value="16430"/>
+ <sid value="16396"/>
+ <sid value="16426"/>
+ <sid value="16388"/>
+ <sid value="16390"/>
+ <sid value="16408"/>
+ <sid value="16414"/>
+ <sid value="16430"/>
+ <sid value="16460"/>
+ <sid value="16468"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Telus Mobility</name>
+ <gsm>
+ <network-id mcc="302" mnc="220"/>
+ <network-id mcc="302" mnc="860"/>
+ <network-id mcc="302" mnc="880"/>
+ <apn value="isp.telus.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="vpn.telus.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet (with VPN)</name>
+ </apn>
+ <apn value="bb.telus.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Blackberry</name>
+ </apn>
+ <apn value="sp.telus.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Web/Smartphone</name>
+ </apn>
+ </gsm>
+ <cdma>
+ <sid value="16422"/>
+ <sid value="17500"/>
+ <sid value="16438"/>
+ <sid value="16458"/>
+ <sid value="16436"/>
+ <sid value="16434"/>
+ <sid value="16384"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Virgin Mobile</name>
+ <cdma/>
+ </provider>
+ <provider>
+ <name>SaskTel</name>
+ <cdma>
+ <sid value="16410"/>
+ <sid value="16412"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Vidéotron</name>
+ <gsm>
+ <network-id mcc="302" mnc="500"/>
+ <network-id mcc="302" mnc="510"/>
+ <apn value="ihvm.videotron">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>IHVM</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>WIND Mobile</name>
+ <gsm>
+ <network-id mcc="302" mnc="490"/>
+ <apn value="broadband.windmobile.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Laptop (data stick)</name>
+ </apn>
+ <apn value="internet.windmobile.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile (add-on for phone)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mobilicity</name>
+ <gsm>
+ <network-id mcc="302" mnc="320"/>
+ <apn value="wap.davewireless.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Web</name>
+ </apn>
+ <apn value="internet.davewireless.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Congo (Dem. Rep.) -->
+<country code="cd">
+ <provider>
+ <name>Vodacom</name>
+ <gsm>
+ <network-id mcc="630" mnc="01"/>
+ <apn value="vodanet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vodalive</username>
+ <dns>172.24.97.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Congo (Rep.) -->
+<country code="cg">
+</country>
+
+<!-- Switzerland -->
+<country code="ch">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="228" mnc="03"/>
+ <apn value="mobileoffice3g">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere - Standard</name>
+ <dns>213.55.128.1</dns>
+ <dns>213.55.128.2</dns>
+ </apn>
+ <apn value="click">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere - Prepaid</name>
+ <dns>213.55.128.1</dns>
+ <dns>213.55.128.2</dns>
+ </apn>
+ <apn value="intranetaccess">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere - Intranet Access</name>
+ </apn>
+ <apn value="internet">
+ <name>Internet Everywhere - Postpaid</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sunrise</name>
+ <gsm>
+ <network-id mcc="228" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ <dns>194.230.1.103</dns>
+ <dns>194.230.1.71</dns>
+ </apn>
+ <apn value="wap.sunrise.ch">
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="mms.sunrise.ch">
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Swisscom</name>
+ <gsm>
+ <!-- username/password not included in Vodafone Broadband Connect version 10.1.0.23908 2010-06-07T17:47:01 -->
+ <!-- http://www.swisscom.ch/res/hilfe/mobile/einstellungen/index.htm -->
+ <network-id mcc="228" mnc="01"/>
+ <balance-check>
+ <ussd>*130#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*123*CODE#</ussd>
+ </balance-top-up>
+ <apn value="gprs.swisscom.ch">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Swisscom GPRS</name>
+ <dns>138.188.101.189</dns>
+ <dns>138.188.101.186</dns>
+ </apn>
+ <apn value="corporate.swisscom.ch">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Swisscom CAA</name>
+ <username>testprofil</username>
+ <password>temporary</password>
+ </apn>
+ <apn value="event.swisscom.ch">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Swisscom MMS</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>M-Budget</name>
+ <gsm>
+ <network-id mcc="228" mnc="01"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <apn value="gprs.swisscom.ch">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Migros Data</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Cote d'Ivoire -->
+<country code="ci">
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="612" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>172.16.100.5</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Chile -->
+<country code="cl">
+ <provider>
+ <name>Claro Chile</name>
+ <gsm>
+ <network-id mcc="730" mnc="03"/>
+ <apn value="bam.clarochile.cl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>clarochile</username>
+ <password>clarochile</password>
+ </apn>
+ <apn value="bap.clarochile.cl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepago</name>
+ <username>clarochile</username>
+ <password>clarochile</password>
+ </apn>
+ <apn value="wap.clarochile.cl">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>clarochile</username>
+ <password>clarochile</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Entel PCS</name>
+ <gsm>
+ <network-id mcc="730" mnc="01"/>
+ <apn value="imovil.entelpcs.cl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract / Prepaid / WebSession</name>
+ <username>entelpcs</username>
+ <password>entelpcs</password>
+ </apn>
+ <apn value="bam.entelpcs.cl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WAP</name>
+ <username>entelpcs</username>
+ <password>entelpcs</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="730" mnc="10"/>
+ <apn value="web.tmovil.cl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web</name>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <apn value="wap.tmovil.cl">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Cameroon -->
+<country code="cm">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="624" mnc="02"/>
+ <apn value="orangecmgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>orange</username>
+ <password>orange</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="624" mnc="01"/>
+ <apn value="INTERNET">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>guest</username>
+ <password>guest</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- China -->
+<country code="cn">
+ <provider>
+ <name>China Mobile</name>
+ <gsm>
+ <network-id mcc="460" mnc="00"/>
+ <network-id mcc="460" mnc="02"/>
+ <apn value="cmwap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>guest</username>
+ <password>guest</password>
+ </apn>
+ <apn value="cmnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <username>guest</username>
+ <password>guest</password>
+ <dns>211.136.20.203</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>China Unicom</name>
+ <gsm>
+ <network-id mcc="460" mnc="01"/>
+ <apn value="3gnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>uninet</username>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>China Telecom</name>
+ <cdma>
+ <username>ctnet@mycdma.cn</username>
+ <password>vnet.mobi</password>
+ <sid value="11296"/>
+ <sid value="11298"/>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Costa Rica -->
+<country code="cr">
+ <provider>
+ <name>IceCelular</name>
+ <gsm>
+ <network-id mcc="712" mnc="01"/>
+ <network-id mcc="712" mnc="02"/>
+ <apn value="icecelular">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>guest</username>
+ <password>guest</password>
+ <dns>208.133.206.44</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Kolbi</name>
+ <gsm>
+ <network-id mcc="712" mnc="03"/>
+ <voicemail>190</voicemail>
+ <balance-check>
+ <sms text="">1150</sms>
+ </balance-check>
+ <apn value="kolbi3g">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Kolbi 3g</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Colombia -->
+<country code="co">
+ <provider>
+ <name>Comcel</name>
+ <gsm>
+ <network-id mcc="732" mnc="101"/>
+ <apn value="internet.comcel.com.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>COMCELWEB</username>
+ <password>COMCELWEB</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>eTb</name>
+ <gsm>
+ <apn value="moviletb.net.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>etb</username>
+ <password>etb</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="732" mnc="102"/>
+ <network-id mcc="732" mnc="123"/>
+ <apn value="internet.movistar.com.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistar</username>
+ <password>movistar</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="732" mnc="103"/>
+ <network-id mcc="732" mnc="111"/>
+ <apn value="web.colombiamovil.com.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Uff</name>
+ <gsm>
+ <apn value="web.uffmovil.com.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>UNE</name>
+ <gsm>
+ <apn value="www.une.net.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>une</username>
+ <password>une</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Cyprus -->
+<country code="cy">
+ <provider>
+ <name>Cytamobile-Vodafone</name>
+ <gsm>
+ <network-id mcc="280" mnc="01"/>
+ <msisdn-query>
+ <ussd>*#109#</ussd>
+ </msisdn-query>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ </apn>
+ <apn value="pp.internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="280" mnc="10"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Czech Republic -->
+<country code="cz">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="230" mnc="03"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>217.77.161.130</dns>
+ <dns>217.77.161.131</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>O2</name>
+ <gsm>
+ <network-id mcc="230" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>160.218.10.200</dns>
+ <dns>160.218.43.200</dns>
+ </apn>
+ <apn value="internet.open">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>160.218.10.200</dns>
+ <dns>160.218.43.200</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="230" mnc="01"/>
+ <apn value="internet.t-mobile.cz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>62.141.0.1</dns>
+ <dns>213.162.65.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Germany -->
+<country code="de">
+ <provider>
+ <name>AldiTalk/MedionMobile</name>
+ <gsm>
+ <network-id mcc="262" mnc="03"/>
+ <network-id mcc="262" mnc="05"/>
+ <network-id mcc="262" mnc="77"/>
+ <voicemail>9911</voicemail>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*104*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Volume rate/30 Day Flatrate</name>
+ <username>eplus</username>
+ <password>gprs</password>
+ <dns>212.23.97.2</dns>
+ <dns>212.23.97.3</dns>
+ </apn>
+ <apn value="tagesflat.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>24 Hour Flatrate</name>
+ <name xml:lang="de">Tages-Flatrate</name>
+ <username>eplus</username>
+ <password>gprs</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>blau.de</name>
+ <gsm>
+ <network-id mcc="262" mnc="03"/>
+ <network-id mcc="262" mnc="05"/>
+ <network-id mcc="262" mnc="77"/>
+
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*104*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>blau</username>
+ <password>blau</password>
+ </apn>
+ <apn value="tagesflat.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>24 Hour Flatrate</name>
+ <name xml:lang="de">Tages-Flatrate</name>
+ <username>blau</username>
+ <password>blau</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bild Mobil</name>
+ <gsm>
+ <!-- http://www.bildmobil.de/info_handyeinstellungen.html -->
+ <network-id mcc="262" mnc="02"/>
+ <apn value="access.vodafone.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>BILD Mobilportal</name>
+ </apn>
+ <apn value="web.vodafone.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <dns>139.7.30.125</dns>
+ <dns>139.7.30.126</dns>
+ </apn>
+ <!-- http://www.prepaid-wiki.de/index.php5/BILDmobil_Daten-SIM -->
+ <apn value="event.vodafone.de">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>BILDmobil Speedstick (Surfpakete)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>E-Plus</name>
+ <gsm>
+ <network-id mcc="262" mnc="03"/>
+ <network-id mcc="262" mnc="05"/>
+ <network-id mcc="262" mnc="77"/>
+
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*104*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>eplus</username>
+ <password>gprs</password>
+ <dns>212.23.97.2</dns>
+ <dns>212.23.97.3</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>O2</name>
+ <gsm>
+ <network-id mcc="262" mnc="07"/>
+ <network-id mcc="262" mnc="08"/>
+ <network-id mcc="262" mnc="11"/>
+
+ <voicemail>333</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*103*CODE#</ussd>
+ </balance-top-up>
+
+ <apn value="pinternet.interkom.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>LOOP</name>
+ <dns>193.189.244.225</dns>
+ <dns>193.189.244.206</dns>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pay-by-MB</name>
+ <dns>195.182.110.132</dns>
+ <dns>62.134.11.4</dns>
+ </apn>
+ <apn value="surfo2">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pay-by-time</name>
+ <dns>195.182.110.132</dns>
+ <dns>62.134.11.4</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tchibo-Mobil</name>
+ <gsm>
+ <network-id mcc="262" mnc="07"/>
+ <network-id mcc="262" mnc="08"/>
+ <network-id mcc="262" mnc="11"/>
+
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*103*CODE#</ussd>
+ </balance-top-up>
+ <apn value="webmobil1">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Tagesflat / Monats-Flatrate L / Monats-Flatrate XL</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile(Telekom)</name>
+ <gsm>
+ <network-id mcc="262" mnc="01"/>
+ <network-id mcc="262" mnc="06"/>
+
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*101*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.t-d1.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <password>t-d1</password>
+ <dns>193.254.160.1</dns>
+ <dns>193.254.160.130</dns>
+ </apn>
+ <apn value="internet.t-mobile">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>t-mobile</username>
+ <password>tm</password>
+ <dns>10.74.83.22</dns>
+ <dns>193.254.160.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Congstar</name>
+ <gsm>
+ <network-id mcc="262" mnc="01"/>
+
+ <apn value="internet.t-mobile">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid Contracts</name>
+ <username>t-mobile</username>
+ <password>tm</password>
+ <dns>193.254.160.1</dns>
+ <dns>10.74.83.22</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="262" mnc="02"/>
+ <network-id mcc="262" mnc="04"/>
+ <network-id mcc="262" mnc="09"/>
+
+ <voicemail>5500</voicemail>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*100*CODE#</ussd>
+ </balance-top-up>
+
+ <apn value="web.vodafone.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>139.7.30.125</dns>
+ <dns>139.7.30.126</dns>
+ </apn>
+ <apn value="event.vodafone.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WebSessions</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>139.7.30.125</dns>
+ <dns>139.7.30.126</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>FONIC</name>
+ <gsm>
+ <network-id mcc="262" mnc="07"/>
+ <network-id mcc="262" mnc="08"/>
+ <network-id mcc="262" mnc="11"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*103*CODE#</ussd>
+ </balance-top-up>
+ <apn value="pinternet.interkom.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>fonic</username>
+ <password>fonic</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>simyo Internet</name>
+ <gsm>
+ <network-id mcc="262" mnc="03"/>
+ <network-id mcc="262" mnc="05"/>
+ <network-id mcc="262" mnc="77"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*104*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>simyo</username>
+ <password>simyo</password>
+ <dns>212.23.97.2</dns>
+ <dns>212.23.97.3</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- This configuration is valid for all vistream retailers like
+ solomo, igge & ko, sdt.net, Südkurier-Tel etc.-->
+ <name>vistream</name>
+ <gsm>
+ <network-id mcc="262" mnc="16"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="internet.vistream.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>vistream</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>solomo</name>
+ <gsm>
+ <network-id mcc="262" mnc="16"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="internet.vistream.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>vistream</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Materna BR</name>
+ <gsm>
+ <network-id mcc="262" mnc="16"/>
+ <apn value="internet.vistream.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>vistream</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>sdt.net</name>
+ <gsm>
+ <network-id mcc="262" mnc="16"/>
+ <apn value="internet.vistream.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>vistream</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>igge &amp; ko</name>
+ <gsm>
+ <network-id mcc="262" mnc="16"/>
+ <apn value="internet.vistream.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>vistream</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>PTT mobile</name>
+ <gsm>
+ <network-id mcc="262" mnc="16"/>
+ <apn value="internet.vistream.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>vistream</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TouristMobile</name>
+ <gsm>
+ <network-id mcc="262" mnc="16"/>
+ <apn value="internet.vistream.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>vistream</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>SunSIM</name>
+ <gsm>
+ <network-id mcc="262" mnc="16"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="internet.vistream.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>vistream</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>SüdkurierTel</name>
+ <gsm>
+ <network-id mcc="262" mnc="16"/>
+ <apn value="internet.vistream.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>vistream</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>NetCologne</name>
+ <gsm>
+ <network-id mcc="262" mnc="03"/>
+ <apn value="internet.netcologne.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>password</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Alice</name>
+ <gsm>
+ <network-id mcc="262" mnc="07"/>
+ <apn value="internet.partner1">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Option Mobile</name>
+ <dns>193.189.244.225</dns>
+ <dns>193.189.244.206</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>1&amp;1</name>
+ <gsm>
+ <!-- Vodafone (D2) network -->
+ <network-id mcc="262" mnc="02"/>
+ <network-id mcc="262" mnc="04"/>
+ <network-id mcc="262" mnc="09"/>
+
+ <voicemail>5500</voicemail>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+
+ <apn value="web.vodafone.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ <apn value="mail.partner.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Web</name>
+ <username>D2</username>
+ <password>Web</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Netzclub</name>
+ <gsm>
+ <!-- O2 network -->
+ <network-id mcc="262" mnc="07"/>
+ <network-id mcc="262" mnc="08"/>
+ <network-id mcc="262" mnc="11"/>
+ <apn value="pinternet.interkom.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <!-- Information taken from https://www.netzclub.net/downloads/default/Manuelle_Handyeinstellungen.pdf -->
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Denmark -->
+<country code="dk">
+ <provider primary="true">
+ <name>3</name>
+ <gsm>
+ <network-id mcc="238" mnc="06"/>
+ <apn value="bredband.tre.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Bredbånd (standard)</name>
+ </apn>
+ <apn value="net.tre.dk">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Bredbånd Premium Kontant</name>
+ </apn>
+ <apn value="data.tre.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3 (standard for mobilkunder; spærret for indgående trafik)</name>
+ </apn>
+ <apn value="static.tre.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3 (statisk IP)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <!-- http://oister.dk - Same network as 3.dk -->
+ <provider>
+ <name>OiSTER</name>
+ <gsm>
+ <network-id mcc="238" mnc="06"/>
+ <apn value="bredband.oister.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+
+ <!-- http://www.ice-net.dk/mobiltbredbaand.php -->
+ <provider>
+ <name>ice.net (Nordisk Mobiltelefon)</name>
+ <cdma>
+ <username>cdma</username>
+ <password>cdma</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="238" mnc="02"/>
+ <network-id mcc="238" mnc="77"/>
+
+ <voicemail>20171717</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ <dtmf>40454545</dtmf>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.88.64.199</dns>
+ <dns>212.88.64.14</dns>
+ </apn>
+ </gsm>
+ </provider>
+
+ <!-- http://www.cbb.dk/mobil/hjaelp/manuel-opsaetning-af-mms-og-gprs/ -->
+ <provider>
+ <name>CBB Mobil</name>
+ <gsm>
+ <network-id mcc="238" mnc="02"/>
+ <network-id mcc="238" mnc="77"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TDC</name>
+ <gsm>
+ <network-id mcc="238" mnc="01"/>
+
+ <voicemail>20171717</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ <dtmf>40454545</dtmf>
+ </balance-check>
+
+ <!-- http://kundeservice.tdc.dk/privat/faq.php?id=20063 -->
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>194.239.134.83</dns>
+ <dns>193.162.153.164</dns>
+ </apn>
+ <!-- mnc="0171" in Vodafone XML -->
+ <apn value="internet.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <!-- mnc="0172" in Vodafone XML -->
+ <apn value="internet.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Fullrate</name>
+ <gsm>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>Fullrate</username>
+ <password>Fullrate</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telia</name>
+ <gsm>
+ <network-id mcc="238" mnc="30"/>
+
+ <voicemail>28184000</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+
+ <apn value="www.internet.mtelia.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>BiBoB</name>
+ <gsm>
+ <network-id mcc="238" mnc="02"/>
+ <apn value="internet.bibob.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <!-- Telmore - Same network as TDC -->
+ <provider>
+ <name>Telmore</name>
+ <gsm>
+ <network-id mcc="238" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>194.239.134.83</dns>
+ <dns>193.162.153.164</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Unotel</name>
+ <gsm>
+ <network-id mcc="238" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>happiimobil</name>
+ <gsm>
+ <network-id mcc="238" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <!-- Onfone: https://www.onfone.dk/Kundeservice/mobil/saet_din_mobil_op/internet-gprs-3g/ -->
+ <provider>
+ <name>Onfone Internet DK</name>
+ <gsm>
+ <network-id mcc="238" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Dominican Republic -->
+<country code="do">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="370" mnc="01"/>
+ <voicemail>*777</voicemail>
+ <balance-check>
+ <ussd>#131#</ussd>
+ </balance-check>
+ <apn value="orangenet.com.do">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="370" mnc="02"/>
+ <voicemail>*99</voicemail>
+ <balance-check>
+ <ussd>*122#</ussd>
+ <dtmf>*22</dtmf>
+ </balance-check>
+ <apn value="internet.ideasclaro.com.do">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.3.81.5</dns>
+ <dns>196.3.81.132</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Viva</name>
+ <gsm>
+ <network-id mcc="370" mnc="04"/>
+ <balance-check>
+ <ussd>#111#</ussd>
+ <dtmf>*74</dtmf>
+ </balance-check>
+ <apn value="edge.viva.net.do">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>viva</username>
+ <password>viva</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Algeria -->
+<country code="dz">
+ <provider>
+ <name>Djezzy</name>
+ <gsm>
+ <network-id mcc="603" mnc="02"/>
+ <apn value="djezzy.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mobilis</name>
+ <gsm>
+ <network-id mcc="603" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Nedjma</name>
+ <gsm>
+ <network-id mcc="603" mnc="03"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB</name>
+ <username>nedjma</username>
+ <password>nedjma</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Ecuador -->
+<country code="ec">
+ <provider>
+ <name>Movistar UMTS</name>
+ <gsm>
+ <network-id mcc="740" mnc="00"/>
+ <apn value="navega.movistar.ec">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistar</username>
+ <password>movistar</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Porta 3G</name>
+ <gsm>
+ <network-id mcc="740" mnc="01"/>
+ <apn value="internet.porta.com.ec">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Estonia -->
+<country code="ee">
+ <provider>
+ <name>EMT</name>
+ <gsm>
+ <network-id mcc="248" mnc="01"/>
+ <apn value="internet.emt.ee">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>217.71.32.116</dns>
+ <dns>217.71.32.115</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Nordea</name>
+ <gsm>
+ <network-id mcc="248" mnc="01"/>
+ <apn value="internet.emt.ee">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Elisa</name>
+ <gsm>
+ <network-id mcc="248" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>194.204.0.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="248" mnc="03"/>
+ <apn value="internet.tele2.ee">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Egypt -->
+<country code="eg">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="602" mnc="02"/>
+ <msisdn-query>
+ <ussd>*878#</ussd>
+ </msisdn-query>
+ <apn value="internet.vodafone.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ <dns>163.121.128.134</dns>
+ <dns>212.103.160.18</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Etisalat</name>
+ <gsm>
+ <network-id mcc="602" mnc="03"/>
+ <apn value="etisalat">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MobiNil</name>
+ <gsm>
+ <network-id mcc="602" mnc="01"/>
+ <apn value="mobinilweb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>80.75.166.250</dns>
+ <dns>163.121.163.201</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Spain -->
+<country code="es">
+ <provider>
+ <name>Euskaltel</name>
+ <gsm>
+ <network-id mcc="214" mnc="08"/>
+ <apn value="internet.euskaltel.mobi">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>CLIENTE</username>
+ <password>EUSKALTEL</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Másmovil</name>
+ <gsm>
+ <network-id mcc="214" mnc="03"/>
+ <apn value="internetmas" >
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>móbil R (Mundo-R)</name>
+ <gsm>
+ <network-id mcc="214" mnc="17"/>
+ <apn value="internet.mundo-r.com" >
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>moviData</name>
+ <gsm>
+ <network-id mcc="214" mnc="03"/>
+ <apn value="INTERNETTPH">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.143.33.8</dns>
+ <dns>62.36.225.150</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ONO</name>
+ <gsm>
+ <network-id mcc="214" mnc="18"/>
+ <apn value="internet.ono.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>62.42.230.24</dns>
+ <dns>62.42.63.52</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Pepephone</name>
+ <gsm>
+ <network-id mcc="214" mnc="06"/>
+ <apn value="gprs.pepephone.com" >
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="214" mnc="03"/>
+ <network-id mcc="214" mnc="09"/>
+
+ <voicemail>242</voicemail>
+ <balance-check>
+ <ussd>*111#</ussd>
+ <ussd>*113#</ussd>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Orange</name>
+ <username>ORANGE</username>
+ <password>ORANGE</password>
+ <dns>85.62.229.133</dns>
+ <dns>85.62.229.134</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Simyo/Blau</name>
+ <gsm>
+ <network-id mcc="214" mnc="19"/>
+ <apn value="gprs-service.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>195.230.105.134</dns>
+ <dns>195.230.105.135</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telecable</name>
+ <gsm>
+ <network-id mcc="214" mnc="16"/>
+ <apn value="internet.telecable.es">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>telecable</username>
+ <password>telecable</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar (Telefónica)</name>
+ <gsm>
+ <network-id mcc="214" mnc="05"/>
+ <network-id mcc="214" mnc="07"/>
+
+ <voicemail>123</voicemail>
+ <balance-check>
+ <dtmf>2266</dtmf>
+ </balance-check>
+ <ecclist>112,911</ecclist>
+ <smscb>whatever</smscb>
+ <apn value="movistar.es">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistar</username>
+ <password>movistar</password>
+ <dns>194.179.1.100</dns>
+ <dns>194.179.1.101</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone (Airtel)</name>
+ <gsm>
+ <network-id mcc="214" mnc="01"/>
+ <network-id mcc="214" mnc="06"/>
+ <msisdn-query>
+ <ussd>*138#</ussd>
+ </msisdn-query>
+ <apn value="ac.vodafone.es">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>212.73.32.96</dns>
+ <dns>212.73.32.67</dns>
+ </apn>
+ <apn value="airtelnet.es">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Airtel (old)</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>212.73.32.3</dns>
+ <dns>212.73.32.67</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Yoigo</name>
+ <gsm>
+ <network-id mcc="214" mnc="04"/>
+
+ <voicemail>633</voicemail>
+ <balance-check>
+ <ussd>*111#</ussd>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.248.76.210</dns>
+ <dns>213.248.100.54</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Jazztel</name>
+ <gsm>
+ <network-id mcc="214" mnc="21"/>
+ <apn value="jazzinternet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <dns>87.216.1.65</dns>
+ <dns>87.216.1.66</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Carrefour Móvil</name>
+ <gsm>
+ <apn value="CARREFOURINTERNET">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- from http://www.eroskimovil.es/geomv/c/pub/en/servicios/datos -->
+ <name>Eroski Móvil</name>
+ <gsm>
+ <network-id mcc="214" mnc="24"/>
+ <apn value="gprs.eroskimovil.es">
+ <name>Eroski Móvil GPRS</name>
+ <username>wap@wap</username>
+ <password>wap125</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Ethiopia -->
+<country code="et">
+ <provider>
+ <name>Ethio Telecom</name>
+ <gsm>
+ <network-id mcc="636" mnc="01"/>
+ <balance-check>
+ <ussd>*804#</ussd>
+ </balance-check>
+
+ <apn value="etc.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.55.96.148</dns>
+ <dns>213.55.96.166</dns>
+ </apn>
+ </gsm>
+ <cdma>
+ <username>etc</username>
+ <password>etc</password>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Faroe Islands -->
+<country code="fo">
+ <provider>
+ <name>Vodafone FO</name>
+ <gsm>
+ <network-id mcc="288" mnc="02"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <apn value="vmc.vodafone.fo">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Finland -->
+<country code="fi">
+ <provider>
+ <name>Dna</name>
+ <gsm>
+ <network-id mcc="244" mnc="03"/>
+ <!-- Phone number dependent:
+ - Numbers beginning with 044 XXXXXXX turn in to 044 6 XXXXXXX
+ - Numbers beginning with 041 XXXXXXX turn in to 041 6 XXXXXXX
+ - Others case by case
+ http://www.dna.fi/Yrityksille/Matkaviestinpalvelut/LiittymienLisapalvelut/dnafaksivastaaja/Documents/dna_vastaaja_kayttohje_120310.pdf
+ <voicemail/> -->
+ <balance-check>
+ <ussd>*100#</ussd>
+ <dtmf>0800412582</dtmf>
+ <sms text="SALDO">14000</sms>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>dna internet</name>
+ <dns>217.78.192.22</dns>
+ <dns>217.78.192.78</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Elisa</name>
+ <gsm>
+ <network-id mcc="244" mnc="05"/>
+ <voicemail>777</voicemail>
+ <balance-check>
+ <dtmf>080090598</dtmf>
+ <sms text="SALDO">18258</sms>
+ <sms text="PAKETTI">18258</sms>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Saunalahti</name>
+ <gsm>
+ <network-id mcc="244" mnc="21"/>
+
+ <!-- Phone number dependent:
+ - Numbers beginning with 045 67 XXXXX turn in to 045 66 XXXXX
+ - Numbers beginning with 045 63 XXXXX turn in to 045 62 XXXXX
+ - Others case by case
+ http://saunalahti.fi/tuki/gsm/vo/ohjevastaaja.php
+ <voicemail/> -->
+ <balance-check>
+ <sms text="SALDO">16304</sms>
+ <sms text="SALDO">15045</sms>
+ <sms text="KOKOSALDO">16304</sms>
+ <sms text="GSALDO">16304</sms>
+ <sms text="PAKETTI">16304</sms>
+ </balance-check>
+
+ <apn value="internet.saunalahti">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid (contract) NAT (available for all subscribers)</name>
+ <dns>195.74.0.47</dns>
+ <dns>195.197.54.100</dns>
+ </apn>
+ <apn value="internet4">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid (contract) public IP address (needs to be ordered)</name>
+ <dns>195.74.0.47</dns>
+ <dns>195.197.54.100</dns>
+ </apn>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid (no contract)</name>
+ <dns>195.74.0.47</dns>
+ <dns>195.197.54.100</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sonera</name>
+ <gsm>
+ <network-id mcc="244" mnc="91"/>
+
+ <!-- Phone number dependent:
+ - Numbers beginning with 040 XXXXXXX turns in to 042 XXXXXXX
+ - Others case by case
+ <voicemail/> -->
+ <balance-check>
+ <sms text="EASY SALDO">15400</sms>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>192.89.123.230</dns>
+ <dns>192.89.123.231</dns>
+ </apn>
+ <apn value="prointernet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Prointernet (public IP)</name>
+ <dns>192.89.123.230</dns>
+ <dns>192.89.123.231</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Welho</name>
+ <gsm>
+ <apn value="internet.welho.fi">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Wekkula</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Fiji -->
+<country code="fj">
+ <provider>
+ <name>Vodafone / Kidanet</name>
+ <gsm>
+ <network-id mcc="542" mnc="01"/>
+ <msisdn-query>
+ <ussd>*999#</ussd>
+ </msisdn-query>
+ <apn value="vfinternet.fj">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="kidanet.fj">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <!-- http://www.vodafone.com.fj/pages.cfm/personal/services/prepay-flashnet/installation-guide.html -->
+ <apn value="prepay.vfinternet.fj">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- France -->
+<country code="fr">
+ <provider>
+ <name>A Mobile (Auchan Telecom)</name>
+ <gsm>
+ <apn value="wap65">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bouygues Telecom</name>
+ <gsm>
+ <network-id mcc="208" mnc="20"/>
+ <network-id mcc="208" mnc="21"/>
+
+ <voicemail>660</voicemail>
+ <balance-check>
+ <dtmf>630</dtmf>
+ </balance-check>
+
+ <apn value="a2bouygtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contrat Pro Data Illimité</name>
+ <dns>62.201.129.99</dns>
+ </apn>
+ <apn value="b2bouygtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>B2Bouygtel</name>
+ <dns>62.201.129.99</dns>
+ </apn>
+ <apn value="ebouygtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Forfait Data</name>
+ <dns>62.201.129.99</dns>
+ </apn>
+ <apn value="mmsbouygtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Forfait Data</name>
+ <dns>62.201.129.99</dns>
+ </apn>
+ <apn value="pcebouygtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contrat Pro Data</name>
+ <dns>62.201.129.99</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Free Mobile</name>
+ <gsm>
+ <!-- http://mobile.free.fr/faq-config-apn-autres.html -->
+ <network-id mcc="208" mnc="15"/>
+ <apn value="free">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Free-Mobile</name>
+ <username>free</username>
+ <password>free</password>
+ </apn>
+ <apn value="mmsfree">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Free-Mobile</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="208" mnc="01"/>
+ <network-id mcc="208" mnc="00"/>
+
+ <voicemail>888</voicemail>
+ <balance-check>
+ <ussd>#123#</ussd>
+ </balance-check>
+
+ <apn value="orange.fr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Orange Internet</name>
+ <dns>194.51.3.56</dns>
+ <dns>194.51.3.76</dns>
+ </apn>
+ <apn value="internet-entreprise">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business Contract</name>
+ <dns>194.51.3.56</dns>
+ <dns>194.51.3.76</dns>
+ </apn>
+ <apn value="orange">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>No Contract / Mobicarte</name>
+ <username>orange</username>
+ <password>orange</password>
+ <dns>194.51.3.56</dns>
+ <dns>194.51.3.76</dns>
+ </apn>
+ <apn value="orange-mib">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Orange Entreprises</name>
+ <username>mportail</username>
+ <password>mib</password>
+ <dns>172.17.0.2</dns>
+ <dns>172.17.0.4</dns>
+ </apn>
+ <apn value="orange-acte">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <username>orange</username>
+ <password>orange</password>
+ </apn>
+ <apn value="orange.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere 3G</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>SFR</name>
+ <gsm>
+ <!-- http://assistance.sfr.fr/internet-partout/Mobile/difference-wap-web/fc-2302-62196 -->
+ <network-id mcc="208" mnc="10"/>
+ <network-id mcc="208" mnc="11"/>
+ <msisdn-query>
+ <sms text="ABCd84367">9445</sms>
+ </msisdn-query>
+ <voicemail>123</voicemail>
+ <balance-check>
+ <dtmf>950</dtmf>
+ </balance-check>
+
+ <apn value="websfr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web / Prepaid</name>
+ <dns>172.20.2.10</dns>
+ <dns>172.20.2.39</dns>
+ </apn>
+ <apn value="wapsfr">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ </apn>
+ <apn value="internetpro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SFR internetpro</name>
+ </apn>
+ <apn value="ipnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SFR ipnet</name>
+ </apn>
+ <apn value="slsfr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <dns>172.20.2.10</dns>
+ <dns>172.20.2.39</dns>
+ </apn>
+ <apn value="sl2sfr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Full Internet (Webphone)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Transatel Telecom</name>
+ <gsm>
+ <network-id mcc="208" mnc="22"/>
+ <apn value="netgprs.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TEN</name>
+ <gsm>
+ <network-id mcc="208" mnc="01"/>
+ <apn value="ao.fr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>orange</username>
+ <password>orange</password>
+ </apn>
+ <apn value="ofnew.fr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pay-by-MB</name>
+ <username>orange</username>
+ <password>orange</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Britain -->
+<country code="gb">
+ <provider>
+ <name>Asda Mobile</name>
+ <gsm>
+ <network-id mcc="234" mnc="15"/>
+ <apn value="asdamobiles.co.uk">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>BT Mobile</name>
+ <gsm>
+ <network-id mcc="234" mnc="00"/>
+ <apn value="btmobile.bt.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>bt</username>
+ <password>bt</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>GiffGaff</name>
+ <gsm>
+ <network-id mcc="234" mnc="02"/>
+ <network-id mcc="234" mnc="10"/>
+ <network-id mcc="234" mnc="11"/>
+ <apn value="giffgaff.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>giffgaff</username>
+ <password>password</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>O2</name>
+ <gsm>
+ <network-id mcc="234" mnc="02"/>
+ <network-id mcc="234" mnc="10"/>
+ <network-id mcc="234" mnc="11"/>
+ <voicemail>901</voicemail>
+ <balance-check>
+ <ussd>*#10#</ussd>
+ <dtmf>4444</dtmf>
+ </balance-check>
+ <apn value="mobile.o2.co.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <username>o2web</username>
+ <password>password</password>
+ <dns>193.113.200.200</dns>
+ <dns>193.113.200.201</dns>
+ </apn>
+ <apn value="mobile.o2.co.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract (faster)</name>
+ <username>faster</username>
+ <password>password</password>
+ <dns>193.113.200.200</dns>
+ <dns>193.113.200.201</dns>
+ </apn>
+ <apn value="payandgo.o2.co.uk">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Pay and Go (Prepaid)</name>
+ <username>payandgo</username>
+ <password>payandgo</password>
+ </apn>
+ <apn value="idata.o2.co.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>iPhone (Contract)</name>
+ <username>vertigo</username>
+ <password>password</password>
+ </apn>
+ <apn value="m-bb.o2.co.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>o2bb</username>
+ <password>password</password>
+ <dns>82.132.254.2</dns>
+ <dns>82.132.254.3</dns>
+ </apn>
+ <apn value="wap.o2.co.uk">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>o2wap</username>
+ <password>password</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="234" mnc="30"/>
+ <voicemail>222</voicemail>
+ <balance-check>
+ <dtmf>150</dtmf>
+ <sms text="BA">150</sms>
+ <sms text="AL">150</sms>
+ </balance-check>
+ <apn value="general.t-mobile.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>User</username>
+ <password>mms</password>
+ <dns>149.254.201.126</dns>
+ <dns>149.254.192.126</dns>
+ </apn>
+ <apn value="general.t-mobile.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>149.254.230.7</dns>
+ <dns>149.254.199.126</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tesco Mobile</name>
+ <gsm>
+ <network-id mcc="234" mnc="02"/>
+ <network-id mcc="234" mnc="10"/>
+ <network-id mcc="234" mnc="11"/>
+ <apn value="prepay.tesco-mobile.com">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>tescowap</username>
+ <password>password</password>
+ <dns>193.113.200.195</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Virgin Mobile</name>
+ <gsm>
+ <network-id mcc="234" mnc="31"/>
+ <network-id mcc="234" mnc="32"/>
+ <apn value="vdata">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.7.0.138</dns>
+ <dns>196.7.142.132</dns>
+ </apn>
+ <apn value="goto.virginmobile.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>user</username>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="234" mnc="15"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <voicemail>121</voicemail>
+ <balance-check>
+ <ussd>*#1345#</ussd>
+ <dtmf>2345</dtmf>
+ </balance-check>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <username>web</username>
+ <password>web</password>
+ <dns>10.206.65.68</dns>
+ <dns>10.203.65.68</dns>
+ </apn>
+ <apn value="pp.vodafone.co.uk">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <username>web</username>
+ <password>web</password>
+ <dns>172.29.1.11</dns>
+ <dns>172.29.1.11</dns>
+ </apn>
+ <apn value="ppbundle.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>TopUp and Go</name>
+ <username>web</username>
+ <password>web</password>
+ <dns>10.203.129.68</dns>
+ <dns>10.203.129.68</dns>
+ </apn>
+ <apn value="pp.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>TopUp and Go (older 1GB SIMs)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>3</name>
+ <gsm>
+ <network-id mcc="234" mnc="20"/>
+ <apn value="3internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="three.co.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Handsets</name>
+ <dns>172.30.139.17</dns>
+ <dns>172.30.140.69</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="234" mnc="33"/>
+ <network-id mcc="234" mnc="34"/>
+ <voicemail>123</voicemail>
+ <balance-check>
+ <dtmf>453</dtmf>
+ </balance-check>
+ <apn value="orangeinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <username>orange</username>
+ <password>orange</password>
+ <dns>193.35.133.10</dns>
+ <dns>193.35.134.10</dns>
+ </apn>
+ <apn value="internetvpn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract (with VPN)</name>
+ <username>orange</username>
+ <password>orange</password>
+ <dns>193.35.133.10</dns>
+ <dns>193.35.134.10</dns>
+ </apn>
+ <apn value="orangewap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Orange WAP</name>
+ <username>orange</username>
+ <password>multimedia</password>
+ <dns>158.43.192.1</dns>
+ <dns>158.43.128.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Georgia -->
+<country code="ge">
+ <provider>
+ <name>Geocell</name>
+ <gsm>
+ <network-id mcc="282" mnc="01"/>
+ <apn value="Internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.72.130.20</dns>
+ <dns>212.72.152.001</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Guernsey -->
+<country code="gg">
+ <provider>
+ <name>Airtel-Vodaphone</name>
+ <gsm>
+ <network-id mcc="234" mnc="03"/>
+ <apn value="airtel-ci-gprs.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sure (Cable &amp; Wireless)</name>
+ <gsm>
+ <network-id mcc="234" mnc="55"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Wave Telecom</name>
+ <gsm>
+ <network-id mcc="234" mnc="50"/>
+ <apn value="pepper">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.9.0.135</dns>
+ <dns>212.9.0.136</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Ghana -->
+<country code="gh">
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="620" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone (ONEtouch)</name>
+ <gsm>
+ <network-id mcc="620" mnc="02"/>
+ <msisdn-query>
+ <ussd>*127#</ussd>
+ </msisdn-query>
+ <apn value="browse">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="620" mnc="03"/>
+ <apn value="web.tigo.com.gh">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="620" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Kasapa</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Greece -->
+<country code="gr">
+ <provider>
+ <name>Cosmote</name>
+ <gsm>
+ <network-id mcc="202" mnc="01"/>
+
+ <voicemail>123</voicemail>
+ <balance-check>
+ <dtmf>1314</dtmf>
+ <sms text="YP">1314</sms>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="202" mnc="05"/>
+ <voicemail>121</voicemail>
+ <balance-check>
+ <dtmf>1252</dtmf>
+ <sms text="Y">1252</sms>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ </apn>
+ <apn value="web.session">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband On Demand</name>
+ <dns>213.249.17.10</dns>
+ <dns>213.249.17.11</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Wind</name>
+ <gsm>
+ <network-id mcc="202" mnc="09"/>
+ <network-id mcc="202" mnc="10"/>
+
+ <voicemail>122</voicemail>
+ <voicemail>1333</voicemail>
+ <balance-check>
+ <dtmf>1269</dtmf>
+ <dtmf>1225</dtmf>
+ <sms text="">1269</sms>
+ <sms text="">1225</sms>
+ </balance-check>
+
+ <apn value="gint.b-online.gr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Guatemala -->
+<country code="gt">
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="704" mnc="01"/>
+ <apn value="internet.ideasclaro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Comcel / Tigo</name>
+ <gsm>
+ <network-id mcc="704" mnc="02"/>
+ <apn value="Wap.tigo.gt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>Wap</username>
+ <password>Wap</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Guyana -->
+<country code="gy">
+ <provider>
+ <name>GT&amp;T Cellink Plus</name>
+ <gsm>
+ <network-id mcc="738" mnc="02"/>
+ <apn value="wap.cellinkgy.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>test</username>
+ <password>test</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>DigiCel</name>
+ <gsm>
+ <network-id mcc="738" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Hong Kong -->
+<country code="hk">
+ <provider>
+ <name>CSL</name>
+ <gsm>
+ <network-id mcc="454" mnc="00"/>
+ <network-id mcc="454" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>202.84.255.1</dns>
+ <dns>203.116.254.150</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>New World</name>
+ <gsm>
+ <network-id mcc="454" mnc="10"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>China Mobile</name>
+ <gsm>
+ <network-id mcc="454" mnc="12"/>
+ <apn value="peoples.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>SmarTone</name>
+ <gsm>
+ <network-id mcc="454" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>PCCW (Sunday)</name>
+ <gsm>
+ <network-id mcc="454" mnc="16"/>
+ <network-id mcc="454" mnc="19"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Sunday (Old)</name>
+ </apn>
+ <apn value="pccwdata">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>PCCW 2G/GPRS</name>
+ </apn>
+ <apn value="pccw">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>PCCW 3G</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sunday</name>
+ <gsm>
+ <network-id mcc="454" mnc="16"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="454" mnc="04"/>
+ <apn value="web.orangehk.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Three</name>
+ <gsm>
+ <network-id mcc="454" mnc="03"/>
+ <network-id mcc="454" mnc="04"/>
+ <apn value="mobile.three.com.hk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Honduras -->
+<country code="hn">
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="708" mnc="02"/>
+ <apn value="internet.tigo.hn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Croatia -->
+<country code="hr">
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="219" mnc="01"/>
+ <apn value="web.htgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>10.12.0.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>VIPNET</name>
+ <gsm>
+ <network-id mcc="219" mnc="10"/>
+ <apn value="data.vip.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract and Prepaid</name>
+ </apn>
+ <apn value="gprs5.vipnet.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS 5</name>
+ <username>38591</username>
+ <password>38591</password>
+ <dns>195.29.159.15</dns>
+ </apn>
+ <apn value="gprs0.vipnet.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS 0</name>
+ <username>38591</username>
+ <password>38591</password>
+ <dns>195.29.159.15</dns>
+ </apn>
+ <apn value="3g.vip.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G</name>
+ <username>38591</username>
+ <password>38591</password>
+ <dns>212.91.97.3</dns>
+ <dns>212.91.97.4</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CARNet VIPNET</name>
+ <gsm>
+ <network-id mcc="219" mnc="10"/>
+ <apn value="carnet.vip.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>AAIEDU</username>
+ <password></password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CARNet Tele2</name>
+ <gsm>
+ <network-id mcc="219" mnc="02"/>
+ <apn value="carnet.tele2.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>AAIEDU</username>
+ <password></password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="219" mnc="02"/>
+ <apn value="mobileinternet.tele2.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.247.156.66</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Hungary -->
+<country code="hu">
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="216" mnc="01"/>
+ <apn value="net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>mobilinternet</name>
+ <dns>217.79.128.40</dns>
+ <dns>217.79.128.45</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>DIGI</name>
+ <gsm>
+ <!-- Using Telenor's network -->
+ <network-id mcc="216" mnc="01"/>
+ <apn value="digi">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>DIGI Move</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="216" mnc="30"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.51.115.1</dns>
+ <dns>194.176.224.6</dns>
+ </apn>
+ <apn value="mms-westel">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>MMS</name>
+ <username>mms</username>
+ <dns>212.51.115.1</dns>
+ <dns>194.176.224.3</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="216" mnc="70"/>
+ <apn value="standardnet.vodafone.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Előf. Normál</name>
+ <username>vodawap</username>
+ <password>vodawap</password>
+ <dns>80.244.97.30</dns>
+ <dns>80.244.96.1</dns>
+ </apn>
+ <!-- http://www.vodafone.hu/en/support/questions-answers/pay-monthly/internet -->
+ <apn value="internet.vodafone.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Előf. töm.</name>
+ <dns>80.244.97.30</dns>
+ <dns>80.244.96.1</dns>
+ </apn>
+ <apn value="vitamax.snet.vodafone.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Felt. norm.</name>
+ <dns>80.244.97.30</dns>
+ <dns>80.244.96.1</dns>
+ </apn>
+ <apn value="vitamax.internet.vodafone.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone (felt. töm.)</name>
+ <dns>80.244.97.30</dns>
+ <dns>80.244.96.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Invitel</name>
+ <!-- MVNO operating on Telenor's network -->
+ <gsm>
+ <apn value="invitel.mobilnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>net.and.go</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Indonesia -->
+<country code="id">
+ <provider>
+ <name>3</name>
+ <gsm>
+ <network-id mcc="510" mnc="89"/>
+ <apn value="3gprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <username>3gprs</username>
+ <password>3gprs</password>
+ </apn>
+ <apn value="3data">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Monthly Internet Service</name>
+ <name xml:lang="id">Layanan Internet Bulanan</name>
+ <username>3data</username>
+ <password>3data</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>AXIS</name>
+ <gsm>
+ <network-id mcc="510" mnc="08"/>
+ <apn value="AXIS">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>axis</username>
+ <password>123456</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Indosat</name>
+ <gsm>
+ <network-id mcc="510" mnc="21"/>
+ <network-id mcc="510" mnc="01"/>
+
+ <!-- http://www.indosat.com/Customer_Support/Customer_Support/Setting_GPRS_MMS_WAP_dan_BroadBand -->
+ <!-- http://3g.indosat.com/about/FAQ.php -->
+ <!-- http://www.indosat.com/Mentari/Mentari_Update/Voucher_Internet_Indosat -->
+ <!-- It seems that the APN is pretty much the same for plans -->
+
+ <apn value="indosatgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>IM3/Mentari Time-based</name>
+ <username>indosat@durasi</username>
+ <password>indosat@durasi</password>
+ </apn>
+ <apn value="indosatgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>IM3/Mentari Volume-based</name>
+ <username>indosat</username>
+ <password>indosat</password>
+ </apn>
+ <apn value="indosatgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Matrix 3G/3.5G</name>
+ <username>indosat</username>
+ <password>indosat</password>
+ </apn>
+ </gsm>
+ <cdma>
+ <name>StarOne</name>
+ <username>starone</username>
+ <password>indosat</password>
+ <sid value="10817"/>
+ <sid value="10819"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Telkomsel</name>
+ <gsm>
+ <network-id mcc="510" mnc="10"/>
+ <network-id mcc="510" mnc="20"/>
+
+ <!-- http://www.telkomsel.com/customer-service/manual-setting/ -->
+ <apn value="telkomsel">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap123</password>
+ <dns>202.152.0.2</dns>
+ <dns>202.155.14.251</dns>
+ </apn>
+
+ <!-- http://www.telkomsel.com/telkomselflash/telkomsel-flash -->
+ <apn value="flash">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Flash Time-based</name>
+ <username>foo</username>
+ <password>bar</password>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Flash Volume-based</name>
+ <username>foo</username>
+ <password>bar</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Excelcomindo (XL)</name>
+ <gsm>
+ <network-id mcc="510" mnc="11"/>
+ <apn value="www.xlgprs.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>xlgprs</username>
+ <password>proxl</password>
+ <dns>202.152.254.245</dns>
+ <dns>202.152.254.246</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>SMART</name>
+ <cdma>
+ <username>smart</username>
+ <password>smart</password>
+ <sid value="10608"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Ceria</name>
+ <cdma>
+ <username>internet</username>
+ <password>ceria</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Fren</name>
+ <cdma>
+ <username>m8</username>
+ <password>m8</password>
+ <sid value="10530"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Telkom Flexy</name>
+ <cdma>
+ <username>telkomnet@flexi</username>
+ <password>telkom</password>
+ <sid value="10496"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Esia</name>
+ <cdma>
+ <sid value="10623"/>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Ireland -->
+<country code="ie">
+ <provider>
+ <name>O2</name>
+ <gsm>
+ <network-id mcc="272" mnc="02"/>
+ <balance-check>
+ <ussd>*#100#</ussd>
+ </balance-check>
+ <apn value="open.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ <dns>62.40.32.33</dns>
+ <dns>62.40.32.34</dns>
+ </apn>
+ <apn value="pp.internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <username>faster</username>
+ <password>web</password>
+ <dns>62.40.32.33</dns>
+ <dns>62.40.32.34</dns>
+ </apn>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Old Config Internet and MMS</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="272" mnc="01"/>
+ <msisdn-query>
+ <sms text="MYMSISDN:">50189</sms>
+ </msisdn-query>
+ <apn value="hs.vodafone.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>89.19.64.36</dns>
+ <dns>89.19.64.164</dns>
+ </apn>
+ <apn value="isp.vodafone.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ </apn>
+ <apn value="live.vodafone.com">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>10.24.59.100</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>E-Mobile</name>
+ <gsm>
+ <network-id mcc="272" mnc="03"/>
+ <!-- Information not found on the web but with the Windows connection software -->
+ <apn value="broadband.eircommbb.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Broadband To Go</name>
+ <dns>212.129.64.220</dns>
+ <dns>212.129.64.221</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Meteor</name>
+ <gsm>
+ <network-id mcc="272" mnc="03"/>
+ <apn value="data.mymeteor.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Meteor Data</name>
+ <username>my</username>
+ <password>meteor</password>
+ </apn>
+ <apn value="broadband.mymeteor.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Broadband To Go</name>
+ <dns>212.129.64.220</dns>
+ <dns>212.129.64.221</dns>
+ </apn>
+ <apn value="isp.mymeteor.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <username>my</username>
+ <password>isp</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Three Ireland</name>
+ <gsm>
+ <network-id mcc="272" mnc="05"/>
+ <apn value="3ireland.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>172.31.140.69</dns>
+ <dns>172.30.140.69</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Israel -->
+<country code="il">
+ <provider>
+ <name>CellCom</name>
+ <gsm>
+ <network-id mcc="425" mnc="02"/>
+ <apn value="internetg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="425" mnc="01"/>
+ <apn value="uinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G Internet</name>
+ <dns>158.43.192.1</dns>
+ <dns>158.43.128.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Pelephone</name>
+ <gsm>
+ <network-id mcc="425" mnc="03"/>
+ <apn value="internet.pelephone.net.il">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G</name>
+ <username>pcl@3g</username>
+ <password>pcl</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Isle of Man -->
+<country code="im">
+ <provider>
+ <name>Manx Telecom</name>
+ <gsm>
+ <network-id mcc="234" mnc="58"/>
+ <apn value="3gpronto">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sure (Cable &amp; Wireless)</name>
+ <gsm>
+ <network-id mcc="234" mnc="36"/>
+ <network-id mcc="234" mnc="55"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- India -->
+<country code="in">
+ <provider>
+ <name>AIRCEL</name>
+ <gsm>
+ <network-id mcc="404" mnc="17"/>
+ <network-id mcc="404" mnc="28"/>
+ <network-id mcc="404" mnc="29"/>
+ <network-id mcc="404" mnc="37"/>
+ <network-id mcc="404" mnc="41"/>
+ <network-id mcc="404" mnc="42"/>
+ <network-id mcc="404" mnc="91"/>
+ <network-id mcc="405" mnc="800"/>
+ <network-id mcc="405" mnc="801"/>
+ <network-id mcc="405" mnc="802"/>
+ <network-id mcc="405" mnc="803"/>
+ <network-id mcc="405" mnc="804"/>
+ <network-id mcc="405" mnc="805"/>
+ <network-id mcc="405" mnc="806"/>
+ <network-id mcc="405" mnc="807"/>
+ <network-id mcc="405" mnc="808"/>
+ <network-id mcc="405" mnc="809"/>
+ <network-id mcc="405" mnc="810"/>
+ <network-id mcc="405" mnc="811"/>
+ <network-id mcc="405" mnc="812"/>
+
+ <apn value="aircelweb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web</name>
+ </apn>
+ <apn value="aircelgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ </apn>
+ <apn value="aircelgprs.po">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS (Postpaid)</name>
+ </apn>
+ <apn value="aircelgprs.pr">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>GPRS (Prepaid)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Airtel</name>
+ <gsm>
+ <network-id mcc="404" mnc="02"/>
+ <network-id mcc="404" mnc="03"/>
+ <network-id mcc="404" mnc="06"/>
+ <network-id mcc="404" mnc="10"/>
+ <network-id mcc="404" mnc="28"/>
+ <network-id mcc="404" mnc="31"/>
+ <network-id mcc="404" mnc="37"/>
+ <network-id mcc="404" mnc="40"/>
+ <network-id mcc="404" mnc="41"/>
+ <network-id mcc="404" mnc="42"/>
+ <network-id mcc="404" mnc="45"/>
+ <network-id mcc="404" mnc="49"/>
+ <network-id mcc="404" mnc="70"/>
+ <network-id mcc="404" mnc="90"/>
+ <network-id mcc="404" mnc="92"/>
+ <network-id mcc="404" mnc="93"/>
+ <network-id mcc="404" mnc="96"/>
+ <network-id mcc="404" mnc="97"/>
+ <network-id mcc="404" mnc="98"/>
+ <network-id mcc="405" mnc="51"/>
+ <network-id mcc="405" mnc="52"/>
+ <network-id mcc="405" mnc="54"/>
+ <network-id mcc="405" mnc="56"/>
+
+ <apn value="airtelgprs.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>202.56.230.5</dns>
+ <dns>202.56.240.5</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="404" mnc="01"/>
+ <network-id mcc="404" mnc="05"/>
+ <network-id mcc="404" mnc="11"/>
+ <network-id mcc="404" mnc="13"/>
+ <network-id mcc="404" mnc="15"/>
+ <network-id mcc="404" mnc="20"/>
+ <network-id mcc="404" mnc="27"/>
+ <network-id mcc="404" mnc="30"/>
+ <network-id mcc="404" mnc="43"/>
+ <network-id mcc="404" mnc="46"/>
+ <network-id mcc="404" mnc="60"/>
+ <network-id mcc="404" mnc="84"/>
+ <network-id mcc="404" mnc="86"/>
+ <network-id mcc="404" mnc="88"/>
+ <network-id mcc="405" mnc="66"/>
+ <network-id mcc="405" mnc="750"/>
+ <network-id mcc="405" mnc="751"/>
+ <network-id mcc="405" mnc="752"/>
+ <network-id mcc="405" mnc="753"/>
+ <network-id mcc="405" mnc="754"/>
+ <network-id mcc="405" mnc="755"/>
+ <network-id mcc="405" mnc="756"/>
+ <apn value="www">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone Connect</name>
+ </apn>
+ <apn value="portalnmms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Vodafone Live</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>BSNL/CellOne</name>
+ <gsm>
+ <network-id mcc="404" mnc="34"/>
+ <network-id mcc="404" mnc="38"/>
+ <network-id mcc="404" mnc="51"/>
+ <network-id mcc="404" mnc="53"/>
+ <network-id mcc="404" mnc="54"/>
+ <network-id mcc="404" mnc="55"/>
+ <network-id mcc="404" mnc="57"/>
+ <network-id mcc="404" mnc="58"/>
+ <network-id mcc="404" mnc="59"/>
+ <network-id mcc="404" mnc="62"/>
+ <network-id mcc="404" mnc="64"/>
+ <network-id mcc="404" mnc="66"/>
+ <network-id mcc="404" mnc="71"/>
+ <network-id mcc="404" mnc="72"/>
+ <network-id mcc="404" mnc="73"/>
+ <network-id mcc="404" mnc="74"/>
+ <network-id mcc="404" mnc="75"/>
+ <network-id mcc="404" mnc="76"/>
+ <network-id mcc="404" mnc="77"/>
+ <network-id mcc="404" mnc="80"/>
+ <network-id mcc="404" mnc="81"/>
+
+ <!-- http://cellone.in/cellone_msp.htm -->
+ <apn value="bsnlnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>New GPRS/3G</name>
+ </apn>
+
+ <apn value="bsnlwap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>New WAP</name>
+ </apn>
+
+ <apn value="bsnlsouth">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old South Zone A (Karnatka, Andhra Pradesh, Chennai, Tamil Nadu, Kerala)</name>
+ </apn>
+ <apn value="gprssouth.cellone.in">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old South Zone B (Karnatka, Andhra Pradesh, Chennai, Tamil Nadu, Kerala)</name>
+ </apn>
+ <apn value="gprsnorth.cellone.in">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old North Zone (Haryana, Punjab, UP(East), UP(West), Himachal Pradesh, Rajasthan, Jammu &amp; Kashmir)</name>
+ </apn>
+ <apn value="gprswest.cellone.in">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old West Zone (Maharashtra, Gujrat, Madhya Pradesh, Chattishgarh)</name>
+ </apn>
+ <apn value="www.e.pr">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Old East Zone Prepaid (Jharkhand, Bihar, Kolkata, West Bengal, Orissa, Assam, North East, Adman Nicobar)</name>
+ <dns>218.248.240.208</dns>
+ <dns>218.248.240.135</dns>
+ </apn>
+ <apn value="www.e.po">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old East Zone Postpaid (Jharkhand, Bihar, Kolkata, West Bengal, Orissa, Assam, North East, Adman Nicobar)</name>
+ <dns>218.248.240.208</dns>
+ <dns>218.248.240.135</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Idea Cellular</name>
+ <gsm>
+ <network-id mcc="404" mnc="04"/>
+ <network-id mcc="404" mnc="07"/>
+ <network-id mcc="404" mnc="12"/>
+ <network-id mcc="404" mnc="14"/>
+ <network-id mcc="404" mnc="19"/>
+ <network-id mcc="404" mnc="22"/>
+ <network-id mcc="404" mnc="24"/>
+ <network-id mcc="404" mnc="44"/>
+ <network-id mcc="404" mnc="56"/>
+ <network-id mcc="404" mnc="82"/>
+ <network-id mcc="405" mnc="70"/>
+ <network-id mcc="405" mnc="799"/>
+ <network-id mcc="405" mnc="845"/>
+ <network-id mcc="405" mnc="848"/>
+ <network-id mcc="405" mnc="850"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTNL</name>
+ <gsm>
+ <network-id mcc="404" mnc="68"/>
+ <network-id mcc="404" mnc="69"/>
+ <apn value="gprsmtnldel">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Delhi</name>
+ <username>mtnl</username>
+ <password>mtnl123</password>
+ </apn>
+ <apn value="gprsppsmum">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Mumbai (Prepaid)</name>
+ <username>mtnl</username>
+ <password>mtnl123</password>
+ </apn>
+ <apn value="gprsmtnlmum">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mumbai (Postpaid / Plan 2)</name>
+ <username>mtnl</username>
+ <password>mtnl123</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Reliance</name>
+ <gsm>
+ <network-id mcc="404" mnc="09"/>
+ <network-id mcc="404" mnc="36"/>
+ <network-id mcc="404" mnc="52"/>
+ <network-id mcc="404" mnc="83"/>
+ <network-id mcc="404" mnc="85"/>
+ <network-id mcc="405" mnc="05"/>
+ <network-id mcc="405" mnc="10"/>
+ <network-id mcc="405" mnc="13"/>
+ <apn value="smartnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Smart Net</name>
+ </apn>
+ <apn value="smartwap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Smart WAP</name>
+ </apn>
+ <apn value="rcomnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Netconnect (RCOMNET)</name>
+ </apn>
+ </gsm>
+ <cdma>
+ <name>Reliance Netconnect</name>
+ <sid value="14655"/>
+ <sid value="14656"/>
+ <sid value="14657"/>
+ <sid value="14658"/>
+ <sid value="14659"/>
+ <sid value="14660"/>
+ <sid value="14661"/>
+ <sid value="14662"/>
+ <sid value="14663"/>
+ <sid value="14664"/>
+ <sid value="14665"/>
+ <sid value="14666"/>
+ <sid value="14667"/>
+ <sid value="14668"/>
+ <sid value="14669"/>
+ <sid value="14670"/>
+ <sid value="14671"/>
+ <sid value="14672"/>
+ <sid value="14673"/>
+ <sid value="14674"/>
+ <sid value="14675"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Spice telecom</name>
+ <gsm>
+ <network-id mcc="404" mnc="14"/>
+ <network-id mcc="404" mnc="44"/>
+
+ <apn value="Simplyenjoy">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>spice</username>
+ <password>spice</password>
+ </apn>
+ <apn value="simplydownload">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>kar</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tata Docomo</name>
+ <gsm>
+ <network-id mcc="405" mnc="025"/>
+ <network-id mcc="405" mnc="026"/>
+ <network-id mcc="405" mnc="027"/>
+ <network-id mcc="405" mnc="029"/>
+ <network-id mcc="405" mnc="030"/>
+ <network-id mcc="405" mnc="031"/>
+ <network-id mcc="405" mnc="032"/>
+ <network-id mcc="405" mnc="034"/>
+ <network-id mcc="405" mnc="035"/>
+ <network-id mcc="405" mnc="036"/>
+ <network-id mcc="405" mnc="037"/>
+ <network-id mcc="405" mnc="038"/>
+ <network-id mcc="405" mnc="039"/>
+ <network-id mcc="405" mnc="041"/>
+ <network-id mcc="405" mnc="042"/>
+ <network-id mcc="405" mnc="043"/>
+ <network-id mcc="405" mnc="044"/>
+ <network-id mcc="405" mnc="045"/>
+ <network-id mcc="405" mnc="046"/>
+ <network-id mcc="405" mnc="047"/>
+
+ <apn value="TATA.DOCOMO.INTERNET">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="TATADOCOMO3G">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tata Indicom (Plug2Surf)</name>
+ <cdma>
+ <username>internet</username>
+ <password>internet</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Tata Indicom (Photon+)</name>
+ <cdma>
+ <username>internet</username>
+ <password>internet</password>
+ <sid value="14836"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>MTS MBlaze</name>
+ <cdma>
+ <username>internet@internet.mtsindia.in</username>
+ <password>mts</password>
+ <sid value="14554"/>
+ <sid value="14555"/>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Iraq -->
+<country code="iq">
+ <provider>
+ <name>Itisaluna</name>
+ <cdma>
+ <username>itisaluna</username>
+ <password>itisaluna</password>
+ <sid value="15456"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Omnea Telecom</name>
+ <cdma>
+ <username>omnea</username>
+ <password>omnea</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Kalimat Telecom</name>
+ <cdma>
+ <sid value="15470"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Korek</name>
+ <gsm>
+ <network-id mcc="418" mnc="40"/>
+ <apn value="net.korek.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>korek</username>
+ <password>korek</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Asia Cell</name>
+ <gsm>
+ <network-id mcc="418" mnc="50"/>
+ <apn value="net.asiacell.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Iran -->
+<country code="ir">
+ <provider>
+ <name>همراه اول</name>
+ <gsm>
+ <network-id mcc="432" mnc="11"/>
+ <apn value="mcinet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ایرانسل</name>
+ <gsm>
+ <network-id mcc="432" mnc="35"/>
+ <apn value="mtnirancell">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Iceland -->
+<country code="is">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="274" mnc="02"/>
+ <network-id mcc="274" mnc="03"/>
+ <apn value="vmc.gprs.is">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.176.128.51</dns>
+ <dns>213.176.128.50</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Nova</name>
+ <gsm>
+ <network-id mcc="274" mnc="11"/>
+ <apn value="internet.nova.is">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>192.168.190.54</dns>
+ <dns>192.168.190.55</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Síminn</name>
+ <gsm>
+ <network-id mcc="274" mnc="01"/>
+ <apn value="wap.simi.is">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>194.105.224.1</dns>
+ <dns>212.30.200.200</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Italy -->
+<country code="it">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="222" mnc="10"/>
+ <apn value="mobile.vodafone.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ </apn>
+ <apn value="web.omnitel.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Facile (old)</name>
+ <dns>83.224.70.62</dns>
+ <dns>83.224.70.78</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TIM</name>
+ <gsm>
+ <network-id mcc="222" mnc="01"/>
+ <apn value="ibox.tim.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Maxxi Alice/Internet</name>
+ <dns>217.200.200.42</dns>
+ <dns>213.230.129.10</dns>
+ </apn>
+ <apn value="wap.tim.it">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>WAPTIM</username>
+ <dns>213.230.155.94</dns>
+ <dns>213.230.130.222</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Wind</name>
+ <gsm>
+ <network-id mcc="222" mnc="88"/>
+ <apn value="internet.wind">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Non-business</name>
+ <username>Wind</username>
+ <password>Wind</password>
+ <dns>193.70.152.25</dns>
+ <dns>193.70.192.25</dns>
+ </apn>
+ <apn value="internet.wind.biz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business</name>
+ <username>Wind</username>
+ <password>Wind</password>
+ <dns>193.70.152.25</dns>
+ <dns>193.70.192.25</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>3</name>
+ <gsm>
+ <network-id mcc="222" mnc="99"/>
+ <apn value="tre.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Ricaricabile</name>
+ <dns>62.13.169.92</dns>
+ <dns>62.13.169.93</dns>
+ </apn>
+ <apn value="datacard.tre.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Abbonamento</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Fastweb</name>
+ <gsm>
+ <network-id mcc="222" mnc="99"/>
+ <apn value="apn.fastweb.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Voce/dati</name>
+ </apn>
+ <apn value="datacard.fastweb.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Solo dati</name>
+ <dns>213.140.2.43</dns>
+ <dns>213.140.2.49</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>PosteMobile</name>
+ <gsm>
+ <network-id mcc="222" mnc="10"/>
+ <apn value="internet.postemobile.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CoopVoce</name>
+ <gsm>
+ <network-id mcc="222" mnc="01"/>
+ <apn value="web.coopvoce.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Mobile</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Jersey -->
+<country code="je">
+ <provider>
+ <name>Airtel-Vodaphone</name>
+ <gsm>
+ <network-id mcc="234" mnc="03"/>
+ <apn value="airtel-ci-gprs.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sure (Cable &amp; Wireless)</name>
+ <gsm>
+ <network-id mcc="234" mnc="55"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Jersey Telecom</name>
+ <gsm>
+ <network-id mcc="234" mnc="50"/>
+ <apn value="pepper">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>abc</username>
+ <password>abc</password>
+ <dns>212.9.0.135</dns>
+ <dns>212.9.0.136</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Jamaica -->
+<country code="jm">
+ <provider>
+ <name>Cable &amp; Wireless</name>
+ <gsm>
+ <network-id mcc="338" mnc="020"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Digicel</name>
+ <gsm>
+ <network-id mcc="338" mnc="050"/>
+ <apn value="web.digiceljamaica.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wapuser</username>
+ <password>wap03jam</password>
+ <dns>208.131.176.126</dns>
+ <dns>200.10.152.232</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Hashemite Kingdom of Jordan -->
+<country code="jo">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="416" mnc="77"/>
+ <apn value="net.orange.jo">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>net</username>
+ <password>net</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="416" mnc="01"/>
+ <apn value="zain">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>Zain</username>
+ <password>Zain</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Japan -->
+<country code="jp">
+ <provider>
+ <name>Softbank Mobile</name>
+ <gsm>
+ <network-id mcc="440" mnc="04"/>
+ <network-id mcc="440" mnc="06"/>
+ <network-id mcc="440" mnc="20"/>
+ <network-id mcc="440" mnc="40"/>
+ <network-id mcc="440" mnc="41"/>
+ <network-id mcc="440" mnc="42"/>
+ <network-id mcc="440" mnc="43"/>
+ <network-id mcc="440" mnc="44"/>
+ <network-id mcc="440" mnc="45"/>
+ <network-id mcc="440" mnc="46"/>
+ <network-id mcc="440" mnc="47"/>
+ <network-id mcc="440" mnc="48"/>
+ <network-id mcc="440" mnc="90"/>
+ <network-id mcc="440" mnc="92"/>
+ <network-id mcc="440" mnc="93"/>
+ <network-id mcc="440" mnc="94"/>
+ <network-id mcc="440" mnc="95"/>
+ <network-id mcc="440" mnc="96"/>
+ <network-id mcc="440" mnc="97"/>
+ <network-id mcc="440" mnc="98"/>
+ <apn value="softbank">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>ai@softbank</username>
+ <password>softbank</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>b-mobile</name>
+ <gsm>
+ <network-id mcc="440" mnc="10"/>
+ <apn value="dm.jplat.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>u300</name>
+ <username>bmobile@u300</username>
+ <password>bmobile</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>e-mobile</name>
+ <gsm>
+ <network-id mcc="440" mnc="00"/>
+ <apn value="emb.ne.jp">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>em</username>
+ <password>em</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>NTTdocomo</name>
+ <gsm>
+ <network-id mcc="440" mnc="01"/>
+ <network-id mcc="440" mnc="02"/>
+ <network-id mcc="440" mnc="03"/>
+ <network-id mcc="440" mnc="09"/>
+ <network-id mcc="440" mnc="10"/>
+ <network-id mcc="440" mnc="11"/>
+ <network-id mcc="440" mnc="12"/>
+ <network-id mcc="440" mnc="13"/>
+ <network-id mcc="440" mnc="14"/>
+ <network-id mcc="440" mnc="15"/>
+ <network-id mcc="440" mnc="16"/>
+ <network-id mcc="440" mnc="17"/>
+ <network-id mcc="440" mnc="18"/>
+ <network-id mcc="440" mnc="19"/>
+ <network-id mcc="440" mnc="21"/>
+ <network-id mcc="440" mnc="22"/>
+ <network-id mcc="440" mnc="23"/>
+ <network-id mcc="440" mnc="24"/>
+ <network-id mcc="440" mnc="25"/>
+ <network-id mcc="440" mnc="26"/>
+ <network-id mcc="440" mnc="27"/>
+ <network-id mcc="440" mnc="28"/>
+ <network-id mcc="440" mnc="29"/>
+ <network-id mcc="440" mnc="30"/>
+ <network-id mcc="440" mnc="31"/>
+ <network-id mcc="440" mnc="32"/>
+ <network-id mcc="440" mnc="33"/>
+ <network-id mcc="440" mnc="34"/>
+ <network-id mcc="440" mnc="35"/>
+ <network-id mcc="440" mnc="36"/>
+ <network-id mcc="440" mnc="37"/>
+ <network-id mcc="440" mnc="38"/>
+ <network-id mcc="440" mnc="39"/>
+ <network-id mcc="440" mnc="49"/>
+ <network-id mcc="440" mnc="58"/>
+ <network-id mcc="440" mnc="60"/>
+ <network-id mcc="440" mnc="61"/>
+ <network-id mcc="440" mnc="62"/>
+ <network-id mcc="440" mnc="63"/>
+ <network-id mcc="440" mnc="64"/>
+ <network-id mcc="440" mnc="65"/>
+ <network-id mcc="440" mnc="66"/>
+ <network-id mcc="440" mnc="67"/>
+ <network-id mcc="440" mnc="68"/>
+ <network-id mcc="440" mnc="69"/>
+ <network-id mcc="440" mnc="87"/>
+ <network-id mcc="440" mnc="99"/>
+
+ <apn value="mopera.ne.jp">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>mopera</name>
+ </apn>
+ <apn value="mopera.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>mopera U</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>au(KDDI)</name>
+ <cdma>
+ <username>au@au-win.ne.jp</username>
+ <password>au</password>
+ <dns>210.196.3.183</dns>
+ <dns>210.141.112.163</dns>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Kenya -->
+<country code="ke">
+ <provider>
+ <name>Airtel</name>
+ <gsm>
+ <network-id mcc="639" mnc="03"/>
+ <apn value="ke.celtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Safaricom</name>
+ <gsm>
+ <network-id mcc="639" mnc="02"/>
+ <apn value="safaricom">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>yu (Econet)</name>
+ <gsm>
+ <network-id mcc="639" mnc="05"/>
+ <apn value="internet.econet.co.ke">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="639" mnc="07"/>
+ <apn value="bew.orange.co.ke">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ <cdma>
+ <name>Orange Fixed Plus</name>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Kyrgyzstan -->
+<country code="kg">
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="437" mnc="01"/>
+ <apn value="internet.beeline.kg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MegaCom</name>
+ <gsm>
+ <network-id mcc="437" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>O!</name>
+ <gsm>
+ <network-id mcc="437" mnc="09"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>FONEX</name>
+ <cdma>
+ <username>cdma</username>
+ <password>cdma</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>nexi (mir+kg)</name>
+ <name xml:lang="ru">Зона Мир+КГ</name>
+ <cdma>
+ <username>555@mir</username>
+ <password>555</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>nexi (kg)</name>
+ <name xml:lang="ru">Зона КГ</name>
+ <cdma>
+ <username>999@kg</username>
+ <password>999</password>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Cambodia -->
+<country code="kh">
+ <provider>
+ <name>Cellcard</name>
+ <gsm>
+ <network-id mcc="456" mnc="01"/>
+
+ <balance-check>
+ <ussd>#124#</ussd>
+ </balance-check>
+
+ <!-- http://www.cellcard.com.kh/en/service/data_3.5G_internet.php -->
+ <apn value="cellcard">
+ <usage type="internet"/>
+ <username>mobitel</username>
+ <password>mobitel</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Hello</name>
+ <gsm>
+ <network-id mcc="456" mnc="02"/>
+
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+
+ <!-- http://www.tmic.com.kh/public/mobile_broadband/mobile_broadband.aspx?page=broadband_faq -->
+ <!-- in reality any APN value works -->
+ <apn value="hellowww">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>qb</name>
+ <gsm>
+ <network-id mcc="456" mnc="04"/>
+
+ <balance-check>
+ <ussd>#132#</ussd>
+ </balance-check>
+
+ <!-- http://www.qbmore.com/download/handsetconfiguration.html -->
+ <apn value="WAP">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Smart Mobile</name>
+ <gsm>
+ <network-id mcc="456" mnc="06"/>
+
+ <balance-check>
+ <ussd>*888#</ussd>
+ </balance-check>
+
+ <!-- http://www.smart.com.kh/en/services/internet -->
+ <apn value="smart">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Metfone</name>
+ <gsm>
+ <network-id mcc="456" mnc="08"/>
+
+ <balance-check>
+ <ussd>*097#</ussd>
+ </balance-check>
+
+ <!-- http://metfone.com.kh/home/metfone.mf?id=20&task=detailpac -->
+ <apn value="metfone">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="456" mnc="09"/>
+
+ <balance-check>
+ <ussd>*102#</ussd>
+ </balance-check>
+
+ <!-- in reality any APN value works -->
+ <apn value="gprs.beeline.com.kh">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Excell</name>
+ <!-- mcc="456" mnc="11" -->
+ <cdma/>
+ </provider>
+ <provider>
+ <name>Mfone</name>
+ <gsm>
+ <network-id mcc="456" mnc="18"/>
+
+ <balance-check>
+ <ussd>*222#</ussd>
+ </balance-check>
+
+ <!-- http://www.mfone.com.kh/images/3g/mfone_3g.pdf -->
+ <apn value="Mfone">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Korea, Republic of -->
+<country code="kr">
+ <provider>
+ <name>KTF</name>
+ <gsm>
+ <network-id mcc="450" mnc="08"/>
+ <apn value="hsdpa-internet.ktfwing.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ <cdma>
+ <!-- cid: "016" -->
+ <username>ktf</username>
+ <password>ktf</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>LGTelecom</name>
+ <cdma>
+ <!-- cid: "109" -->
+ <!--
+ username must be xxxx(yournumber)@lgt.co.kr and
+ password must be your last 4 number
+ <username>number@lgt.co.kr</username>
+ <password></password>
+ -->
+ </cdma>
+ </provider>
+ <provider>
+ <name>SKTelecom</name>
+ <gsm>
+ <network-id mcc="450" mnc="05"/>
+ <apn value="nate.sktelecom.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ <cdma>
+ <!-- cid: 1501 -->
+ <username>sktelecom</username>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Kuwait -->
+<country code="kw">
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="419" mnc="02"/>
+ <apn value="pps">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Personal</name>
+ <username>pps</username>
+ <password>pps</password>
+ </apn>
+ <apn value="apn01">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Corporate</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Wataniya</name>
+ <gsm>
+ <network-id mcc="419" mnc="03"/>
+ <apn value="action.wataniya.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Viva</name>
+ <gsm>
+ <network-id mcc="419" mnc="04"/>
+ <apn value="viva">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Kazakhstan -->
+<country code="kz">
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="401" mnc="01"/>
+ <apn value="internet.beeline.kz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>@internet.beeline</username>
+ <dns>212.19.149.53</dns>
+ <dns>194.226.128.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>K'CELL</name>
+ <gsm>
+ <network-id mcc="401" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- Owned by K'CELL -->
+ <name>Activ</name>
+ <gsm>
+ <network-id mcc="401" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="401" mnc="77"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Pathword</name>
+ <cdma>
+ <username>Pathword</username>
+ <password>Pathword</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Dalacom</name>
+ <cdma>
+ <username>Dalacom</username>
+ <password>Dalacom</password>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Laos -->
+<country code="la">
+ <provider>
+ <name>ETL</name>
+ <gsm>
+ <network-id mcc="457" mnc="02"/>
+ <apn value="etlnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>192.168.4.130</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Lao Telecom</name>
+ <gsm>
+ <network-id mcc="457" mnc="01"/>
+ <balance-check>
+ <ussd>*122#</ussd>
+ </balance-check>
+ <apn value="ltcnet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Unitel</name>
+ <gsm>
+ <network-id mcc="457" mnc="03"/>
+ <apn value="startelecom">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Unitel (2G)</name>
+ </apn>
+ <apn value="unitel3g">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Unitel (3G)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Beeline (Tigo)</name>
+ <gsm>
+ <network-id mcc="457" mnc="08"/>
+ <apn value="beelinenet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Lebanon -->
+<country code="lb">
+ <provider>
+ <name>MTC Touch</name>
+ <gsm>
+ <network-id mcc="415" mnc="03"/>
+ <apn value="gprs.mtctouch.com.lb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- St Lucia -->
+<country code="lc">
+ <provider>
+ <name>Cable &amp; Wireless</name>
+ <gsm>
+ <network-id mcc="358" mnc="110"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Sri Lanka -->
+<country code="lk">
+ <provider>
+ <name>Airtel</name>
+ <gsm>
+ <network-id mcc="413" mnc="05"/>
+ <apn value="www.wap.airtel.lk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Dialog GSM</name>
+ <gsm>
+ <network-id mcc="413" mnc="02"/>
+ <apn value="www.dialogsl.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid</name>
+ </apn>
+ <apn value="ppinternet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ </apn>
+ <apn value="dialogbb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Unlimited Broadband</name>
+ </apn>
+ <apn value="kitbb.com">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid (Kitbb)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Hutch</name>
+ <gsm>
+ <network-id mcc="413" mnc="08"/>
+ <apn value="htwap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mobitel</name>
+ <gsm>
+ <network-id mcc="413" mnc="01"/>
+ <apn value="isp">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="413" mnc="03"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Lesotho -->
+<country code="ls">
+ <provider>
+ <name>Vodacom Lesotho</name>
+ <gsm>
+ <network-id mcc="651" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Lithuania -->
+<country code="lt">
+ <provider>
+ <name>Bite</name>
+ <gsm>
+ <network-id mcc="246" mnc="02"/>
+ <apn value="banga">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.226.131.131</dns>
+ <dns>193.219.88.36</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TELE2 GPRS</name>
+ <gsm>
+ <network-id mcc="246" mnc="03"/>
+ <apn value="internet.tele2.lt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Omnitel (contract)</name>
+ <gsm>
+ <network-id mcc="246" mnc="01"/>
+ <apn value="gprs.omnitel.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <dns>194.176.32.129</dns>
+ <dns>195.22.175.1</dns>
+ </apn>
+ <apn value="gprs.startas.lt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>No contract</name>
+ <username>omni</username>
+ <password>omni</password>
+ <dns>194.176.32.129</dns>
+ <dns>195.22.175.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Luxembourg -->
+<country code="lu">
+ <provider>
+ <name>LUXGSM</name>
+ <gsm>
+ <network-id mcc="270" mnc="01"/>
+ <apn value="web.pt.lu">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>194.154.192.101</dns>
+ <dns>194.154.192.102</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tango</name>
+ <gsm>
+ <network-id mcc="270" mnc="77"/>
+ <apn value="hspa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>hspa</name>
+ <username>tango</username>
+ <password>tango</password>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>internet</name>
+ <username>tango</username>
+ <password>tango</password>
+ <dns>212.66.70.3</dns>
+ <dns>212.66.75.7</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="270" mnc="99"/>
+ <apn value="orange.lu">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>85.94.224.1</dns>
+ <dns>85.94.224.2</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>VOXmobile</name>
+ <gsm>
+ <network-id mcc="270" mnc="99"/>
+ <apn value="vox.lu">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Latvia -->
+<country code="lv">
+ <provider>
+ <name>LMT</name>
+ <gsm>
+ <network-id mcc="247" mnc="01"/>
+ <apn value="internet.lmt.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.93.96.2</dns>
+ <dns>212.93.96.4</dns>
+ </apn>
+ <apn value="open.lmt.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>O!Karte internet</name>
+ </apn>
+ <apn value="okarte.lmt.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>O!Karte</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="247" mnc="02"/>
+ <apn value="internet.tele2.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Regular</name>
+ <username>gprs</username>
+ <password>internet</password>
+ </apn>
+ <apn value="mobileinternet.tele2.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="data.tele2.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Zelta Zivtina</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bite</name>
+ <gsm>
+ <network-id mcc="247" mnc="05"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Bite plus</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Prepaid/Contract</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Morocco -->
+<country code="ma">
+ <provider>
+ <name>Ittissalat Al Maghrib (IAM)</name>
+ <gsm>
+ <network-id mcc="604" mnc="01"/>
+ <apn value="www.iamgprs1.ma">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Abonnement</name>
+ </apn>
+ <apn value="www.iamgprs2.ma">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Pre-payé</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Medi Telecom</name>
+ <gsm>
+ <network-id mcc="604" mnc="00"/>
+ <apn value="internet1.meditel.ma">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Abonnement</name>
+ <username>MEDINET</username>
+ <password>MEDINET</password>
+ </apn>
+ <apn value="internet2.meditel.ma">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Pre-payé</name>
+ <username>MEDINET</username>
+ <password>MEDINET</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>WANA</name>
+ <gsm>
+ <network-id mcc="604" mnc="02"/>
+ <apn value="www.wana.ma">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>INWI</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Moldova -->
+<country code="md">
+ <provider>
+ <name>Moldcell</name>
+ <gsm>
+ <network-id mcc="259" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Eventis</name>
+ <gsm>
+ <network-id mcc="259" mnc="04"/>
+ <apn value="internet.md">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="259" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Montenegro -->
+<country code="me">
+ <provider>
+ <name>ProMonte GSM</name>
+ <gsm>
+ <network-id mcc="297" mnc="01"/>
+ <apn value="gprs.promonte.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="297" mnc="02"/>
+ <apn value="tmcg-data">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>38267</username>
+ <password>38267</password>
+ </apn>
+ <apn value="tmcg-nw">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <username>38267</username>
+ <password>38267</password>
+ </apn>
+ <apn value="internet-postpaid">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid (old)</name>
+ </apn>
+ <apn value="internet-prepaid">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid (old)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>m:tel</name>
+ <gsm>
+ <network-id mcc="297" mnc="03"/>
+ <apn value="gprsinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Mali -->
+<country code="ml">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="610" mnc="02"/>
+ <apn value="iew">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>iew</username>
+ <password>iew</password>
+ </apn>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Malitel</name>
+ <cdma>
+ <username>card</username>
+ <password>card</password>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Mongolia -->
+<country code="mn">
+ <provider>
+ <name>MobiCom</name>
+ <gsm>
+ <network-id mcc="428" mnc="99"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Macau -->
+<country code="mo">
+ <provider>
+ <name>3 / Hutchison</name>
+ <gsm>
+ <network-id mcc="455" mnc="03"/>
+ <network-id mcc="455" mnc="05"/>
+ <apn value="web.hutchisonmacau.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>hutchison</username>
+ <password>1234</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CTM</name>
+ <gsm>
+ <network-id mcc="455" mnc="01"/>
+ <network-id mcc="455" mnc="04"/>
+ <apn value="ctm-mobile">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>China Telecom</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Macedonia -->
+<country code="mk">
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="294" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>One</name>
+ <gsm>
+ <network-id mcc="294" mnc="02"/>
+ <apn value="datacard">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="294" mnc="03"/>
+ <apn value="vipoperator">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vipoperator</username>
+ <password>vipoperator</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Malta -->
+<country code="mt">
+ <provider>
+ <name>GO Mobile</name>
+ <gsm>
+ <network-id mcc="278" mnc="21"/>
+ <apn value="gosurfing">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid</name>
+ </apn>
+ <apn value="rtgsurfing">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="278" mnc="01"/>
+ <apn value="Internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ <dns>80.85.96.131</dns>
+ <dns>80.85.97.70</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Mauritius -->
+<country code="mu">
+ <provider>
+ <name>Emtel</name>
+ <gsm>
+ <network-id mcc="617" mnc="10"/>
+ <apn value="WEB">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Maldives -->
+<country code="mv">
+ <provider>
+ <name>Dhiraagu</name>
+ <gsm>
+ <network-id mcc="472" mnc="01"/>
+ <apn value="internet.dhimobile">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Wataniya</name>
+ <gsm>
+ <network-id mcc="472" mnc="02"/>
+ <apn value="WataniyaNet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Malawi -->
+<country code="mw">
+ <provider>
+ <name>TNM</name>
+ <gsm>
+ <network-id mcc="650" mnc="01"/>
+ <apn value="Internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Mexico -->
+<country code="mx">
+ <provider>
+ <name>Telcel</name>
+ <gsm>
+ <network-id mcc="334" mnc="02"/>
+
+ <voicemail>*86</voicemail>
+ <balance-check>
+ <dtmf>*333</dtmf>
+ </balance-check>
+
+ <apn value="internet.itelcel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>webgprs</username>
+ <password>webgprs2002</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="334" mnc="03"/>
+
+ <voicemail>*86</voicemail>
+ <balance-check>
+ <dtmf>*133#</dtmf>
+ </balance-check>
+
+ <apn value="internet.movistar.mx">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistar</username>
+ <password>movistar</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Iusacell</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Malaysia -->
+<country code="my">
+ <provider>
+ <name>DiGi</name>
+ <gsm>
+ <network-id mcc="502" mnc="16"/>
+ <apn value="diginet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ <dns>203.92.128.131</dns>
+ <dns>203.92.128.132</dns>
+ </apn>
+ <apn value="3gdgnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Maxis</name>
+ <gsm>
+ <network-id mcc="502" mnc="12"/>
+ <network-id mcc="502" mnc="17"/>
+ <apn value="maxisbb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ <username>maxis</username>
+ <password>wap</password>
+ </apn>
+ <apn value="net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <username>maxis</username>
+ <password>net</password>
+ </apn>
+ <apn value="unet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G (handsets)</name>
+ <username>maxis</username>
+ <password>wap</password>
+ <dns>10.213.17.1</dns>
+ <dns>10.213.17.2</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Celcom</name>
+ <gsm>
+ <network-id mcc="502" mnc="13"/>
+ <network-id mcc="502" mnc="19"/>
+ <!-- http://www.channelx.com.my/mdp/gprs/internet_config.jsp?model_name=motorola_e398 -->
+ <apn value="celcom.net.my">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ </apn>
+ <!-- http://www.channelx.com.my/mdp/3g/wap_config_3g.jsp?model_name=huwei_u600_3g -->
+ <apn value="celcom3g">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Celcom 3G</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Mozambique -->
+<country code="mz">
+ <provider>
+ <name>MCel</name>
+ <gsm>
+ <network-id mcc="643" mnc="01"/>
+ <apn value="isp.mcel.mz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>guest</username>
+ <password>guest</password>
+ <dns>212.96.24.2</dns>
+ <dns>212.96.24.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodacom</name>
+ <gsm>
+ <network-id mcc="643" mnc="04"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract / Prepaid</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Namibia -->
+<country code="na">
+ <provider>
+ <name>MTC</name>
+ <gsm>
+ <network-id mcc="649" mnc="01"/>
+ <apn value="ppsinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Tango</name>
+ <username>ppsuser</username>
+ <password>ppsuser</password>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telecom</name>
+ <cdma>
+ <name>switch</name>
+ <password>telecom</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Leo</name>
+ <gsm>
+ <network-id mcc="649" mnc="03"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Leo</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Nigeria -->
+<country code="ng">
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="621" mnc="20"/>
+ <network-id mcc="621" mnc="80"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="621" mnc="30"/>
+ <network-id mcc="621" mnc="60"/>
+ <apn value="web.gprs.mtnnigeria.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Glo Mobile</name>
+ <gsm>
+ <network-id mcc="621" mnc="50"/>
+ <network-id mcc="621" mnc="70"/>
+ <apn value="glosecure">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pay as You Go</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ </apn>
+ <apn value="gloflat">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Glo 3G Packs</name>
+ <username>flat</username>
+ <password>flat</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Etisalat</name>
+ <gsm>
+ <network-id mcc="621" mnc="90"/>
+ <apn value="etisalat">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Etisalat Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Starcomms</name>
+ <cdma>
+ <username>your_phone_number@starcomms.com</username>
+ <password>your_phone_number</password>
+ <sid value="2"/>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Nicaragua -->
+<country code="ni">
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="710" mnc="21"/>
+ <network-id mcc="710" mnc="73"/>
+ <apn value="wap.emovil">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>wapemovil</username>
+ <password>wapemovil</password>
+ </apn>
+ <apn value="web.emovil">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web</name>
+ <username>webemovil</username>
+ <password>webemovil</password>
+ </apn>
+ <apn value="internet.ideasalo.ni">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web (Alo pcs)</name>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ <apn value="wap.ideasalo.ni">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP (Alo pcs)</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="710" mnc="30"/>
+ <apn value="internet.movistar.ni">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Netherlands -->
+<country code="nl">
+ <provider>
+ <name>Hi</name>
+ <gsm>
+ <network-id mcc="204" mnc="08"/>
+ <apn value="portalmmm.nl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>KPN NL</name>
+ <gsm>
+ <network-id mcc="204" mnc="08"/>
+ <apn value="prepaidinternet" >
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="fastinternet" >
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>KPN</username>
+ <password>gprs</password>
+ <dns>62.133.126.28</dns>
+ <dns>62.133.126.29</dns>
+ </apn>
+ <apn value="noapn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>62.133.126.28</dns>
+ <dns>62.133.126.29</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MEDIONmobile</name>
+ <gsm>
+ <network-id mcc="204" mnc="08"/>
+ <network-id mcc="204" mnc="10"/>
+ <apn value="portalmmm.nl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Aldi Talk Mobiel Prepaid Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telfort</name>
+ <gsm>
+ <network-id mcc="204" mnc="12"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>telfortnl</username>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="204" mnc="16"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>193.78.240.12</dns>
+ <dns>193.79.242.39</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ben</name>
+ <gsm>
+ <network-id mcc="204" mnc="16"/>
+ <apn value="internet.ben">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>193.78.240.12</dns>
+ <dns>193.79.242.39</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="204" mnc="20"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>orange</username>
+ <password>orange</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="204" mnc="02"/>
+ <apn value="data.tele2.nl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>XS4ALL Mobiel Internet</name>
+ <gsm>
+ <apn value="umts.xs4all.nl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>xs4all</username>
+ <password>xs4all</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="204" mnc="04"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <apn value="live.vodafone.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Non-business</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>62.140.138.237</dns>
+ <dns>62.140.140.250</dns>
+ </apn>
+ <apn value="office.vodafone.nl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Norway -->
+<country code="no">
+ <provider>
+ <name>Netcom</name>
+ <gsm>
+ <network-id mcc="242" mnc="02"/>
+
+ <balance-check>
+ <ussd>*150#</ussd>
+ </balance-check>
+
+ <apn value="internet.netcom.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>netcom</username>
+ <password>netcom</password>
+ <dns>212.169.123.67</dns>
+ <dns>212.45.188.254</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <!-- http://www.ice.no/Mobilt-bredb%C3%A5nd-1046.aspx -->
+ <provider>
+ <name>ice.net (Nordisk Mobiltelefon)</name>
+ <cdma>
+ <username>cdma</username>
+ <password>cdma</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="242" mnc="01"/>
+
+ <voicemail>91500002</voicemail>
+ <balance-check>
+ <sms text="saldo">2525</sms>
+ </balance-check>
+
+ <apn value="telenor">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.17.131.3</dns>
+ <dns>148.122.161.2</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TDC</name>
+ <gsm>
+ <network-id mcc="242" mnc="08"/>
+ <apn value="internet.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>80.232.41.10</dns>
+ <dns>80.232.41.20</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>NetworkNorway</name>
+ <gsm>
+ <network-id mcc="242" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>OneCall</name>
+ <gsm>
+ <network-id mcc="242" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Lebara</name>
+ <gsm>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Altibox</name>
+ <gsm>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>SheTalks</name>
+ <gsm>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telipol</name>
+ <gsm>
+ <network-id mcc="242" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ventelo</name>
+ <gsm>
+ <network-id mcc="242" mnc="07"/>
+ <apn value="internet.ventelo.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ludo Mobil</name>
+ <gsm>
+ <network-id mcc="242" mnc="07"/>
+ <apn value="internet.ventelo.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="242" mnc="02"/>
+ <network-id mcc="242" mnc="04"/>
+
+ <voicemail>47230000</voicemail>
+ <balance-check>
+ <ussd>*111#</ussd>
+ <dtmf>47300000</dtmf>
+ </balance-check>
+
+ <apn value="internet.tele2.no">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Mobilt internet</name>
+ </apn>
+ <!-- http://www.tele2.no/mobilt-bredbaand.html -->
+ <apn value="mobileinternet.tele2.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt bredbånd</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Nepal -->
+<country code="np">
+ <provider>
+ <name>Nepal Telecom</name>
+ <gsm>
+ <network-id mcc="429" mnc="01"/>
+ <apn value="ntnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mero Mobile</name>
+ <gsm>
+ <network-id mcc="429" mnc="02"/>
+ <apn value="mero">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- New Zealand -->
+<country code="nz">
+ <provider>
+ <name>Telecom New Zealand</name>
+ <gsm>
+ <network-id mcc="530" mnc="00"/>
+ <network-id mcc="530" mnc="05"/>
+ <apn value="wap.telecom.co.nz">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>XT mobile (WAP)</name>
+ </apn>
+ <apn value="internet.telecom.co.nz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>XT mobile (Internet with Firewall)</name>
+ <dns>202.27.156.72</dns>
+ <dns>202.27.158.40</dns>
+ </apn>
+ <apn value="direct.telecom.co.nz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>XT mobile (Direct Internet)</name>
+ <dns>202.27.156.72</dns>
+ <dns>202.27.158.40</dns>
+ </apn>
+ <apn value="oa.telecom.co.nz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>XT mobile (One Office/Remote Office)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="530" mnc="01"/>
+ <apn value="live.vodafone.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WAP</name>
+ <dns>202.73.206.16</dns>
+ <dns>202.73.198.16</dns>
+ </apn>
+ <apn value="www.vodafone.net.nz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract / Prepaid (Restricted)</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Unrestricted (public)</name>
+ <dns>202.73.206.16</dns>
+ <dns>202.73.198.16</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>2-Degrees</name>
+ <gsm>
+ <network-id mcc="530" mnc="24"/>
+ <apn value="mms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>MMS</name>
+ </apn>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ <dns>118.148.1.10</dns>
+ <dns>118.148.1.20</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TelstraClear</name>
+ <gsm>
+ <apn value="www.telstraclear.net.nz">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orcon</name>
+ <gsm>
+ <apn value="www.orcon.net.nz">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Oman -->
+<country code="om">
+ <provider>
+ <name>Oman Mobile</name>
+ <gsm>
+ <network-id mcc="422" mnc="02"/>
+ <apn value="taif">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>taif</username>
+ <password>taif</password>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet (old)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Nawras</name>
+ <gsm>
+ <network-id mcc="422" mnc="03"/>
+ <apn value="isp.nawras.com.om">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Panama -->
+<country code="pa">
+ <provider>
+ <name>Cable and Wireless</name>
+ <gsm>
+ <network-id mcc="714" mnc="01"/>
+ <apn value="apn01.cwpanama.com.pa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="714" mnc="02"/>
+ <apn value="internet.movistar.pa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistarpa</username>
+ <password>movistarpa</password>
+ <dns>200.39.10.1</dns>
+ <dns>200.36.160.237</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Peru -->
+<country code="pe">
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="716" mnc="10"/>
+ <apn value="tim.pe">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>tim</username>
+ <password>tulibertad</password>
+ </apn>
+ <apn value="ba.amx">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Internet Móvil Prepago</name>
+ <username>amx</username>
+ <password>amx</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="716" mnc="06"/>
+ <apn value="movistar.pe">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistar@datos</username>
+ <password>movistar</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Nextel</name>
+ <gsm>
+ <network-id mcc="716" mnc="07"/>
+ <apn value="datacard.nextel.com.pe">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- French Polynesia -->
+<country code="pf">
+ <provider>
+ <name>Vini</name>
+ <gsm>
+ <network-id mcc="547" mnc="20"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Philippines -->
+<country code="ph">
+ <provider>
+ <name>Globe Telecom</name>
+ <gsm>
+ <network-id mcc="515" mnc="02"/>
+ <apn value="internet.globe.com.ph">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid</name>
+ <username>globe</username>
+ <password>globe</password>
+ <dns>203.127.225.10</dns>
+ <dns>203.127.225.11</dns>
+ </apn>
+ <apn value="http.globe.com.ph">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <username>globe</username>
+ <password>globe</password>
+ <dns>203.127.225.10</dns>
+ <dns>203.127.225.11</dns>
+ </apn>
+ <apn value="www.globe.com.ph">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WAP</name>
+ <username>globe</username>
+ <password>globe</password>
+ <dns>203.127.225.10</dns>
+ <dns>203.127.225.11</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Smart</name>
+ <gsm>
+ <network-id mcc="515" mnc="03"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>witsductoor</username>
+ <password>banonoy</password>
+ <dns>202.57.96.3</dns>
+ <dns>202.57.96.4</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Digitel (Sun Cellular)</name>
+ <gsm>
+ <network-id mcc="515" mnc="05"/>
+ <apn value="minternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Pakistan -->
+<country code="pk">
+ <provider>
+ <name>Djuice</name>
+ <gsm>
+ <network-id mcc="515" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>telenor</username>
+ <password>telenor</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mobilink</name>
+ <gsm>
+ <network-id mcc="515" mnc="01"/>
+ <apn value="connect.mobilinkworld.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="jazzconnect.mobilinkworld.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Jazz</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="515" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>telenor</username>
+ <password>telenor</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ufone</name>
+ <gsm>
+ <network-id mcc="410" mnc="03"/>
+ <apn value="ufone.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>ufone</username>
+ <password>ufone</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Warid</name>
+ <gsm>
+ <network-id mcc="515" mnc="07"/>
+ <apn value="warid">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ZONG</name>
+ <gsm>
+ <network-id mcc="515" mnc="04"/>
+ <apn value="zonginternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ptcl EVO</name>
+ <cdma>
+ <username>vwireless@ptcl.com</username>
+ <password>ptcl</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>WorldCall Wireless</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Poland -->
+<country code="pl">
+ <!-- Polish physical operators -->
+ <provider primary="true">
+ <name>T-mobile</name><!-- rebranded from Era in 2011 -->
+ <gsm>
+ <network-id mcc="260" mnc="02"/>
+ <voicemail>602950</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*111*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <dns>213.158.194.1</dns>
+ <dns>213.158.193.38</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>Play Online</name>
+ <gsm>
+ <network-id mcc="260" mnc="06"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ <ussd>*155#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*100*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="260" mnc="03"/>
+ <voicemail>*501</voicemail>
+ <balance-check>
+ <ussd>*124*#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*125*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Standard access - with image compression</name>
+ <name xml:lang="pl">Dostęp standardowy - z kompresją grafiki</name>
+ <username>internet</username>
+ <password>internet</password>
+ <dns>194.9.223.79</dns>
+ <dns>194.204.159.1</dns>
+ </apn>
+ <apn value="vpn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>VPN mode access without compression (requires activation)</name>
+ <name xml:lang="pl">Dostęp VPN bez kompresji (wymaga aktywacji)</name>
+ <username>internet</username>
+ <password>internet</password>
+ <dns>194.9.223.79</dns>
+ <dns>194.204.159.1</dns>
+ </apn>
+ </gsm>
+ <cdma>
+ <username>cdma@orange</username>
+ <password>orange</password>
+ </cdma>
+ </provider>
+ <provider primary="true">
+ <name>Plus</name>
+ <gsm>
+ <network-id mcc="260" mnc="01"/>
+ <voicemail>2222</voicemail>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*123*CODE#</ussd>
+ </balance-top-up>
+ <apn value="www.plusgsm.pl">
+ <plan type="postpaid"/>
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Standard access</name>
+ <name xml:lang="pl">Dostęp standardowy</name>
+ <username>plusgsm</username>
+ <password>plusgsm</password>
+ <dns>212.2.96.51</dns>
+ <dns>212.2.96.52</dns>
+ </apn>
+ <apn value="pro.plusgsm.pl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>External dynamic IP address (requires activation)</name>
+ <name xml:lang="pl">Zewnętrzny dynamiczny adres IP (wymaga aktywacji)</name>
+ <username>plusgsm</username>
+ <password>plusgsm</password>
+ <dns>212.2.96.51</dns>
+ <dns>212.2.96.52</dns>
+ </apn>
+ <apn value="m2m.plusgsm.pl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>External static IP address (requires activation)</name>
+ <name xml:lang="pl">Zewnętrzny statyczny adres IP (wymaga aktywacji)</name>
+ <username>plusgsm</username>
+ <password>plusgsm</password>
+ <dns>212.2.96.51</dns>
+ <dns>212.2.96.52</dns>
+ </apn>
+ <apn value="optimizer">
+ <plan type="postpaid"/>
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>iPlus optimizer with data compression</name>
+ <name xml:lang="pl">iPlus optimizer z kompresją danych</name>
+ <dns>212.2.96.51</dns>
+ <dns>212.2.96.52</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>Cyfrowy Polsat</name>
+ <gsm>
+ <network-id mcc="260" mnc="12"/>
+ <apn value="multi.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>aero2</name>
+ <gsm>
+ <network-id mcc="260" mnc="17"/>
+ <apn value="darmowy">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <!-- Polish MVNO operators -->
+ <provider primary="false">
+ <name>Multimo</name>
+ <gsm>
+ <network-id mcc="260" mnc="03"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Default APN</name>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ <apn value="mni.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>APN: mni.internet</name>
+ <username>mni.internet</username>
+ </apn>
+ <apn value="telogic.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>APN: telogic.internet</name>
+ <username>telogic.internet</username>
+ </apn>
+ </gsm>
+ <cdma>
+ <username>cdma@orange</username>
+ <password>orange</password>
+ </cdma>
+ </provider>
+ <provider primary="false">
+ <name>FreeM</name>
+ <gsm>
+ <network-id mcc="260" mnc="01"/>
+ <apn value="freedata.pl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Heyah</name>
+ <gsm>
+ <network-id mcc="260" mnc="02"/>
+ <balance-check>
+ <ussd>*108#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*109*CODE#</ussd>
+ </balance-top-up>
+ <apn value="heyah.pl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>heyah</username>
+ <password>heyah</password>
+ <dns>213.158.194.1</dns>
+ <dns>213.158.193.38</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>GaduAIR</name>
+ <gsm>
+ <network-id mcc="260" mnc="01"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <apn value="internet.gadu-gadu.pl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Aster</name>
+ <gsm>
+ <network-id mcc="260" mnc="03"/>
+ <apn value="aster.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Netia</name>
+ <gsm>
+ <network-id mcc="260" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Vectra</name>
+ <gsm>
+ <network-id mcc="260" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>mBank mobile</name>
+ <gsm>
+ <network-id mcc="260" mnc="01"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="www.mobile.pl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>INEA</name>
+ <gsm>
+ <network-id mcc="260" mnc="03"/>
+ <apn value="telogic.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Mobilking</name>
+ <gsm>
+ <network-id mcc="260" mnc="02"/>
+ <apn value="wapMOBILKING">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>mobilking</username>
+ <password>mobilking</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>SamiSwoi</name>
+ <gsm>
+ <network-id mcc="260" mnc="01"/>
+ <apn value="www.plusgsm.pl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Sferia</name>
+ <cdma>
+ <username>sferia</username>
+ <password>sferia</password>
+ </cdma>
+ </provider>
+ <provider primary="false">
+ <name>Nordisk Polska</name>
+ <cdma>
+ <username>CDMA</username>
+ <password>CDMA</password>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Portugal -->
+<country code="pt">
+ <provider>
+ <name>Kanguru</name>
+ <gsm>
+ <network-id mcc="268" mnc="03"/>
+ <apn value="kanguru-portatil">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Portable</name>
+ <name xml:lang="pt">Portátil</name>
+ <dns>62.169.67.172</dns>
+ <dns>62.169.67.171</dns>
+ </apn>
+ <apn value="kanguru-tempo">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Tempo (Prepaid)</name>
+ <dns>62.169.67.172</dns>
+ <dns>62.169.67.171</dns>
+ </apn>
+ <apn value="kangurufixo">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Fixo</name>
+ <dns>62.169.67.172</dns>
+ <dns>62.169.67.171</dns>
+ </apn>
+ <apn value="noapn">
+ <name>Apn dinâmico (no apn)</name>
+ <dns>62.169.67.172</dns>
+ <dns>62.169.67.171</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- Merged with Optimus in 2010 -->
+ <name>Clix</name>
+ <gsm>
+ <network-id mcc="268" mnc="03"/>
+ <apn value="clixinternetmovel">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Optimus</name>
+ <gsm>
+ <network-id mcc="268" mnc="03"/>
+ <apn value="umts">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <dns>194.79.69.129</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TMN</name>
+ <gsm>
+ <network-id mcc="268" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Tmn Internet</name>
+ <username>tmn</username>
+ <password>tmn</password>
+ <dns>88.214.178.1</dns>
+ <dns>88.214.182.2</dns>
+ </apn>
+ <apn value="mmsc.tmn.pt">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Tmn Mms</name>
+ <username>tmn</username>
+ <password>tmnnet</password>
+ <dns>194.65.3.20</dns>
+ <dns>194.65.3.21</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="268" mnc="01"/>
+ <apn value="internet.vodafone.pt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>212.18.160.133</dns>
+ <dns>212.18.160.134</dns>
+ </apn>
+ <apn value="net2.vodafone.pt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone Internet</name>
+ </apn>
+ <apn value="vas.vodafone.pt">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Vodafone MMS</name>
+ <username>vas</username>
+ <password>vas</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ZON</name>
+ <gsm>
+ <network-id mcc="268" mnc="01"/>
+ <apn value="internet.zon.pt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Dados Móveis</name>
+ </apn>
+ <apn value="vas.zon.pt">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>MMS</name>
+ <username>vas</username>
+ <password>vas</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Paraguay -->
+<country code="py">
+ <provider>
+ <name>VOX</name>
+ <gsm>
+ <network-id mcc="744" mnc="01"/>
+ <apn value="vox.wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/></apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Personal</name>
+ <gsm>
+ <network-id mcc="744" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/></apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="744" mnc="04"/>
+ <apn value="internet.tigo.py">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="broadband.tigo.py">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ <name xml:lang="es">Banda Ancha Móvil</name>
+ <username>tigo</username>
+ <password>tigo</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="744" mnc="02"/>
+ <apn value="gprs.claro.com.py">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Qatar -->
+<country code="qa">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="427" mnc="02"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <apn value="web.vodafone.com.qa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web</name>
+ </apn>
+ <apn value="vodafone.com.qa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web (old)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Q-Tel</name>
+ <gsm>
+ <network-id mcc="427" mnc="01"/>
+ <apn value="gprs.qtel">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Qatarnet</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Réunion (France) -->
+<country code="re">
+ <provider>
+ <name>SFR Réunion</name>
+ <gsm>
+ <network-id mcc="647" mnc="10"/>
+ <msisdn-query>
+ <sms text="ABCd84367">+33621012555</sms>
+ </msisdn-query>
+ <apn value="websfr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract / Prepaid</name>
+ </apn>
+ <apn value="slsfr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SFR slsfr</name>
+ </apn>
+ <apn value="internetpro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SFR internetpro</name>
+ </apn>
+ <apn value="ipnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SFR ipnet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Romania -->
+<country code="ro">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="226" mnc="10"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>172.22.7.21</dns>
+ <dns>172.22.7.20</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="226" mnc="01"/>
+ <apn value="tobe.vodafone.ro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet (Prepaid)</name>
+ <username>tobe.vodafone.ro</username>
+ <password>vodafone</password>
+ </apn>
+ <apn value="internet.vodafone.ro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet (Postpaid)</name>
+ <username>internet.vodafone.ro</username>
+ <password>vodafone</password>
+ </apn>
+ <apn value="internet.pre.vodafone.ro">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet (Prepaid)</name>
+ <username>internet.pre.vodafone.ro</username>
+ <password>vodafone</password>
+ </apn>
+ <apn value="live.vodafone.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Live! (Postpaid)</name>
+ <username>live</username>
+ <password>vodafone</password>
+ </apn>
+ <apn value="live.pre.vodafone.ro">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Live! (Prepaid)</name>
+ <username>live.pre.vodafone.com</username>
+ <password>vodafone</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zapp</name>
+ <cdma>
+ <username>zapp</username>
+ <password>zapp</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Digi.Net Mobil</name>
+ <gsm>
+ <network-id mcc="226" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Home</name>
+ </apn>
+ <apn value="static">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business (static)</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Serbia -->
+<country code="rs">
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="220" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>telenor</username>
+ <password>gprs</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telekom Srbija</name>
+ <gsm>
+ <network-id mcc="220" mnc="03"/>
+ <apn value="gprsinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mts</username>
+ <password>064</password>
+ <dns>195.178.38.3</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>VIP Mobile</name>
+ <gsm>
+ <network-id mcc="220" mnc="05"/>
+ <apn value="vipmobile">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vipmobile</username>
+ <password>vipmobile</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Rwanda -->
+<country code="rw">
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="635" mnc="10"/>
+ <apn value="internet.mtn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="635" mnc="13"/>
+ <apn value="web.tigo.rw">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Russia -->
+<country code="ru">
+ <provider>
+ <name>BaikalWestCom</name>
+ <name xml:lang="ru">БайкалВестКом</name>
+ <gsm>
+ <network-id mcc="250" mnc="12"/>
+ <apn value="inet.bwc.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>bwc</username>
+ <password>bwc</password>
+ <dns>81.18.113.2</dns>
+ <dns>81.18.112.50</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Beeline</name>
+ <name xml:lang="ru">Билайн</name>
+ <gsm>
+ <network-id mcc="250" mnc="28"/>
+ <network-id mcc="250" mnc="99"/>
+ <apn value="home.beeline.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G modem</name>
+ <name xml:lang="ru">USB-модем</name>
+ <username>beeline</username>
+ <password>beeline</password>
+ <dns>212.44.130.6</dns>
+ <dns>217.118.83.6</dns>
+ </apn>
+ <apn value="internet.beeline.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile phone</name>
+ <name xml:lang="ru">Мобильный телефон</name>
+ <username>beeline</username>
+ <password>beeline</password>
+ <dns>217.118.66.243</dns>
+ <dns>217.118.66.244</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ETK</name>
+ <gsm>
+ <network-id mcc="250" mnc="05"/>
+ <apn value="wap.etk.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTS</name>
+ <gsm>
+ <network-id mcc="250" mnc="01"/>
+ <apn value="internet.mts.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mts</username>
+ <password>mts</password>
+ <dns>213.87.0.1</dns>
+ <dns>213.87.1.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Megafon</name>
+ <name xml:lang="ru">Мегафон</name>
+
+ <gsm>
+ <network-id mcc="250" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>RUS</name>
+ <name xml:lang="ru">Россия</name>
+ <username>gdata</username>
+ <password>gdata</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>NCC</name>
+ <gsm>
+ <network-id mcc="250" mnc="03"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>ncc</username>
+ <dns>10.0.3.5</dns>
+ <dns>10.0.3.2</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>NTC</name>
+ <gsm>
+ <network-id mcc="250" mnc="16"/>
+ <apn value="internet.ntc">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>80.243.64.67</dns>
+ <dns>80.243.68.34</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Enisey TeleCom</name>
+ <name xml:lang="ru">Енисей Телеком</name>
+ <gsm>
+ <network-id mcc="250" mnc="05"/>
+ <apn value="internet.etk.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>etk</username>
+ <dns>10.10.30.3</dns>
+ <dns>10.10.30.4</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Motiv</name>
+ <name xml:lang="ru">Мотив</name>
+ <gsm>
+ <network-id mcc="250" mnc="35"/>
+ <apn value="inet.ycc.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>motiv</username>
+ <dns>217.148.52.34</dns>
+ <dns>217.148.52.3</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tatincom</name>
+ <name xml:lang="ru">Татинком</name>
+ <gsm>
+ <apn value="internet.tatincom.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>tatincom</username>
+ <password>tatincom</password>
+ <dns>89.207.96.2</dns>
+ <dns>89.207.97.18</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <name xml:lang="ru">Теле2</name>
+ <gsm>
+ <network-id mcc="250" mnc="20"/>
+ <apn value="internet.tele2.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>130.244.127.161</dns>
+ <dns>130.244.127.169</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Skylink</name>
+ <name xml:lang="ru">Скайлинк</name>
+ <cdma>
+ <username>mobile</username>
+ <password>internet</password>
+
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="11396"/> <!-- Khabarovsk area -->
+ <sid value="11398"/> <!-- Adygeya -->
+ <sid value="11400"/> <!-- Altay republic -->
+ <sid value="11418"/> <!-- Bashkostostan -->
+ <sid value="11424"/> <!-- Buryatiya -->
+ <sid value="11432"/> <!-- Dagestan -->
+ <sid value="11434"/> <!-- Ingushetia -->
+ <sid value="11438"/> <!-- Kabardino-Balkariya -->
+ <sid value="11440"/> <!-- Kalmykia -->
+ <sid value="11442"/> <!-- Karachayevo-Cherkessiya -->
+ <sid value="11446"/> <!-- Karelia -->
+ <sid value="11452"/> <!-- Komi -->
+ <sid value="11456"/> <!-- Mordovia -->
+ <sid value="11462"/> <!-- Yakutiya -->
+ <sid value="11465"/> <!-- North Osetia -->
+ <sid value="11482"/> <!-- Tatarstan -->
+ <sid value="11484"/> <!-- Tuva -->
+ <sid value="11492"/> <!-- Udmurtiya -->
+ <sid value="11494"/> <!-- Khakasia -->
+ <sid value="11498"/> <!-- Chechnya -->
+ <sid value="11510"/> <!-- Altay area -->
+ <sid value="11532"/> <!-- Krasnodar -->
+ <sid value="11546"/> <!-- Krasnoyarsk -->
+ <sid value="11556"/> <!-- Primorsky area -->
+ <sid value="11568"/> <!-- Stavropol -->
+ <sid value="11572"/> <!-- Amur area -->
+ <sid value="11578"/> <!-- Arkhangelsk -->
+ <sid value="11582"/> <!-- Astrakhan -->
+ <sid value="11590"/> <!-- Belgorod -->
+ <sid value="11596"/> <!-- Bryansk -->
+ <sid value="11604"/> <!-- Vladimir -->
+ <sid value="11616"/> <!-- Volgograd -->
+ <sid value="11622"/> <!-- Vologda -->
+ <sid value="11630"/> <!-- Ivanovo -->
+ <sid value="11642"/> <!-- Irkutsk -->
+ <sid value="11646"/> <!-- Kaliningrad -->
+ <sid value="11650"/> <!-- Kaluga -->
+ <sid value="11668"/> <!-- Kemerovo -->
+ <sid value="11672"/> <!-- Kostroma -->
+ <sid value="11676"/> <!-- Kurgan -->
+ <sid value="11684"/> <!-- Kursk -->
+ <sid value="11692"/> <!-- Leningrad area -->
+ <sid value="11698"/> <!-- Lipetsk -->
+ <sid value="11700"/> <!-- Magadan -->
+ <sid value="11732"/> <!-- Moscow area -->
+ <sid value="11736"/> <!-- Murmansk -->
+ <sid value="11754"/> <!-- Nizhniy Novgorod -->
+ <sid value="11758"/> <!-- V. Novgorog -->
+ <sid value="11772"/> <!-- Novosibirsk -->
+ <sid value="11780"/> <!-- Kirov -->
+ <sid value="11784"/> <!-- Chuvashia -->
+ <sid value="11788"/> <!-- Evreysky district -->
+ <sid value="11790"/> <!-- Aginsky-Buryatsky district -->
+ <sid value="11794"/> <!-- Penza -->
+ <sid value="11802"/> <!-- Mariy El -->
+ <sid value="11806"/> <!-- Koryak district -->
+ <sid value="11816"/> <!-- Omsk -->
+ <sid value="11826"/> <!-- Orenburg -->
+ <sid value="11830"/> <!-- Orel -->
+ <sid value="11844"/> <!-- Perm -->
+ <sid value="11848"/> <!-- Pskov -->
+ <sid value="11868"/> <!-- Rostov -->
+ <sid value="11874"/> <!-- Tomsk -->
+ <sid value="11884"/> <!-- Voronezh -->
+ <sid value="11892"/> <!-- Ryazan -->
+ <sid value="11908"/> <!-- Samara -->
+ <sid value="11922"/> <!-- Saratov -->
+ <sid value="11924"/> <!-- Sakhalin -->
+ <sid value="11948"/> <!-- Sverdlovsk -->
+ <sid value="11960"/> <!-- Tambov -->
+ <sid value="11964"/> <!-- Smolensk -->
+ <sid value="11968"/> <!-- Tver -->
+ <sid value="11978"/> <!-- Tula -->
+ <sid value="11984"/> <!-- Tyumen -->
+ <sid value="11990"/> <!-- Ul yanovsk -->
+ <sid value="12006"/> <!-- Chelyabinsk -->
+ <sid value="12012"/> <!-- Chita -->
+ <sid value="12020"/> <!-- Yaroslavl -->
+ <sid value="12060"/> <!-- Moscow -->
+ <sid value="12061"/> <!-- Moscow -->
+ <sid value="12063"/> <!-- St. Petersburg -->
+ <sid value="12064"/> <!-- St. Petersburg -->
+ <sid value="12065"/> <!-- Kemerovo -->
+ <sid value="12066"/> <!-- Kemerovo -->
+ <sid value="12067"/> <!-- Sverdlovsk -->
+ <sid value="12085"/> <!-- Nenetskiy district -->
+ <sid value="12087"/> <!-- Ust-Ordynsky district -->
+ <sid value="12090"/> <!-- Khanty-Mansi district -->
+ <sid value="12092"/> <!-- Chukotsky district -->
+ <sid value="12094"/> <!-- Yamal-Nenets district -->
+ <sid value="12095"/> <!-- Kamchatka -->
+ </cdma>
+ </provider>
+ <provider>
+ <name>U-tel</name>
+ <gsm>
+ <network-id mcc="250" mnc="39"/>
+ <apn value="internet.usi.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Saudi Arabia -->
+<country code="sa">
+ <provider>
+ <name>Mobily</name>
+ <gsm>
+ <network-id mcc="420" mnc="03"/>
+ <apn value="web1">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid</name>
+ </apn>
+ <apn value="web2">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>STC</name>
+ <gsm>
+ <network-id mcc="420" mnc="01"/>
+ <apn value="jawalnet.com.sa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.118.133.101</dns>
+ <dns>212.118.133.102</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="420" mnc="04"/>
+ <apn value="zain">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+
+<!-- Sweden -->
+<country code="se">
+ <provider primary="true">
+ <name>3</name>
+ <gsm>
+ <network-id mcc="240" mnc="02"/>
+ <network-id mcc="240" mnc="04"/>
+ <!-- http://www.tre.se/templates/Sporg3_02.aspx?id=4231 -->
+ <apn value="data.tre.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobiltelefon</name>
+ </apn>
+ <!-- http://www.tre.se/templates/Sporg3_02.aspx?id=4231 -->
+ <apn value="bredband.tre.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Bredband</name>
+ </apn>
+ <apn value="net.tre.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Bredband Kontantkort</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Glocalnet</name>
+ <gsm>
+ <network-id mcc="240" mnc="08"/>
+ <!-- http://glocalnet.se/mobiltbredband -->
+ <apn value="bredband.glocalnet.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Bredband</name>
+ </apn>
+ <!-- http://kundservice.glocalnet.se/Kundservice/Mobiltelefoni/Installningar/ -->
+ <apn value="internet.glocalnet.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Glocalnet Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Halebop</name>
+ <gsm>
+ <network-id mcc="240" mnc="01"/>
+
+ <!-- http://www.halebop.se/halebop_kundtjanst/vanliga_fragor_kontantkort/ -->
+ <apn value="halebop.telia.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- http://www.ice.net/Mobilt-bredband-1373.aspx -->
+ <name>ice.net (Nordisk Mobiltelefon)</name>
+ <cdma>
+ <username>cdma</username>
+ <password>cdma</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="240" mnc="07"/>
+ <network-id mcc="240" mnc="05"/>
+
+ <voicemail>222</voicemail>
+ <balance-check>
+ <ussd>*111#</ussd>
+ <dtmf>211</dtmf>
+ </balance-check>
+
+ <!-- http://www.tele2.se/internet-via-gprs.html -->
+ <apn value="internet.tele2.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Internet</name>
+ </apn>
+ <!-- http://www.tele2.se/alien-modem.html -->
+ <apn value="mobileinternet.tele2.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Bredband</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Comviq</name>
+ <gsm>
+ <network-id mcc="240" mnc="07"/>
+ <network-id mcc="240" mnc="05"/>
+
+ <voicemail>222</voicemail>
+ <balance-check>
+ <ussd>*111#</ussd>
+ <dtmf>211</dtmf>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*110*CODE#</ussd>
+ </balance-top-up>
+
+ <apn value="data.comviq.se">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Surf</name>
+ </apn>
+
+ <apn value="internet.tele2.se">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Tele2 Comviq 3G</name>
+ </apn>
+ <apn value="mobileinternet.tele2.se">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Tele2 Comviq 3G (7,2 Mbit/s)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Multicom Security</name>
+ <gsm>
+ <network-id mcc="240" mnc="01"/>
+ <network-id mcc="240" mnc="05"/>
+
+ <!-- http://multicomsecurity.se/produkter-tjanster/mobil-datakommunikation/mobiflex/ -->
+ <apn value="mobiflex.telia.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobiflex</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="240" mnc="04"/>
+ <network-id mcc="240" mnc="06"/>
+ <network-id mcc="240" mnc="08"/>
+
+ <voicemail>888</voicemail>
+ <balance-check>
+ <ussd>*222#</ussd>
+ </balance-check>
+
+ <!-- http://www.telenor.se/privat/mobiltelefoni/alla-mobiltjanster/alla-mobiltjanster.html#C45-2100 -->
+ <apn value="internet.telenor.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Internet</name>
+ </apn>
+ <apn value="services.telenor.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilsurf med maxtaxa</name>
+ </apn>
+ <apn value="bredband.telenor.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Bredband</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telia</name>
+ <gsm>
+ <network-id mcc="240" mnc="01"/>
+ <network-id mcc="240" mnc="05"/>
+
+ <voicemail>*133#</voicemail>
+ <balance-check>
+ <ussd>*120#</ussd>
+ <ussd>*121#</ussd>
+ </balance-check>
+
+ <!-- http://www3.telia.se/foretag/mobilguiden/ -->
+ <apn value="online.telia.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telia 3G</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TDC</name>
+ <gsm>
+ <network-id mcc="240" mnc="14"/>
+ <apn value="internet.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>djuice</name>
+ <gsm>
+ <network-id mcc="240" mnc="09"/>
+ <apn value="internet.djuice.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Com Hem</name>
+ <gsm>
+ <network-id mcc="240" mnc="02"/>
+ <network-id mcc="240" mnc="04"/>
+ <!-- MVNO operating on 3's network -->
+ <apn value="bredband.comhem.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Parlino</name>
+ <gsm>
+ <network-id mcc="240" mnc="07"/>
+ <apn value="internet.parlino.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Universal Telecom</name>
+ <gsm>
+ <!-- http://www.uvtc.com/SWEDEN/internet/mobiltbredband/Default.aspx -->
+ <apn value="sp-internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Bredband</name>
+ </apn>
+ <!-- http://www.uvtc.com/sweden/Mobil/Faq/default.aspx -->
+ <apn value="internet.uvtc.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Singapore -->
+<country code="sg">
+ <provider>
+ <name>M1</name>
+ <gsm>
+ <network-id mcc="525" mnc="03"/>
+ <!-- http://m1.com.sg/filedownloads/popup/Miworld/popup_se2.5.html mid page -->
+ <apn value="sunsurf">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SunSurf/Mobile Broadband (postpaid)</name>
+ <username>65</username>
+ <dns>202.79.64.21</dns>
+ <dns>202.79.64.26</dns>
+ </apn>
+ <!-- http://m1.com.sg/filedownloads/popup/Miworld/popup_se2.5.html top page-->
+ <apn value="miworld">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>MiWorld Mobile (postpaid)</name>
+ <username>65(mobilenumber)</username>
+ <password>user123</password>
+ </apn>
+ <!-- http://m1.com.sg/filedownloads/popup/Miworld/popup_se2.5.html lower page -->
+ <apn value="miworldcard">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>MiWorld Mobile (prepaid)</name>
+ <username>65(mobilenumber)</username>
+ <password>user123</password>
+ </apn>
+ <apn value="prepaidbb">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband (prepaid)</name>
+ </apn>
+ <apn value="sunsurfmcard">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>M Card (prepaid)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>SingTel</name>
+ <gsm>
+ <network-id mcc="525" mnc="01"/>
+ <network-id mcc="525" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>165.21.100.88</dns>
+ <dns>165.21.83.88</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Starhub</name>
+ <gsm>
+ <network-id mcc="525" mnc="05"/>
+ <apn value="shwap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>star</username>
+ <password>hub</password>
+ <dns>203.116.1.78</dns>
+ </apn>
+ <apn value="shppd">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>MaxMobile Broadband (prepaid)</name>
+ </apn>
+ <apn value="shinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>MaxMobile Broadband (postpaid)</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Slovenia -->
+<country code="si">
+ <provider>
+ <name>Mobitel</name>
+ <gsm>
+ <network-id mcc="293" mnc="41"/>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid</name>
+ <username>mobitel</username>
+ <password>internet</password>
+ <dns>213.229.248.161</dns>
+ <dns>193.189.160.11</dns>
+ </apn>
+ <apn value="internetpro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mobitel</username>
+ <password>internet</password>
+ <dns>213.229.248.161</dns>
+ <dns>193.189.160.11</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone / Simobil</name>
+ <gsm>
+ <network-id mcc="293" mnc="40"/>
+ <msisdn-query>
+ <ussd>*100#</ussd>
+ </msisdn-query>
+ <apn value="internet.simobil.si">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>simobil</username>
+ <password>internet</password>
+ <dns>121.30.86.130</dns>
+ <dns>193.189.160.11</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-2</name>
+ <gsm>
+ <network-id mcc="293" mnc="64"/>
+ <apn value="internet.t-2.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Slovakia -->
+<country code="sk">
+ <provider>
+ <name>Slovak Telekom</name>
+ <gsm>
+ <network-id mcc="231" mnc="02"/>
+ <network-id mcc="231" mnc="04"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>195.91.0.17</dns>
+ <dns>194.154.227.17</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="231" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.151.200.31</dns>
+ <dns>213.151.208.162</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>O2</name>
+ <gsm>
+ <network-id mcc="231" mnc="06"/>
+ <apn value="o2internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <dns>160.218.161.60</dns>
+ <dns>194.228.211.33</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Senegal -->
+<country code="sn">
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="608" mnc="02"/>
+ <apn value="wap.sentelgsm.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>200.85.0.104</dns>
+ <dns>200.85.0.107</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- El Salvador -->
+<country code="sv">
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="706" mnc="04"/>
+ <apn value="internet.movistar.sv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistarsv</username>
+ <password>movistarsv</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>digicel</name>
+ <gsm>
+ <network-id mcc="706" mnc="02"/>
+ <apn value="wap.digicelsv.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="706" mnc="03"/>
+ <apn value="internet.tigo.sv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="706" mnc="10"/>
+ <apn value="internet.ideasclaro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Sudan -->
+<country code="sd">
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="634" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Thailand -->
+<country code="th">
+ <provider>
+ <name>AIS</name>
+ <gsm>
+ <network-id mcc="520" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>202.183.255.20</dns>
+ <dns>202.183.255.21</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>DTAC</name>
+ <gsm>
+ <network-id mcc="520" mnc="18"/>
+ <apn value="www.dtac.co.th">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>202.44.202.2</dns>
+ <dns>203.44.144.33</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>True Move</name>
+ <gsm>
+ <network-id mcc="520" mnc="99"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>true</username>
+ <password>true</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TOT 3G</name>
+ <gsm>
+ <network-id mcc="520" mnc="15"/>
+ <apn value="internet" >
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Tunisia -->
+<country code="tn">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="605" mnc="01"/>
+ <apn value="weborange">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="mms.otun">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Internet + MMS</name>
+ </apn>
+ <apn value="keygp">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere Prepaid</name>
+ </apn>
+ <apn value="keypro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere Professional</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tunisie Télécom / TUNTEL</name>
+ <gsm>
+ <network-id mcc="605" mnc="02"/>
+ <apn value="mms.tn">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>MMS</name>
+ <username>mms@tt1</username>
+ <password>mms</password>
+ </apn>
+ <apn value="gprs.tn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS DATA</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ </apn>
+ <apn value="internet.tn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB DATA</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tunisiana</name>
+ <gsm>
+ <network-id mcc="605" mnc="03"/>
+ <apn value="internet.tunisiana.com">
+ <name>Internet</name>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Turkey -->
+<country code="tr">
+ <provider>
+ <name>Avea</name>
+ <gsm>
+ <network-id mcc="286" mnc="03"/>
+ <network-id mcc="286" mnc="04"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.156.4.4</dns>
+ <dns>212.156.4.20</dns>
+ </apn>
+
+ <apn value="aycell">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>(former Aycell)</name>
+ <dns>212.156.4.1</dns>
+ <dns>212.156.4.4</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Turkcell</name>
+ <gsm>
+ <network-id mcc="286" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>gprs</username>
+ <password>gprs</password>
+ <dns>86.108.136.27</dns>
+ <dns>86.108.136.26</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="286" mnc="02"/><!-- mnc="0251" in Vodofone XML -->
+ <msisdn-query>
+ <ussd>*101#</ussd>
+ </msisdn-query>
+ <apn value="internet">
+ <usage type="internet"/>
+ <name>Vodafone Internet</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ </apn>
+ <!--
+ KKTC Telsim was a subsidiary of Telsim Group in Turkey which was taken
+ over by the Vodafone Group 2006 and rebranded as Vodafone in 2007.
+ Due to the political situation in Northern Cyprus the company shares the
+ Vodafone Turkey MCC and MNC codes although it is logically a separate
+ operator. The brand KKTC Telsim is still used in Northern Cyprus due to
+ Vodafone Group agreements with Cytamobile-Vodafone in Southern Cyprus.
+ -->
+ <apn value="edge.kktctelsim.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>KKTC Telsim</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Trinidad & Tobago -->
+<country code="tt">
+ <provider>
+ <name>Digicel</name>
+ <gsm>
+ <network-id mcc="374" mnc="13"/>
+ <apn value="wap.digiceltt.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>bmobile / TSTT</name>
+ <gsm>
+ <network-id mcc="374" mnc="12"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Taiwan -->
+<country code="tw">
+ <provider>
+ <name>Chunghwa Telecom (emome)</name>
+ <name xml:lang="zh">中華電信 (emome)</name>
+ <gsm>
+ <network-id mcc="466" mnc="92"/>
+ <!-- http://www.nav4all.com/site2/www.nav4all.com/enguk/gprs_settings_taiwan_chunghwatelekom_nav4all.php?m=F3 -->
+ <apn value="emome">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <!-- Vodafone Broadband Connect version 10.1.0.23908 2010-06-07T17:47:01 lists username/pass = web. Others list empty -->
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Far EasTone / KGT</name>
+ <name xml:lang="zh">遠傳電信 / 和信電訊</name>
+ <gsm>
+ <network-id mcc="466" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TW Mobile</name>
+ <name xml:lang="zh">台湾大哥大</name>
+ <gsm>
+ <network-id mcc="466" mnc="99"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TransAsia</name>
+ <name xml:lang="zh">泛亞電信</name>
+ <gsm>
+ <network-id mcc="466" mnc="97"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vibo Telecom / Aurora</name>
+ <name xml:lang="zh">威寶電信 (Vibo) / 震旦電信 (Aurora)</name>
+ <gsm>
+ <network-id mcc="466" mnc="89"/>
+ <apn value="vibo">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Asia Pacific Telecom (APBW)</name>
+ <name xml:lang="zh">亞太電信 (亞太行動寬頻電信)</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Tanzania, United Republic of -->
+<country code="tz">
+ <provider>
+ <name>Airtel Tanzania</name>
+ <gsm>
+ <network-id mcc="640" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodacom</name>
+ <gsm>
+ <network-id mcc="640" mnc="04"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zantel</name>
+ <gsm>
+ <network-id mcc="640" mnc="03"/>
+ <apn value="znet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ <cdma>
+ <username>@zantel.com</username>
+ <password> </password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Sasatel</name>
+ <cdma>
+ <username>sasatel</username>
+ <password>sasatel</password>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="9891"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>TTCL</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Ukraine -->
+<country code="ua">
+ <provider>
+ <name>kyivstar</name>
+ <gsm>
+ <network-id mcc="255" mnc="03"/>
+
+ <apn value="www.ab.kyivstar.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Ace&amp;Base</name>
+ <username>igprs</username>
+ <password>internet</password>
+ </apn>
+ <apn value="www.kyivstar.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract GPRS</name>
+ </apn>
+ <apn value="3g.kyivstar.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet 3G</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Djuice</name>
+ <gsm>
+ <network-id mcc="255" mnc="03"/>
+
+ <apn value="www.djuice.com.ua">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet GPRS</name>
+ </apn>
+ <apn value="xl.kyivstar.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet XL</name>
+ </apn>
+ <apn value="3g.kyivstar.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet 3G</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Life</name>
+ <gsm>
+ <network-id mcc="255" mnc="06"/>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Standard</name>
+ <dns>212.58.160.33</dns>
+ <dns>212.58.160.34</dns>
+ </apn>
+ <apn value="speed">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Faster</name>
+ <dns>212.58.160.33</dns>
+ <dns>212.58.160.34</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="255" mnc="02"/>
+ <apn value="internet.beeline.ua">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Jeans</name>
+ <gsm>
+ <network-id mcc="255" mnc="01"/>
+ <apn value="www.jeans.ua">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>80.255.64.23</dns>
+ <dns>80.255.64.24</dns>
+ </apn>
+ <apn value="hyper.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Hyper.NET</name>
+ <dns>212.58.160.33</dns>
+ <dns>212.58.160.34</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTS</name>
+ <gsm>
+ <network-id mcc="255" mnc="01"/>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS Internet</name>
+ <username>internet</username>
+ <dns>212.58.160.33</dns>
+ <dns>212.58.160.34</dns>
+ </apn>
+ <apn value="hyper.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Hyper.NET</name>
+ </apn>
+ <apn value="active">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>HyperActive</name>
+ </apn>
+ <apn value="www.umc.ua">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>umc.ua</name>
+ <dns>80.255.64.23</dns>
+ <dns>80.255.64.24</dns>
+ </apn>
+ </gsm>
+ <cdma>
+ <name>MTS Connect 3G</name>
+ <username>mobile</username>
+ <password>internet</password>
+ <sid value="15907"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Utel</name>
+ <gsm>
+ <network-id mcc="255" mnc="07"/>
+ <apn value="3g.utel.ua">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CDMA Ukraine</name>
+ <cdma>
+ <username>cdma</username>
+ <password>cdma</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>InterTelecom</name>
+ <cdma>
+ <username>IT@IT</username>
+ <password>IT</password>
+ <sid value="15906"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>PEOPLEnet</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Uganda -->
+<country code="ug">
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="641" mnc="10"/>
+ <apn value="yellopix.mtn.co.ug">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>193.108.252.50</dns>
+ <dns>193.108.252.51</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="641" mnc="14"/>
+ <apn value="orange.ug">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>UTL</name>
+ <gsm>
+ <network-id mcc="641" mnc="11"/>
+ <apn value="utbroadband">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ <apn value="utweb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Warid</name>
+ <gsm>
+ <network-id mcc="641" mnc="22"/>
+ <!-- http://www.waridtel.co.ug/gprs.php -->
+ <apn value="web.waridtel.co.ug">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="641" mnc="01"/>
+ <apn value="web.ug.zain.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- United States -->
+<country code="us">
+ <provider>
+ <name>AT&amp;T</name>
+ <gsm>
+ <network-id mcc="310" mnc="038"/>
+ <network-id mcc="310" mnc="090"/>
+ <network-id mcc="310" mnc="150"/>
+ <network-id mcc="310" mnc="410"/>
+ <network-id mcc="310" mnc="560"/>
+ <network-id mcc="310" mnc="680"/>
+ <!-- http://www.wireless.att.com/answer-center/main.jsp?solutionId=35078&t=solutionTab -->
+ <apn value="wap.cingular">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>MEdia Net (phones)</name>
+ </apn>
+ <apn value="Broadband">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>LaptopConnect (data cards)</name>
+ </apn>
+ <apn value="isp.cingular">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Data Connect (old)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="310" mnc="160"/>
+ <network-id mcc="310" mnc="200"/>
+ <network-id mcc="310" mnc="210"/>
+ <network-id mcc="310" mnc="220"/>
+ <network-id mcc="310" mnc="230"/>
+ <network-id mcc="310" mnc="240"/>
+ <network-id mcc="310" mnc="250"/>
+ <network-id mcc="310" mnc="260"/>
+ <network-id mcc="310" mnc="270"/>
+ <network-id mcc="310" mnc="310"/>
+ <network-id mcc="310" mnc="490"/>
+ <network-id mcc="310" mnc="580"/>
+ <network-id mcc="310" mnc="660"/>
+ <network-id mcc="310" mnc="800"/>
+
+ <voicemail>123</voicemail>
+ <apn value="epc.tmobile.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet/WebConnect</name>
+ <dns>10.177.0.34</dns>
+ <dns>10.164.103.44</dns>
+ </apn>
+ <apn value="wap.voicestream.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web2Go/t-zones</name>
+ </apn>
+ <apn value="internet2.voicestream.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet (old)</name>
+ </apn>
+ <apn value="internet3.voicestream.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet with VPN (old)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Cincinnati Bell Wireless</name>
+ <gsm>
+ <network-id mcc="310" mnc="420"/>
+ <apn value="wap.gocbw.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>cbw</username>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sprint</name>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="4103"/>
+ <sid value="4106"/>
+ <sid value="4107"/>
+ <sid value="4120"/>
+ <sid value="4121"/>
+ <sid value="4124"/>
+ <sid value="4126"/>
+ <sid value="4132"/>
+ <sid value="4135"/>
+ <sid value="4139"/>
+ <sid value="4144"/>
+ <sid value="4145"/>
+ <sid value="4148"/>
+ <sid value="4151"/>
+ <sid value="4153"/>
+ <sid value="4155"/>
+ <sid value="4157"/>
+ <sid value="4159"/>
+ <sid value="4162"/>
+ <sid value="4164"/>
+ <sid value="4166"/>
+ <sid value="4168"/>
+ <sid value="4170"/>
+ <sid value="4171"/>
+ <sid value="4174"/>
+ <sid value="4180"/>
+ <sid value="4181"/>
+ <sid value="4183"/>
+ <sid value="4184"/>
+ <sid value="4186"/>
+ <sid value="4188"/>
+ <sid value="4190"/>
+ <sid value="4194"/>
+ <sid value="4195"/>
+ <sid value="4198"/>
+ <sid value="4274"/>
+ <sid value="4376"/>
+ <sid value="4379"/>
+ <sid value="4384"/>
+ <sid value="4390"/>
+ <sid value="4396"/>
+ <sid value="4418"/>
+ <sid value="4622"/>
+ <sid value="4654"/>
+ <sid value="4694"/>
+ <sid value="4812"/>
+ <sid value="4982"/>
+ <sid value="5116"/>
+ <sid value="5142"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Boost Mobile (Prepaid)</name>
+ <cdma />
+ </provider>
+ <provider>
+ <name>Verizon</name>
+ <gsm>
+ <network-id mcc="310" mnc="995"/>
+ <network-id mcc="311" mnc="480"/>
+ <apn value="vzwims">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>4G LTE Contract</name>
+ </apn>
+ <apn value="vzwinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>4G LTE Contract</name>
+ <dns>66.174.92.14</dns>
+ <dns>69.78.96.14</dns>
+ </apn>
+ <apn value="vzwapp">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>4G LTE Contract</name>
+ </apn>
+ </gsm>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="2"/>
+ <sid value="4"/>
+ <sid value="5"/>
+ <sid value="6"/>
+ <sid value="8"/>
+ <sid value="12"/>
+ <sid value="15"/>
+ <sid value="17"/>
+ <sid value="18"/>
+ <sid value="20"/>
+ <sid value="21"/>
+ <sid value="22"/>
+ <sid value="26"/>
+ <sid value="28"/>
+ <sid value="30"/>
+ <sid value="32"/>
+ <sid value="33"/>
+ <sid value="37"/>
+ <sid value="40"/>
+ <sid value="41"/>
+ <sid value="48"/>
+ <sid value="51"/>
+ <sid value="54"/>
+ <sid value="56"/>
+ <sid value="58"/>
+ <sid value="59"/>
+ <sid value="60"/>
+ <sid value="64"/>
+ <sid value="65"/>
+ <sid value="69"/>
+ <sid value="73"/>
+ <sid value="75"/>
+ <sid value="78"/>
+ <sid value="80"/>
+ <sid value="86"/>
+ <sid value="92"/>
+ <sid value="93"/>
+ <sid value="94"/>
+ <sid value="95"/>
+ <sid value="96"/>
+ <sid value="104"/>
+ <sid value="107"/>
+ <sid value="110"/>
+ <sid value="112"/>
+ <sid value="113"/>
+ <sid value="119"/>
+ <sid value="126"/>
+ <sid value="127"/>
+ <sid value="133"/>
+ <sid value="137"/>
+ <sid value="139"/>
+ <sid value="143"/>
+ <sid value="150"/>
+ <sid value="154"/>
+ <sid value="162"/>
+ <sid value="163"/>
+ <sid value="165"/>
+ <sid value="170"/>
+ <sid value="172"/>
+ <sid value="179"/>
+ <sid value="180"/>
+ <sid value="181"/>
+ <sid value="186"/>
+ <sid value="189"/>
+ <sid value="190"/>
+ <sid value="203"/>
+ <sid value="213"/>
+ <sid value="214"/>
+ <sid value="222"/>
+ <sid value="224"/>
+ <sid value="226"/>
+ <sid value="228"/>
+ <sid value="241"/>
+ <sid value="250"/>
+ <sid value="258"/>
+ <sid value="262"/>
+ <sid value="263"/>
+ <sid value="266"/>
+ <sid value="272"/>
+ <sid value="276"/>
+ <sid value="284"/>
+ <sid value="286"/>
+ <sid value="294"/>
+ <sid value="298"/>
+ <sid value="299"/>
+ <sid value="300"/>
+ <sid value="314"/>
+ <sid value="316"/>
+ <sid value="319"/>
+ <sid value="323"/>
+ <sid value="328"/>
+ <sid value="329"/>
+ <sid value="330"/>
+ <sid value="349"/>
+ <sid value="356"/>
+ <sid value="377"/>
+ <sid value="385"/>
+ <sid value="404"/>
+ <sid value="428"/>
+ <sid value="443"/>
+ <sid value="456"/>
+ <sid value="465"/>
+ <sid value="482"/>
+ <sid value="483"/>
+ <sid value="486"/>
+ <sid value="490"/>
+ <sid value="498"/>
+ <sid value="502"/>
+ <sid value="506"/>
+ <sid value="528"/>
+ <sid value="530"/>
+ <sid value="532"/>
+ <sid value="539"/>
+ <sid value="1015"/>
+ <sid value="1026"/>
+ <sid value="1032"/>
+ <sid value="1034"/>
+ <sid value="1062"/>
+ <sid value="1072"/>
+ <sid value="1074"/>
+ <sid value="1076"/>
+ <sid value="1083"/>
+ <sid value="1086"/>
+ <sid value="1088"/>
+ <sid value="1094"/>
+ <sid value="1103"/>
+ <sid value="1129"/>
+ <sid value="1131"/>
+ <sid value="1137"/>
+ <sid value="1139"/>
+ <sid value="1145"/>
+ <sid value="1151"/>
+ <sid value="1153"/>
+ <sid value="1164"/>
+ <sid value="1166"/>
+ <sid value="1174"/>
+ <sid value="1180"/>
+ <sid value="1189"/>
+ <sid value="1193"/>
+ <sid value="1196"/>
+ <sid value="1220"/>
+ <sid value="1224"/>
+ <sid value="1227"/>
+ <sid value="1230"/>
+ <sid value="1267"/>
+ <sid value="1285"/>
+ <sid value="1330"/>
+ <sid value="1358"/>
+ <sid value="1417"/>
+ <sid value="1429"/>
+ <sid value="1476"/>
+ <sid value="1488"/>
+ <sid value="1492"/>
+ <sid value="1494"/>
+ <sid value="1506"/>
+ <sid value="1510"/>
+ <sid value="1514"/>
+ <sid value="1516"/>
+ <sid value="1517"/>
+ <sid value="1519"/>
+ <sid value="1523"/>
+ <sid value="1548"/>
+ <sid value="1552"/>
+ <sid value="1563"/>
+ <sid value="1567"/>
+ <sid value="1614"/>
+ <sid value="1626"/>
+ <sid value="1630"/>
+ <sid value="1632"/>
+ <sid value="1637"/>
+ <sid value="1639"/>
+ <sid value="1641"/>
+ <sid value="1653"/>
+ <sid value="1679"/>
+ <sid value="1736"/>
+ <sid value="1740"/>
+ <sid value="1749"/>
+ <sid value="1760"/>
+ <sid value="1776"/>
+ <sid value="1780"/>
+ <sid value="1790"/>
+ <sid value="1792"/>
+ <sid value="1824"/>
+ <sid value="1826"/>
+ <sid value="1827"/>
+ <sid value="1830"/>
+ <sid value="1832"/>
+ <sid value="1857"/>
+ <sid value="1910"/>
+ <sid value="1912"/>
+ <sid value="1940"/>
+ <sid value="1969"/>
+ <sid value="2004"/>
+ <sid value="2054"/>
+ <sid value="2058"/>
+ <sid value="2060"/>
+ <sid value="2076"/>
+ <sid value="2115"/>
+ <sid value="2119"/>
+ <sid value="2125"/>
+ <sid value="2127"/>
+ <sid value="2149"/>
+ <sid value="3004"/>
+ <sid value="3008"/>
+ <sid value="3046"/>
+ <sid value="3066"/>
+ <sid value="3216"/>
+ <sid value="3218"/>
+ <sid value="3228"/>
+ <sid value="6709"/>
+ <sid value="6711"/>
+ <sid value="7532"/>
+ <sid value="7536"/>
+ <sid value="9640"/>
+ <sid value="9642"/>
+ <sid value="9644"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>US Cellular</name>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm
+ NOTE: SIDs listed as "HOLLAND & KNIGHT LLP" are counted for US Cellular
+ because HOLLAND & KNIGHT LLP/Peter M. Connolly appears to be the
+ license administrator for US Cellular in those license areas listed
+ in the IFAST SID database as assigned to HOLLAND & KNIGHT LLP.
+ When a search of the FCC's ULS for the CMA noted for a SID by
+ IFAST does not return an active license held by
+ US Cellular/HOLLAND & KNIGHT LLP, that SID is not counted
+ for US Cellular (ex SID 1925, 1935, 5289, 5291, 5293, etc).
+ -->
+ <sid value="5"/>
+ <sid value="104"/>
+ <sid value="166"/>
+ <sid value="191"/>
+ <sid value="193"/>
+ <sid value="195"/>
+ <sid value="217"/>
+ <sid value="221"/>
+ <sid value="246"/>
+ <sid value="298"/>
+ <sid value="303"/>
+ <sid value="309"/>
+ <sid value="331"/>
+ <sid value="333"/>
+ <sid value="340"/>
+ <sid value="364"/>
+ <sid value="384"/>
+ <sid value="389"/>
+ <sid value="393"/>
+ <sid value="413"/>
+ <sid value="445"/>
+ <sid value="580"/>
+ <sid value="599"/>
+ <sid value="1059"/>
+ <sid value="1061"/>
+ <sid value="1075"/>
+ <sid value="1173"/>
+ <sid value="1175"/>
+ <sid value="1200"/>
+ <sid value="1211"/>
+ <sid value="1213"/>
+ <sid value="1219"/>
+ <sid value="1223"/>
+ <sid value="1228"/>
+ <sid value="1229"/>
+ <sid value="1237"/>
+ <sid value="1272"/>
+ <sid value="1317"/>
+ <sid value="1320"/>
+ <sid value="1399"/>
+ <sid value="1403"/>
+ <sid value="1406"/>
+ <sid value="1419"/>
+ <sid value="1425"/>
+ <sid value="1427"/>
+ <sid value="1484"/>
+ <sid value="1521"/>
+ <sid value="1541"/>
+ <sid value="1543"/>
+ <sid value="1574"/>
+ <sid value="1595"/>
+ <sid value="1607"/>
+ <sid value="1610"/>
+ <sid value="1643"/>
+ <sid value="1753"/>
+ <sid value="1779"/>
+ <sid value="1783"/>
+ <sid value="1794"/>
+ <sid value="1802"/>
+ <sid value="1819"/>
+ <sid value="1821"/>
+ <sid value="1881"/>
+ <sid value="1914"/>
+ <sid value="1983"/>
+ <sid value="2066"/>
+ <sid value="2141"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Alltel</name>
+ <gsm>
+ <!-- Former Western Wireless (roaming only) -->
+ <network-id mcc="310" mnc="590"/>
+ </gsm>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="32"/>
+ <sid value="42"/>
+ <sid value="52"/>
+ <sid value="53"/>
+ <sid value="54"/>
+ <sid value="57"/>
+ <sid value="71"/>
+ <sid value="74"/>
+ <sid value="79"/>
+ <sid value="83"/>
+ <sid value="84"/>
+ <sid value="85"/>
+ <sid value="97"/>
+ <sid value="100"/>
+ <sid value="114"/>
+ <sid value="116"/>
+ <sid value="120"/>
+ <sid value="126"/>
+ <sid value="130"/>
+ <sid value="142"/>
+ <sid value="144"/>
+ <sid value="152"/>
+ <sid value="156"/>
+ <sid value="182"/>
+ <sid value="186"/>
+ <sid value="188"/>
+ <sid value="202"/>
+ <sid value="204"/>
+ <sid value="205"/>
+ <sid value="208"/>
+ <sid value="212"/>
+ <sid value="216"/>
+ <sid value="220"/>
+ <sid value="240"/>
+ <sid value="244"/>
+ <sid value="256"/>
+ <sid value="260"/>
+ <sid value="272"/>
+ <sid value="281"/>
+ <sid value="282"/>
+ <sid value="292"/>
+ <sid value="304"/>
+ <sid value="306"/>
+ <sid value="312"/>
+ <sid value="318"/>
+ <sid value="338"/>
+ <sid value="342"/>
+ <sid value="344"/>
+ <sid value="348"/>
+ <sid value="350"/>
+ <sid value="368"/>
+ <sid value="374"/>
+ <sid value="376"/>
+ <sid value="386"/>
+ <sid value="387"/>
+ <sid value="392"/>
+ <sid value="396"/>
+ <sid value="416"/>
+ <sid value="418"/>
+ <sid value="424"/>
+ <sid value="430"/>
+ <sid value="440"/>
+ <sid value="444"/>
+ <sid value="448"/>
+ <sid value="462"/>
+ <sid value="478"/>
+ <sid value="487"/>
+ <sid value="491"/>
+ <sid value="504"/>
+ <sid value="518"/>
+ <sid value="520"/>
+ <sid value="544"/>
+ <sid value="546"/>
+ <sid value="547"/>
+ <sid value="550"/>
+ <sid value="558"/>
+ <sid value="570"/>
+ <sid value="578"/>
+ <sid value="1008"/>
+ <sid value="1012"/>
+ <sid value="1014"/>
+ <sid value="1016"/>
+ <sid value="1025"/>
+ <sid value="1031"/>
+ <sid value="1033"/>
+ <sid value="1038"/>
+ <sid value="1040"/>
+ <sid value="1042"/>
+ <sid value="1044"/>
+ <sid value="1046"/>
+ <sid value="1048"/>
+ <sid value="1052"/>
+ <sid value="1054"/>
+ <sid value="1056"/>
+ <sid value="1058"/>
+ <sid value="1093"/>
+ <sid value="1118"/>
+ <sid value="1120"/>
+ <sid value="1124"/>
+ <sid value="1126"/>
+ <sid value="1148"/>
+ <sid value="1154"/>
+ <sid value="1156"/>
+ <sid value="1236"/>
+ <sid value="1244"/>
+ <sid value="1246"/>
+ <sid value="1248"/>
+ <sid value="1250"/>
+ <sid value="1252"/>
+ <sid value="1254"/>
+ <sid value="1256"/>
+ <sid value="1258"/>
+ <sid value="1260"/>
+ <sid value="1262"/>
+ <sid value="1264"/>
+ <sid value="1266"/>
+ <sid value="1268"/>
+ <sid value="1270"/>
+ <sid value="1271"/>
+ <sid value="1296"/>
+ <sid value="1298"/>
+ <sid value="1302"/>
+ <sid value="1311"/>
+ <sid value="1332"/>
+ <sid value="1334"/>
+ <sid value="1336"/>
+ <sid value="1338"/>
+ <sid value="1340"/>
+ <sid value="1342"/>
+ <sid value="1344"/>
+ <sid value="1346"/>
+ <sid value="1348"/>
+ <sid value="1370"/>
+ <sid value="1372"/>
+ <sid value="1375"/>
+ <sid value="1383"/>
+ <sid value="1385"/>
+ <sid value="1393"/>
+ <sid value="1400"/>
+ <sid value="1414"/>
+ <sid value="1422"/>
+ <sid value="1424"/>
+ <sid value="1426"/>
+ <sid value="1466"/>
+ <sid value="1493"/>
+ <sid value="1495"/>
+ <sid value="1499"/>
+ <sid value="1501"/>
+ <sid value="1526"/>
+ <sid value="1528"/>
+ <sid value="1530"/>
+ <sid value="1532"/>
+ <sid value="1534"/>
+ <sid value="1536"/>
+ <sid value="1538"/>
+ <sid value="1540"/>
+ <sid value="1542"/>
+ <sid value="1544"/>
+ <sid value="1546"/>
+ <sid value="1558"/>
+ <sid value="1560"/>
+ <sid value="1566"/>
+ <sid value="1568"/>
+ <sid value="1638"/>
+ <sid value="1640"/>
+ <sid value="1642"/>
+ <sid value="1650"/>
+ <sid value="1652"/>
+ <sid value="1654"/>
+ <sid value="1688"/>
+ <sid value="1712"/>
+ <sid value="1720"/>
+ <sid value="1763"/>
+ <sid value="1765"/>
+ <sid value="1800"/>
+ <sid value="1816"/>
+ <sid value="1818"/>
+ <sid value="1866"/>
+ <sid value="1874"/>
+ <sid value="1900"/>
+ <sid value="1913"/>
+ <sid value="1916"/>
+ <sid value="1928"/>
+ <sid value="1930"/>
+ <sid value="1934"/>
+ <sid value="1938"/>
+ <sid value="1972"/>
+ <sid value="1982"/>
+ <sid value="1984"/>
+ <sid value="1986"/>
+ <sid value="1989"/>
+ <sid value="1992"/>
+ <sid value="2010"/>
+ <sid value="2012"/>
+ <sid value="2014"/>
+ <sid value="2018"/>
+ <sid value="2022"/>
+ <sid value="2026"/>
+ <sid value="2040"/>
+ <sid value="2044"/>
+ <sid value="2046"/>
+ <sid value="2064"/>
+ <sid value="2133"/>
+ <sid value="3020"/>
+ <sid value="3226"/>
+ <sid value="3244"/>
+ <sid value="3292"/>
+ <sid value="30524"/>
+ <sid value="30635"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Leap Wireless</name>
+ <cdma />
+ </provider>
+ <provider>
+ <name>Cricket Communications</name>
+ <gsm>
+ <network-id mcc="310" mnc="000"/>
+ </gsm>
+ <cdma />
+ </provider>
+ <provider>
+ <name>Jump Mobile (Prepaid)</name>
+ <cdma />
+ </provider>
+ <provider>
+ <name>MetroPCS</name>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="4269"/>
+ <sid value="4273"/>
+ <sid value="4387"/>
+ <sid value="4531"/>
+ <sid value="4533"/>
+ <sid value="4547"/>
+ <sid value="4815"/>
+ <sid value="4855"/>
+ <sid value="5007"/>
+ <sid value="5023"/>
+ <sid value="5037"/>
+ <sid value="5097"/>
+ <sid value="5167"/>
+ <sid value="5199"/>
+ <sid value="21580"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Virgin Mobile / Helio</name>
+ <cdma>
+ <sid value="4183"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Cellular South</name>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm
+ NOTE: Cellular South appears to use "Lukas, Nace, Gutierrez & Sachs, Chartered"
+ as their license administrator, but that firm also administers Rural Cellular
+ Corporation (recently bought by Verizon) as well, so SIDs counted for
+ Cellular South were found by searching the FCC database for "Cellular South",
+ looking up the returned Cellular Market Areas in the IFAST database, and from
+ the IFAST database results using SIDs attributed to "Lukas, Nace, ..."
+ -->
+ <sid value="160"/>
+ <sid value="264"/>
+ <sid value="1382"/>
+ <sid value="1394"/>
+ <sid value="1996"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>BendBroadband</name>
+ <gsm>
+ <network-id mcc="311" mnc="570"/>
+ <apn value="ISP">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTPCS (Cellular One)</name>
+ <gsm>
+ <network-id mcc="310" mnc="570"/>
+ <apn value="wapgw.chinookwireless.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mid-Rivers Cellular</name>
+ <cdma>
+ <sid value="3102"/>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Uruguay -->
+<country code="uy">
+ <provider>
+ <name>Ancel</name>
+ <gsm>
+ <network-id mcc="748" mnc="00"/>
+ <network-id mcc="748" mnc="01"/>
+ <apn value="adslmovil">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>ADSL Móvil</name>
+ <dns>200.40.30.245</dns>
+ <dns>200.40.220.245</dns>
+ </apn>
+ <apn value="prepago.ancel">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>ADSL Móvil Prepago</name>
+ <username>BAM</username>
+ <password>BAM</password>
+ </apn>
+ <apn value="gprs.ancel">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <dns>200.40.30.245</dns>
+ <dns>200.40.220.245</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="748" mnc="10"/>
+ <apn value="gprs.claro.com.uy">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G Internet</name>
+ <username>ctigprs</username>
+ <password>ctigprs999</password>
+ </apn>
+ <apn value="internet.ctimovil.com.uy">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>2G Internet</name>
+ <username>ctiweb</username>
+ <password>ctiweb999</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="748" mnc="07"/>
+ <apn value="apnumt.movistar.com.uy">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G Internet</name>
+ <username>movistar</username>
+ <password>movistar</password>
+ </apn>
+ <apn value="webapn.movistar.com.uy">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>2G Internet</name>
+ <username>movistar</username>
+ <password>movistar</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Uzbekistan -->
+<country code="uz">
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="434" mnc="04"/>
+ <apn value="internet.beeline.uz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>beeline</username>
+ <password>beeline</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTS (Uzdunrobita)</name>
+ <gsm>
+ <network-id mcc="434" mnc="07"/>
+ <apn value="net.mts.uz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mts</username>
+ <password>mts</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ucell</name>
+ <gsm>
+ <network-id mcc="434" mnc="05"/>
+ <apn value="internet">
+ <username></username>
+ <password></password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- St Vincent -->
+<country code="vc">
+ <provider>
+ <name>Digicel</name>
+ <gsm>
+ <network-id mcc="360" mnc="070"/>
+ <apn value="wap.digiceloecs.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wapoecs</username>
+ <password>wap03oecs</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Venezuela -->
+<country code="ve">
+ <provider>
+ <name>Digitel TIM</name>
+ <gsm>
+ <network-id mcc="734" mnc="01"/>
+ <network-id mcc="734" mnc="02"/>
+ <network-id mcc="734" mnc="03"/>
+ <apn value="gprsweb.digitel.ve">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>57.67.127.195</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movilnet</name>
+ <gsm>
+ <network-id mcc="734" mnc="06"/>
+ <apn value="int.movilnet.com.ve">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>200.44.32.12</dns>
+ <dns>200.11.248.12</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="734" mnc="04"/>
+ <apn value="internet.movistar.ve">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>200.35.65.3</dns>
+ <dns>200.35.65.4</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Viet Nam -->
+<country code="vn">
+ <provider>
+ <name>MobiFone</name>
+ <gsm>
+ <network-id mcc="452" mnc="01"/>
+ <apn value="m-wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vinaphone</name>
+ <gsm>
+ <network-id mcc="452" mnc="02"/>
+ <apn value="m3-world">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ <apn value="m3-card">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>S-Fone</name>
+ <cdma>
+ <!-- phone number dialed appears to be 1501 not 777 (???
+ http://www.sfone.com.vn/webportal/guideMobile02_vi.html?pageNum=3&subNum=9&idxNum=091
+ -->
+ <username>S-Fone</username>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="13331"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Viettel Mobile</name>
+ <gsm>
+ <network-id mcc="452" mnc="04"/>
+ <apn value="v-internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ </apn>
+ <apn value="e-connect">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>D-com 3G</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vietnamobile</name>
+ <gsm>
+ <network-id mcc="452" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>EVNTelecom/E-Mobile</name>
+ <gsm>
+ <network-id mcc="452" mnc="08"/>
+ <apn value="e-internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>EVNTelecomNet</name>
+ </apn>
+ </gsm>
+ <cdma>
+ <username>evntelecom</username>
+ <password>evntelecom</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Beeline VN</name>
+ <gsm>
+ <network-id mcc="452" mnc="07"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- South Africa -->
+<country code="za">
+ <provider>
+ <name>Cell-c</name>
+ <gsm>
+ <network-id mcc="655" mnc="07"/>
+ <msisdn-query>
+ <ussd>*147*100#</ussd>
+ </msisdn-query>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*102*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.7.0.138</dns>
+ <dns>196.7.142.132</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="655" mnc="10"/>
+ <msisdn-query>
+ <ussd>*123*888#</ussd>
+ </msisdn-query>
+ <balance-check>
+ <ussd>*141#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*141*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.11.240.241</dns>
+ <dns>209.212.97.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodacom</name>
+ <gsm>
+ <network-id mcc="655" mnc="01"/>
+ <msisdn-query>
+ <ussd>*111*501#</ussd>
+ </msisdn-query>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*100*01*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.207.40.165</dns>
+ <dns>196.43.46.190</dns>
+ </apn>
+ <apn value="unrestricted">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Unrestricted</name>
+ <dns>196.207.32.69</dns>
+ <dns>196.43.45.190</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Virgin Mobile</name>
+ <gsm>
+ <network-id mcc="655" mnc="07"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*102*CODE#</ussd>
+ </balance-top-up>
+ <apn value="vdata">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.7.0.138</dns>
+ <dns>196.7.142.132</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>8.ta</name>
+ <gsm>
+ <network-id mcc="655" mnc="02"/>
+ <msisdn-query>
+ <ussd>*1#</ussd>
+ </msisdn-query>
+ <balance-check>
+ <ussd>*188#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*188*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+</serviceproviders>
+
diff --git a/shared/resources/branding/official/Browser.png b/shared/resources/branding/official/Browser.png
new file mode 100644
index 0000000..269a8e2
--- /dev/null
+++ b/shared/resources/branding/official/Browser.png
Binary files differ
diff --git a/shared/resources/branding/official/about_logo.png b/shared/resources/branding/official/about_logo.png
new file mode 100644
index 0000000..2928664
--- /dev/null
+++ b/shared/resources/branding/official/about_logo.png
Binary files differ
diff --git a/shared/resources/branding/official/initlogo.png b/shared/resources/branding/official/initlogo.png
new file mode 100644
index 0000000..c38bfd5
--- /dev/null
+++ b/shared/resources/branding/official/initlogo.png
Binary files differ
diff --git a/shared/resources/branding/official/logosmall.png b/shared/resources/branding/official/logosmall.png
new file mode 100644
index 0000000..d61fc82
--- /dev/null
+++ b/shared/resources/branding/official/logosmall.png
Binary files differ
diff --git a/shared/resources/branding/official/powered.png b/shared/resources/branding/official/powered.png
new file mode 100644
index 0000000..b30596b
--- /dev/null
+++ b/shared/resources/branding/official/powered.png
Binary files differ
diff --git a/shared/resources/branding/official/privacy_sprite.png b/shared/resources/branding/official/privacy_sprite.png
new file mode 100644
index 0000000..98083a2
--- /dev/null
+++ b/shared/resources/branding/official/privacy_sprite.png
Binary files differ
diff --git a/shared/resources/branding/official/splash_screen_generic.png b/shared/resources/branding/official/splash_screen_generic.png
new file mode 100644
index 0000000..41e36ed
--- /dev/null
+++ b/shared/resources/branding/official/splash_screen_generic.png
Binary files differ
diff --git a/shared/resources/branding/unofficial/Browser.png b/shared/resources/branding/unofficial/Browser.png
new file mode 100644
index 0000000..340ad2b
--- /dev/null
+++ b/shared/resources/branding/unofficial/Browser.png
Binary files differ
diff --git a/shared/resources/branding/unofficial/about_logo.png b/shared/resources/branding/unofficial/about_logo.png
new file mode 100644
index 0000000..08d7408
--- /dev/null
+++ b/shared/resources/branding/unofficial/about_logo.png
Binary files differ
diff --git a/shared/resources/branding/unofficial/initlogo.png b/shared/resources/branding/unofficial/initlogo.png
new file mode 100644
index 0000000..d4526cb
--- /dev/null
+++ b/shared/resources/branding/unofficial/initlogo.png
Binary files differ
diff --git a/shared/resources/branding/unofficial/logosmall.png b/shared/resources/branding/unofficial/logosmall.png
new file mode 100644
index 0000000..a73d3a3
--- /dev/null
+++ b/shared/resources/branding/unofficial/logosmall.png
Binary files differ
diff --git a/shared/resources/branding/unofficial/powered.png b/shared/resources/branding/unofficial/powered.png
new file mode 100644
index 0000000..7798789
--- /dev/null
+++ b/shared/resources/branding/unofficial/powered.png
Binary files differ
diff --git a/shared/resources/branding/unofficial/privacy_sprite.png b/shared/resources/branding/unofficial/privacy_sprite.png
new file mode 100644
index 0000000..11afb6a
--- /dev/null
+++ b/shared/resources/branding/unofficial/privacy_sprite.png
Binary files differ
diff --git a/shared/resources/branding/unofficial/splash_screen_generic.png b/shared/resources/branding/unofficial/splash_screen_generic.png
new file mode 100644
index 0000000..22742d4
--- /dev/null
+++ b/shared/resources/branding/unofficial/splash_screen_generic.png
Binary files differ
diff --git a/shared/resources/keyboard_layouts.json b/shared/resources/keyboard_layouts.json
new file mode 100644
index 0000000..7ddcdef
--- /dev/null
+++ b/shared/resources/keyboard_layouts.json
@@ -0,0 +1,46 @@
+{
+ "ar" : "arabic",
+ "as" : "otherlatins",
+ "bn-BD" : "otherlatins",
+ "ca" : "otherlatins",
+ "cs" : "otherlatins",
+ "cy" : "otherlatins",
+ "de" : "otherlatins",
+ "el" : "greek",
+ "en-US" : "english",
+ "eo" : "otherlatins",
+ "es" : "spanish",
+ "et" : "otherlatins",
+ "eu" : "otherlatins",
+ "ff" : "otherlatins",
+ "fr" : "otherlatins",
+ "fy-NL" : "otherlatins",
+ "ga-IE" : "otherlatins",
+ "gd" : "otherlatins",
+ "gl" : "otherlatins",
+ "he" : "hebrew",
+ "hi-IN" : "otherlatins",
+ "ht" : "otherlatins",
+ "hu" : "otherlatins",
+ "id" : "otherlatins",
+ "it" : "otherlatins",
+ "ja" : "japanese",
+ "ko" : "otherlatins",
+ "lij" : "otherlatins",
+ "ml" : "otherlatins",
+ "nl" : "otherlatins",
+ "or" : "otherlatins",
+ "pa" : "otherlatins",
+ "pl" : "otherlatins",
+ "pt-BR" : "portuguese",
+ "ro" : "otherlatins",
+ "ru" : "cyrillic",
+ "sl" : "otherlatins",
+ "sq" : "otherlatins",
+ "sv-SE" : "otherlatins",
+ "te" : "otherlatins",
+ "tr" : "otherlatins",
+ "ur" : "otherlatins",
+ "zh-CN" : "zhuyin",
+ "zh-TW" : "zhuyin"
+}
diff --git a/shared/resources/languages.json b/shared/resources/languages.json
new file mode 100644
index 0000000..3c32cd3
--- /dev/null
+++ b/shared/resources/languages.json
@@ -0,0 +1,6 @@
+{
+ "ar" : "العربية",
+ "en-US" : "English (US)",
+ "fr" : "Français",
+ "zh-TW" : "正體中文"
+}
diff --git a/shared/resources/media/alarms/ac_classic_clock_alarm.opus b/shared/resources/media/alarms/ac_classic_clock_alarm.opus
new file mode 100644
index 0000000..06ec657
--- /dev/null
+++ b/shared/resources/media/alarms/ac_classic_clock_alarm.opus
Binary files differ
diff --git a/shared/resources/media/alarms/ac_classic_clock_alarm_prog.opus b/shared/resources/media/alarms/ac_classic_clock_alarm_prog.opus
new file mode 100644
index 0000000..6c38678
--- /dev/null
+++ b/shared/resources/media/alarms/ac_classic_clock_alarm_prog.opus
Binary files differ
diff --git a/shared/resources/media/alarms/ac_classic_clock_radio.opus b/shared/resources/media/alarms/ac_classic_clock_radio.opus
new file mode 100644
index 0000000..7e847a5
--- /dev/null
+++ b/shared/resources/media/alarms/ac_classic_clock_radio.opus
Binary files differ
diff --git a/shared/resources/media/alarms/ac_normal_gem_echoes.opus b/shared/resources/media/alarms/ac_normal_gem_echoes.opus
new file mode 100644
index 0000000..fe8fe2f
--- /dev/null
+++ b/shared/resources/media/alarms/ac_normal_gem_echoes.opus
Binary files differ
diff --git a/shared/resources/media/alarms/ac_normal_ringing_strings.opus b/shared/resources/media/alarms/ac_normal_ringing_strings.opus
new file mode 100644
index 0000000..d9cfed8
--- /dev/null
+++ b/shared/resources/media/alarms/ac_normal_ringing_strings.opus
Binary files differ
diff --git a/shared/resources/media/alarms/ac_soft_humming_waves.opus b/shared/resources/media/alarms/ac_soft_humming_waves.opus
new file mode 100644
index 0000000..5f5b6c1
--- /dev/null
+++ b/shared/resources/media/alarms/ac_soft_humming_waves.opus
Binary files differ
diff --git a/shared/resources/media/alarms/ac_soft_into_the_void.opus b/shared/resources/media/alarms/ac_soft_into_the_void.opus
new file mode 100644
index 0000000..825a42f
--- /dev/null
+++ b/shared/resources/media/alarms/ac_soft_into_the_void.opus
Binary files differ
diff --git a/shared/resources/media/alarms/ac_soft_smooth_strings.opus b/shared/resources/media/alarms/ac_soft_smooth_strings.opus
new file mode 100644
index 0000000..19fa360
--- /dev/null
+++ b/shared/resources/media/alarms/ac_soft_smooth_strings.opus
Binary files differ
diff --git a/shared/resources/media/notifications/list.json b/shared/resources/media/notifications/list.json
new file mode 100644
index 0000000..03f0205
--- /dev/null
+++ b/shared/resources/media/notifications/list.json
@@ -0,0 +1,15 @@
+{
+ "notifier_bell.opus": "",
+ "notifier_dididi.opus": "",
+ "notifier_rewind.ogg": "",
+ "notifier_ting.opus": "",
+ "notifier_bap.opus": "",
+ "notifier_boomer.opus": "",
+ "notifier_exclamation.ogg": "",
+ "notifier_ring.ogg": "",
+ "notifier_bell_extd.opus": "",
+ "notifier_bop.opus": "",
+ "notifier_minimal_bands.ogg": "",
+ "notifier_spring.ogg": ""
+}
+
diff --git a/shared/resources/media/notifications/notifier_bap.opus b/shared/resources/media/notifications/notifier_bap.opus
new file mode 100644
index 0000000..5ed60eb
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_bap.opus
Binary files differ
diff --git a/shared/resources/media/notifications/notifier_bell.opus b/shared/resources/media/notifications/notifier_bell.opus
new file mode 100644
index 0000000..7aa1b12
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_bell.opus
Binary files differ
diff --git a/shared/resources/media/notifications/notifier_bell_extd.opus b/shared/resources/media/notifications/notifier_bell_extd.opus
new file mode 100644
index 0000000..521f881
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_bell_extd.opus
Binary files differ
diff --git a/shared/resources/media/notifications/notifier_boomer.opus b/shared/resources/media/notifications/notifier_boomer.opus
new file mode 100644
index 0000000..cd8fe7e
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_boomer.opus
Binary files differ
diff --git a/shared/resources/media/notifications/notifier_bop.opus b/shared/resources/media/notifications/notifier_bop.opus
new file mode 100644
index 0000000..f94047d
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_bop.opus
Binary files differ
diff --git a/shared/resources/media/notifications/notifier_dididi.opus b/shared/resources/media/notifications/notifier_dididi.opus
new file mode 100644
index 0000000..d751096
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_dididi.opus
Binary files differ
diff --git a/shared/resources/media/notifications/notifier_exclamation.ogg b/shared/resources/media/notifications/notifier_exclamation.ogg
new file mode 100644
index 0000000..dfd0cc2
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_exclamation.ogg
Binary files differ
diff --git a/shared/resources/media/notifications/notifier_minimal_bands.ogg b/shared/resources/media/notifications/notifier_minimal_bands.ogg
new file mode 100644
index 0000000..1d63b28
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_minimal_bands.ogg
Binary files differ
diff --git a/shared/resources/media/notifications/notifier_rewind.ogg b/shared/resources/media/notifications/notifier_rewind.ogg
new file mode 100644
index 0000000..65b3b37
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_rewind.ogg
Binary files differ
diff --git a/shared/resources/media/notifications/notifier_ring.ogg b/shared/resources/media/notifications/notifier_ring.ogg
new file mode 100644
index 0000000..8203a87
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_ring.ogg
Binary files differ
diff --git a/shared/resources/media/notifications/notifier_spring.ogg b/shared/resources/media/notifications/notifier_spring.ogg
new file mode 100644
index 0000000..c9b5b11
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_spring.ogg
Binary files differ
diff --git a/shared/resources/media/notifications/notifier_ting.opus b/shared/resources/media/notifications/notifier_ting.opus
new file mode 100644
index 0000000..94e8f22
--- /dev/null
+++ b/shared/resources/media/notifications/notifier_ting.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/list.json b/shared/resources/media/ringtones/list.json
new file mode 100644
index 0000000..36dd48f
--- /dev/null
+++ b/shared/resources/media/ringtones/list.json
@@ -0,0 +1,17 @@
+{
+ "ringer_classic_prism.ogg": "",
+ "ringer_classic_courier.opus": "",
+ "ringer_classic_touchmatic.opus": "",
+ "ringer_classic_electric.ogg": "",
+ "ringer_classic_wallphone.ogg": "",
+ "ringer_soft_disco_drive.opus": "",
+ "ringer_vamos_la_elektro.opus": "",
+ "ringer_digitalascent.opus": "",
+ "ringer_low_bit_swing.opus": "",
+ "ringer_ringing_gems.opus": "",
+ "ringer_rain_echoes.opus": "",
+ "ringer_progressive_dapple.opus": "",
+ "ringer_digital_dapple.opus": "",
+ "ringer_loud_windchimes.opus": "",
+ "ringer_bitbounce.opus": ""
+}
diff --git a/shared/resources/media/ringtones/ringer_bitbounce.opus b/shared/resources/media/ringtones/ringer_bitbounce.opus
new file mode 100644
index 0000000..bcb58ba
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_bitbounce.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_classic_courier.opus b/shared/resources/media/ringtones/ringer_classic_courier.opus
new file mode 100644
index 0000000..0c948d2
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_classic_courier.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_classic_electric.ogg b/shared/resources/media/ringtones/ringer_classic_electric.ogg
new file mode 100644
index 0000000..a576e15
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_classic_electric.ogg
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_classic_prism.ogg b/shared/resources/media/ringtones/ringer_classic_prism.ogg
new file mode 100644
index 0000000..428cc87
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_classic_prism.ogg
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_classic_touchmatic.opus b/shared/resources/media/ringtones/ringer_classic_touchmatic.opus
new file mode 100644
index 0000000..75e8d3f
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_classic_touchmatic.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_classic_wallphone.ogg b/shared/resources/media/ringtones/ringer_classic_wallphone.ogg
new file mode 100644
index 0000000..4f41dcf
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_classic_wallphone.ogg
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_digital_dapple.opus b/shared/resources/media/ringtones/ringer_digital_dapple.opus
new file mode 100644
index 0000000..a7feb8b
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_digital_dapple.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_digitalascent.opus b/shared/resources/media/ringtones/ringer_digitalascent.opus
new file mode 100644
index 0000000..83d3b77
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_digitalascent.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_loud_windchimes.opus b/shared/resources/media/ringtones/ringer_loud_windchimes.opus
new file mode 100644
index 0000000..2d0f566
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_loud_windchimes.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_low_bit_swing.opus b/shared/resources/media/ringtones/ringer_low_bit_swing.opus
new file mode 100644
index 0000000..d52cda0
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_low_bit_swing.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_progressive_dapple.opus b/shared/resources/media/ringtones/ringer_progressive_dapple.opus
new file mode 100644
index 0000000..0271185
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_progressive_dapple.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_rain_echoes.opus b/shared/resources/media/ringtones/ringer_rain_echoes.opus
new file mode 100644
index 0000000..b981056
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_rain_echoes.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_ringing_gems.opus b/shared/resources/media/ringtones/ringer_ringing_gems.opus
new file mode 100644
index 0000000..c1672a1
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_ringing_gems.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_soft_disco_drive.opus b/shared/resources/media/ringtones/ringer_soft_disco_drive.opus
new file mode 100644
index 0000000..8e7ffb1
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_soft_disco_drive.opus
Binary files differ
diff --git a/shared/resources/media/ringtones/ringer_vamos_la_elektro.opus b/shared/resources/media/ringtones/ringer_vamos_la_elektro.opus
new file mode 100644
index 0000000..550d1e7
--- /dev/null
+++ b/shared/resources/media/ringtones/ringer_vamos_la_elektro.opus
Binary files differ
diff --git a/shared/resources/tz.json b/shared/resources/tz.json
new file mode 100644
index 0000000..1dfc95b
--- /dev/null
+++ b/shared/resources/tz.json
@@ -0,0 +1,484 @@
+{
+
+"Africa": [
+ {"cc":"CI", "offset":"+00:00,+00:00", "city":"Abidjan"},
+ {"cc":"GH", "offset":"+00:00,+00:00", "city":"Accra"},
+ {"cc":"ET", "offset":"+03:00,+03:00", "city":"Addis_Ababa"},
+ {"cc":"DZ", "offset":"+01:00,+01:00", "city":"Algiers"},
+ {"cc":"ER", "offset":"+03:00,+03:00", "city":"Asmara"},
+ {"cc":"ER", "offset":"+03:00,+03:00", "city":"Asmera", "id":"Africa/Asmara"},
+ {"cc":"ML", "offset":"+00:00,+00:00", "city":"Bamako"},
+ {"cc":"CF", "offset":"+01:00,+01:00", "city":"Bangui"},
+ {"cc":"GM", "offset":"+00:00,+00:00", "city":"Banjul"},
+ {"cc":"GW", "offset":"+00:00,+00:00", "city":"Bissau"},
+ {"cc":"MW", "offset":"+02:00,+02:00", "city":"Blantyre"},
+ {"cc":"CG", "offset":"+01:00,+01:00", "city":"Brazzaville"},
+ {"cc":"BI", "offset":"+02:00,+02:00", "city":"Bujumbura"},
+ {"cc":"EG", "offset":"+02:00,+02:00", "city":"Cairo"},
+ {"cc":"MA", "offset":"+00:00,+01:00", "city":"Casablanca"},
+ {"cc":"ES", "offset":"+01:00,+02:00", "city":"Ceuta"},
+ {"cc":"GN", "offset":"+00:00,+00:00", "city":"Conakry"},
+ {"cc":"SN", "offset":"+00:00,+00:00", "city":"Dakar"},
+ {"cc":"TZ", "offset":"+03:00,+03:00", "city":"Dar_es_Salaam"},
+ {"cc":"DJ", "offset":"+03:00,+03:00", "city":"Djibouti"},
+ {"cc":"CM", "offset":"+01:00,+01:00", "city":"Douala"},
+ {"cc":"EH", "offset":"+00:00,+00:00", "city":"El_Aaiun"},
+ {"cc":"SL", "offset":"+00:00,+00:00", "city":"Freetown"},
+ {"cc":"BW", "offset":"+02:00,+02:00", "city":"Gaborone"},
+ {"cc":"ZW", "offset":"+02:00,+02:00", "city":"Harare"},
+ {"cc":"ZA", "offset":"+02:00,+02:00", "city":"Johannesburg"},
+ {"cc":"SS", "offset":"+03:00,+03:00", "city":"Juba"},
+ {"cc":"UG", "offset":"+03:00,+03:00", "city":"Kampala"},
+ {"cc":"SD", "offset":"+03:00,+03:00", "city":"Khartoum"},
+ {"cc":"RW", "offset":"+02:00,+02:00", "city":"Kigali"},
+ {"cc":"CD", "offset":"+01:00,+01:00", "city":"Kinshasa"},
+ {"cc":"NG", "offset":"+01:00,+01:00", "city":"Lagos"},
+ {"cc":"GA", "offset":"+01:00,+01:00", "city":"Libreville"},
+ {"cc":"TG", "offset":"+00:00,+00:00", "city":"Lome"},
+ {"cc":"AO", "offset":"+01:00,+01:00", "city":"Luanda"},
+ {"cc":"CD", "offset":"+02:00,+02:00", "city":"Lubumbashi"},
+ {"cc":"ZM", "offset":"+02:00,+02:00", "city":"Lusaka"},
+ {"cc":"GQ", "offset":"+01:00,+01:00", "city":"Malabo"},
+ {"cc":"MZ", "offset":"+02:00,+02:00", "city":"Maputo"},
+ {"cc":"LS", "offset":"+02:00,+02:00", "city":"Maseru"},
+ {"cc":"SZ", "offset":"+02:00,+02:00", "city":"Mbabane"},
+ {"cc":"SO", "offset":"+03:00,+03:00", "city":"Mogadishu"},
+ {"cc":"LR", "offset":"+00:00,+00:00", "city":"Monrovia"},
+ {"cc":"KE", "offset":"+03:00,+03:00", "city":"Nairobi"},
+ {"cc":"TD", "offset":"+01:00,+01:00", "city":"Ndjamena"},
+ {"cc":"NE", "offset":"+01:00,+01:00", "city":"Niamey"},
+ {"cc":"MR", "offset":"+00:00,+00:00", "city":"Nouakchott"},
+ {"cc":"BF", "offset":"+00:00,+00:00", "city":"Ouagadougou"},
+ {"cc":"BJ", "offset":"+01:00,+01:00", "city":"Porto-Novo"},
+ {"cc":"ST", "offset":"+00:00,+00:00", "city":"Sao_Tome"},
+ {"cc":"ML", "offset":"+00:00,+00:00", "city":"Timbuktu", "id":"Africa/Bamako"},
+ {"cc":"LY", "offset":"+02:00,+02:00", "city":"Tripoli"},
+ {"cc":"TN", "offset":"+01:00,+01:00", "city":"Tunis"},
+ {"cc":"NA", "offset":"+01:00,+02:00", "city":"Windhoek"}
+],
+
+"America": [
+ {"cc":"US", "offset":"-10:00,-09:00", "city":"Adak"},
+ {"cc":"US", "offset":"-09:00,-08:00", "city":"Anchorage"},
+ {"cc":"AI", "offset":"-04:00,-04:00", "city":"Anguilla"},
+ {"cc":"AG", "offset":"-04:00,-04:00", "city":"Antigua"},
+ {"cc":"BR", "offset":"-03:00,-03:00", "city":"Araguaina"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/Buenos_Aires"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/Catamarca"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/ComodRivadavia", "id":"America/Argentina/Catamarca"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/Cordoba"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/Jujuy"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/La_Rioja"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/Mendoza"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/Rio_Gallegos"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/Salta"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/San_Juan"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/San_Luis"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/Tucuman"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Argentina/Ushuaia"},
+ {"cc":"AW", "offset":"-04:00,-04:00", "city":"Aruba"},
+ {"cc":"PY", "offset":"-04:00,-03:00", "city":"Asuncion"},
+ {"cc":"CA", "offset":"-05:00,-05:00", "city":"Atikokan"},
+ {"cc":"US", "offset":"-10:00,-09:00", "city":"Atka", "id":"America/Adak"},
+ {"cc":"BR", "offset":"-03:00,-02:00", "city":"Bahia"},
+ {"cc":"MX", "offset":"-06:00,-05:00", "city":"Bahia_Banderas"},
+ {"cc":"BB", "offset":"-04:00,-04:00", "city":"Barbados"},
+ {"cc":"BR", "offset":"-03:00,-03:00", "city":"Belem"},
+ {"cc":"BZ", "offset":"-06:00,-06:00", "city":"Belize"},
+ {"cc":"CA", "offset":"-04:00,-04:00", "city":"Blanc-Sablon"},
+ {"cc":"BR", "offset":"-04:00,-04:00", "city":"Boa_Vista"},
+ {"cc":"CO", "offset":"-05:00,-05:00", "city":"Bogota", "name":"Bogotá"},
+ {"cc":"US", "offset":"-07:00,-06:00", "city":"Boise"},
+ {"cc":"BR", "offset":"-03:00,-02:00", "city":"Brasilia", "id":"America/Sao_Paulo", "name":"Brasília"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Buenos_Aires", "id":"America/Argentina/Buenos_Aires"},
+ {"cc":"CA", "offset":"-07:00,-06:00", "city":"Cambridge_Bay"},
+ {"cc":"BR", "offset":"-04:00,-03:00", "city":"Campo_Grande"},
+ {"cc":"MX", "offset":"-06:00,-05:00", "city":"Cancun"},
+ {"cc":"VE", "offset":"-04:30,-04:30", "city":"Caracas"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Catamarca", "id":"America/Argentina/Catamarca"},
+ {"cc":"GF", "offset":"-03:00,-03:00", "city":"Cayenne"},
+ {"cc":"KY", "offset":"-05:00,-05:00", "city":"Cayman"},
+ {"cc":"US", "offset":"-06:00,-05:00", "city":"Chicago"},
+ {"cc":"MX", "offset":"-07:00,-06:00", "city":"Chihuahua"},
+ {"cc":"CA", "offset":"-05:00,-05:00", "city":"Coral_Harbour", "id":"America/Atikokan"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Cordoba", "id":"America/Argentina/Cordoba"},
+ {"cc":"CR", "offset":"-06:00,-06:00", "city":"Costa_Rica"},
+ {"cc":"CA", "offset":"-07:00,-07:00", "city":"Creston"},
+ {"cc":"BR", "offset":"-04:00,-03:00", "city":"Cuiaba"},
+ {"cc":"CW", "offset":"-04:00,-04:00", "city":"Curacao"},
+ {"cc":"GL", "offset":"+00:00,+00:00", "city":"Danmarkshavn"},
+ {"cc":"CA", "offset":"-08:00,-07:00", "city":"Dawson"},
+ {"cc":"CA", "offset":"-07:00,-07:00", "city":"Dawson_Creek"},
+ {"cc":"US", "offset":"-07:00,-06:00", "city":"Denver"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Detroit"},
+ {"cc":"DM", "offset":"-04:00,-04:00", "city":"Dominica"},
+ {"cc":"CA", "offset":"-07:00,-06:00", "city":"Edmonton"},
+ {"cc":"BR", "offset":"-04:00,-04:00", "city":"Eirunepe"},
+ {"cc":"SV", "offset":"-06:00,-06:00", "city":"El_Salvador"},
+ {"cc":"MX", "offset":"-08:00,-07:00", "city":"Ensenada", "id":"America/Tijuana"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Fort_Wayne", "id":"America/Indiana/Indianapolis"},
+ {"cc":"BR", "offset":"-03:00,-03:00", "city":"Fortaleza"},
+ {"cc":"CA", "offset":"-04:00,-03:00", "city":"Glace_Bay"},
+ {"cc":"GL", "offset":"-03:00,-02:00", "city":"Godthab"},
+ {"cc":"CA", "offset":"-04:00,-03:00", "city":"Goose_Bay"},
+ {"cc":"TC", "offset":"-05:00,-04:00", "city":"Grand_Turk"},
+ {"cc":"GD", "offset":"-04:00,-04:00", "city":"Grenada"},
+ {"cc":"GP", "offset":"-04:00,-04:00", "city":"Guadeloupe"},
+ {"cc":"GT", "offset":"-06:00,-06:00", "city":"Guatemala"},
+ {"cc":"EC", "offset":"-05:00,-05:00", "city":"Guayaquil"},
+ {"cc":"GY", "offset":"-04:00,-04:00", "city":"Guyana"},
+ {"cc":"CA", "offset":"-04:00,-03:00", "city":"Halifax"},
+ {"cc":"CU", "offset":"-05:00,-04:00", "city":"Havana"},
+ {"cc":"MX", "offset":"-07:00,-07:00", "city":"Hermosillo"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Indiana/Indianapolis"},
+ {"cc":"US", "offset":"-06:00,-05:00", "city":"Indiana/Knox"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Indiana/Marengo"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Indiana/Petersburg"},
+ {"cc":"US", "offset":"-06:00,-05:00", "city":"Indiana/Tell_City"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Indiana/Vevay"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Indiana/Vincennes"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Indiana/Winamac"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Indianapolis", "id":"America/Indiana/Indianapolis"},
+ {"cc":"CA", "offset":"-07:00,-06:00", "city":"Inuvik"},
+ {"cc":"CA", "offset":"-05:00,-04:00", "city":"Iqaluit"},
+ {"cc":"JM", "offset":"-05:00,-05:00", "city":"Jamaica"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Jujuy", "id":"America/Argentina/Jujuy"},
+ {"cc":"US", "offset":"-09:00,-08:00", "city":"Juneau"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Kentucky/Louisville"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Kentucky/Monticello"},
+ {"cc":"US", "offset":"-06:00,-05:00", "city":"Knox_IN", "id":"America/Indiana/Knox"},
+ {"cc":"BQ", "offset":"-04:00,-04:00", "city":"Kralendijk", "id":"America/Curacao"},
+ {"cc":"BO", "offset":"-04:00,-04:00", "city":"La_Paz"},
+ {"cc":"PE", "offset":"-05:00,-05:00", "city":"Lima"},
+ {"cc":"US", "offset":"-08:00,-07:00", "city":"Los_Angeles"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"Louisville", "id":"America/Kentucky/Louisville"},
+ {"cc":"SX", "offset":"-04:00,-04:00", "city":"Lower_Princes", "id":"America/Curacao"},
+ {"cc":"BR", "offset":"-03:00,-03:00", "city":"Maceio"},
+ {"cc":"NI", "offset":"-06:00,-06:00", "city":"Managua"},
+ {"cc":"BR", "offset":"-04:00,-04:00", "city":"Manaus"},
+ {"cc":"MF", "offset":"-04:00,-04:00", "city":"Marigot", "id":"America/Guadeloupe"},
+ {"cc":"MQ", "offset":"-04:00,-04:00", "city":"Martinique"},
+ {"cc":"MX", "offset":"-06:00,-05:00", "city":"Matamoros"},
+ {"cc":"MX", "offset":"-07:00,-06:00", "city":"Mazatlan"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Mendoza", "id":"America/Argentina/Mendoza"},
+ {"cc":"US", "offset":"-06:00,-05:00", "city":"Menominee"},
+ {"cc":"MX", "offset":"-06:00,-05:00", "city":"Merida"},
+ {"cc":"US", "offset":"-08:00,-08:00", "city":"Metlakatla"},
+ {"cc":"MX", "offset":"-06:00,-05:00", "city":"Mexico_City"},
+ {"cc":"PM", "offset":"-03:00,-02:00", "city":"Miquelon"},
+ {"cc":"CA", "offset":"-04:00,-03:00", "city":"Moncton"},
+ {"cc":"MX", "offset":"-06:00,-05:00", "city":"Monterrey"},
+ {"cc":"UY", "offset":"-03:00,-02:00", "city":"Montevideo"},
+ {"cc":"CA", "offset":"-05:00,-04:00", "city":"Montreal"},
+ {"cc":"MS", "offset":"-04:00,-04:00", "city":"Montserrat"},
+ {"cc":"BS", "offset":"-05:00,-04:00", "city":"Nassau"},
+ {"cc":"US", "offset":"-05:00,-04:00", "city":"New_York"},
+ {"cc":"CA", "offset":"-05:00,-04:00", "city":"Nipigon"},
+ {"cc":"US", "offset":"-09:00,-08:00", "city":"Nome"},
+ {"cc":"BR", "offset":"-02:00,-02:00", "city":"Noronha"},
+ {"cc":"US", "offset":"-06:00,-05:00", "city":"North_Dakota/Beulah"},
+ {"cc":"US", "offset":"-06:00,-05:00", "city":"North_Dakota/Center"},
+ {"cc":"US", "offset":"-06:00,-05:00", "city":"North_Dakota/New_Salem"},
+ {"cc":"MX", "offset":"-07:00,-06:00", "city":"Ojinaga"},
+ {"cc":"PA", "offset":"-05:00,-05:00", "city":"Panama"},
+ {"cc":"CA", "offset":"-05:00,-04:00", "city":"Pangnirtung"},
+ {"cc":"SR", "offset":"-03:00,-03:00", "city":"Paramaribo"},
+ {"cc":"US", "offset":"-07:00,-07:00", "city":"Phoenix"},
+ {"cc":"HT", "offset":"-05:00,-04:00", "city":"Port-au-Prince"},
+ {"cc":"TT", "offset":"-04:00,-04:00", "city":"Port_of_Spain"},
+ {"cc":"BR", "offset":"-04:00,-04:00", "city":"Porto_Acre", "id":"America/Rio_Branco"},
+ {"cc":"BR", "offset":"-04:00,-04:00", "city":"Porto_Velho"},
+ {"cc":"PR", "offset":"-04:00,-04:00", "city":"Puerto_Rico"},
+ {"cc":"CA", "offset":"-06:00,-05:00", "city":"Rainy_River"},
+ {"cc":"CA", "offset":"-06:00,-05:00", "city":"Rankin_Inlet"},
+ {"cc":"BR", "offset":"-03:00,-03:00", "city":"Recife"},
+ {"cc":"CA", "offset":"-06:00,-06:00", "city":"Regina"},
+ {"cc":"CA", "offset":"-06:00,-05:00", "city":"Resolute"},
+ {"cc":"BR", "offset":"-04:00,-04:00", "city":"Rio_Branco"},
+ {"cc":"AR", "offset":"-03:00,-03:00", "city":"Rosario", "id":"America/Argentina/Cordoba"},
+ {"cc":"MX", "offset":"-08:00,-07:00", "city":"Santa_Isabel"},
+ {"cc":"BR", "offset":"-03:00,-03:00", "city":"Santarem"},
+ {"cc":"CL", "offset":"-04:00,-03:00", "city":"Santiago"},
+ {"cc":"DO", "offset":"-04:00,-04:00", "city":"Santo_Domingo"},
+ {"cc":"BR", "offset":"-03:00,-02:00", "city":"Sao_Paulo", "name":"São Paulo"},
+ {"cc":"GL", "offset":"-01:00,+00:00", "city":"Scoresbysund"},
+ {"cc":"US", "offset":"-07:00,-06:00", "city":"Shiprock", "id":"America/Denver"},
+ {"cc":"US", "offset":"-09:00,-08:00", "city":"Sitka"},
+ {"cc":"BL", "offset":"-04:00,-04:00", "city":"St_Barthelemy", "id":"America/Guadeloupe"},
+ {"cc":"CA", "offset":"-03:30,-02:30", "city":"St_Johns"},
+ {"cc":"KN", "offset":"-04:00,-04:00", "city":"St_Kitts"},
+ {"cc":"LC", "offset":"-04:00,-04:00", "city":"St_Lucia"},
+ {"cc":"VI", "offset":"-04:00,-04:00", "city":"St_Thomas"},
+ {"cc":"VC", "offset":"-04:00,-04:00", "city":"St_Vincent"},
+ {"cc":"CA", "offset":"-06:00,-06:00", "city":"Swift_Current"},
+ {"cc":"HN", "offset":"-06:00,-06:00", "city":"Tegucigalpa"},
+ {"cc":"GL", "offset":"-04:00,-03:00", "city":"Thule"},
+ {"cc":"CA", "offset":"-05:00,-04:00", "city":"Thunder_Bay"},
+ {"cc":"MX", "offset":"-08:00,-07:00", "city":"Tijuana"},
+ {"cc":"CA", "offset":"-05:00,-04:00", "city":"Toronto"},
+ {"cc":"VG", "offset":"-04:00,-04:00", "city":"Tortola"},
+ {"cc":"CA", "offset":"-08:00,-07:00", "city":"Vancouver"},
+ {"cc":"VI", "offset":"-04:00,-04:00", "city":"Virgin", "id":"America/St_Thomas"},
+ {"cc":"CA", "offset":"-08:00,-07:00", "city":"Whitehorse"},
+ {"cc":"CA", "offset":"-06:00,-05:00", "city":"Winnipeg"},
+ {"cc":"US", "offset":"-09:00,-08:00", "city":"Yakutat"},
+ {"cc":"CA", "offset":"-07:00,-06:00", "city":"Yellowknife"}
+],
+
+"Antarctica": [
+ {"cc":"AQ", "offset":"+11:00,+08:00", "city":"Casey"},
+ {"cc":"AQ", "offset":"+05:00,+07:00", "city":"Davis"},
+ {"cc":"AQ", "offset":"+10:00,+10:00", "city":"DumontDUrville", "name":"Dumont d'Urville"},
+ {"cc":"AQ", "offset":"+11:00,+11:00", "city":"Macquarie"},
+ {"cc":"AQ", "offset":"+05:00,+05:00", "city":"Mawson"},
+ {"cc":"AQ", "offset":"+12:00,+13:00", "city":"McMurdo"},
+ {"cc":"AQ", "offset":"-04:00,-03:00", "city":"Palmer"},
+ {"cc":"AQ", "offset":"-03:00,-03:00", "city":"Rothera"},
+ {"cc":"AQ", "offset":"+12:00,+13:00", "city":"South_Pole", "id":"Antarctica/McMurdo"},
+ {"cc":"AQ", "offset":"+03:00,+03:00", "city":"Syowa"},
+ {"cc":"AQ", "offset":"+06:00,+06:00", "city":"Vostok"}
+],
+
+"Asia": [
+ {"cc":"YE", "offset":"+03:00,+03:00", "city":"Aden"},
+ {"cc":"KZ", "offset":"+06:00,+06:00", "city":"Almaty"},
+ {"cc":"JO", "offset":"+02:00,+03:00", "city":"Amman"},
+ {"cc":"RU", "offset":"+12:00,+12:00", "city":"Anadyr"},
+ {"cc":"KZ", "offset":"+05:00,+05:00", "city":"Aqtau"},
+ {"cc":"KZ", "offset":"+05:00,+05:00", "city":"Aqtobe"},
+ {"cc":"TM", "offset":"+05:00,+05:00", "city":"Ashgabat"},
+ {"cc":"TM", "offset":"+05:00,+05:00", "city":"Ashkhabad", "id":"Asia/Ashgabat"},
+ {"cc":"IQ", "offset":"+03:00,+03:00", "city":"Baghdad"},
+ {"cc":"BH", "offset":"+03:00,+03:00", "city":"Bahrain"},
+ {"cc":"AZ", "offset":"+04:00,+05:00", "city":"Baku"},
+ {"cc":"TH", "offset":"+07:00,+07:00", "city":"Bangkok"},
+ {"cc":"LB", "offset":"+02:00,+03:00", "city":"Beirut"},
+ {"cc":"KG", "offset":"+06:00,+06:00", "city":"Bishkek"},
+ {"cc":"BN", "offset":"+08:00,+08:00", "city":"Brunei"},
+ {"cc":"IN", "offset":"+05:30,+05:30", "city":"Calcutta", "id":"Asia/Kolkata"},
+ {"cc":"MN", "offset":"+08:00,+08:00", "city":"Choibalsan"},
+ {"cc":"CN", "offset":"+08:00,+08:00", "city":"Chongqing"},
+ {"cc":"CN", "offset":"+08:00,+08:00", "city":"Chungking", "id":"Asia/Chongqing"},
+ {"cc":"LK", "offset":"+05:30,+05:30", "city":"Colombo"},
+ {"cc":"BD", "offset":"+06:00,+06:00", "city":"Dacca", "id":"Asia/Dhaka"},
+ {"cc":"SY", "offset":"+02:00,+03:00", "city":"Damascus"},
+ {"cc":"BD", "offset":"+06:00,+06:00", "city":"Dhaka"},
+ {"cc":"TL", "offset":"+09:00,+09:00", "city":"Dili"},
+ {"cc":"AE", "offset":"+04:00,+04:00", "city":"Dubai"},
+ {"cc":"TJ", "offset":"+05:00,+05:00", "city":"Dushanbe"},
+ {"cc":"PS", "offset":"+02:00,+03:00", "city":"Gaza"},
+ {"cc":"CN", "offset":"+08:00,+08:00", "city":"Harbin"},
+ {"cc":"PS", "offset":"+02:00,+03:00", "city":"Hebron"},
+ {"cc":"VN", "offset":"+07:00,+07:00", "city":"Ho_Chi_Minh"},
+ {"cc":"HK", "offset":"+08:00,+08:00", "city":"Hong_Kong"},
+ {"cc":"MN", "offset":"+07:00,+07:00", "city":"Hovd"},
+ {"cc":"RU", "offset":"+09:00,+09:00", "city":"Irkutsk"},
+ {"cc":"TR", "offset":"+02:00,+03:00", "city":"Istanbul", "id":"Europe/Istanbul"},
+ {"cc":"ID", "offset":"+07:00,+07:00", "city":"Jakarta"},
+ {"cc":"ID", "offset":"+09:00,+09:00", "city":"Jayapura"},
+ {"cc":"IL", "offset":"+02:00,+03:00", "city":"Jerusalem"},
+ {"cc":"AF", "offset":"+04:30,+04:30", "city":"Kabul"},
+ {"cc":"RU", "offset":"+12:00,+12:00", "city":"Kamchatka"},
+ {"cc":"PK", "offset":"+05:00,+05:00", "city":"Karachi"},
+ {"cc":"CN", "offset":"+08:00,+08:00", "city":"Kashgar"},
+ {"cc":"NP", "offset":"+05:45,+05:45", "city":"Kathmandu"},
+ {"cc":"NP", "offset":"+05:45,+05:45", "city":"Katmandu", "id":"Asia/Kathmandu"},
+ {"cc":"IN", "offset":"+05:30,+05:30", "city":"Kolkata"},
+ {"cc":"RU", "offset":"+08:00,+08:00", "city":"Krasnoyarsk"},
+ {"cc":"MY", "offset":"+08:00,+08:00", "city":"Kuala_Lumpur"},
+ {"cc":"MY", "offset":"+08:00,+08:00", "city":"Kuching"},
+ {"cc":"KW", "offset":"+03:00,+03:00", "city":"Kuwait"},
+ {"cc":"MO", "offset":"+08:00,+08:00", "city":"Macao", "id":"Asia/Macau"},
+ {"cc":"MO", "offset":"+08:00,+08:00", "city":"Macau"},
+ {"cc":"RU", "offset":"+12:00,+12:00", "city":"Magadan"},
+ {"cc":"ID", "offset":"+08:00,+08:00", "city":"Makassar"},
+ {"cc":"PH", "offset":"+08:00,+08:00", "city":"Manila"},
+ {"cc":"OM", "offset":"+04:00,+04:00", "city":"Muscat"},
+ {"cc":"CY", "offset":"+02:00,+03:00", "city":"Nicosia"},
+ {"cc":"RU", "offset":"+07:00,+07:00", "city":"Novokuznetsk"},
+ {"cc":"RU", "offset":"+07:00,+07:00", "city":"Novosibirsk"},
+ {"cc":"RU", "offset":"+07:00,+07:00", "city":"Omsk"},
+ {"cc":"KZ", "offset":"+05:00,+05:00", "city":"Oral"},
+ {"cc":"KH", "offset":"+07:00,+07:00", "city":"Phnom_Penh"},
+ {"cc":"ID", "offset":"+07:00,+07:00", "city":"Pontianak"},
+ {"cc":"KP", "offset":"+09:00,+09:00", "city":"Pyongyang"},
+ {"cc":"QA", "offset":"+03:00,+03:00", "city":"Qatar"},
+ {"cc":"KZ", "offset":"+06:00,+06:00", "city":"Qyzylorda"},
+ {"cc":"MM", "offset":"+06:30,+06:30", "city":"Rangoon"},
+ {"cc":"SA", "offset":"+03:00,+03:00", "city":"Riyadh"},
+ {"cc":"VN", "offset":"+07:00,+07:00", "city":"Saigon", "id":"Asia/Ho_Chi_Minh"},
+ {"cc":"RU", "offset":"+11:00,+11:00", "city":"Sakhalin"},
+ {"cc":"UZ", "offset":"+05:00,+05:00", "city":"Samarkand"},
+ {"cc":"KR", "offset":"+09:00,+09:00", "city":"Seoul"},
+ {"cc":"CN", "offset":"+08:00,+08:00", "city":"Shanghai"},
+ {"cc":"SG", "offset":"+08:00,+08:00", "city":"Singapore"},
+ {"cc":"TW", "offset":"+08:00,+08:00", "city":"Taipei"},
+ {"cc":"UZ", "offset":"+05:00,+05:00", "city":"Tashkent"},
+ {"cc":"GE", "offset":"+04:00,+04:00", "city":"Tbilisi"},
+ {"cc":"IR", "offset":"+03:30,+04:30", "city":"Tehran"},
+ {"cc":"IL", "offset":"+02:00,+03:00", "city":"Tel_Aviv", "id":"Asia/Jerusalem"},
+ {"cc":"BT", "offset":"+06:00,+06:00", "city":"Thimbu", "id":"Asia/Thimphu"},
+ {"cc":"BT", "offset":"+06:00,+06:00", "city":"Thimphu"},
+ {"cc":"JP", "offset":"+09:00,+09:00", "city":"Tokyo"},
+ {"cc":"ID", "offset":"+08:00,+08:00", "city":"Ujung_Pandang", "id":"Asia/Makassar"},
+ {"cc":"MN", "offset":"+08:00,+08:00", "city":"Ulaanbaatar"},
+ {"cc":"MN", "offset":"+08:00,+08:00", "city":"Ulan_Bator", "id":"Asia/Ulaanbaatar"},
+ {"cc":"CN", "offset":"+08:00,+08:00", "city":"Urumqi"},
+ {"cc":"LA", "offset":"+07:00,+07:00", "city":"Vientiane"},
+ {"cc":"RU", "offset":"+11:00,+11:00", "city":"Vladivostok"},
+ {"cc":"RU", "offset":"+10:00,+10:00", "city":"Yakutsk"},
+ {"cc":"RU", "offset":"+06:00,+06:00", "city":"Yekaterinburg"},
+ {"cc":"AM", "offset":"+04:00,+04:00", "city":"Yerevan"}
+],
+
+"Atlantic": [
+ {"cc":"PT", "offset":"-01:00,+00:00", "city":"Azores"},
+ {"cc":"BM", "offset":"-04:00,-03:00", "city":"Bermuda"},
+ {"cc":"ES", "offset":"+00:00,+01:00", "city":"Canary"},
+ {"cc":"CV", "offset":"-01:00,-01:00", "city":"Cape_Verde"},
+ {"cc":"FO", "offset":"+00:00,+01:00", "city":"Faeroe", "id":"Atlantic/Faroe"},
+ {"cc":"FO", "offset":"+00:00,+01:00", "city":"Faroe"},
+ {"cc":"NO", "offset":"+01:00,+02:00", "city":"Jan_Mayen", "id":"Europe/Oslo"},
+ {"cc":"PT", "offset":"+00:00,+01:00", "city":"Madeira"},
+ {"cc":"IS", "offset":"+00:00,+00:00", "city":"Reykjavik"},
+ {"cc":"GS", "offset":"-02:00,-02:00", "city":"South_Georgia"},
+ {"cc":"SH", "offset":"+00:00,+00:00", "city":"St_Helena"},
+ {"cc":"FK", "offset":"-03:00,-03:00", "city":"Stanley"}
+],
+
+"Australia": [
+ {"cc":"AU", "offset":"+09:30,+10:30", "city":"Adelaide"},
+ {"cc":"AU", "offset":"+10:00,+10:00", "city":"Brisbane"},
+ {"cc":"AU", "offset":"+09:30,+10:30", "city":"Broken_Hill"},
+ {"cc":"AU", "offset":"+10:00,+11:00", "city":"Currie"},
+ {"cc":"AU", "offset":"+09:30,+09:30", "city":"Darwin"},
+ {"cc":"AU", "offset":"+08:45,+08:45", "city":"Eucla"},
+ {"cc":"AU", "offset":"+10:00,+11:00", "city":"Hobart"},
+ {"cc":"AU", "offset":"+10:00,+10:00", "city":"Lindeman"},
+ {"cc":"AU", "offset":"+10:30,+11:00", "city":"Lord_Howe"},
+ {"cc":"AU", "offset":"+10:00,+11:00", "city":"Melbourne"},
+ {"cc":"AU", "offset":"+08:00,+08:00", "city":"Perth"},
+ {"cc":"AU", "offset":"+10:00,+11:00", "city":"Sydney"}
+],
+
+"Europe": [
+ {"cc":"NL", "offset":"+01:00,+02:00", "city":"Amsterdam"},
+ {"cc":"AD", "offset":"+01:00,+02:00", "city":"Andorra"},
+ {"cc":"GR", "offset":"+02:00,+03:00", "city":"Athens"},
+ {"cc":"GB", "offset":"+00:00,+01:00", "city":"Belfast", "id":"Europe/London"},
+ {"cc":"RS", "offset":"+01:00,+02:00", "city":"Belgrade"},
+ {"cc":"DE", "offset":"+01:00,+02:00", "city":"Berlin"},
+ {"cc":"SK", "offset":"+01:00,+02:00", "city":"Bratislava", "id":"Europe/Prague"},
+ {"cc":"BE", "offset":"+01:00,+02:00", "city":"Brussels"},
+ {"cc":"RO", "offset":"+02:00,+03:00", "city":"Bucharest"},
+ {"cc":"HU", "offset":"+01:00,+02:00", "city":"Budapest"},
+ {"cc":"MD", "offset":"+02:00,+03:00", "city":"Chisinau"},
+ {"cc":"DK", "offset":"+01:00,+02:00", "city":"Copenhagen"},
+ {"cc":"IE", "offset":"+00:00,+01:00", "city":"Dublin"},
+ {"cc":"GI", "offset":"+01:00,+02:00", "city":"Gibraltar"},
+ {"cc":"GG", "offset":"+00:00,+01:00", "city":"Guernsey", "id":"Europe/London"},
+ {"cc":"FI", "offset":"+02:00,+03:00", "city":"Helsinki"},
+ {"cc":"IM", "offset":"+00:00,+01:00", "city":"Isle_of_Man", "id":"Europe/London"},
+ {"cc":"TR", "offset":"+02:00,+03:00", "city":"Istanbul"},
+ {"cc":"JE", "offset":"+00:00,+01:00", "city":"Jersey", "id":"Europe/London"},
+ {"cc":"RU", "offset":"+03:00,+03:00", "city":"Kaliningrad"},
+ {"cc":"UA", "offset":"+02:00,+03:00", "city":"Kiev"},
+ {"cc":"PT", "offset":"+00:00,+01:00", "city":"Lisbon"},
+ {"cc":"SI", "offset":"+01:00,+02:00", "city":"Ljubljana", "id":"Europe/Belgrade"},
+ {"cc":"GB", "offset":"+00:00,+01:00", "city":"London"},
+ {"cc":"LU", "offset":"+01:00,+02:00", "city":"Luxembourg"},
+ {"cc":"ES", "offset":"+01:00,+02:00", "city":"Madrid"},
+ {"cc":"MT", "offset":"+01:00,+02:00", "city":"Malta"},
+ {"cc":"AX", "offset":"+02:00,+03:00", "city":"Mariehamn", "id":"Europe/Helsinki"},
+ {"cc":"BY", "offset":"+03:00,+03:00", "city":"Minsk"},
+ {"cc":"MC", "offset":"+01:00,+02:00", "city":"Monaco"},
+ {"cc":"RU", "offset":"+04:00,+04:00", "city":"Moscow"},
+ {"cc":"CY", "offset":"+02:00,+03:00", "city":"Nicosia", "id":"Asia/Nicosia"},
+ {"cc":"NO", "offset":"+01:00,+02:00", "city":"Oslo"},
+ {"cc":"FR", "offset":"+01:00,+02:00", "city":"Paris"},
+ {"cc":"ME", "offset":"+01:00,+02:00", "city":"Podgorica", "id":"Europe/Belgrade"},
+ {"cc":"CZ", "offset":"+01:00,+02:00", "city":"Prague"},
+ {"cc":"LV", "offset":"+02:00,+03:00", "city":"Riga"},
+ {"cc":"IT", "offset":"+01:00,+02:00", "city":"Rome"},
+ {"cc":"RU", "offset":"+04:00,+04:00", "city":"Samara"},
+ {"cc":"SM", "offset":"+01:00,+02:00", "city":"San_Marino", "id":"Europe/Rome"},
+ {"cc":"BA", "offset":"+01:00,+02:00", "city":"Sarajevo", "id":"Europe/Belgrade"},
+ {"cc":"UA", "offset":"+02:00,+03:00", "city":"Simferopol"},
+ {"cc":"MK", "offset":"+01:00,+02:00", "city":"Skopje", "id":"Europe/Belgrade"},
+ {"cc":"BG", "offset":"+02:00,+03:00", "city":"Sofia"},
+ {"cc":"SE", "offset":"+01:00,+02:00", "city":"Stockholm"},
+ {"cc":"EE", "offset":"+02:00,+03:00", "city":"Tallinn"},
+ {"cc":"AL", "offset":"+01:00,+02:00", "city":"Tirane"},
+ {"cc":"MD", "offset":"+02:00,+03:00", "city":"Tiraspol", "id":"Europe/Chisinau"},
+ {"cc":"UA", "offset":"+02:00,+03:00", "city":"Uzhgorod"},
+ {"cc":"LI", "offset":"+01:00,+02:00", "city":"Vaduz"},
+ {"cc":"VA", "offset":"+01:00,+02:00", "city":"Vatican", "id":"Europe/Rome"},
+ {"cc":"AT", "offset":"+01:00,+02:00", "city":"Vienna"},
+ {"cc":"LT", "offset":"+02:00,+03:00", "city":"Vilnius"},
+ {"cc":"RU", "offset":"+04:00,+04:00", "city":"Volgograd"},
+ {"cc":"PL", "offset":"+01:00,+02:00", "city":"Warsaw"},
+ {"cc":"HR", "offset":"+01:00,+02:00", "city":"Zagreb", "id":"Europe/Belgrade"},
+ {"cc":"UA", "offset":"+02:00,+03:00", "city":"Zaporozhye"},
+ {"cc":"CH", "offset":"+01:00,+02:00", "city":"Zurich"}
+],
+
+"Indian": [
+ {"cc":"MG", "offset":"+03:00,+03:00", "city":"Antananarivo"},
+ {"cc":"IO", "offset":"+06:00,+06:00", "city":"Chagos"},
+ {"cc":"CX", "offset":"+07:00,+07:00", "city":"Christmas"},
+ {"cc":"CC", "offset":"+06:30,+06:30", "city":"Cocos"},
+ {"cc":"KM", "offset":"+03:00,+03:00", "city":"Comoro"},
+ {"cc":"TF", "offset":"+05:00,+05:00", "city":"Kerguelen"},
+ {"cc":"SC", "offset":"+04:00,+04:00", "city":"Mahe"},
+ {"cc":"MV", "offset":"+05:00,+05:00", "city":"Maldives"},
+ {"cc":"MU", "offset":"+04:00,+04:00", "city":"Mauritius"},
+ {"cc":"YT", "offset":"+03:00,+03:00", "city":"Mayotte"},
+ {"cc":"RE", "offset":"+04:00,+04:00", "city":"Reunion"}
+],
+
+"Pacific": [
+ {"cc":"WS", "offset":"+13:00,+14:00", "city":"Apia"},
+ {"cc":"NZ", "offset":"+12:00,+13:00", "city":"Auckland"},
+ {"cc":"NZ", "offset":"+12:45,+13:45", "city":"Chatham"},
+ {"cc":"FM", "offset":"+10:00,+10:00", "city":"Chuuk"},
+ {"cc":"CL", "offset":"-06:00,-05:00", "city":"Easter"},
+ {"cc":"VU", "offset":"+11:00,+11:00", "city":"Efate"},
+ {"cc":"KI", "offset":"+13:00,+13:00", "city":"Enderbury"},
+ {"cc":"TK", "offset":"+13:00,+13:00", "city":"Fakaofo"},
+ {"cc":"FJ", "offset":"+12:00,+13:00", "city":"Fiji"},
+ {"cc":"TV", "offset":"+12:00,+12:00", "city":"Funafuti"},
+ {"cc":"EC", "offset":"-06:00,-06:00", "city":"Galapagos"},
+ {"cc":"PF", "offset":"-09:00,-09:00", "city":"Gambier"},
+ {"cc":"SB", "offset":"+11:00,+11:00", "city":"Guadalcanal"},
+ {"cc":"GU", "offset":"+10:00,+10:00", "city":"Guam"},
+ {"cc":"US", "offset":"-10:00,-10:00", "city":"Honolulu"},
+ {"cc":"UM", "offset":"-10:00,-10:00", "city":"Johnston"},
+ {"cc":"KI", "offset":"+14:00,+14:00", "city":"Kiritimati"},
+ {"cc":"FM", "offset":"+11:00,+11:00", "city":"Kosrae"},
+ {"cc":"MH", "offset":"+12:00,+12:00", "city":"Kwajalein"},
+ {"cc":"MH", "offset":"+12:00,+12:00", "city":"Majuro"},
+ {"cc":"PF", "offset":"-09:30,-09:30", "city":"Marquesas"},
+ {"cc":"UM", "offset":"-11:00,-11:00", "city":"Midway"},
+ {"cc":"NR", "offset":"+12:00,+12:00", "city":"Nauru"},
+ {"cc":"NU", "offset":"-11:00,-11:00", "city":"Niue"},
+ {"cc":"NF", "offset":"+11:30,+11:30", "city":"Norfolk"},
+ {"cc":"NC", "offset":"+11:00,+11:00", "city":"Noumea"},
+ {"cc":"AS", "offset":"-11:00,-11:00", "city":"Pago_Pago"},
+ {"cc":"PW", "offset":"+09:00,+09:00", "city":"Palau"},
+ {"cc":"PN", "offset":"-08:00,-08:00", "city":"Pitcairn"},
+ {"cc":"FM", "offset":"+11:00,+11:00", "city":"Pohnpei"},
+ {"cc":"FM", "offset":"+11:00,+11:00", "city":"Ponape", "id":"Pacific/Pohnpei"},
+ {"cc":"PG", "offset":"+10:00,+10:00", "city":"Port_Moresby"},
+ {"cc":"CK", "offset":"-10:00,-10:00", "city":"Rarotonga"},
+ {"cc":"MP", "offset":"+10:00,+10:00", "city":"Saipan"},
+ {"cc":"AS", "offset":"-11:00,-11:00", "city":"Samoa", "id":"Pacific/Pago_Pago"},
+ {"cc":"PF", "offset":"-10:00,-10:00", "city":"Tahiti"},
+ {"cc":"KI", "offset":"+12:00,+12:00", "city":"Tarawa"},
+ {"cc":"TO", "offset":"+13:00,+13:00", "city":"Tongatapu"},
+ {"cc":"FM", "offset":"+10:00,+10:00", "city":"Truk", "id":"Pacific/Chuuk"},
+ {"cc":"UM", "offset":"+12:00,+12:00", "city":"Wake"},
+ {"cc":"WF", "offset":"+12:00,+12:00", "city":"Wallis"},
+ {"cc":"FM", "offset":"+10:00,+10:00", "city":"Yap", "id":"Pacific/Chuuk"}
+]
+
+}
diff --git a/shared/style/README.md b/shared/style/README.md
new file mode 100644
index 0000000..2bc5276
--- /dev/null
+++ b/shared/style/README.md
@@ -0,0 +1,118 @@
+Building Blocks
+===============
+
+Taxonomy
+--------
+
+* `action_menu.css`: context menus
+* `buttons.css`: common buttons
+* `confirm.css`: dialog boxes with message + accept/dismiss buttons
+* `edit_mode.css`: edition panels with a dialog-like button toolbar
+* `headers.css`: common header bars (title + navigation buttons)
+* `input_areas.css`: common input areas (e.g. search bars)
+* `status.css`: notification toasters
+* `switches.css`: checkboxes, radio buttons, ON/OFF switches
+
+
+Specific Attributes
+-------------------
+
+A `data-type` attribute is used when the `type` and `role` attributes are not specific enough. Here’s the list of its possible values.
+
+* `action`: used in `action_menu.css`, title + action selection + accept/dismiss buttons
+* `confirm`: used in `confirm.css`, message + accept/dismiss buttons
+* `edit`: used in `edit_mode.css`, edition panel with dialog-like button toolbar
+* `object`: used in `action_menu.css`, action selection + accept/dismiss buttons
+* `switch`: used in `switches.css`, turns a checkbox into an ON/OFF switch
+
+
+Class Name Usage
+----------------
+
+We try to avoid arbitrary class names as much as possible, but sometimes we have to use some — here’s the list.
+
+### Common Class Names
+
+**Icons**
+
+* `.icon`
+* `.icon-add`
+* `.icon-back`
+* `.icon-close`
+* `.icon-dialog`
+* `.icon-edit`
+* `.icon-menu`
+* `.icon-user`
+* `.icon-view`
+
+**Skins**
+
+* `.skin-dark`
+* `.skin-organic`
+
+**Buttons**
+
+* `.danger`: dangerous choice, e.g. delete something
+* `.recommend`: default/recommended choice, should be safe
+
+**Other**
+
+* `.action`: applies to fieldset elements (explanation needed)
+* `.bottom`: bottom-positioned element, applies to search forms
+* `.compact`: compact list, applies to button lists
+* `.full`: full-width element, applies to buttons or search forms
+
+### Usage by Block
+
+**action_menu.css**
+
+None
+
+**buttons.css**
+
+* `.compact`
+* `.danger`
+* `.icon-dialog`
+* `.icon-view`
+* `.recommend`
+
+**confirm.css**
+
+* `.full`
+
+**edit_mode.css**
+
+* `.danger`
+* `.full`
+* `.icon`
+* `.recommend`
+
+**headers.css**
+
+* `.icon`
+* `.icon-add`
+* `.icon-edit`
+* `.icon-close`
+* `.icon-back`
+* `.icon-menu`
+* `.icon-user`
+* `.skin-dark`
+* `.skin-organic`
+
+**input_areas.css**
+
+* `.action` (explanation needed)
+* `.bottom`
+* `.full`
+
+**status.css**
+
+None
+
+**switches.css**
+
+* `.danger`
+
+Future improves
+----------------
+* Use `[data-icon="name"]` instead of `.icon.icon-name` \ No newline at end of file
diff --git a/shared/style/action_menu.css b/shared/style/action_menu.css
new file mode 100644
index 0000000..4d01649
--- /dev/null
+++ b/shared/style/action_menu.css
@@ -0,0 +1,151 @@
+/* ----------------------------------
+ * Action menu
+ * ---------------------------------- */
+
+/* Main dialog setup */
+form[role="dialog"][data-type="action"],
+form[role="dialog"][data-type="object"] {
+ background:
+ url(action_menu/images/ui/pattern.png) repeat left top,
+ url(action_menu/images/ui/gradient.png) no-repeat left top / 100% 100%;
+ overflow: hidden;
+ position: fixed;
+ z-index: 100;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ padding: 0 0 7rem;
+ font-family: "MozTT", Sans-serif;
+ /**
+ * Using "font-size: 0" to avoid the unwanted visual space (about 3px) created
+ * by white spaces and line breaks in the code between inline-block elements.
+ */
+ font-size: 0;
+ color: #fff;
+}
+
+form[role="dialog"][data-type="action"]:before,
+form[role="dialog"][data-type="object"]:before {
+ content: '';
+ display: inline-block;
+ vertical-align: top;
+ width: 1px;
+ height: 100%;
+ margin-left: -1px;
+}
+
+form[role="dialog"][data-type="action"] > header:first-child,
+form[role="dialog"][data-type="object"] > header:first-child {
+ -moz-box-sizing: padding-box;
+ width: 100%;
+ display: inline-block;
+ vertical-align: top;
+ white-space: normal;
+ font: 1.6rem/1em 'MozTT', Sans-serif;
+ color: #fff;
+ border-bottom: 0.1rem solid #616262;
+ background: url(action_menu/images/ui/alpha.png) repeat 0 0;
+ padding: 2rem 3rem 0 3rem;
+ height: 5rem;
+ -moz-box-sizing: border-box;
+}
+
+form[role="dialog"][data-type="action"] > header:after,
+form[role="dialog"][data-type="object"] > header:after {
+ content: '';
+ position: absolute;
+ width: 100%;
+ background: #222323;
+ height: 0.1rem;
+ left: 0;
+ top: 5rem;
+}
+
+/* Specific component code */
+form[role="dialog"][data-type="action"] > menu,
+form[role="dialog"][data-type="object"] > menu {
+ margin: 0;
+ padding: 0;
+ width: auto;
+ border: none;
+ background: none;
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+}
+
+form[role="dialog"][data-type="action"] > menu > button,
+form[role="dialog"][data-type="object"] > menu > button {
+ width: calc(100% - 3rem);
+ height: 4rem;
+ -moz-box-sizing: border-box;
+ vertical-align: middle;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ font-family: 'MozTT', Sans-serif;
+ font-weight: normal;
+ line-height: 4rem;
+ outline: none;
+ font-size: 1.4rem;
+ color: #fff;
+ text-shadow: none;
+ text-align: left;
+ padding: 0 1rem;
+ margin: 0 1.5rem 1rem 1.5rem;
+ background: #5f5f5f padding-box;
+ border-radius: 0.2rem;
+ border: none;
+}
+
+form[role="dialog"][data-type="action"] > menu > button:last-child,
+form[role="dialog"][data-type="object"] > menu > button:last-child {
+ text-shadow: 0.1rem 0.1rem 0 rgba(255,255,255,0.3);
+ color: #333;
+ font-weight: 500;
+ background: #fafafa url(buttons/images/ui/default.png) repeat-x left bottom;
+ border: solid 0.1rem #a6a6a6;
+ margin: 2.5rem 1.5rem 1.5rem 1.5rem;
+ text-align: center;
+ font-size: 1.6rem;
+}
+
+form[role="dialog"][data-type="action"] > menu > button:last-child:before,
+form[role="dialog"][data-type="object"] > menu > button:last-child:before {
+ content: '';
+ position: absolute;
+ width: 100%;
+ background: url(action_menu/images/ui/pattern.png) repeat scroll left top #2D2D2D;
+ height: 7rem;
+ left: 0;
+ bottom: 0;
+ z-index: -1;
+ border-top: 0.1rem solid rgba(255, 255, 255, 0.1);
+}
+
+/* Press state */
+form[role="dialog"][data-type="action"] > menu > button:active,
+form[role="dialog"][data-type="object"] > menu > button:active {
+ background-color: #006f86;
+ color: #333;
+ text-shadow: 0 0.1rem 0 rgba(255, 255, 255, 0.25);
+}
+
+form[role="dialog"][data-type="action"] > menu > button:last-child:active,
+form[role="dialog"][data-type="object"] > menu > button:last-child:active {
+ border: solid 0.1rem #008aaa;
+ background: #008aaa;
+ color: #333;
+}
+
+/* Disabled */
+form[role="dialog"][data-type="action"] > menu > button[disabled],
+form[role="dialog"][data-type="object"] > menu > button[disabled] {
+ background: #4d4d4d;
+ color: #333;
+ text-shadow: none;
+ border: none;
+ pointer-events: none;
+}
diff --git a/shared/style/action_menu/images/ui/alpha.png b/shared/style/action_menu/images/ui/alpha.png
new file mode 100644
index 0000000..d7d89aa
--- /dev/null
+++ b/shared/style/action_menu/images/ui/alpha.png
Binary files differ
diff --git a/shared/style/action_menu/images/ui/default.png b/shared/style/action_menu/images/ui/default.png
new file mode 100644
index 0000000..2ff298a
--- /dev/null
+++ b/shared/style/action_menu/images/ui/default.png
Binary files differ
diff --git a/apps/system/camera/style/images/ui/gradient.png b/shared/style/action_menu/images/ui/gradient.png
index b288545..b288545 100644
--- a/apps/system/camera/style/images/ui/gradient.png
+++ b/shared/style/action_menu/images/ui/gradient.png
Binary files differ
diff --git a/apps/system/camera/style/images/ui/pattern.png b/shared/style/action_menu/images/ui/pattern.png
index af03f56..af03f56 100644
--- a/apps/system/camera/style/images/ui/pattern.png
+++ b/shared/style/action_menu/images/ui/pattern.png
Binary files differ
diff --git a/shared/style/action_menu/index.html b/shared/style/action_menu/index.html
new file mode 100644
index 0000000..270d07a
--- /dev/null
+++ b/shared/style/action_menu/index.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Action menu</title>
+ <meta name="description" content="Presenting a list of actions related to the App content">
+
+ <link rel="stylesheet" href="../action_menu.css">
+ <!--
+ - This <style> element is only used for the example code;
+ - it is not required for the real use case.
+ -->
+ <style type="text/css">
+ html, body {
+ margin: 0;
+ padding: 0;
+ font-size: 10px;
+ background-color: #fff;
+ }
+ body {
+ background: none;
+ }
+ </style>
+</head>
+<body role="application">
+
+ <form role="dialog" data-type="action" onsubmit="return false;">
+ <header> Title </header> <!-- this header is optional -->
+ <menu>
+ <button> Action 1 </button>
+ <button disabled> Action 2 (disabled) </button>
+ <button> Action 3 </button>
+ <button> Cancel </button>
+ </menu>
+ </form>
+
+</body>
+</html>
+
diff --git a/shared/style/buttons.css b/shared/style/buttons.css
new file mode 100644
index 0000000..6c7eec9
--- /dev/null
+++ b/shared/style/buttons.css
@@ -0,0 +1,230 @@
+/* ----------------------------------
+ * Buttons
+ * ---------------------------------- */
+
+a[role="button"]::-moz-focus-inner,
+button::-moz-focus-inner {
+ border: none;
+ outline: none;
+}
+
+button,
+a[role="button"] {
+ width: 100%;
+ height: 3.8rem;
+ margin: 0 0 1rem;
+ padding: 0 1.5rem;
+ -moz-box-sizing: border-box;
+ display: inline-block;
+ vertical-align: middle;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ background: #fafafa url(buttons/images/ui/default.png) repeat-x left bottom;
+ border: 0.1rem solid #a6a6a6;
+ border-radius: 0.2rem;
+ font: 500 1.6rem/3.8rem 'MozTT', Sans-serif;
+ color: #333;
+ text-align: center;
+ text-shadow: 0.1rem 0.1rem 0 rgba(255,255,255,0.3);
+ text-decoration: none;
+ outline: none;
+}
+
+/* Press (default & recommend) */
+button:active,
+a[role="button"]:active,
+button.recommend:active,
+a.recommend[role="button"]:active {
+ border-color: #008aaa;
+ background: #008aaa;
+ color: #333;
+}
+
+/* Recommend */
+button.recommend,
+a[role="button"].recommend {
+ background-image: url(buttons/images/ui/recommend.png);
+ background-color: #00caf2;
+ border-color: #008eab;
+}
+
+/* Danger */
+button.danger,
+a.danger[role="button"] {
+ background-image: url(buttons/images/ui/danger.png);
+ background-color: #b70404;
+ color: #fff;
+ text-shadow: none;
+ border-color: #820000;
+}
+
+/* Danger Press */
+button.danger:active,
+a[role="button"].danger:active {
+ background-image: url(buttons/images/ui/danger-press.png);
+ background-color: #890707;
+}
+
+/* Disabled (default & recommend) */
+button[disabled],
+a[role="button"][aria-disabled="true"],
+button[disabled].recommend,
+a[role="button"][aria-disabled="true"].recommend {
+ background: #e7e7e7;
+ border-color: #c7c7c7;
+ color: #c7c7c7;
+ text-shadow: none;
+ pointer-events: none;
+}
+
+/* Danger disabled */
+button[disabled].danger,
+a[role="button"][aria-disabled="true"].danger {
+ background: #c68484;
+ border-color: #a56464;
+ color: #a56464;
+ text-shadow: none;
+ pointer-events: none;
+}
+
+/* Disabled with dark background */
+.dark button[disabled],
+.dark a[role="button"][aria-disabled="true"] {
+ background: #5f5f5f;
+ color: #4d4d4d;
+ border-color: #4d4d4d;
+ text-shadow: none;
+ pointer-events: none;
+}
+
+
+/* ----------------------------------
+ * Buttons inside lists
+ * ---------------------------------- */
+
+li button,
+li a[role="button"] {
+ position: relative;
+ background: #e7e7e7;
+ text-align: left;
+ /* For hacking box-shadows we need overflow:visible; so we lose text-overflows...*/
+ white-space: normal;
+ overflow: visible;
+}
+
+/* Hacking box-shadow */
+li button:after,
+li a[role="button"]:after {
+ content: "";
+ position: absolute;
+ bottom: -0.3rem;
+ left: 0;
+ right: 0;
+ height: 0.2rem;
+ background: url( buttons/images/ui/shadow.png) repeat-x left bottom;
+}
+
+/* Press */
+li a[role="button"]:active:after,
+li button:active:after {
+ opacity: 0;
+}
+
+/* Disabled */
+li button[disabled]:after,
+li a[role="button"][aria-disabled="true"]:after {
+ background: none;
+}
+
+/* Icons */
+li button.icon,
+li a[role="button"].icon {
+ padding-right: 3rem;
+}
+
+li button.icon:before,
+li a[role="button"].icon:before {
+ content: "";
+ width: 3rem;
+ height: 3rem;
+ position: absolute;
+ top: 50%;
+ right: 0;
+ margin-top: -1.5rem;
+ background: transparent no-repeat center center / 100% auto;
+ pointer-events: none;
+}
+
+li button.icon-view:before,
+li a[role="button"].icon-view:before {
+ background: url(buttons/images/icons/view.png) no-repeat 1.6rem 0 / 1rem 9rem;
+}
+
+li button.icon-view:active:before,
+li a[role="button"].icon-view:active:before {
+ background-position: 1.6rem -3rem;
+}
+
+li button.icon-view:disabled:before,
+li a[role="button"][aria-disabled="true"].icon-view:before {
+ background-position: 1.6rem -6rem;
+}
+
+li button.icon-dialog:before,
+li a[role="button"].icon-dialog:before {
+ background: url(buttons/images/icons/dialog.png) no-repeat 1.6rem 0 / 1rem 9rem;
+ top: 100%;
+ margin-top: -2.4rem;
+}
+
+li button.icon-dialog:active:before,
+li a[role="button"].icon-dialog:active:before {
+ background-position: 1.6rem -3rem;
+}
+
+li button.icon-dialog:disabled:before,
+li a[role="button"][aria-disabled="true"].icon-dialog:before {
+ background-position: 1.6rem -6rem;
+}
+
+
+/* ----------------------------------
+ * Buttons inside lists, compact mode
+ * ---------------------------------- */
+
+ul.compact,
+ol.compact {
+ margin-bottom: 1rem;
+}
+
+.compact > li button,
+.compact > li a[role="button"] {
+ margin: -0.1rem 0;
+ border-radius: 0;
+ background: #fff;
+}
+
+.compact > li:first-child button,
+.compact > li:first-child a[role="button"] {
+ border-radius: 0.3rem 0.3rem 0 0;
+}
+
+.compact > li:last-child button,
+.compact > li:last-child a[role="button"] {
+ border-radius: 0 0 0.3rem 0.3rem;
+}
+
+/* Pressed */
+.compact > li button:active,
+.compact > li a[role="button"]:active {
+ border-color: #008aaa;
+ background: #008aaa;
+}
+
+/* Disabled */
+.compact > li button[disabled],
+.compact > li a[role="button"][aria-disabled="true"] {
+ color: #a6a6a6;
+ border-color: #a6a6a6;
+} \ No newline at end of file
diff --git a/shared/style/buttons/images/icons/dialog.png b/shared/style/buttons/images/icons/dialog.png
new file mode 100644
index 0000000..6cda241
--- /dev/null
+++ b/shared/style/buttons/images/icons/dialog.png
Binary files differ
diff --git a/shared/style/buttons/images/icons/view.png b/shared/style/buttons/images/icons/view.png
new file mode 100644
index 0000000..de62f59
--- /dev/null
+++ b/shared/style/buttons/images/icons/view.png
Binary files differ
diff --git a/shared/style/buttons/images/ui/danger-disabled.png b/shared/style/buttons/images/ui/danger-disabled.png
new file mode 100644
index 0000000..2a14bfb
--- /dev/null
+++ b/shared/style/buttons/images/ui/danger-disabled.png
Binary files differ
diff --git a/shared/style/buttons/images/ui/danger-press.png b/shared/style/buttons/images/ui/danger-press.png
new file mode 100644
index 0000000..d7529b5
--- /dev/null
+++ b/shared/style/buttons/images/ui/danger-press.png
Binary files differ
diff --git a/shared/style/buttons/images/ui/danger.png b/shared/style/buttons/images/ui/danger.png
new file mode 100644
index 0000000..400e3ae
--- /dev/null
+++ b/shared/style/buttons/images/ui/danger.png
Binary files differ
diff --git a/shared/style/buttons/images/ui/default.png b/shared/style/buttons/images/ui/default.png
new file mode 100644
index 0000000..2ff298a
--- /dev/null
+++ b/shared/style/buttons/images/ui/default.png
Binary files differ
diff --git a/shared/style/buttons/images/ui/disabled.png b/shared/style/buttons/images/ui/disabled.png
new file mode 100644
index 0000000..2e97135
--- /dev/null
+++ b/shared/style/buttons/images/ui/disabled.png
Binary files differ
diff --git a/shared/style/buttons/images/ui/recommend.png b/shared/style/buttons/images/ui/recommend.png
new file mode 100644
index 0000000..42aed39
--- /dev/null
+++ b/shared/style/buttons/images/ui/recommend.png
Binary files differ
diff --git a/shared/style/buttons/images/ui/shadow.png b/shared/style/buttons/images/ui/shadow.png
new file mode 100644
index 0000000..acc799f
--- /dev/null
+++ b/shared/style/buttons/images/ui/shadow.png
Binary files differ
diff --git a/shared/style/buttons/index.html b/shared/style/buttons/index.html
new file mode 100644
index 0000000..c97cbd6
--- /dev/null
+++ b/shared/style/buttons/index.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+
+ <title>Buttons</title>
+ <meta name="description" content="You can use button tag or also anchor tag with role button">
+
+ <link rel="stylesheet" href="../buttons.css">
+
+ <!--
+ - This <style> and <link> is only used for the example preview,
+ - it isn't needed for the real use case.
+ -->
+ <style>
+ html, body {
+ margin: 0;
+ padding: 0;
+ font-size: 10px;
+ background-color: #fff;
+ }
+
+ h2.bb-docs {
+ font-size: 1.8rem;
+ font-family: "MozTT", Sans-serif;
+ font-weight: lighter;
+ color: #666;
+ margin: -0.1rem 0 0;
+ background-color: #f5f5f5;
+ padding: 0.4rem 0.4rem 0.4rem 3rem;
+ border: solid 0.1rem #e8e8e8;
+ }
+
+ div.bb-docs {
+ padding: 1rem;
+ }
+
+ div.bb-docs.dark {
+ background: #000;
+ }
+
+ ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ }
+
+ body[role="application"] > [role="region"] {
+ height: 100%;
+ position: relative;
+ }
+ </style>
+</head>
+<body role="application">
+ <h2 class="bb-docs">Normal</h2>
+ <div class="bb-docs">
+ <button>Default</button>
+ <button class="recommend">Recommend</button>
+ <button class="danger">Danger</button>
+ </div>
+
+ <h2 class="bb-docs">Disabled</h2>
+ <div class="bb-docs">
+ <button disabled>Default</button>
+ <a href="#" role="button" aria-disabled="true" class="recommend">Recommend</a>
+ <button disabled class="danger">Danger</button>
+ </div>
+
+ <h2 class="bb-docs">Disabled with dark background</h2>
+ <div class="bb-docs dark">
+ <button disabled>Default</button>
+ <a href="#" role="button" aria-disabled="true" class="recommend">Recommend</a>
+ <button disabled class="danger">Danger</button>
+ </div>
+
+ <h2 class="bb-docs">Button List </h2>
+ <div class="bb-docs">
+ <ul>
+ <li>
+ <button>Default</button>
+ </li>
+ <li>
+ <button disabled="disabled">Disabled</button>
+ </li>
+ <li>
+ <button class="icon icon-view">
+ View Name
+ </button>
+ </li>
+ <li>
+ <button disabled="disabled" class="icon icon-view">
+ View Name
+ </button>
+ </li>
+ <li>
+ <a role="button" class="icon icon-dialog">
+ Tuesday September 18, 2012
+ </a>
+ </li>
+ <li>
+ <a role="button" aria-disabled="true" class="icon icon-dialog">
+ Tuesday September 18, 2012
+ </a>
+ </li>
+ </ul>
+ </div>
+
+ <h2 class="bb-docs">Button list (compact mode)</h2>
+ <div class="bb-docs">
+ <ul class="compact">
+ <li><button>Action 1</button></li>
+ <li><button>Action 2</button></li>
+ <li><button disabled >Action 3 (disabled)</button></li>
+ <li><button>Action 4</button></li>
+ <li><button>Action 5</button></li>
+ <li>
+ <button>
+ <span class="end tick"></span>
+ Action 6
+ </button>
+ </li>
+ </ul>
+ </div>
+</body>
+</html>
+
diff --git a/shared/style/confirm.css b/shared/style/confirm.css
new file mode 100644
index 0000000..0acdca2
--- /dev/null
+++ b/shared/style/confirm.css
@@ -0,0 +1,184 @@
+/* ----------------------------------
+ * Confirm
+ * ---------------------------------- */
+
+/* Main dialog setup */
+form[role="dialog"][data-type="confirm"] {
+ background:
+ url(confirm/images/ui/pattern.png) repeat left top,
+ url(confirm/images/ui/gradient.png) no-repeat left top;
+ background-size: auto auto, 100% 100%;
+ /* We can't use shortand with background size because is not implemented yet:
+ https://bugzilla.mozilla.org/show_bug.cgi?id=570326; */
+ overflow: hidden;
+ position: absolute;
+ z-index: 100;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ padding: 1.5rem 0 7rem;
+ font-family: "MozTT", Sans-serif;
+ font-size: 0;
+ /* Using font-size: 0; we avoid the unwanted visual space (about 3px)
+ created by white-spaces and break lines in the code betewen inline-block elements */
+ color: #fff;
+ text-align: left;
+}
+
+form[role="dialog"][data-type="confirm"]:before {
+ content: "";
+ display: inline-block;
+ vertical-align: middle;
+ width: 1px;
+ height: 100%;
+ margin-left: -1px;
+}
+
+form[role="dialog"][data-type="confirm"] > section {
+ font-weight: lighter;
+ font-size: 2.2rem;
+ color: #FAFAFA;
+ padding: 0 2.5rem 0 2rem;
+ -moz-box-sizing: padding-box;
+ width: 100%;
+ display: inline-block;
+ overflow-y: scroll;
+ max-height: 100%;
+ vertical-align: middle;
+ white-space: normal;
+}
+
+form[role="dialog"][data-type="confirm"] h1 {
+ font-weight: normal;
+ font-size: 1.6rem;
+ line-height: 1em;
+ color: #fff;
+ margin: 0;
+ padding: 0;
+}
+
+/* Menu & buttons setup */
+form[role="dialog"][data-type="confirm"] menu {
+ white-space: nowrap;
+ margin: 0;
+ padding: 1.5rem;
+ border-top: solid 0.1rem rgba(255, 255, 255, 0.1);
+ background: #2d2d2d url(confirm/images/ui/pattern.png) repeat left top;
+ display: block;
+ overflow: hidden;
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+}
+
+form[role="dialog"][data-type="confirm"] menu button::-moz-focus-inner {
+ border: none;
+ outline: none;
+}
+form[role="dialog"][data-type="confirm"] menu button {
+ width: 100%;
+ height: 3.8rem;
+ margin: 0 0 1rem;
+ padding: 0 1.5rem;
+ -moz-box-sizing: border-box;
+ display: inline-block;
+ vertical-align: middle;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ background: #fafafa url(buttons/images/ui/default.png) repeat-x left bottom;
+ border: 0.1rem solid #a6a6a6;
+ border-radius: 0.3rem;
+ font: 500 1.6rem/3.8rem 'MozTT', Sans-serif;
+ color: #333;
+ text-align: center;
+ text-shadow: 0.1rem 0.1rem 0 rgba(255,255,255,0.3);
+ text-decoration: none;
+ outline: none;
+}
+
+/* Press (default & recommend) */
+form[role="dialog"][data-type="confirm"] menu button:active,
+form[role="dialog"][data-type="confirm"] menu button.recommend:active,
+a.recommend[role="button"]:active {
+ border-color: #008aaa;
+ background: #008aaa;
+ color: #333;
+}
+
+/* Recommend */
+form[role="dialog"][data-type="confirm"] menu button.recommend {
+ background-image: url(buttons/images/ui/recommend.png);
+ background-color: #00caf2;
+ border-color: #008eab;
+}
+
+/* Danger */
+form[role="dialog"][data-type="confirm"] menu button.danger,
+a.danger[role="button"] {
+ background-image: url(buttons/images/ui/danger.png);
+ background-color: #b70404;
+ color: #fff;
+ text-shadow: none;
+ border-color: #820000;
+}
+
+/* Danger Press */
+form[role="dialog"][data-type="confirm"] menu button.danger:active {
+ background-image: url(buttons/images/ui/danger-press.png);
+ background-color: #890707;
+}
+
+/* Disabled */
+form[role="dialog"][data-type="confirm"] > menu > button[disabled] {
+ background: #5f5f5f;
+ color: #4d4d4d;
+ text-shadow: none;
+ border-color: #4d4d4d;
+ pointer-events: none;
+}
+
+
+form[role="dialog"][data-type="confirm"] menu button:last-child {
+ margin-left: 1rem;
+}
+
+form[role="dialog"][data-type="confirm"] menu button,
+form[role="dialog"][data-type="confirm"] menu button:first-child {
+ margin: 0;
+}
+
+form[role="dialog"][data-type="confirm"] menu button {
+ width: calc((100% - 1rem) / 2);
+}
+
+form[role="dialog"][data-type="confirm"] menu button.full {
+ width: 100%;
+}
+
+/* Specific component code */
+form[role="dialog"][data-type="confirm"] p {
+ word-wrap: break-word;
+ margin: 1rem 0 0;
+ padding-top: 1rem;
+ border-top: 0.1rem solid #686868;
+}
+
+form[role="dialog"][data-type="confirm"] p img {
+ float: left;
+ margin-right: 2rem;
+}
+
+form[role="dialog"][data-type="confirm"] p strong {
+ font-weight: lighter;
+}
+
+form[role="dialog"][data-type="confirm"] p small {
+ font-size: 1.4rem;
+ font-weight: normal;
+ color: #cbcbcb;
+ display: block;
+}
+
diff --git a/shared/style/confirm/content.html b/shared/style/confirm/content.html
new file mode 100644
index 0000000..7479824
--- /dev/null
+++ b/shared/style/confirm/content.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+
+ <title>Confirm, with content</title>
+ <meta name="description" content="Prompts user to take action">
+
+ <link rel="stylesheet" href="../confirm.css">
+
+ <!--
+ - This <style> element is only used for the example code;
+ - it is not required for the real use case.
+ -->
+ <style type="text/css">
+ html, body {
+ margin: 0;
+ padding: 0;
+ font-size: 10px;
+ background-color: #fff;
+ }
+ body {
+ background: none;
+ }
+ </style>
+</head>
+
+<body role="application">
+
+ <form role="dialog" data-type="confirm">
+ <section>
+ <h1>Confirmation</h1>
+ <p>
+ <img alt="Lightbox Icon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAA3CAYAAACo29JGAAAYtUlEQVR4XqWaeaymV33fP2d51ne5+517587imbHHY7vUgI0xNk4gtAltYkjaFKlp07QiiUJE01at+kf/jNSq/3UxpaiFohI1ISpEFMuxk7IkAswSNoMxjtfZ17u9y/M+y9k6HA0ejTJzVeSvdHSe933Oc8/z/f2+v+XoveK3DzwQ7ustsxdaGSi6MU1ecrJ3J2r/Q6S+h1aBmWqxFBACEYAIRMg4wzPpHxNCgBDiLHycX1s7FhmJbEm8IaQ9NhdXcMeO0QpP33qmeh4gPuO9RwiBlDJ+ttZSnnqGH/zXfy+urSEC0Mfm93HPSLMXhHRok7Hr+4hsHalPoPQ6XipG0pI7QQSgEMTNxfXvflh+5zpx4gvcMBZ9Dy0tzlkmaY9mcQN78F5mWmMtGKmIgB+TiwPAOce8aLgZdL+DZpCyF5TI8EZSJzl1oUhzQRCW4BoEBo0GIJIKIBDIcP0FJMlr155AvAzhtaFEhZKBECx4jXIBFTQh5KTOk4WKGxC4fhkCbX/15uR80+GLhL1gQkqOwgqJxxHoEHZKEjxCery6vmcQAhHAC4EggiJ4gg+RmBfRc9fWAgJMGBHwOGxc48QEqOI3LjiMEHuoSpLlc6z96r8JAzXl2G/8CwKO5pUfooOO2mUvlE1Nrg2zJEcHRRApXvTxAdASL2fIcJ0gARAgiCATCgREciHgZSRGkIIA9LohAosRFqdzUqFovKX1DR5PCL1okOuxdj32lFQ0xiKKklpaJs5S5hmUPbRNFSY49kIuiDJsMdQ4EiGiZ9rgCF7GROC5nkQQAgL4eClofYBrzwQhcCKSw/lAAKSfg9DinUGqEulTZOvR3lEGCJjr5MKN5LQIdKmg8Y4kSHQrkC4gOoVuhKd0mr3QpWmUnxEBKwx50pHJGuU7PALh8kjitYQSB9djLh1GL2kl8VIgBVgCIXhs8OwMcoSvCV1FpzKsBGc7hJfRkLMsIRAQCJQQ8doRd0aIeI2ra3qJJ3MJofNgFTprHHWm2AvaprhgESSEIGiaDkRAy4w6OHq6fY0YxJhDhAAupn1Uv6Ozglr2mC3M06YJwjgCFpEpWlPStjPEEIxw2FTjxzOsztntzZGbLsZWUAqHA2SUpwgQTEBai9aamagxqYxGtapFA3j2Rhc6pG9BKLT0JAoy6ZHOxTgJlggf5SijdUUkKUFA2ULqJFIKgpExTqwBj8QCmbBIEUASsybCRZl23iGcQKqCAEQ2CAIOgQQgBAdwvTwEXsM1coG94HRHEhwOB8GhvEP+eIgWxUJ8uRgDUsZZIpCJRAJ9mWCDQIoErxSoFKFCjBMrBNrP8MGgAteKvbsmSYcmloQbGwAB4doaKQSeGxFJAhrAir3JBa1wThCQSJcjXIYgReFIpMRbASoWbqxwCFzcPDiDEND6lhAkjh/NLQFFUBoLNAJ6mcYJj9MyJikXY0mTCEUadPyOEKISgggID/hAiPuoSOZm0ABOsCe8kDiRIEWBkjmSAhclF18IlY4IMmCEQWqD0o4sh6LUJJnmLn2Utm7ZtpbNxJHIBhsUuUjINTRagddYqQgiJygJIolkhEsRCYgALpJU17xLJIV38TPcWNivkyOwF2zQ+GBxIfqEzs/ogkUkFV1qKAcjijKhP8yvjoSshCyXqMyjVMuavIPQtFS2YxvD2Aamo4adacOWcZw2LaKztDLDygxIEDrFB4+zUYJAQASBjwQFCIgSDQKut3Q3EPz/IofQuGg5ixMVpDtkhSZf6uivwPJSwuLiAvsPrLOyvkRvUCCVx/gO5xypWCDxgIROOaZVxe75HU6du8TZ3REHRzUXRhMutpaLxjMV0CXRNTgEeBWVAR685FoLRIhLuLFXJQDXPUcQ7AlBQoRwiKQjG3YsrmvWjhX0j+Tce+JNCK0gBneg8o7gAZWhUkUlHEnXga1xeIq+ZPHYEocPrzAFzjzzMi9euMKzl8ewW3M+dPgARiiEEkBxXW4izghu6bHXCOtRDmvWUkuPSxUJmqz1BOtj4bVKsNTMuKwl2/MJBx5aJDs2Y9/RZe6//340AaSja1py3aOrJK9+/1Veef40zcTibMAJSZFrhnMFh49ucPTEIWxf0jAjzRLW7z7KkXuOsvGd73DnmQu8MGr56pUxF+bWmch5BmGb8bTBS0WpU1TjwTpsIrGpoNvd5MIn/u1fPfIABC1JtCY2ve5am6MUVgvQkrM5lIcOcPDEQZbeeII7Hnwzg6UFZnVDLy8wo8AXPv81vvTFpzn7yiWasUWLklTk1DODSBLyVGHsDOdr+os5h45v8OBPPcjD73iY3v4edjrj3vvewPptG6QvnWJabhN2x+hJTVdkBOcJQmOsh+DRsRXz2KZDtfWts2XnHQGFMQZvPYnKosZn3mOlZPuORfTxq+Teci93P/JWyBOcEDgLv/ex3+OpTz3N7s4IZySFGpCqPnk2Ry8f0teSLji0ljgxozMV1XbF1//8WZ5++vt89COf5JG/9xb+yT94HzqVLCz2ecfb7oXiB8jnT3FhvMszzQKpJKrIB6IalACCQwZLXwVuBglghKBzls4aXAAvBTMCI+1pFwr2vfM+Nt7+Jm5/+/1Yregaw/e+9l3+5W/9Dv/9P36ES2cv4WaBni4pkwLpBO2sZTKaMhqNsMYzm8yYjitM60hFQqn6+Jll6+IWn/2Dp/hnv/mv+dqXv4s1ghR4131v5JE7DnIsMSx4R89btDNIxLUTeIf0nkwIEtPd2nNBSaSSaFIEglrArnKE9SXm33AH+up8zwNvZjg3x2hzlz/+o8f5xIf/B/XWLku9ebxKCMHjbU3jPIksycs8xpkI8lqCU5guoW07uq7C2AlaQZGl2Al884vPcO7lM3zgd97P29/xVvoLmofedB/UHRfOVLy0O6aeNbgsIJHgA7brQDmq6uayFL9718+FNZkgdCyOOBeovaUa5iw+eA8n3vUQ9/6Nd1JXM2zV8Mn/+Uk++fHfJ/OKYTHANoaZ9fR6A+b7i2hVYIzHdRKBRgiFCZ5EqkhGCYcPXexaOt8QJNBqGtewPbmMLB3/6Dd/lX/4a79CkqUgBH/y9e/ypZdf4RtXdpmkA9TVIazHmorW1qi2pf7O97BpRbh8hivf+Iq43n55B8bjEDjvMXlCeXiN1TedYP7Nx6nHU+b7A/7zhz7KJz/x+6igQCdUzsd4WlnYF+N1ezSCUMUuRsksxpmWGh+g9R1tZ/GuJWCQWqLyFJVoLl5+lcHCkMFcyqjZ4eMf/xhGGD7wwQ+wtbPNw7etMK42OT8b86oxGNsREHjv6bqOrJijf/QErm+xSt0oSy0Vxjt8CKAkvYU5lu44wuqdR0j2r5BsW/7oU5/m8f/zWWZVw8GNw4zGM3bqCSvr+5ls1ngPggStE7zQhCDAS1SiCEERsLFmBeewzuO9Be/womN5f5+LWxfi/cF8wdkrF/jUp/+Qlf0rPPqL72U1C9yxtsiz4wmXtwy7nSV4CUFGZYwN9Ish9Dw2Ka+Tm0iHTVr2ySFMWqphib19lXve8w4O33kMebliZ7Pisf/0GNWkYn7fIuc2z7MwnGOl7FHvXkSFFIJHCRlLgCCPPaKVEoQC1+CDxWNBG7zq8NZguzaSvGANxWAR4xomVcXi3CL1aMJ/e+wxHnngfnaXl7jztjv4jXSB8PhTPCtyTooUoXKUkdQ55EnJsGqZ2huzJWWSsTMexaLoUsWh24+y/8AG3jlEgA9/5MNcuXIFh8PaLsoNoKoqptMpjWkw3mKtoW1rWtPivcMGS93OsN7gvI/PtraNs8fjgqVtW5qmoWlmSAVaa6y1UUkXL17ksf/yodeOUav7ljmwsZ9gGvpZQjOrSJRmLvEU7ZTk6kh9dyM5HRSegC1zyv37OPaGe0iyDDNrOPnCSzz55JMgQUqJcw4piSSrukIIkFrH2EEKjOuwviVIB9LhsXjhccLgMPG+8RYvLSgQ2oOwzNpJNI6U4LxBKUUQxL2ff/75mBfysuDuE8cZpIoSRyECqU7Iqy2qV59j8tL36a6cuzHmbNMiy4Kxchy5/SDrx49Q1TXKeP7kiafoTEO/38d2DqFUjKe6q6OksqKHMR3OC1TwKJ2Q5IpiriAvByATEhGid+omIBpL2zV0bYN1bUwKMoO2NVRNRVak0YghOAaDAbPZlCcef5y7f+uDUbK333aAA0tDLl/coZcMaY0hr3c4+fiH/kr7JQG8h1Z4JhrK/atkg2G0XD2t+PznP4/Ugs620epCyxg/xhikIr6ECzZKDy3IewnJ1RFEh6WFxOOVw2sbO5C8n5IVCU4ZbOhAx9KA0gFja6LXUo1xlrbroiK+8qUvMZpO6GzHoMw4vDSHbsZoU+M6w1yibl3ERaKZBcvw4BqDtWWmzSzWvRdeeJGzFy+R9RTOGfK8iGTqegaI2I92kXCBVpIsy0iLDBc6qsoQmookLdGIKGMlIcs0aS+hDDm1cgQcxliSLKFrOup6St4r49+aTKcUZcbF8+d47oc/5K33vZmuqdiY77PWy3hlUpPm8/juFu1XLNwCfKpY3L/Gwr59NE1HVzd841vfxEpIizQGetHLabo6JgUpBRHCY7xBJjKeuj0uWtj4BofBx1iLg8Y1MbYcJkpXptCYOhIUMiBEoLWGpmspyjLumeZlTGzf+vZfRAmbZsrawoDVfkkmPDLAtLO37i1razASvNaUwwFJksSMderUKUTUf4gEhBAxuymlrmU1E+8VRRFjMi3yKNHGNNHDWstIWigQErquYVyNMaYlK1PKskCqmJziPalAXluntMAGj5RREZw+fZrGdIBnrl+QykCiZczYpDk3gzZaoJGxnfJzBTbXyNZhSdnebOllaySZwIsakQ1wyQRdaEbtDJEJlHIYN2J5bp5xNaVqppRFLxpnNLqA2w4oGY1Ff9hDKcGlnSssp6vkwz7TK5cQvZzamLhOJlk0oiGjHCziSMn0YS5veRqnyJFkqk8/GWKqk6RZQebDrWMOZHR5lKhzOA9BqrhJWeaAQEtNqufI0+ZaW9UHEaJlbWsILouFWcg+QuQ0zYRZ5eL9JJFUM0NayJgBjU9wJiWkOcPhWlRFIl1UBMhILkvnsSaJ35GpKEmAzhiE0Nd/K1AKU5tbkouLCAIA6zqkS3A6EFN9nuBcghCOVPai1aSQJIkHiAbpD0uKYpmu0zgzQ6cZQhkaW6G1wBqHCQIfEoTMo5yULlCqpCygrqvX6mh8aaHiPp0ISCQ69wTfAdBai1Ya5zzCB0SIBrw5uUgMCQSA6LkQZMxgCBfjQyoZr30wcZjOIYUCINYpmUaSADPTghEEJUErnBC0posdvleB3WoSy0jRK+Mzs9kM7100cAguylcphfddHAiB8h4hFR6HDwIXwLoQnw+djc/sIUuQUkdibduSp0kM8jxPOTfdZTjsYikwxuHcKBbcRGc/Jheb6PnlHkmu8VjqtkGnSWzAtY5/FwCpNd5ZpAYnGlpnsa7Cu/Za4faRHEJh3Y/GhFSlVJOGxX3DmKWFEDE+o1GFgJi49B7kQtR5tOJoNGKwnMdCvW9tiee+VxMEGFdjvUBpizAdSCCImNW6zker9wZzDOtFqtoQZEZWDijyXiQ4nuziXEeSA65jVtcIPEIH8IaAiHsK5ZFKE2jwVPFzPRuxum8pHm+UzqMxG2Nj7Kcxg+9xEpcykmM8HrO1tcna/GKsY0ePHuHLqeR6WwN5XmItSJHgPVFCaZKyu1MjxTz9wTpSeWYtOCvwvk8ICkGG9VNE1+Ec4BoElkAgkRkIDxCzaZal0djOuTinieDYkcPRW947Lm9uxqOXCCAFpGm6V0KJtYyqmkWCsTnWmvX1dfI8R4sE6S0qZEgNnQwELwnOI1AU+Ty7uzOSxLK672CseeOxZTxpSJNBTEzzgyWcmzKdbOKtoCj7CFqaeoIWXdxfCRu7nkwpZFBgNcIpBr2CjY11kBC8YGc0pqpnkXwQe/xWUBeKVjVkMiU/dYm54xWTugJdcuDwEW5bPcip86fpZUNCI8nSHKOhamrSYU7VVpQhiW3W1niXTmwyv7RIb+kEw9UNYIiVB2jr55lNvkHmDKnW0QNtmGAzaP0mZZrRTizaa3rFEGsaekUvhsq+g0fYOHA7mdBsj3fYrrbZNRVkc2A8fW7RfkW36wTpQQXY2dxid3Mbbyw6z3jLw28jiBBbq7qrQUmWllcRKqNtPP1yiSCgLPsM+6uEULC52XHhfMvOTsB0vVgCuq5PM1uiaRYxdoBHIdAErymLBbo2oFXG+sbBmFS2d3boD/t4AQ888GCUXtMatscTprMGIXX0ttb61gklkhMKKUBJydb5i2TnLlCuLhHKnLvveyNzf/YUo50xc8N5Zs0M4wX79x/k3OUtTKvwBBQKQYm38wRWQK1imiWmtk/NDOwcMtxNIgusfyF6TulALy1pu8tIJAcPrjKebNNUNf2FObbHYxaXl3jTfW9Gpinj8ZQLlzbZ2h2BkoBHS40zjptBXgWEEBNDpjTVzojdc5fiMb+qKtJ+yUM/9dOYEOicRadJtJzWPRYX1iOhgEaqAUovo/R+tD6EEBs4t0rd9GI34t0KiuOkyRvIi+Mk2RqOHl2bocSApaWDKN1jdzyjHC6ATqhay4OPvJPh3AKtcWyNp5y5vM3udBY9FxMhLsbezaBjfQGEkogA2gYmP7LO6fOEQ5L+3JCH3/GznDp9ga89/VUOrR9iLsu5eGWT5eWD6NVFdqoKwTzezeH9IlKtoJN9SN3De0hSBRa80Ti7jnVX8GETETqkqFlcGlCmkgvnX2J5ZS2WmzOnzvHA2x7moUd+Fi8Eo0nFmUtXuLI7xqucICVSgAbQ+tae85nGCXDBk6uEbmfCxVdOMd7cJvaG2Tzv/Nn3cvzOv8bFzS06a9FJQjWbkaY5i8uH6Q32I/USgXk8PQKaIEFkYOIRCCzQBYFjgSQ5yMLCMdb3306a9BhPa/rDeaRKOHvuEkduv4e/+e6/S1quYKyNxjx3ldzMQFL0Xut9tQpkWXbrhOJTFQkiJblOUK2lurzNldPn2Lp0mc2dhoMH7+Bv/cIvsX/jYEzDvX5xrXxMSNN5yv5aJLm0fIiiN8QKh8GAApVB0B0uMaR9zfziIRaX7qLf20DJnC7WPsdwfo7RtGJ1bYNH3/s+9m/cwWjiubK9w5lzF5jMOpxQOCFjCUiUQEEkecuEYiVIpZEOJIJEqNhiXbl4CYqUY3/9Lma15fbjJ3j00Uf57GceZ3Nri7V9R6hmlp1Rgwg1eaYYzi2ymC3QeqgtGA8JKTIBlYAG6DTtpM9kYuiaHYoSVlZWOH36ORYWevydX/4l7rjzHuoWpOpx/vx5rmxtInQRY60z7seNdlSF8OoWda6nGboUJwI+1XgBNgiU6ejtTpEvnuZU9mUOHbkbpQ9w6J5HeU//zXzuySd45S+/z9rKgLl+x6we0TYXaNslVNoj5CmiBFm2SGZ0dY4ZFeBAhl2EO4kuZ5TDRZqd5zh5uuPIXW/jXX/7F9g4ssE0jBhXpzh39gVe3mzo0rnY92oCSoAUEoJAyxJlJzcnhxCUKAJAgIDAerDOo7AQGi6dPY0mY+1wSd5LOXHiblZW9vFnX/y/vPDcs1w4f44kWaEs18jLaxYN0M3ANxotFnAWRDBorZA+w9iC2XTMjnmZ/mCeR952Pw/99M/QG/Ro6wn4ip0L57hy6iRTBRaLVZagowzh+v+AMSDcnNyl7U36/VV8CNceEvEBGzzCW2auY/vcjDLJ8S5l+YAGVTJcWuHR9/0Kp89c5C8+9ySbmzO2NncZV89R5I5e/zaGWQ+UQhrINbQuYVJtMZk9i9QXWF0tWFt+Jw+9+16WlnqEEJfTVSNe/MFXmO6cJLS7kGmk9yQh4AEZiRGJ4Rw7lze5GQQ/AX7tH/+rDx48/pZ/unDgxPG5fUexIiPvJaQWdnZmkejJV65w4fyM8ViAz0l0D98khKQjKVqKecnS8oDDB5Y4fHiJtRXoNNQTUMEyuvwKuxdffOHl555+7H997N99iJ8QIYS9yO2Nn//FX/+Zwyfe+uvLh+75+wduvxeZlCQ5WAs+gNSQJNB1sLtjGO3WZElOb6gp5yUqBe8ABwmgFTgDpjKcfPHbTC+9/Aen/vKbH/3MH/6HLwC8HnKSnxBPfOajX3jma0+9/6Vn/vz93/7SE3967sVnuHhpSttBkkZitN5jVc1gxXH4RI+NEy3lisUKsB7SAvLS07aWi+c6Xnzm2zz3rc/96fkXv/7+r37xf78/Env9QPA68HPv+e3B/NLGz6/d/ZZ358Xiu3q99QN5PiQf5BQDTZaDVNC1oDT4ANUUqpGlGY1op2fPds2lz1969bmnLpx98YnPPf7hCXvgdcjy9eFdv/y7tx3aeOCB4fzhe2U6uEuk+qiUxToyWYiNgkt2nFUXvJ294s3lH053X3rm0pkffOPJT//zk+yB10Pu/wGWLthadIR5rwAAAABJRU5ErkJggg%3D%3D">
+ <strong>Lightbox</strong>
+ <small>Lightbox Enterprises LLC.</small>
+ </p>
+ <p>Do you want to download and install this application?</p>
+ </section>
+ <menu>
+ <button>Cancel</button>
+ <button class="recommend">Yes</button>
+ </menu>
+ </form>
+
+</body>
+</html>
+
diff --git a/shared/style/confirm/images/ui/danger-disabled.png b/shared/style/confirm/images/ui/danger-disabled.png
new file mode 100644
index 0000000..2a14bfb
--- /dev/null
+++ b/shared/style/confirm/images/ui/danger-disabled.png
Binary files differ
diff --git a/shared/style/confirm/images/ui/danger-press.png b/shared/style/confirm/images/ui/danger-press.png
new file mode 100644
index 0000000..d7529b5
--- /dev/null
+++ b/shared/style/confirm/images/ui/danger-press.png
Binary files differ
diff --git a/shared/style/confirm/images/ui/danger.png b/shared/style/confirm/images/ui/danger.png
new file mode 100644
index 0000000..400e3ae
--- /dev/null
+++ b/shared/style/confirm/images/ui/danger.png
Binary files differ
diff --git a/shared/style/confirm/images/ui/default.png b/shared/style/confirm/images/ui/default.png
new file mode 100644
index 0000000..2ff298a
--- /dev/null
+++ b/shared/style/confirm/images/ui/default.png
Binary files differ
diff --git a/shared/style/confirm/images/ui/disabled.png b/shared/style/confirm/images/ui/disabled.png
new file mode 100644
index 0000000..2e97135
--- /dev/null
+++ b/shared/style/confirm/images/ui/disabled.png
Binary files differ
diff --git a/apps/system/camera/style/images/ui/gradient.png b/shared/style/confirm/images/ui/gradient.png
index b288545..b288545 100644
--- a/apps/system/camera/style/images/ui/gradient.png
+++ b/shared/style/confirm/images/ui/gradient.png
Binary files differ
diff --git a/apps/system/camera/style/images/ui/pattern.png b/shared/style/confirm/images/ui/pattern.png
index af03f56..af03f56 100644
--- a/apps/system/camera/style/images/ui/pattern.png
+++ b/shared/style/confirm/images/ui/pattern.png
Binary files differ
diff --git a/shared/style/confirm/images/ui/recommend.png b/shared/style/confirm/images/ui/recommend.png
new file mode 100644
index 0000000..42aed39
--- /dev/null
+++ b/shared/style/confirm/images/ui/recommend.png
Binary files differ
diff --git a/shared/style/confirm/index.html b/shared/style/confirm/index.html
new file mode 100644
index 0000000..49de126
--- /dev/null
+++ b/shared/style/confirm/index.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+
+ <title>Confirm</title>
+ <meta name="description" content="Prompts user to take action">
+
+ <link rel="stylesheet" href="../confirm.css">
+
+ <!--
+ - This <style> element is only used for the example code;
+ - it is not required for the real use case.
+ -->
+ <style type="text/css">
+ html, body {
+ margin: 0;
+ padding: 0;
+ font-size: 10px;
+ background-color: #fff;
+ }
+ body {
+ background: none;
+ }
+ </style>
+</head>
+
+<body role="application">
+
+ <form role="dialog" data-type="confirm">
+ <section>
+ <h1>Confirmation</h1>
+ <p>Are you sure you want to delete this contact?</p>
+ </section>
+ <menu>
+ <button>Cancel</button>
+ <button class="danger">Delete</button>
+ </menu>
+ </form>
+
+</body>
+</html>
+
diff --git a/shared/style/confirm/long_content.html b/shared/style/confirm/long_content.html
new file mode 100644
index 0000000..ee5d52b
--- /dev/null
+++ b/shared/style/confirm/long_content.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+
+ <title>Confirm</title>
+ <meta name="description" content="Prompts user to take action">
+
+ <link rel="stylesheet" href="../confirm.css">
+
+ <!--
+ - This <style> element is only used for the example code;
+ - it is not required for the real use case.
+ -->
+ <style type="text/css">
+ html, body {
+ margin: 0;
+ padding: 0;
+ font-size: 10px;
+ background-color: #fff;
+ }
+ body {
+ background: none;
+ }
+ </style>
+</head>
+
+<body role="application">
+
+ <form role="dialog" data-type="confirm">
+ <section>
+ <h1>Confirmation</h1>
+ <p>mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm</p>
+ </section>
+ <menu>
+ <button>Cancel</button>
+ <button class="danger">Delete</button>
+ </menu>
+ </form>
+
+</body>
+</html>
+
diff --git a/shared/style/confirm/no_title.html b/shared/style/confirm/no_title.html
new file mode 100644
index 0000000..dc59be2
--- /dev/null
+++ b/shared/style/confirm/no_title.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+
+ <title>Confirm, w/o title</title>
+ <meta name="description" content="Prompts user to take action">
+
+ <link rel="stylesheet" href="../confirm.css">
+
+ <!--
+ - This <style> element is only used for the example code;
+ - it is not required for the real use case.
+ -->
+ <style type="text/css">
+ html, body {
+ margin: 0;
+ padding: 0;
+ font-size: 10px;
+ background-color: #fff;
+ }
+ body {
+ background: none;
+ }
+ </style>
+</head>
+
+<body role="application">
+
+ <form role="dialog" data-type="confirm">
+ <section>
+ <p>Are you sure you want to delete this contact?</p>
+ </section>
+ <menu>
+ <button>Cancel</button>
+ <button class="danger">Delete</button>
+ </menu>
+ </form>
+
+</body>
+</html>
+
diff --git a/shared/style/edit_mode.css b/shared/style/edit_mode.css
new file mode 100644
index 0000000..28f5439
--- /dev/null
+++ b/shared/style/edit_mode.css
@@ -0,0 +1,238 @@
+/* ----------------------------------
+ * Edit mode
+ * ---------------------------------- */
+
+form[role="dialog"][data-type="edit"] {
+ overflow: hidden;
+ position: absolute;
+ z-index: 100;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ white-space: nowrap;
+ font-family: "MozTT", Sans-serif;
+ color: #fff;
+ pointer-events: none;
+}
+
+/* Header */
+form[role="dialog"][data-type="edit"] header {
+ pointer-events: auto;
+ position: relative;
+ z-index: 10;
+ padding: 0;
+ height: 5rem;
+ color: #fff;
+ background: url(edit_mode/images/ui/alpha.png) repeat 0 0;
+ border: none;
+}
+
+form[role="dialog"][data-type="edit"] header:after {
+ content: "";
+ display: block;
+ height: 0.3rem;
+ position: absolute;
+ top: 100%;
+ left: 0;
+ right: 0;
+ background: url(edit_mode/images/ui/shadow.png) repeat-x 0 0;
+ background-size: auto 100%;
+}
+
+form[role="dialog"][data-type="edit"] header h1 {
+ font: 2.5rem/5rem "MozTT", Sans-serif;
+ text-align: left;
+ color: #fff;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ display: block;
+ overflow: hidden;
+ margin: 0 0 0 3rem;
+ height: 100%
+}
+
+form[role="dialog"][data-type="edit"] header button {
+ border: none;
+ background: none;
+ padding: 0;
+ overflow: hidden;
+ font: normal 1.4rem/1.1em "MozTT", Sans-serif;
+ color: #fff;
+ border-radius: 0;
+}
+
+form[role="dialog"][data-type="edit"] header menu[type="toolbar"] {
+ height: 100%;
+ float: right;
+ margin: 0;
+ padding: 0;
+}
+
+form[role="dialog"][data-type="edit"] header menu[type="toolbar"] button {
+ height: 5rem;
+ min-width: 5rem;
+ width: auto;
+ margin-bottom: 0;
+ border-radius: 0;
+ line-height: 5rem;
+ float: left;
+ font-weight: normal;
+ background: none;
+ padding: 0 1.75rem;
+ -moz-box-sizing: border-box;
+ text-align: center;
+ text-shadow: none;
+ position: relative;
+ z-index: 5;
+}
+
+form[role="dialog"][data-type="edit"] header menu button {
+ color: #fff;
+ border: none;
+}
+
+form[role="dialog"][data-type="edit"] header menu[type="toolbar"] button:last-child {
+ background: url(edit_mode/images/ui/separator.png) no-repeat left center;
+ margin-left: -0.2rem;
+ z-index: 1;
+}
+
+/* Press state */
+form[role="dialog"][data-type="edit"] header button:active .icon:after,
+form[role="dialog"][data-type="edit"] header menu[type="toolbar"] button:active {
+ background: #008aaa !important;
+ transition: background 0.2s ease;
+ color: #fff;
+}
+
+form[role="dialog"][data-type="edit"] header button:first-letter {
+ text-transform: uppercase;
+}
+
+form[role="dialog"][data-type="edit"] header > button {
+ position: absolute;
+ left: 0;
+ width: 4rem;
+ height: 5rem;
+ background: url(edit_mode/images/ui/separator-large.png) no-repeat 2rem center;
+ overflow: hidden;
+ text-align: center;
+}
+
+form[role="dialog"][data-type="edit"] header > button span {
+ background: url(edit_mode/images/icons/close.png) no-repeat center center;
+ overflow: visible;
+ font: 0/0 a;
+ position: static;
+ margin-left: -2rem;
+ height: 4.9rem;
+ display: block;
+}
+
+form[role="dialog"][data-type="edit"] header > button span:after {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: -1;
+ width: 2rem;
+ height: 4.9rem;
+}
+
+/* Menu */
+form[role="dialog"][data-type="edit"] > menu {
+ pointer-events: auto;
+ white-space: nowrap;
+ margin: 0;
+ padding: 1.5rem;
+ border-top: solid 0.1rem rgba(255, 255, 255, 0.1);
+ background: url(edit_mode/images/ui/alpha.png) repeat left top;
+ display: block;
+ overflow: hidden;
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+}
+
+form[role="dialog"][data-type="edit"] menu button {
+ width: 100%;
+ height: 3.8rem;
+ margin: 0 0 1rem;
+ padding: 0 1.5rem;
+ -moz-box-sizing: border-box;
+ display: inline-block;
+ vertical-align: middle;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ background: #fafafa url(edit_mode/images/ui/default.png) repeat-x left bottom;
+ border: 0.1rem solid #a6a6a6;
+ border-radius: 0.3rem;
+ font-size: 1.6rem;
+ font-family: 'MozTT', Sans-serif;
+ font-weight: 500;
+ line-height: 3.8rem;
+ color: #333;
+ text-align: center;
+ text-shadow: 0.1rem 0.1rem 0 rgba(255,255,255,0.3);
+ text-decoration: none;
+ outline: none;
+}
+
+/* Press (default & recommend) */
+form[role="dialog"][data-type="edit"] menu button:active,
+form[role="dialog"][data-type="edit"] menu button.recommend:active {
+ border-color: #008aaa;
+ background: #008aaa;
+ color: #333;
+}
+
+/* Recommend */
+form[role="dialog"][data-type="edit"] menu button.recommend{
+ background-image: url(edit_mode/images/ui/recommend.png);
+ background-color: #00caf2;
+ border-color: #008eab;
+}
+
+/* Danger */
+form[role="dialog"][data-type="edit"] menu button.danger{
+ background-image: url(edit_mode/images/ui/danger.png);
+ background-color: #b70404;
+ color: #fff;
+ text-shadow: none;
+ border-color: #820000;
+}
+
+/* Danger Press */
+form[role="dialog"][data-type="edit"] menu button.danger:active{
+ background-image: url(edit_mode/images/ui/danger-press.png);
+ background-color: #890707;
+}
+
+/* Disabled */
+form[role="dialog"][data-type="edit"] > menu > button[disabled] {
+ background: #5f5f5f;
+ color: #4d4d4d;
+ text-shadow: none;
+ border-color: #4d4d4d;
+ pointer-events: none;
+}
+
+form[role="dialog"][data-type="edit"] menu button:last-child {
+ margin-left: 1rem;
+}
+
+form[role="dialog"][data-type="edit"] menu button,
+form[role="dialog"][data-type="edit"] menu button:first-child {
+ margin: 0;
+}
+
+form[role="dialog"][data-type="edit"] menu button {
+ width: calc((100% - 1rem) / 2);
+}
+
+form[role="dialog"][data-type="edit"] menu button.full {
+ width: 100%;
+}
diff --git a/shared/style/edit_mode/images/icons/close.png b/shared/style/edit_mode/images/icons/close.png
new file mode 100644
index 0000000..23f0ab3
--- /dev/null
+++ b/shared/style/edit_mode/images/icons/close.png
Binary files differ
diff --git a/shared/style/edit_mode/images/ui/alpha.png b/shared/style/edit_mode/images/ui/alpha.png
new file mode 100644
index 0000000..fb3ead5
--- /dev/null
+++ b/shared/style/edit_mode/images/ui/alpha.png
Binary files differ
diff --git a/shared/style/edit_mode/images/ui/danger-disabled.png b/shared/style/edit_mode/images/ui/danger-disabled.png
new file mode 100644
index 0000000..2a14bfb
--- /dev/null
+++ b/shared/style/edit_mode/images/ui/danger-disabled.png
Binary files differ
diff --git a/shared/style/edit_mode/images/ui/danger-press.png b/shared/style/edit_mode/images/ui/danger-press.png
new file mode 100644
index 0000000..d7529b5
--- /dev/null
+++ b/shared/style/edit_mode/images/ui/danger-press.png
Binary files differ
diff --git a/shared/style/edit_mode/images/ui/danger.png b/shared/style/edit_mode/images/ui/danger.png
new file mode 100644
index 0000000..400e3ae
--- /dev/null
+++ b/shared/style/edit_mode/images/ui/danger.png
Binary files differ
diff --git a/shared/style/edit_mode/images/ui/default.png b/shared/style/edit_mode/images/ui/default.png
new file mode 100644
index 0000000..2ff298a
--- /dev/null
+++ b/shared/style/edit_mode/images/ui/default.png
Binary files differ
diff --git a/shared/style/edit_mode/images/ui/disabled.png b/shared/style/edit_mode/images/ui/disabled.png
new file mode 100644
index 0000000..8a93c42
--- /dev/null
+++ b/shared/style/edit_mode/images/ui/disabled.png
Binary files differ
diff --git a/shared/style/edit_mode/images/ui/recommend.png b/shared/style/edit_mode/images/ui/recommend.png
new file mode 100644
index 0000000..42aed39
--- /dev/null
+++ b/shared/style/edit_mode/images/ui/recommend.png
Binary files differ
diff --git a/shared/style/edit_mode/images/ui/separator-large.png b/shared/style/edit_mode/images/ui/separator-large.png
new file mode 100644
index 0000000..22dee97
--- /dev/null
+++ b/shared/style/edit_mode/images/ui/separator-large.png
Binary files differ
diff --git a/shared/style/edit_mode/images/ui/separator.png b/shared/style/edit_mode/images/ui/separator.png
new file mode 100644
index 0000000..e02f24a
--- /dev/null
+++ b/shared/style/edit_mode/images/ui/separator.png
Binary files differ
diff --git a/shared/style/edit_mode/images/ui/shadow.png b/shared/style/edit_mode/images/ui/shadow.png
new file mode 100644
index 0000000..aec120c
--- /dev/null
+++ b/shared/style/edit_mode/images/ui/shadow.png
Binary files differ
diff --git a/shared/style/edit_mode/index.html b/shared/style/edit_mode/index.html
new file mode 100644
index 0000000..22123ca
--- /dev/null
+++ b/shared/style/edit_mode/index.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+
+ <title>Edit mode</title>
+ <meta name="description" content="Starts an edition mode for adding or removing items">
+
+ <link rel="stylesheet" href="../edit_mode.css">
+
+ <!--
+ - This <style> element is only used for the example code;
+ - it is not required for the real use case.
+ -->
+ <style type="text/css">
+ html, body {
+ margin: 0;
+ padding: 0;
+ font-size: 10px;
+ background-color: #fff;
+ }
+ body {
+ background: none;
+ }
+ </style>
+</head>
+
+<body role="application">
+
+ <form role="dialog" data-type="edit">
+ <section>
+ <header>
+ <button><span class="icon icon-close">close</span></button>
+ <menu type="toolbar">
+ <button>done</button>
+ </menu>
+ <h1>Edit</h1>
+ </header>
+ </section>
+ <menu>
+ <button>Delete all</button>
+ <button>Delete selected</button>
+ </menu>
+ </form>
+
+</body>
+</html>
+
diff --git a/shared/style/headers.css b/shared/style/headers.css
new file mode 100644
index 0000000..5d37c3f
--- /dev/null
+++ b/shared/style/headers.css
@@ -0,0 +1,381 @@
+/* ----------------------------------
+ * HEADERS: default
+ * ---------------------------------- */
+section[role="region"] > header:first-child {
+ position: relative;
+ z-index: 10;
+ padding: 0;
+ height: 5rem;
+ color: #fff;
+ background: url(headers/images/ui/header.png) repeat-x 0 0;
+ background-size: auto 100%;
+ border: none;
+}
+
+section[role="region"] > header:first-child:after {
+ content: "";
+ display: block;
+ height: 0.3rem;
+ position: absolute;
+ top: 100%;
+ left: 0;
+ right: 0;
+ background: url(headers/images/ui/shadow.png) repeat-x 0 0;
+ background-size: auto 100%;
+}
+
+section[role="region"] > header:first-child h1 {
+ font: 2.5rem/4.8rem "MozTT", Sans-serif;
+ text-align: left;
+ color: #fff;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ display: block;
+ overflow: hidden;
+ margin: 0 0 0 3rem;
+ height: 100%
+}
+
+section[role="region"] > header:first-child h1 em {
+ font: 400 1.5rem/1em "MozTT", Sans-serif;
+}
+
+section[role="region"] > header:first-child form {
+ display: block;
+ overflow: hidden;
+ position: relative;
+ padding: 1rem 1rem 0 0.5rem ;
+ margin-left: 2.5rem;
+}
+
+section[role="region"] > header:first-child input[type="text"] {
+ width: 100%;
+ height: 3rem;
+ -moz-box-sizing: border-box;
+ padding: 0 0.8rem;
+ border: solid 0.1rem #9d4123;
+ border-top-color: #a6501e;
+ border-radius: 0.3rem;
+ background: #fff url(headers/images/ui/shadow.png) repeat-x left -0.1rem;
+ font: 1.5rem/3em "MozTT", Sans-serif;
+ box-shadow: none;
+}
+
+section[role="region"] > header:first-child form button[type="reset"] {
+ font-size: 0;
+ overflow: hidden;
+ position: absolute;
+ right: 1rem;
+ top: 1rem;
+ bottom: 0;
+ width: 3rem;
+ height: auto;
+ margin: 0;
+ display: none;
+ border: none;
+ background: url(headers/images/icons/clear.png) no-repeat center center;
+}
+
+section[role="region"] > header:first-child input[type="text"]:valid + button[type="reset"] {
+ display: block;
+}
+
+/* Generic set of actions in toolbar */
+section[role="region"] > header:first-child menu[type="toolbar"] {
+ height: 100%;
+ float: right;
+}
+
+section[role="region"] > header:first-child menu[type="toolbar"] a,
+section[role="region"] > header:first-child menu[type="toolbar"] button {
+ height: 5rem;
+ min-width: 5rem;
+ width: auto;
+ margin-bottom: 0;
+ border-radius: 0;
+ line-height: 5rem;
+ float: left;
+ background: none;
+ padding: 0 1.75rem;
+ -moz-box-sizing: border-box;
+ text-align: center;
+ text-shadow: none;
+ position: relative;
+ z-index: 5;
+}
+
+section[role="region"] > header:first-child menu[type="toolbar"] a:last-child,
+section[role="region"] > header:first-child menu[type="toolbar"] button:last-child {
+ background: url(headers/images/ui/separator.png) no-repeat left center;
+ margin-left: -0.2rem;
+ z-index: 1;
+}
+
+section[role="region"] > header:first-child menu[type="toolbar"] {
+ padding: 0;
+ margin: 0;
+}
+
+section[role="region"] > header:first-child a,
+section[role="region"] > header:first-child button {
+ border: none;
+ background: none;
+ padding: 0;
+ overflow: hidden;
+ font: 400 1.5rem/1.1em "MozTT", Sans-serif;
+ color: #fff;
+ border-radius: 0;
+ text-decoration: none;
+}
+
+
+/* Pressed state */
+section[role="region"] > header:first-child a::-moz-focus-inner,
+section[role="region"] > header:first-child button::-moz-focus-inner,
+section[role="region"] > header:first-child a:active,
+section[role="region"] > header:first-child button:active,
+section[role="region"] > header:first-child a:focus,
+section[role="region"] > header:first-child button:focus {
+ outline: none !important;
+ border: none !important;
+}
+
+section[role="region"] > header:first-child a:not([aria-disabled="true"]):active .icon:after,
+section[role="region"] > header:first-child button:not(:disabled):active .icon:after,
+section[role="region"] > header:first-child menu[type="toolbar"] a:not([aria-disabled="true"]):active,
+section[role="region"] > header:first-child menu[type="toolbar"] button:not(:disabled):active {
+ background: #008aaa !important;
+ transition: background 0.2s ease;
+ border-bottom: solid 0.1rem rgba(0, 0, 0, 0.2) !important;
+}
+
+/* Disabled state */
+section[role="region"] > header:first-child menu[type="toolbar"] a[aria-disabled="true"],
+section[role="region"] > header:first-child menu[type="toolbar"] button[disabled] {
+ opacity: 0.5;
+}
+
+section[role="region"] > header:first-child a:first-letter,
+section[role="region"] > header:first-child button:first-letter {
+ text-transform: uppercase;
+}
+
+/* Icon definitions */
+section[role="region"] > header:first-child .icon {
+ display: inline-block;
+ vertical-align: top;
+ float: none;
+ width: 3rem;
+ height: 3rem;
+ margin: 0 -1rem;
+ background: transparent no-repeat center center;
+ font-size: 0;
+ overflow: hidden;
+ position: relative;
+ height: 4.9rem;
+}
+
+section[role="region"] > header:first-child .icon.icon-add {
+ background-image: url(headers/images/icons/add.png);
+}
+
+section[role="region"] > header:first-child .icon.icon-compose {
+ background-image: url(headers/images/icons/compose.png);
+}
+
+section[role="region"] > header:first-child .icon.icon-edit {
+ background-image: url(headers/images/icons/edit.png);
+}
+
+section[role="region"] > header:first-child .icon.icon-send {
+ background-image: url(headers/images/icons/send.png);
+}
+
+section[role="region"] > header:first-child .icon.icon-close {
+ background-image: url(headers/images/icons/close.png);
+}
+
+section[role="region"] > header:first-child .icon.icon-back {
+ background-image: url(headers/images/icons/back.png);
+}
+
+section[role="region"] > header:first-child .icon.icon-menu {
+ background-image: url(headers/images/icons/menu.png);
+}
+
+section[role="region"] > header:first-child .icon.icon-user {
+ background-image: url(headers/images/icons/user.png);
+}
+
+section[role="region"] > header:first-child .icon.icon-reply {
+ background-image: url(headers/images/icons/reply.png);
+}
+
+section[role="region"] > header:first-child .icon.icon-reply-all {
+ background-image: url(headers/images/icons/reply-all.png);
+}
+
+/* Navigation links (back, cancel, etc) */
+section[role="region"] > header:first-child > button,
+section[role="region"] > header:first-child > a {
+ position: absolute;
+ left: 0;
+ width: 5rem;
+ height: 5rem;
+ background: url(headers/images/ui/separator-large.png) no-repeat 2rem center;
+ overflow: hidden;
+}
+
+section[role="region"] > header:first-child > button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+section[role="region"] > header:first-child > button .icon,
+section[role="region"] > header:first-child > a .icon {
+ display: block;
+ overflow: visible;
+ font-size: 0;
+ position: static;
+ height: 4.9rem;
+ margin: 0;
+ width: 2rem;
+}
+
+section[role="region"] > header:first-child > button .icon:after,
+section[role="region"] > header:first-child > a .icon:after {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: -1;
+ width: 2rem;
+ height: 4.9rem;
+ background: #9d3d26 url(headers/images/ui/negative.png) repeat-x 0 0;
+}
+
+section[role="region"] > header > a .icon.icon-menu,
+section[role="region"] > header > button .icon.icon-menu {
+ background-position: -1.1rem center;
+}
+
+/* ----------------------------------
+ * HEADERS: subheader
+ * ---------------------------------- */
+
+section[role="region"] > header {
+ background: url(headers/images/ui/subheader.png) repeat left bottom;
+ border-bottom: solid 0.1rem #e6e6e6;
+ z-index: 0;
+ padding: 0.4rem 0;
+ height: auto;
+ color: #424242;
+}
+
+section[role="region"] > header:after {
+ display: none;
+}
+
+section[role="region"] > header h2 {
+ font-family: "MozTT", Sans-serif;
+ font-weight: 400;
+ margin: 0 3rem;
+ font-size: 1.5rem;
+ line-height: 1.8rem;
+}
+
+/* ----------------------------------
+ * HEADERS: dark
+ * ---------------------------------- */
+section[role="region"].skin-dark > header:first-child,
+.skin-dark section[role="region"] > header:first-child {
+ background: url(headers/images/ui/dark/header.png) repeat-x 0 0;
+}
+
+/* Navigation links (back, cancel, etc) */
+section[role="region"].skin-dark > header:first-child > a .icon:after,
+.skin-dark section[role="region"] > header:first-child > a .icon:after,
+section[role="region"].skin-dark > header:first-child > button .icon:after,
+.skin-dark section[role="region"] > header:first-child > button .icon:after {
+ background: #26272c url(headers/images/ui/dark/negative.png) repeat-x 0 0;
+}
+
+section[role="region"].skin-dark > header:first-child menu[type="toolbar"] a:last-child,
+.skin-dark section[role="region"] > header:first-child menu[type="toolbar"] a:last-child,
+section[role="region"].skin-dark > header:first-child menu[type="toolbar"] button:last-child,
+.skin-dark section[role="region"] > header:first-child menu[type="toolbar"] button:last-child {
+ background-image: url(headers/images/ui/dark/separator.png);
+}
+
+section[role="region"].skin-dark > header,
+.skin-dark section[role="region"] > header {
+ background: #7f7f7f url(headers/images/ui/dark/subheader.png) repeat-x left bottom;
+ color: #c5c5c5;
+}
+
+/* ----------------------------------
+ * HEADERS: organic
+ * ---------------------------------- */
+
+section[role="region"].skin-organic > header:first-child,
+.skin-organic section[role="region"] > header:first-child {
+ background: url(headers/images/ui/organic/header.png) repeat-x 0 0, url(headers/images/ui/organic/pattern.png) repeat 0 0;
+}
+
+section[role="region"].skin-organic > header:first-child:after,
+.skin-organic section[role="region"] > header:first-child:after {
+ margin-top: -0.1rem;
+}
+
+/* Navigation links (back, cancel, etc) */
+section[role="region"].skin-organic > header:first-child > a .icon:after,
+.skin-organic section[role="region"] > header:first-child > a .icon:after,
+section[role="region"].skin-organic > header:first-child > button .icon:after,
+.skin-organic section[role="region"] > header > button .icon:after {
+ background: url(headers/images/ui/organic/negative.png) repeat-x 0 0;
+}
+
+section[role="region"].skin-organic > header:first-child menu[type="toolbar"] a:last-child,
+.skin-organic section[role="region"] > header:first-child menu[type="toolbar"] a:last-child,
+section[role="region"].skin-organic > header:first-child menu[type="toolbar"] button:last-child,
+.skin-organic section[role="region"] > header:first-child menu[type="toolbar"] button:last-child {
+ background-image: url(headers/images/ui/organic/separator.png);
+}
+
+section[role="region"].skin-organic > header,
+.skin-organic section[role="region"] > header {
+ background: #7f7f7f url(headers/images/ui/organic/subheader.png) repeat-x left bottom;
+ color: #fff;
+}
+
+/* ----------------------------------
+ * HEADERS: right-to-left tweaks
+ * ---------------------------------- */
+
+html[dir="rtl"] section[role="region"] > header:first-child h1 {
+ text-align: right;
+ margin: 0 3rem 0 0;
+}
+
+html[dir="rtl"] section[role="region"] > header:first-child button,
+html[dir="rtl"] section[role="region"] > header:first-child a {
+ left: inherit;
+ right: 0;
+}
+
+html[dir="rtl"] section[role="region"] > header:first-child > button .icon,
+html[dir="rtl"] section[role="region"] > header:first-child > a .icon {
+ margin-left: 0;
+ margin-right: -2rem;
+}
+
+html[dir="rtl"] section[role="region"] > header:first-child > button .icon:after,
+html[dir="rtl"] section[role="region"] > header:first-child > a .icon:after {
+ left: inherit;
+ right: 0;
+}
+
+html[dir="rtl"] section[role="region"] > header:first-child .icon.icon-back {
+ background-image: url(headers/images/icons/back-rtl.png);
+}
+
diff --git a/apps/system/camera/style/images/video.png b/shared/style/headers/images/icons/add.png
index 5c41986..92a5a24 100644
--- a/apps/system/camera/style/images/video.png
+++ b/shared/style/headers/images/icons/add.png
Binary files differ
diff --git a/apps/system/camera/style/images/video.png b/shared/style/headers/images/icons/back-rtl.png
index 5c41986..a71c7c0 100644
--- a/apps/system/camera/style/images/video.png
+++ b/shared/style/headers/images/icons/back-rtl.png
Binary files differ
diff --git a/apps/system/camera/style/images/video.png b/shared/style/headers/images/icons/back.png
index 5c41986..5383ee2 100644
--- a/apps/system/camera/style/images/video.png
+++ b/shared/style/headers/images/icons/back.png
Binary files differ
diff --git a/shared/style/headers/images/icons/clear.png b/shared/style/headers/images/icons/clear.png
new file mode 100644
index 0000000..9990d01
--- /dev/null
+++ b/shared/style/headers/images/icons/clear.png
Binary files differ
diff --git a/apps/system/camera/style/images/actionicon_cancel.png b/shared/style/headers/images/icons/close.png
index 5e73322..5e73322 100644
--- a/apps/system/camera/style/images/actionicon_cancel.png
+++ b/shared/style/headers/images/icons/close.png
Binary files differ
diff --git a/shared/style/headers/images/icons/compose.png b/shared/style/headers/images/icons/compose.png
new file mode 100644
index 0000000..d11379f
--- /dev/null
+++ b/shared/style/headers/images/icons/compose.png
Binary files differ
diff --git a/shared/style/headers/images/icons/edit.png b/shared/style/headers/images/icons/edit.png
new file mode 100644
index 0000000..66c7a2d
--- /dev/null
+++ b/shared/style/headers/images/icons/edit.png
Binary files differ
diff --git a/apps/system/camera/style/images/grid.png b/shared/style/headers/images/icons/menu.png
index b53bcf2..d1462c8 100644
--- a/apps/system/camera/style/images/grid.png
+++ b/shared/style/headers/images/icons/menu.png
Binary files differ
diff --git a/shared/style/headers/images/icons/reply-all.png b/shared/style/headers/images/icons/reply-all.png
new file mode 100644
index 0000000..85580d1
--- /dev/null
+++ b/shared/style/headers/images/icons/reply-all.png
Binary files differ
diff --git a/shared/style/headers/images/icons/reply.png b/shared/style/headers/images/icons/reply.png
new file mode 100644
index 0000000..ee47dfe
--- /dev/null
+++ b/shared/style/headers/images/icons/reply.png
Binary files differ
diff --git a/apps/system/camera/style/images/actionicon_cancel.png b/shared/style/headers/images/icons/send.png
index 5e73322..054ae3f 100644
--- a/apps/system/camera/style/images/actionicon_cancel.png
+++ b/shared/style/headers/images/icons/send.png
Binary files differ
diff --git a/apps/system/camera/style/images/actionicon_cancel.png b/shared/style/headers/images/icons/user.png
index 5e73322..c8abb82 100644
--- a/apps/system/camera/style/images/actionicon_cancel.png
+++ b/shared/style/headers/images/icons/user.png
Binary files differ
diff --git a/shared/style/headers/images/ui/dark/header.png b/shared/style/headers/images/ui/dark/header.png
new file mode 100644
index 0000000..75ec39b
--- /dev/null
+++ b/shared/style/headers/images/ui/dark/header.png
Binary files differ
diff --git a/shared/style/headers/images/ui/dark/negative.png b/shared/style/headers/images/ui/dark/negative.png
new file mode 100644
index 0000000..3d09e1b
--- /dev/null
+++ b/shared/style/headers/images/ui/dark/negative.png
Binary files differ
diff --git a/shared/style/headers/images/ui/dark/separator.png b/shared/style/headers/images/ui/dark/separator.png
new file mode 100644
index 0000000..c87aa17
--- /dev/null
+++ b/shared/style/headers/images/ui/dark/separator.png
Binary files differ
diff --git a/shared/style/headers/images/ui/dark/subheader.png b/shared/style/headers/images/ui/dark/subheader.png
new file mode 100644
index 0000000..4c7699f
--- /dev/null
+++ b/shared/style/headers/images/ui/dark/subheader.png
Binary files differ
diff --git a/shared/style/headers/images/ui/header.png b/shared/style/headers/images/ui/header.png
new file mode 100644
index 0000000..b79a761
--- /dev/null
+++ b/shared/style/headers/images/ui/header.png
Binary files differ
diff --git a/shared/style/headers/images/ui/negative.png b/shared/style/headers/images/ui/negative.png
new file mode 100644
index 0000000..9e9f428
--- /dev/null
+++ b/shared/style/headers/images/ui/negative.png
Binary files differ
diff --git a/shared/style/headers/images/ui/organic/header.png b/shared/style/headers/images/ui/organic/header.png
new file mode 100644
index 0000000..9d3735a
--- /dev/null
+++ b/shared/style/headers/images/ui/organic/header.png
Binary files differ
diff --git a/shared/style/headers/images/ui/organic/negative.png b/shared/style/headers/images/ui/organic/negative.png
new file mode 100644
index 0000000..b663901
--- /dev/null
+++ b/shared/style/headers/images/ui/organic/negative.png
Binary files differ
diff --git a/shared/style/headers/images/ui/organic/pattern.png b/shared/style/headers/images/ui/organic/pattern.png
new file mode 100644
index 0000000..202db19
--- /dev/null
+++ b/shared/style/headers/images/ui/organic/pattern.png
Binary files differ
diff --git a/shared/style/headers/images/ui/organic/separator.png b/shared/style/headers/images/ui/organic/separator.png
new file mode 100644
index 0000000..c87aa17
--- /dev/null
+++ b/shared/style/headers/images/ui/organic/separator.png
Binary files differ
diff --git a/shared/style/headers/images/ui/organic/subheader.png b/shared/style/headers/images/ui/organic/subheader.png
new file mode 100644
index 0000000..8df7e08
--- /dev/null
+++ b/shared/style/headers/images/ui/organic/subheader.png
Binary files differ
diff --git a/shared/style/headers/images/ui/overlay/header.png b/shared/style/headers/images/ui/overlay/header.png
new file mode 100644
index 0000000..fb3ead5
--- /dev/null
+++ b/shared/style/headers/images/ui/overlay/header.png
Binary files differ
diff --git a/shared/style/headers/images/ui/overlay/separator.png b/shared/style/headers/images/ui/overlay/separator.png
new file mode 100644
index 0000000..e02f24a
--- /dev/null
+++ b/shared/style/headers/images/ui/overlay/separator.png
Binary files differ
diff --git a/shared/style/headers/images/ui/search.png b/shared/style/headers/images/ui/search.png
new file mode 100644
index 0000000..08e7e1e
--- /dev/null
+++ b/shared/style/headers/images/ui/search.png
Binary files differ
diff --git a/shared/style/headers/images/ui/separator-large.png b/shared/style/headers/images/ui/separator-large.png
new file mode 100644
index 0000000..22dee97
--- /dev/null
+++ b/shared/style/headers/images/ui/separator-large.png
Binary files differ
diff --git a/shared/style/headers/images/ui/separator.png b/shared/style/headers/images/ui/separator.png
new file mode 100644
index 0000000..0e7f460
--- /dev/null
+++ b/shared/style/headers/images/ui/separator.png
Binary files differ
diff --git a/shared/style/headers/images/ui/shadow.png b/shared/style/headers/images/ui/shadow.png
new file mode 100644
index 0000000..aec120c
--- /dev/null
+++ b/shared/style/headers/images/ui/shadow.png
Binary files differ
diff --git a/shared/style/headers/images/ui/subheader.png b/shared/style/headers/images/ui/subheader.png
new file mode 100644
index 0000000..6bd5a23
--- /dev/null
+++ b/shared/style/headers/images/ui/subheader.png
Binary files differ
diff --git a/shared/style/headers/index.html b/shared/style/headers/index.html
new file mode 100644
index 0000000..3e402fe
--- /dev/null
+++ b/shared/style/headers/index.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Headers</title>
+ <meta name="description" content="Providing top-level navigation and inputs for the active view">
+ <!--
+ - This <style> and <link> is only used for the example preview,
+ - it isn't needed for the real use case.
+ -->
+ <link rel="stylesheet" href="../headers.css">
+ <style type="text/css">
+ html, body {
+ margin: 0;
+ padding: 0;
+ font-size: 10px;
+ background-color: #fff;
+ }
+ body {
+ background: none;
+ }
+ section[role="region"] {
+ margin-bottom: 1.5rem;
+ position: relative;
+ }
+ </style>
+</head>
+<body role="application">
+ <section role="region">
+ <header>
+ <menu type="toolbar">
+ <a href="#"><span class="icon icon-edit">edit</span></a>
+ <a href="#"><span class="icon icon-add">add</span></a>
+ </menu>
+ <h1>Messages</h1>
+ </header>
+ </section>
+
+ <section role="region">
+ <header>
+ <a href="#"><span class="icon icon-back">back</span></a>
+ <menu type="toolbar">
+ <button><span class="icon icon-edit">edit</span></button>
+ </menu>
+ <h1>Mark Alfenito</h1>
+ </header>
+ </section>
+
+ <section role="region">
+ <header>
+ <button><span class="icon icon-menu">menu</span></button>
+ <menu type="toolbar">
+ <button><span class="icon icon-edit">edit</span></button>
+ <button><span class="icon icon-add">add</span></button>
+ </menu>
+ <h1>Inbox <em>(2)</em></h1>
+ </header>
+ </section>
+
+ <section role="region">
+ <header>
+ <button><span class="icon icon-close">close</span></button>
+ <menu type="toolbar">
+ <button>done</button>
+ </menu>
+ <h1>Title</h1>
+ </header>
+ <header>
+ <h2>Subheader text</h2>
+ </header>
+ </section>
+
+ <section role="region">
+ <header>
+ <button><span class="icon icon-back">back</span></button>
+ <menu type="toolbar">
+ <button><span class="icon icon-user">user</span></button>
+ </menu>
+ <form action="#">
+ <input type="text" placeholder="search" required="required">
+ <button type="reset">Remove text</button>
+ </form>
+ </header>
+ </section>
+
+ <section role="region" class="skin-dark">
+ <header>
+ <a href="#"><span class="icon icon-back">back</span></a>
+ <h1>Song title</h1>
+ </header>
+ <header>
+ <h2>Subheader text</h2>
+ </header>
+ </section>
+
+ <section role="region" class="skin-dark">
+ <header>
+ <h1>Song title</h1>
+ </header>
+ </section>
+
+ <section role="region" class="skin-organic">
+ <header>
+ <a href="#"><span class="icon icon-back">back</span></a>
+ <h1>Settings</h1>
+ </header>
+ <header>
+ <h2>Subheader text</h2>
+ </header>
+ </section>
+
+ <div class="skin-organic">
+ <section role="region">
+ <header>
+ <h1>Settings</h1>
+ </header>
+ <header>
+ <h2>Subheader text</h2>
+ </header>
+ </section>
+
+ <section role="region">
+ <header>
+ <a href="#"><span class="icon icon-close">close</span></a>
+ <h1>Settings</h1>
+ </header>
+ <header>
+ <h2>Subheader text</h2>
+ </header>
+ </section>
+ </div>
+
+</body>
+</html>
diff --git a/shared/style/input_areas.css b/shared/style/input_areas.css
new file mode 100644
index 0000000..73cf026
--- /dev/null
+++ b/shared/style/input_areas.css
@@ -0,0 +1,309 @@
+/* ----------------------------------
+* Input areas
+* ---------------------------------- */
+input[type="text"],
+input[type="password"],
+input[type="email"],
+input[type="tel"],
+input[type="search"],
+input[type="url"],
+textarea {
+ -moz-box-sizing: border-box;
+ display: block;
+ overflow: hidden;
+ width: 100%;
+ height: 4rem;
+ resize: none;
+ padding: 0 0.8rem;
+ font: 1.4rem/4rem "MozTT", Sans-serif;
+ border: 0.1rem solid #ccc;
+ border-radius: 0.3rem;
+ box-shadow: none; /* override the box-shadow from the system (performance issue) */
+ background: #fff url(input_areas/images/ui/shadow.png) repeat-x;
+}
+
+textarea {
+ height: 10rem;
+ max-height: 10rem;
+ line-height: 2rem;
+ margin: 0;
+}
+
+/* fix for required inputs with wrong or empty value e.g. [type=email] */
+input:invalid,
+textarea:invalid {
+ border: 0.1rem solid #820000;
+ color: #b90000;
+}
+
+input[type="text"]::-moz-placeholder,
+input[type="password"]::-moz-placeholder,
+input[type="email"]::-moz-placeholder,
+input[type="tel"]::-moz-placeholder,
+input[type="search"]::-moz-placeholder,
+input[type="url"]::-moz-placeholder,
+textarea::-moz-placeholder {
+ color: #666;
+}
+
+form p {
+ position: relative;
+ margin: 0;
+}
+
+form p + p {
+ margin-top: 1rem;
+}
+
+form p input + button[type="reset"],
+form p textarea + button[type="reset"] {
+ position: absolute;
+ top: 50%;
+ right: 0;
+ width: 3.5rem;
+ height: 4rem;
+ margin: -2rem 0 0;
+ padding: 0;
+ border: none;
+ font-size: 0;
+ opacity: 0;
+ pointer-events: none;
+ background: url(input_areas/images/icons/clear.png) no-repeat 50% 50%;
+}
+
+form p input + button[type="reset"],
+form p textarea + button[type="reset"] {
+ top: 0;
+ margin: 0;
+}
+
+textarea {
+ padding: 0.8rem;
+}
+
+form p input:focus {
+ padding-right: 3.5rem;
+}
+
+form p textarea:focus {
+ padding-right: 3rem;
+}
+
+form p input:focus + button[type="reset"],
+form p textarea:focus + button[type="reset"] {
+ opacity: 1;
+ pointer-events: all;
+}
+
+/* Fieldset */
+fieldset {
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ border-radius: 0.3rem;
+ border: 0.1rem solid rgba(0,0,0,.2);
+ font: 1.4rem/1em "MozTT", Sans-serif;
+ background: #fff url(input_areas/images/ui/shadow.png) repeat-x left top;
+}
+
+fieldset + fieldset {
+ margin-top: 1.5rem;
+}
+
+fieldset legend {
+ -moz-box-sizing: border-box;
+ position: relative;
+ float: left;
+ width: 9.5rem;
+ height: 4rem;
+ padding: 0 0.5rem 0 1.8rem;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ color: #333;
+ line-height: 4rem;
+ text-transform: uppercase;
+}
+
+fieldset legend.action {
+ position: relative;
+}
+
+fieldset legend.action:after {
+ content: "";
+ position: absolute;
+ top: 1.8rem;
+ width: 0;
+ height: 0;
+ margin-left: 0.5rem;
+ border: 0.4rem solid transparent;
+ border-top-color: #333;
+}
+
+fieldset section input[type="text"],
+fieldset section input[type="password"],
+fieldset section input[type="email"],
+fieldset section input[type="tel"],
+fieldset section input[type="search"],
+fieldset section textarea {
+ height: 4rem;
+ border: none;
+ border-radius: 0;
+ background: none;
+ font-weight: 600;
+}
+
+fieldset section {
+ display: block;
+ border-left: 0.1rem solid #ddd;
+ border-radius: 0 0.3rem 0.3rem 0;
+ overflow: hidden;
+}
+
+fieldset section p {
+ margin: 0;
+ border-bottom: 0.1rem solid #ddd;
+}
+
+fieldset section p:last-child {
+ border-bottom: none;
+}
+
+/* Tidy (search/submit) */
+form[role="search"] {
+ position: relative;
+ height: 3.7rem;
+ background: #e8e8e8 url(input_areas/images/ui/background.png) repeat-x;
+}
+
+section[role="region"] > header:first-child + form[role="search"] {
+ /* increase height when underneath a header because of header's shadow */
+ padding-top: 0.3rem;
+ border-bottom: 0.1rem solid #c8c8c8;
+}
+
+form[role="search"]:after {
+ content: "";
+ position: absolute;
+ top: 100%;
+ right: 0;
+ left: 0;
+ height: 0.3rem;
+ background: url(input_areas/images/ui/shadow-search.png) repeat-x left top;
+}
+
+form[role="search"].bottom:after {
+ content: "";
+ position: absolute;
+ top: -0.3rem;
+ right: 0;
+ left: 0;
+ height: 0.3rem;
+ background: url(input_areas/images/ui/shadow-invert.png) repeat-x 0 100%;
+}
+
+section[role="region"] > header:first-child + form[role="search"]:after{
+ background: none;
+}
+
+form[role="search"] p {
+ -moz-box-sizing: border-box;
+ padding: 0.3rem 1.2rem;
+ overflow: hidden;
+}
+
+form[role="search"].full p {
+ padding: 0.3rem 2.5rem;
+}
+
+form[role="search"] p input {
+ height: 3rem;
+ border: 0.1rem solid #ababab;
+ background: #fff url(input_areas/images/ui/shadow-search.png) repeat-x left top;
+}
+
+form[role="search"] p button[type="reset"] {
+ right: 1rem;
+}
+
+form[role="search"].full p button[type="reset"] {
+ right: 2.3rem;
+}
+
+form[role="search"] button[type="submit"] {
+ float: right;
+ min-width: 6rem;
+ height: 3.7rem;
+ padding: 0 0.4rem;
+ border: none;
+ color: #333;
+ font: 600 1.4rem/3.2rem "MozTT", Sans-serif;
+ background: url(input_areas/images/ui/separator.png) no-repeat 0 50%,
+ url(input_areas/images/ui/active.png) repeat-x 0 100%;
+}
+
+form[role="search"] button[type="submit"] + p > textarea {
+ height: 3rem;
+ padding: 0.5rem 3rem 0.5rem 0.8rem;
+ line-height: 2rem;
+}
+
+form[role="search"] button[type="submit"] + p button {
+ height: 3.7rem;
+}
+
+form[role="search"].full button[type="submit"] {
+ display: none;
+}
+
+form[role="search"] button[type="submit"]:active {
+ background: #008caa;
+ text-shadow: 0.1rem 0.1rem 0 rgba(255,255,255,.3);
+}
+
+form[role="search"] button[type="submit"][disabled] {
+ color: #adadad;
+ background: url(input_areas/images/ui/separator.png) no-repeat 0 50%;
+}
+
+form p button[type="reset"]:focus,
+form p button[type="reset"]::-moz-focus-inner {
+ border: none;
+ outline: none;
+}
+
+/******************************************************************************
+ * Right-to-Left layout
+ */
+
+html[dir="rtl"] form p input:valid,
+html[dir="rtl"] form p input:valid:focus {
+ padding: 0 0.8rem 0 3.5rem;
+}
+
+html[dir="rtl"] form p textarea:valid,
+html[dir="rtl"] form p textarea:valid:focus {
+ padding: 0.8rem 0.8rem 0.8rem 3.5rem;
+}
+
+html[dir="rtl"] form p input + button[type="reset"],
+html[dir="rtl"] form p textarea + button[type="reset"] {
+ right: auto;
+ left: 0;
+}
+
+html[dir="rtl"] fieldset legend.action:after {
+ margin: 0 0.5rem 0 0;
+}
+
+html[dir="rtl"] fieldset legend {
+ padding: 0 1.8rem 0 0.5rem;
+}
+
+html[dir="rtl"] form[role="search"] button[type="submit"] + p > textarea {
+ padding: 0.5rem 0.8rem 0.5rem 3rem;
+}
+
+html[dir="rtl"] form[role="search"] button[type="submit"] + p > button {
+ left: 1rem;
+} \ No newline at end of file
diff --git a/shared/style/input_areas/images/icons/clear.png b/shared/style/input_areas/images/icons/clear.png
new file mode 100644
index 0000000..9990d01
--- /dev/null
+++ b/shared/style/input_areas/images/icons/clear.png
Binary files differ
diff --git a/shared/style/input_areas/images/ui/active.png b/shared/style/input_areas/images/ui/active.png
new file mode 100644
index 0000000..f81fb43
--- /dev/null
+++ b/shared/style/input_areas/images/ui/active.png
Binary files differ
diff --git a/shared/style/input_areas/images/ui/background.png b/shared/style/input_areas/images/ui/background.png
new file mode 100644
index 0000000..dce3df4
--- /dev/null
+++ b/shared/style/input_areas/images/ui/background.png
Binary files differ
diff --git a/shared/style/input_areas/images/ui/separator.png b/shared/style/input_areas/images/ui/separator.png
new file mode 100644
index 0000000..32bcc46
--- /dev/null
+++ b/shared/style/input_areas/images/ui/separator.png
Binary files differ
diff --git a/shared/style/input_areas/images/ui/shadow-invert.png b/shared/style/input_areas/images/ui/shadow-invert.png
new file mode 100644
index 0000000..1694bbf
--- /dev/null
+++ b/shared/style/input_areas/images/ui/shadow-invert.png
Binary files differ
diff --git a/shared/style/input_areas/images/ui/shadow-search.png b/shared/style/input_areas/images/ui/shadow-search.png
new file mode 100644
index 0000000..234e7e4
--- /dev/null
+++ b/shared/style/input_areas/images/ui/shadow-search.png
Binary files differ
diff --git a/shared/style/input_areas/images/ui/shadow.png b/shared/style/input_areas/images/ui/shadow.png
new file mode 100644
index 0000000..3739f71
--- /dev/null
+++ b/shared/style/input_areas/images/ui/shadow.png
Binary files differ
diff --git a/shared/style/input_areas/index.html b/shared/style/input_areas/index.html
new file mode 100644
index 0000000..20eafa4
--- /dev/null
+++ b/shared/style/input_areas/index.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html>
+<html dir="ltr">
+<head>
+ <meta charset="utf-8">
+
+ <title>Input areas</title>
+ <link rel="stylesheet" href="../input_areas.css">
+
+ <!--
+ This <style> and <link> is only used for the example code, is no needed for the real case use
+ -->
+ <style>
+ html, body {
+ margin: 0;
+ padding: 0;
+ font-size: 10px;
+ background-color: #fff;
+ }
+ body { background: none; }
+ h2.bb-docs {
+ padding: 0.4rem 3rem;
+ margin: -0.1rem 0 0;
+ border: solid 0.1rem #e8e8e8;
+ color: #666;
+ font-size: 1.8rem;
+ font-family: "MozTT", Sans-serif;
+ font-weight: lighter;
+ background-color: #f5f5f5;
+ }
+ form { margin: 1rem 2rem; }
+ </style>
+</head>
+
+<body role="application">
+
+ <h2 class="bb-docs">Default inputs</h2>
+ <form>
+ <p>
+ <input type="text" placeholder="Placeholder" required>
+ <button type="reset">Clear</button>
+ </p>
+
+ <p>
+ <textarea placeholder="Placeholder in textarea" required></textarea>
+ <button type="reset">Clear</button>
+ </p>
+
+ <p>
+ <input type="text" placeholder="Placeholder" value="Some written text" required>
+ <button type="reset">Clear</button>
+ </p>
+ </form>
+
+ <h2 class="bb-docs">Fieldset</h2>
+ <form>
+ <fieldset>
+ <legend class="action">Mobile</legend>
+ <section>
+ <p>
+ <input type="tel" placeholder="Phone number" required>
+ <button type="reset">Clear</button>
+ </p>
+ <p>
+ <input type="text" placeholder="Name" value="Jessy James" required>
+ <button type="reset">Clear</button>
+ </p>
+ </section>
+ </fieldset>
+
+ <fieldset>
+ <legend>Work</legend>
+ <section>
+ <p>
+ <input type="tel" placeholder="Email" required>
+ <button type="reset">Clear</button>
+ </p>
+ </section>
+ </fieldset>
+ </form>
+
+ <h2 class="bb-docs">Input forms</h2>
+
+ <!-- form used at the top of the page with fixed/absolute position and content scrolls underneath -->
+ <form role="search">
+ <button type="submit">Cancel</button>
+ <p>
+ <input type="text" placeholder="search term here..." required>
+ <button type="reset">Clear</button>
+ </p>
+ </form>
+
+ <!-- form used under a header, this form scrolls together with the content underneath the header -->
+ <section role="region">
+ <header>
+ <!-- here should be the content of the header -->
+ </header>
+ <form role="search" class="full">
+ <button type="submit">Send</button>
+ <p>
+ <input type="text" placeholder="search term here..." required>
+ <button type="reset">Clear</button>
+ </p>
+ </form>
+ </section>
+
+ <form role="search" class="bottom">
+ <button type="submit">Send</button>
+ <p>
+ <input type="text" required>
+ <button type="reset">Clear</button>
+ </p>
+ </form>
+
+ <form role="search" class="bottom">
+ <button type="submit">Send</button>
+ <p>
+ <textarea placeholder="Placeholder in textarea" required></textarea>
+ <button type="reset">Clear</button>
+ </p>
+ </form>
+
+</body>
+</html> \ No newline at end of file
diff --git a/shared/style/status.css b/shared/style/status.css
new file mode 100644
index 0000000..78dfc98
--- /dev/null
+++ b/shared/style/status.css
@@ -0,0 +1,43 @@
+/* ----------------------------------
+ * Status
+ * ---------------------------------- */
+section[role="status"] {
+ background: url(status/images/ui/pattern.png) repeat left top, url(status/images/ui/gradient.png) no-repeat left top;
+ background-size: auto auto, 100% 100%;
+ overflow: hidden;
+ position: absolute;
+ z-index: 100;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ height: 1rem;
+ min-height: 6.2rem;
+ white-space: nowrap;
+ font-family: "MozTT", Sans-serif;
+ color: #fff;
+ text-align: center;
+}
+
+section[role="status"] p {
+ display: inline-block;
+ vertical-align: middle;
+ white-space: normal;
+ font-size: 1.6rem;
+ line-height: 1.4em;
+ max-width: 75%;
+ margin: 1rem 0;
+ text-align: left;
+}
+
+section[role="status"]:before {
+ content: "";
+ height: 100%;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+section[role="status"] p strong {
+ text-transform: uppercase;
+ color: #0995b0;
+ font-weight: normal;
+} \ No newline at end of file
diff --git a/apps/system/camera/style/images/ui/gradient.png b/shared/style/status/images/ui/gradient.png
index b288545..b288545 100644
--- a/apps/system/camera/style/images/ui/gradient.png
+++ b/shared/style/status/images/ui/gradient.png
Binary files differ
diff --git a/apps/system/camera/style/images/ui/pattern.png b/shared/style/status/images/ui/pattern.png
index af03f56..af03f56 100644
--- a/apps/system/camera/style/images/ui/pattern.png
+++ b/shared/style/status/images/ui/pattern.png
Binary files differ
diff --git a/shared/style/status/index.html b/shared/style/status/index.html
new file mode 100644
index 0000000..b440de2
--- /dev/null
+++ b/shared/style/status/index.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+
+ <title>Status</title>
+ <meta name="description" content="Most common used after Multi-Select edit, to confirm user action, and optional provide 'Undo' input">
+
+ <link rel="stylesheet" href="../status.css">
+
+ <!--
+ This <style> and <link> is only used for the example code, is no needed for the real case use
+ -->
+ <style>
+ html, body {
+ margin: 0;
+ padding: 0;
+ font-size: 10px;
+ background-color: #fff;
+ }
+
+ body {
+ background: none;
+ }
+ </style>
+</head>
+
+<body role="application">
+
+ <section role="status">
+ <p>The Alarm is set for <strong>7 hours</strong> and <strong>14 minutes</strong> from now</p>
+ </section>
+
+</body>
+</html> \ No newline at end of file
diff --git a/shared/style/switches.css b/shared/style/switches.css
new file mode 100644
index 0000000..a000293
--- /dev/null
+++ b/shared/style/switches.css
@@ -0,0 +1,127 @@
+/* ----------------------------------
+ * CHECKBOXES / RADIOS
+ * ---------------------------------- */
+
+label:not([for]) {
+ display: inline-block;
+ vertical-align: middle;
+ width: 5rem;
+ height: 5rem;
+ position: relative;
+ background: none;
+}
+
+label:not([for]) input {
+ margin: 0;
+ opacity: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+
+label:not([for]) input + span {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin: -1.1rem 0 0 -1.1rem;
+ width: 2.2rem;
+ height: 2.2rem;
+ pointer-events: none;
+}
+
+label:not([for]) input[type="checkbox"] + span {
+ background: url(switches/images/check/default.png) no-repeat center top;
+}
+
+label:not([for]) input[type="radio"] + span {
+ background: url(switches/images/radio/default.png) no-repeat center top;
+}
+
+label:not([for]) input:checked + span {
+ background-position: center bottom;
+}
+
+/* 'Dangerous' switches */
+
+label:not([for]).danger input[type="checkbox"] + span {
+ background-image: url(switches/images/check/danger.png);
+}
+
+label:not([for]).danger input[type="radio"] + span {
+ background-image: url(switches/images/radio/danger.png);
+}
+
+
+/* ----------------------------------
+ * ON/OFF SWITCHES
+ * ---------------------------------- */
+
+label input[type="checkbox"][data-type="switch"] + span {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin: -1.1rem 0 0 -2.7rem;
+ width: 5.4rem;
+ height: 2.2rem;
+ pointer-events: none;
+ border: solid 1px #c2c2c2;
+ border-radius: 5.4rem;
+ overflow: hidden;
+ background: url(switches/images/switch/handler.png) no-repeat -0.2rem center;
+ background-size: auto calc(100% + 2px);
+ transition: background 0.18s ease;
+}
+
+label input[data-type="switch"] + span:after,
+label input[data-type="switch"] + span:before {
+ content: "";
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 5.4rem;
+ z-index: -1;
+ transition: transform 0.2s ease;
+}
+
+label input[data-type="switch"] + span:before {
+ right: 100%;
+ background: #00c3ea url(switches/images/switch/icon.png) no-repeat 0.5rem center;
+ background-size: auto calc(100% - 2px);
+}
+
+label input[data-type="switch"] + span:after {
+ left: 100%;
+ background: #e6e6e6;
+ transform: translateX(-5.4rem);
+}
+
+/* switch: disabled state */
+label input[data-type="switch"]:disabled + span:before,
+label input[data-type="switch"]:disabled + span:after {
+ opacity: 0.2;
+}
+
+label input[data-type="switch"]:disabled + span {
+ opacity: 0.3;
+}
+
+label input[data-type="switch"]:checked:disabled + span {
+ opacity: 1;
+ border: solid 1px #A7DBE6;
+}
+
+/* 'ON' state */
+
+label input[data-type="switch"]:checked + span {
+ border-color: #00acce;
+ background-position: 3.2rem center;
+}
+
+label input[data-type="switch"]:checked + span:before {
+ transform: translateX(5.4rem);
+}
+
+label input[data-type="switch"]:checked + span:after {
+ transform: translateX(0);
+}
+
diff --git a/shared/style/switches/images/check/danger.png b/shared/style/switches/images/check/danger.png
new file mode 100644
index 0000000..75c2f84
--- /dev/null
+++ b/shared/style/switches/images/check/danger.png
Binary files differ
diff --git a/shared/style/switches/images/check/default.png b/shared/style/switches/images/check/default.png
new file mode 100644
index 0000000..2bfc15c
--- /dev/null
+++ b/shared/style/switches/images/check/default.png
Binary files differ
diff --git a/shared/style/switches/images/radio/danger.png b/shared/style/switches/images/radio/danger.png
new file mode 100644
index 0000000..5b48b2c
--- /dev/null
+++ b/shared/style/switches/images/radio/danger.png
Binary files differ
diff --git a/shared/style/switches/images/radio/default.png b/shared/style/switches/images/radio/default.png
new file mode 100644
index 0000000..64a2515
--- /dev/null
+++ b/shared/style/switches/images/radio/default.png
Binary files differ
diff --git a/shared/style/switches/images/switch/background.png b/shared/style/switches/images/switch/background.png
new file mode 100644
index 0000000..8bf0778
--- /dev/null
+++ b/shared/style/switches/images/switch/background.png
Binary files differ
diff --git a/shared/style/switches/images/switch/handler.png b/shared/style/switches/images/switch/handler.png
new file mode 100644
index 0000000..5d014f6
--- /dev/null
+++ b/shared/style/switches/images/switch/handler.png
Binary files differ
diff --git a/shared/style/switches/images/switch/icon.png b/shared/style/switches/images/switch/icon.png
new file mode 100644
index 0000000..b8b2822
--- /dev/null
+++ b/shared/style/switches/images/switch/icon.png
Binary files differ
diff --git a/shared/style/switches/index.html b/shared/style/switches/index.html
new file mode 100644
index 0000000..c91c134
--- /dev/null
+++ b/shared/style/switches/index.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Switches</title>
+ <meta name="description" content="Activates/Deactivates a given item. It's also used to select an element within a list">
+ <link rel="stylesheet" href="../switches.css">
+ <!--
+ - This <style> element is only used for the example code;
+ - it is not required for the real use case.
+ -->
+ <style type="text/css">
+ html, body {
+ margin: 0;
+ padding: 0;
+ font-size: 10px;
+ background-color: #fff;
+ }
+ body {
+ background: none;
+ }
+ h2.bb-docs {
+ font-size: 1.8rem;
+ font-family: "MozTT", Sans-serif;
+ font-weight: lighter;
+ color: #666;
+ margin: -1px 0 0;
+ background-color: #f5f5f5;
+ padding: 0.4rem 0.4rem 0.4rem 3rem;
+ border: solid 1px #e8e8e8;
+ }
+ </style>
+</head>
+<body role="application">
+
+ <h2 class="bb-docs">Checkbox, commonly used in edit mode</h2>
+ <label>
+ <input type="checkbox" checked>
+ <span></span>
+ </label>
+
+ <label>
+ <input type="checkbox">
+ <span></span>
+ </label>
+
+ <label class="danger">
+ <input type="checkbox" checked>
+ <span></span>
+ </label>
+
+ <label class="danger">
+ <input type="checkbox">
+ <span></span>
+ </label>
+
+ <h2 class="bb-docs">Radio, commonly used in settings</h2>
+ <label>
+ <input type="radio" name="example" checked>
+ <span></span>
+ </label>
+
+ <label>
+ <input type="radio" name="example">
+ <span></span>
+ </label>
+
+ <label class="danger">
+ <input type="radio" name="example2" checked>
+ <span></span>
+ </label>
+
+ <label class="danger">
+ <input type="radio" name="example2">
+ <span></span>
+ </label>
+
+ <h2 class="bb-docs">Switch, commonly used in settings</h2>
+ <label>
+ <input type="checkbox" data-type="switch" checked>
+ <span></span>
+ </label>
+
+ <label>
+ <input type="checkbox" data-type="switch">
+ <span></span>
+ </label>
+</body>
+</html>