Introduction
With ArcGIS you can take your web maps and layers offline to reliably work with your GIS data in disconnected scenarios when connectivity is intermittent or unavailable.
To learn about the concepts, steps, data requirements and applications that support taking a map offline, refer to the appropriate documentation pages:
Once web maps have been prepared, certain applications in the ArcGIS Platform and the ArcGIS Runtime SDKs allow you to build applications that can utitlize these maps while remaining disconnected. These workflows all make use of offline map areas, which a web map owner can define in one of two ways:
- ahead of the time field workers will download these areas for offline use, known as preplanned map areas
- at the time field workers actually need to download them for use, known as on-demand map areas
Note: Only a web map owner can create offline map areas. See Create and manage offline areas for details.
Making map areas ahead of time is the recommended workflow because the map author can ensure accuracy of the offline content and packaging of offline contents occurs only once. Packaged content can be used by mutliple workers to increase performance. This guide describes how to use the ArcGIS API for Python to create preplanned offline map areas for use in custom ArcGIS Runtime SDK apps or Esri applications such as ArcGIS Field Maps.
Let's get started with the API to demonstrate preparing areas ahead of time.
Creating offline map areas
With ArcGIS API for Python, you can conveniently manage offline areas from a Map
object. The offline_areas
property accesses the OfflineMapAreaManager
object with which you can administer all aspects of offline map area management, from creating, to listing to updating. Let's take a look:
from arcgis.gis import GIS
from arcgis.map import Map
gis = GIS(profile="your_online_api_data_owner_profile")
Let's use a hydrology web map depicting the Middle Little Missouri River Sub Basin from the National Hydrology Dataset in the state of North Dakota in the United Sates.
wm_item = gis.content.get("6d7330a7f3f5438ebcbc6fe23f8abcc8")
wm_item
wm_obj = Map(item=wm_item)
You can create offline areas for a specified extent, a specific polygon, or a bookmark. You can additionally specify any layers that you need to ignore, a destination folder to store these packages and a minimum and maximum scale to which the packages need to be cached. Let's examine a couple examples:
Examining the Basemap for a Web map
When creating offline map areas, we need information about the basemap in order to package it correctly for offline use. Whether a Basemap is a Tile layer or Vector Tile layer may alter how you have to construct the argument for the tile_services
parameter. We'll show an example of packaging for a Basemap configured from a Vector Tile Layer using 3 styles based upon the same service.
Let's use the basemap
property of a Map to initialize a BasemapManger, then use the manager's basemap
property to return information about the basemap:
wm_obj.basemap.basemap
{'baseMapLayers': [{'id': 'VectorTile_8900', 'itemId': '2afe5b807fa74006be6363fd243ffb30', 'layerType': 'VectorTileLayer', 'opacity': 1.0, 'styleUrl': 'https://www.arcgis.com/sharing/rest/content/items/2afe5b807fa74006be6363fd243ffb30/resources/styles/root.json', 'title': 'Human Geography Base', 'visibility': True}, {'id': 'VectorTile_9702', 'isReference': True, 'itemId': '97fa1365da1e43eabb90d0364326bc2d', 'layerType': 'VectorTileLayer', 'opacity': 0.37, 'styleUrl': 'https://www.arcgis.com/sharing/rest/content/items/97fa1365da1e43eabb90d0364326bc2d/resources/styles/root.json', 'title': 'Human Geography Detail', 'visibility': True}, {'id': 'VectorTile_7804', 'isReference': True, 'itemId': 'ba52238d338745b1a355407ec9df6768', 'layerType': 'VectorTileLayer', 'opacity': 1.0, 'styleUrl': 'https://www.arcgis.com/sharing/rest/content/items/ba52238d338745b1a355407ec9df6768/resources/styles/root.json', 'title': 'Human Geography Label', 'visibility': True}], 'title': 'Human Geography Map'}
We now have a dictionary representation of our Human Geograpy Map
basemap. We can see it's comprised of 3 VectorTileLayers
using 3 different styles to create the map. Let's get the layer item for each basemap layer:
basemap_lyr_items = [
gis.content.get(vlyr_id["itemId"])
for vlyr_id
in wm_obj.basemap.basemap["baseMapLayers"]
]
basemap_lyr_items
[<Item title:"Human Geography Base" type:Vector Tile Layer owner:esri_vector>, <Item title:"Human Geography Detail" type:Vector Tile Layer owner:esri_vector>, <Item title:"Human Geography Label" type:Vector Tile Layer owner:esri_vector>]
We'll use the url for each of these layers to minimize the size of the vector tile package created for the offline map area.
base_url = basemap_lyr_items[0].url
detail_url = basemap_lyr_items[1].url
label_url = basemap_lyr_items[2].url
Creating offline areas with Bookmarks
The web map depicts wetlands data from subwatersheds within the Little Missouri River basin area of North Dakota. We've created bookmarks
in the web map for areas surrounding three subwatersheds:
for bookmark in wm_obj.bookmarks.list:
print(bookmark.name)
Lower Garner Creek Merrifield Creek Bear Creek
We'll create an offline area for the bookmark called Lower Garner Creek. We'll also limit the data extracted into the offline map area package to specific layers in the web map. We'll include a subwatershed boundaries layer and a wetlands layer designating features we want our field workers to update. Let's first look at the list of layers from our web map so we know how to create a list of layers for the ignore_layers
argument.
for flyr in wm_obj.content.layers:
print(f"{flyr.properties.id:<3}{flyr.properties.name}\n{' '*2}{flyr.url}")
6 Middle_Little_Missouri_Subbasin https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/6 5 Sub_Watershed Boundaries https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/5 4 Theodore_Roosevelt_National_Park https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/4 3 Middle Little Missouri Riparian Areas https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/3 2 Middle Little Missouri Wetlands https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/2 1 Populated_GNIS_Place_Names https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/1 0 Non_Populated_GNIS_Places https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/0
We only want to include layer 2, and layer 5. So let's use a list comprehension to create a list of the urls for the feature layers we want to ignore:
flyrs_to_ignore = [fl.url for fl in wm_obj.content.layers if not fl.url[-1] in ["2", "5"]]
flyrs_to_ignore
['https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/6', 'https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/4', 'https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/3', 'https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/1', 'https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/0']
We'll also set the farthest scale users will zoom out to view layers in the package with the min_scale
argument. In addition, we'll use the item_properties
parameter to specify properties for the resulting Map Area item. We'll specify the title, description, and tags for the item that gets created.
This operation can take a while as the server is packaging the contents of the web map for offline use. To view the status, you can optionally turn on the verbosity using the env
module as shown below:
from arcgis import env
env.verbose = True
Note: You must own the web map to run this operation.
offline_item_properties = {"title": "Offline area for Lower Garner Creek Subwatershed",
"tags": ["Python", "automation", "hydrology", "wetlands"],
"snippet": "Area created for updating wetlands and riparian areas."}
lower_garner_offline_item = wm_obj.offline_areas.create(area = wm_obj.bookmarks.list[0].name,
item_properties = offline_item_properties,
min_scale = 126720,
max_scale = 0,
ignore_layers=flyrs_to_ignore,
folder="Wetlands_Inventory",
tile_services=[
{
"url":base_url,
"levels":"9,10,11,12,13"
},
{
"url":detail_url,
"levels":"9,10,11,12,13"
},
{
"url":label_url,
"levels":"9,10,11,12,13"
}
])
We can now use the list()
method on the offline_areas object to examine the resulting item:
wm_obj.offline_areas.list()
[<Item title:"Offline area for Lower Garner Creek Subwatershed" type:Map Area owner:api_data_owner>]
Notice the type attribute of the item is Map Area.
Create offline areas with an Extent
We can also use an extent object to create an offline map area. An extent defines a bounding box by specifying coordinate pairs for both the lower-left and upper-right corners. You can define an extent yourself with coordinates that lie within the entire extent of the web map, or use existing features within web map layers to define an extent.
We can define a smaller area within the bounds of our data using latitude and longitude coordinates for an area we know is within our overall extent. For this dataset, we know we are in southwestern North Dakota, so we'll define an extent covering a subarea of a subwatershed named Middlefield Creek within the basin.
When using an extent for the area
argument we can use a dictionary formatted as below:
extent_coordinates = { "xmin": value, "ymin": value, "xmax": value, "ymax": value, "spatialReference": { {"wkid": value} } }
Note: The spatial reference of the extent object must match that of the Web map.
mfield_sub_extent = {
"xmin": -11528805.585,
"ymin": 5907789.4016,
"xmax": -11526060.571,
"ymax": 5909332.221,
"spatialReference": {
"wkid": 102100,
"latestWkid": 3857
}
}
offline_item_properties = {"title": "Offline area for mid-section of Merrifield Creek Subwatershed",
"tags": ["Python", "automation", "hydrology", "wetlands"],
"snippet": "Area created for updating wetlands and riparian areas in Little Missouri River basin."}
merrifield_offline_item = wm_obj.offline_areas.create(
area = mfield_sub_extent,
item_properties = offline_item_properties,
min_scale = 126720,
max_scale = 0,
ignore_layers= flyrs_to_ignore,
folder="Wetlands_Inventory",
tile_services=[
{
"url":base_url,
"levels":"9,10,11,12,13"
},
{
"url":detail_url,
"levels":"9,10,11,12,13"
},
{
"url":label_url,
"levels":"9,10,11,12,13"
}
]
)
Using the same list() method as above, we can now see that we have two Map Area items for this web map.
for wm_oma in wm_obj.offline_areas.list():
print(wm_oma)
<Item title:"Offline area for mid-section of Merrifield Creek Subwatershed" type:Map Area owner:api_data_owner> <Item title:"Offline area for Lower Garner Creek Subwatershed" type:Map Area owner:api_data_owner>
Create offline areas from a specific polygon
We can also create an offline map area using an instance of a polygon geometry to define the geographic area. We can extract a polygon from one of our layers.
wm_obj.content.layers[1].properties.name
'Sub_Watershed Boundaries'
from arcgis.geometry import Polygon
subwatershed_lyr = wm_obj.content.layers[1]
bear_ck = subwatershed_lyr.query(where="name = 'Bear Creek'").features[0]
bear_ck_poly = Polygon(bear_ck.geometry)
bear_ck_poly
offline_item_properties = {"title": "Offline area for Bear Creek Subwatershed",
"tags": ["Python", "automation", "hydrology", "wetlands"],
"snippet": "Area created for updating wetlands and riparian areas in Bear Creek subwatershed in the Little Missouri River basin."}
bear_creek_offline_item = wm_obj.offline_areas.create(
area = bear_ck_poly,
item_properties = offline_item_properties,
min_scale = 210000,
max_scale = 0,
ignore_layers= flyrs_to_ignore,
folder="Wetlands_Inventory",
tile_services=[
{
"url":base_url,
"levels":"9,10,11,12,13"
},
{
"url":detail_url,
"levels":"9,10,11,12,13"
},
{
"url":label_url,
"levels":"9,10,11,12,13"
}
]
)
We've used three different ways of specifying a geographic area to create offline mapping ares for our web map. Now it's time to inspect the Map Area items to get some additional information. As we saw earlier, the create() method results in items with a type attribute of Map Area. We can loop through our list to see this:
for oma_item in wm_obj.offline_areas.list():
print(f"{oma_item.title:65}{oma_item.type}")
Offline Area for Lower Garner Creek Subwatershed Map Area Offline area for mid-section of Merrifield Creek Subwatershed Map Area Offline area for Bear Creek Subwatershed Map Area
Inspecting offline packages created for a map area
When you create an offline map area, the data for the specified extent is bundled into one or many packages for downloading depending upon the types of layers in the web map. Feature Layers are packaged into mobile geodatabases, while tile layers and vector tile layers are bundled into tile packages and vector tile packages, respectively. See the Create and manager offline map areas documentation for details.
The packages created for a Map Area
item share a relationship with the item. The relationship type is an Area2Package
relation with a forward direction. See the Relationship types documentation for a comprehensive list of possible relations between items. Any item has the related_items()
method from which you can retrieve the items that participate in the specific relationship type:
for oma_item in wm_obj.offline_areas.list():
print(f"{oma_item.title} shares the `Area2Package` relationship with: \n{'-' * 50}")
for rel_item in oma_item.related_items('Area2Package', 'forward'):
print(f"{' '*2}{rel_item.title:55}\n{' '*4}{rel_item.type}")
print("\n")
Offline area for Bear Creek Subwatershed shares the `Area2Package` relationship with: -------------------------------------------------- VectorTileServe-f22a2b78d51b42d4a33245f3182ff08e Vector Tile Package Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas-ba4441141ab04c259fd4deb11b3388d9 SQLite Geodatabase Offline area for mid-section of Merrifield Creek Subwatershed shares the `Area2Package` relationship with: -------------------------------------------------- VectorTileServe-231eda57e6864977a0dd22aba2e66536 Vector Tile Package Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas-8568af2abb5a49f1b50cea9a4c4f6602 SQLite Geodatabase Offline area for Lower Garner Creek Subwatershed shares the `Area2Package` relationship with: -------------------------------------------------- Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas-5e781bac510e41eb857a877b6b2f752a SQLite Geodatabase VectorTileServe-b9b01536150f45969c9905e9650e5dc8 Vector Tile Package
These items are meant for use in offline applications like ArcGIS Field Maps, ArcGIS Survey123, or ArcGIS Runtime SDK applications. If needed, you can call the download()
method of the Map Area item to download the data to disk.
Updating offline areas
The layer data used to create the offline map areas may change, so keeping offline areas up to date is an important task. The update()
method of the OfflineMapAreaManager class accomplishes this. The method accepts a list of Map Area items as input. If no items are specified in the items
argument, all map area items for the web map get updated.
Below is an example of how the progress is relayed back to you when you turn on the verbosity
in the env
module.
from arcgis import env
env.verbose=True
# update all offline areas for the fire web map
wm_obj.offline_areas.update()
Submitted. Executing... Start Time: Monday, August 19, 2024 7:00:08 PM World_Basemap_v2/VectorTileServer - Check if export URL is different from service URL. World_Basemap_v2/VectorTileServer - Submitting export vector tile job:https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/exportTiles World_Basemap_v2/VectorTileServer - Job url:https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/jobs/87d4bd6a20683a98 Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Get Service Definition Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Submit sync job Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Submitting sync job:https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/synchronizeReplica Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Job url :https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/jobs/bf9eb299-15e5-492d-be66-cdeef0184c8e World_Basemap_v2/VectorTileServer - Check if export URL is different from service URL. World_Basemap_v2/VectorTileServer - Submitting export vector tile job:https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/exportTiles World_Basemap_v2/VectorTileServer - Job url:https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/jobs/92ff7dbe214b7b01 Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Get Service Definition Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Submit sync job Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Submitting sync job:https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/synchronizeReplica Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Job url :https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/jobs/22fdb7d2-3165-4eb1-b8ec-5e825b7653e8 Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Get Service Definition Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Submit sync job Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Submitting sync job:https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/synchronizeReplica Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Job url :https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer/jobs/9b0d7ca8-6f79-4f98-afb3-0fcebc27e959 World_Basemap_v2/VectorTileServer - Check if export URL is different from service URL. World_Basemap_v2/VectorTileServer - Submitting export vector tile job:https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/exportTiles World_Basemap_v2/VectorTileServer - Job url:https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/jobs/a92e57b7e1a22343 Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Add/Update package item Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - No changes for the package Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Add/Update package item Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - No changes for the package Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Add/Update package item Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - No changes for the package Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Processing complete World_Basemap_v2/VectorTileServer - Add/Update package item World_Basemap_v2/VectorTileServer - Vector tile package url:https://lws-job-results-prd0-use1.s3.amazonaws.com/export/b015ce0507e8ba7c.vtpk World_Basemap_v2/VectorTileServer - Updating package item by URL:b3566c44b5fe4304ab3853f1830ac1b1 World_Basemap_v2/VectorTileServer - Checking status for package item:b3566c44b5fe4304ab3853f1830ac1b1 Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Processing complete Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer - Processing complete World_Basemap_v2/VectorTileServer - Add/Update package item World_Basemap_v2/VectorTileServer - Vector tile package url:https://lws-job-results-prd0-use1.s3.amazonaws.com/export/a5ef2c47e476b160.vtpk World_Basemap_v2/VectorTileServer - Updating package item by URL:97710205e4ca4c88a3b8568fde6ae1da World_Basemap_v2/VectorTileServer - Checking status for package item:97710205e4ca4c88a3b8568fde6ae1da World_Basemap_v2/VectorTileServer - Add/Update package item World_Basemap_v2/VectorTileServer - Vector tile package url:https://lws-job-results-prd0-use1.s3.amazonaws.com/export/aa5576c7a46b2d0a.vtpk World_Basemap_v2/VectorTileServer - Updating package item by URL:db850e1e9e8347fa84f28ace9ac2ea8c World_Basemap_v2/VectorTileServer - Checking status for package item:db850e1e9e8347fa84f28ace9ac2ea8c World_Basemap_v2/VectorTileServer - Processing complete World_Basemap_v2/VectorTileServer - Processing complete World_Basemap_v2/VectorTileServer - Processing complete Succeeded at Monday, August 19, 2024 7:02:21 PM (Elapsed Time: 2 minutes 13 seconds) RefreshMapAreaPackage GP Job: j463ed64babed47a6932085d52ed74e32 finished successfully.
[{'source': 'https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer', 'itemId': '2cc02db5b65548549fcd829c968e4104', 'state': 'unchanged'}, {'source': 'https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer', 'itemId': 'f137c8363e25434f8a982eb84aca02e3', 'state': 'unchanged'}, {'source': 'https://services7.arcgis.com/YoUrOrgANIzATIon/arcgis/rest/services/Middle_Little_Missouri_SubBasin_Wetlands_and_Riparian_Areas/FeatureServer', 'itemId': '55ba8ad002a2462eb6411c91ba53dd91', 'state': 'unchanged'}, {'source': 'https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer', 'itemId': 'b3566c44b5fe4304ab3853f1830ac1b1', 'state': 'updated'}, {'source': 'https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer', 'itemId': '97710205e4ca4c88a3b8568fde6ae1da', 'state': 'updated'}, {'source': 'https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer', 'itemId': 'db850e1e9e8347fa84f28ace9ac2ea8c', 'state': 'updated'}]
Now any field users are all set with the latest packages for use in a disconnected setting.