diff --git a/README.md b/README.md
index 5d0bebd..797a13c 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@
     $ pub run discovery_api_client_generator:generate run_config
 
 - Diff with previous APIs and determine whether to do minor or major version
-  update.
+  update. Update CHANGELOG.md files in resources/.
 
 - Update `config.yaml` with new version and generate again.
 
diff --git a/config.yaml b/config.yaml
index 099cc31..5aff97f 100644
--- a/config.yaml
+++ b/config.yaml
@@ -1,6 +1,6 @@
 packages:
 - googleapis:
-    version: 0.4.1
+    version: 0.5.0
     author: Dart Team <misc@dartlang.org>
     homepage: http://www.dartlang.org/googleapis/
     readme: resources/README.md
@@ -38,6 +38,7 @@
     - fitness:v1  # https://developers.google.com/fitness/
     - freebase:v1  # https://developers.google.com/freebase/
     - fusiontables:v1  # https://developers.google.com/fusiontables/
+    - fusiontables:v2  # https://developers.google.com/fusiontables/
     - games:v1  # https://developers.google.com/games/services/
     - gamesManagement:v1management  # https://developers.google.com/games/services/management/api/
     - gmail:v1  # https://developers.google.com/gmail/
@@ -66,7 +67,7 @@
     - youtubeAnalytics:v1  # https://developers.google.com/youtube/analytics/
 
 - googleapis_beta:
-    version: 0.5.1
+    version: 0.5.2
     author: Dart Team <misc@dartlang.org>
     homepage: http://www.dartlang.org/googleapis/
     readme: resources/README.md
diff --git a/discovery/googleapis/adexchangebuyer__v1.3.json b/discovery/googleapis/adexchangebuyer__v1.3.json
index 198e767..d77f115 100644
--- a/discovery/googleapis/adexchangebuyer__v1.3.json
+++ b/discovery/googleapis/adexchangebuyer__v1.3.json
@@ -15,7 +15,7 @@
     "description": "Accesses your bidding-account information, submits creatives for validation, finds available direct deals, and retrieves performance reports.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/bOoBgOb8TcnyMQXYMKjYeQ3PEwA\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/C3mhoy7cA_Im1BTsfmai3rrE394\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -593,7 +593,7 @@
             }
         }
     },
-    "revision": "20141101",
+    "revision": "20141113",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/adexchangeseller__v1.1.json b/discovery/googleapis/adexchangeseller__v1.1.json
index 552ace1..7cee4da 100644
--- a/discovery/googleapis/adexchangeseller__v1.1.json
+++ b/discovery/googleapis/adexchangeseller__v1.1.json
@@ -18,7 +18,7 @@
     "description": "Gives Ad Exchange seller users access to their inventory and the ability to generate reports",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/ad-exchange/seller-rest/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/4lfJAK76tGGU0FQG-u6nIOToF_8\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/URTWx7cTAVtTHqIk_6E2hABtFIg\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -704,7 +704,7 @@
             }
         }
     },
-    "revision": "20141110",
+    "revision": "20141113",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/adexchangeseller__v2.0.json b/discovery/googleapis/adexchangeseller__v2.0.json
index 953f955..048c4e2 100644
--- a/discovery/googleapis/adexchangeseller__v2.0.json
+++ b/discovery/googleapis/adexchangeseller__v2.0.json
@@ -18,7 +18,7 @@
     "description": "Gives Ad Exchange seller users access to their inventory and the ability to generate reports",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/ad-exchange/seller-rest/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/1ev2ZwUVDXtiqyGGi2W04y856a0\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/c9S1eEwotGJ-OTuNxQHcPdDC3p4\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -654,7 +654,7 @@
             }
         }
     },
-    "revision": "20141110",
+    "revision": "20141113",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/admin__directory_v1.json b/discovery/googleapis/admin__directory_v1.json
index 1ef395f..fc54db0 100644
--- a/discovery/googleapis/admin__directory_v1.json
+++ b/discovery/googleapis/admin__directory_v1.json
@@ -69,7 +69,7 @@
     "description": "The Admin SDK Directory API lets you view and manage enterprise resources such as users and groups, administrative notifications, security features, and more.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/admin-sdk/directory/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/l5pod8YqQveewbHEUdz0VFkXQt0\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/l5pod8YqQveewbHEUdz0VFkXQt0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/admin__email_migration_v2.json b/discovery/googleapis/admin__email_migration_v2.json
index 3d8cb2b..aa72b72 100644
--- a/discovery/googleapis/admin__email_migration_v2.json
+++ b/discovery/googleapis/admin__email_migration_v2.json
@@ -14,7 +14,7 @@
     "description": "Email Migration API lets you migrate emails of users to Google backends.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/admin-sdk/email-migration/v2/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/Dam2iHq0kOgu8qnsdYB9fhgy5SY\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/Dam2iHq0kOgu8qnsdYB9fhgy5SY\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/googlemail-16.png",
         "x32": "https://www.google.com/images/icons/product/googlemail-32.png"
diff --git a/discovery/googleapis/admin__reports_v1.json b/discovery/googleapis/admin__reports_v1.json
index 0dea5b7..7a1670f 100644
--- a/discovery/googleapis/admin__reports_v1.json
+++ b/discovery/googleapis/admin__reports_v1.json
@@ -18,7 +18,7 @@
     "description": "Allows the administrators of Google Apps customers to fetch reports about the usage, collaboration, security and risk for their users.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/admin-sdk/reports/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/kJZsFL2AtxHJ8zBLAO6NO99YjxA\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/CpuGdkdyJs_gneYZvMlGLtrzsqg\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -290,7 +290,7 @@
                         "parameters": {
                             "description": "Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.",
                             "location": "query",
-                            "pattern": "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+)",
+                            "pattern": "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+)",
                             "type": "string"
                         }
                     },
@@ -331,7 +331,7 @@
                         "filters": {
                             "description": "Represents the set of filters including parameter operator value.",
                             "location": "query",
-                            "pattern": "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+)",
+                            "pattern": "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+[<,<=,==,>=,>,!=].+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+[<,<=,==,>=,>,!=].+)",
                             "type": "string"
                         },
                         "maxResults": {
@@ -349,7 +349,7 @@
                         "parameters": {
                             "description": "Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.",
                             "location": "query",
-                            "pattern": "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+)",
+                            "pattern": "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+)",
                             "type": "string"
                         },
                         "userKey": {
@@ -370,7 +370,7 @@
             }
         }
     },
-    "revision": "20141111",
+    "revision": "20141115",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Activities": {
diff --git a/discovery/googleapis/adsense__v1.4.json b/discovery/googleapis/adsense__v1.4.json
index 13bae0c..412c79d 100644
--- a/discovery/googleapis/adsense__v1.4.json
+++ b/discovery/googleapis/adsense__v1.4.json
@@ -18,7 +18,7 @@
     "description": "Gives AdSense publishers access to their inventory and the ability to generate reports",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/adsense/management/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/VkNy0KUdWO-QpiJ1DxQh7QJh7h8\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/0t5-b7AKY9Sek6OD1WTcEtSga8k\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/adsense-16.png",
         "x32": "https://www.google.com/images/icons/product/adsense-32.png"
@@ -1624,7 +1624,7 @@
             }
         }
     },
-    "revision": "20141110",
+    "revision": "20141113",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/adsensehost__v4.1.json b/discovery/googleapis/adsensehost__v4.1.json
index 53c1b53..91fb3de 100644
--- a/discovery/googleapis/adsensehost__v4.1.json
+++ b/discovery/googleapis/adsensehost__v4.1.json
@@ -15,7 +15,7 @@
     "description": "Gives AdSense Hosts access to report generation, ad code generation, and publisher management capabilities.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/adsense/host/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/FOYrMCxKo8OSJUA8inXdZ8NLQqk\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/qFrIniIOVp_HaOQ_RFFrZjcDZu4\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/adsense-16.png",
         "x32": "https://www.google.com/images/icons/product/adsense-32.png"
@@ -1072,7 +1072,7 @@
             }
         }
     },
-    "revision": "20141110",
+    "revision": "20141113",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/analytics__v3.json b/discovery/googleapis/analytics__v3.json
index 10a2fda..783f171 100644
--- a/discovery/googleapis/analytics__v3.json
+++ b/discovery/googleapis/analytics__v3.json
@@ -11,6 +11,9 @@
                 "https://www.googleapis.com/auth/analytics.manage.users": {
                     "description": "Manage Google Analytics Account users by email address"
                 },
+                "https://www.googleapis.com/auth/analytics.manage.users.readonly": {
+                    "description": "View Google Analytics user permissions"
+                },
                 "https://www.googleapis.com/auth/analytics.provision": {
                     "description": "Create a new Google Analytics account along with its default property and view"
                 },
@@ -26,7 +29,7 @@
     "description": "View and manage your Google Analytics data",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/analytics/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/FwAb1zUse29CS-ZohAWilr35TBA\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/RFkjN9VUkoQ_dosYBnbHNV8-g4c\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/analytics-16.png",
         "x32": "https://www.google.com/images/icons/product/analytics-32.png"
@@ -486,7 +489,8 @@
                                 "$ref": "EntityUserLinks"
                             },
                             "scopes": [
-                                "https://www.googleapis.com/auth/analytics.manage.users"
+                                "https://www.googleapis.com/auth/analytics.manage.users",
+                                "https://www.googleapis.com/auth/analytics.manage.users.readonly"
                             ]
                         },
                         "update": {
@@ -1975,7 +1979,8 @@
                                 "$ref": "EntityUserLinks"
                             },
                             "scopes": [
-                                "https://www.googleapis.com/auth/analytics.manage.users"
+                                "https://www.googleapis.com/auth/analytics.manage.users",
+                                "https://www.googleapis.com/auth/analytics.manage.users.readonly"
                             ]
                         },
                         "update": {
@@ -3196,7 +3201,8 @@
                                 "$ref": "EntityUserLinks"
                             },
                             "scopes": [
-                                "https://www.googleapis.com/auth/analytics.manage.users"
+                                "https://www.googleapis.com/auth/analytics.manage.users",
+                                "https://www.googleapis.com/auth/analytics.manage.users.readonly"
                             ]
                         },
                         "update": {
@@ -3297,7 +3303,7 @@
             }
         }
     },
-    "revision": "20141015",
+    "revision": "20141113",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/androidpublisher__v2.json b/discovery/googleapis/androidpublisher__v2.json
index d486b74..d543693 100644
--- a/discovery/googleapis/androidpublisher__v2.json
+++ b/discovery/googleapis/androidpublisher__v2.json
@@ -15,7 +15,7 @@
     "description": "Lets Android application developers access their Google Play accounts.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/android-publisher",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/DrMyiBR493_IBfZvqlikbYuZEB0\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/S5ypkYRuyek1RrNfMVi9ZUu1mcQ\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/android-16.png",
         "x32": "https://www.google.com/images/icons/product/android-32.png"
@@ -518,7 +518,7 @@
                                     "application/octet-stream",
                                     "application/vnd.android.package-archive"
                                 ],
-                                "maxSize": "50MB",
+                                "maxSize": "1GB",
                                 "protocols": {
                                     "resumable": {
                                         "multipart": true,
@@ -927,7 +927,9 @@
                                         "phoneScreenshots",
                                         "promoGraphic",
                                         "sevenInchScreenshots",
-                                        "tenInchScreenshots"
+                                        "tenInchScreenshots",
+                                        "tvBanner",
+                                        "tvScreenshots"
                                     ],
                                     "enumDescriptions": [
                                         "",
@@ -935,6 +937,8 @@
                                         "",
                                         "",
                                         "",
+                                        "",
+                                        "",
                                         ""
                                     ],
                                     "location": "path",
@@ -983,7 +987,9 @@
                                         "phoneScreenshots",
                                         "promoGraphic",
                                         "sevenInchScreenshots",
-                                        "tenInchScreenshots"
+                                        "tenInchScreenshots",
+                                        "tvBanner",
+                                        "tvScreenshots"
                                     ],
                                     "enumDescriptions": [
                                         "",
@@ -991,6 +997,8 @@
                                         "",
                                         "",
                                         "",
+                                        "",
+                                        "",
                                         ""
                                     ],
                                     "location": "path",
@@ -1042,7 +1050,9 @@
                                         "phoneScreenshots",
                                         "promoGraphic",
                                         "sevenInchScreenshots",
-                                        "tenInchScreenshots"
+                                        "tenInchScreenshots",
+                                        "tvBanner",
+                                        "tvScreenshots"
                                     ],
                                     "enumDescriptions": [
                                         "",
@@ -1050,6 +1060,8 @@
                                         "",
                                         "",
                                         "",
+                                        "",
+                                        "",
                                         ""
                                     ],
                                     "location": "path",
@@ -1117,7 +1129,9 @@
                                         "phoneScreenshots",
                                         "promoGraphic",
                                         "sevenInchScreenshots",
-                                        "tenInchScreenshots"
+                                        "tenInchScreenshots",
+                                        "tvBanner",
+                                        "tvScreenshots"
                                     ],
                                     "enumDescriptions": [
                                         "",
@@ -1125,6 +1139,8 @@
                                         "",
                                         "",
                                         "",
+                                        "",
+                                        "",
                                         ""
                                     ],
                                     "location": "path",
@@ -2154,7 +2170,7 @@
             }
         }
     },
-    "revision": "20141022",
+    "revision": "20141111",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Apk": {
diff --git a/discovery/googleapis/appsactivity__v1.json b/discovery/googleapis/appsactivity__v1.json
index 3208f9c..ef8de92 100644
--- a/discovery/googleapis/appsactivity__v1.json
+++ b/discovery/googleapis/appsactivity__v1.json
@@ -23,7 +23,7 @@
     "description": "Provides a historical view of activity.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/activity/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/0zYm3U9WhfJU7WORU2EWqKp-P40\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/0zYm3U9WhfJU7WORU2EWqKp-P40\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/appstate__v1.json b/discovery/googleapis/appstate__v1.json
index a5dd003..9f9a88c 100644
--- a/discovery/googleapis/appstate__v1.json
+++ b/discovery/googleapis/appstate__v1.json
@@ -15,7 +15,7 @@
     "description": "The Google App State API.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services/web/api/states",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/zJr9jRMo3k5dn95nQ6WFvqkXdu8\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/PBXzd4_N58RmzZWAFFtUcJHa-NY\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -211,7 +211,7 @@
             }
         }
     },
-    "revision": "20141112",
+    "revision": "20141118",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "GetResponse": {
diff --git a/discovery/googleapis/bigquery__v2.json b/discovery/googleapis/bigquery__v2.json
index 87582f2..9e8a8a8 100644
--- a/discovery/googleapis/bigquery__v2.json
+++ b/discovery/googleapis/bigquery__v2.json
@@ -29,7 +29,7 @@
     "description": "A data platform for customers to create, manage, share and query data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/bigquery/docs/overview",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/5IKwzbIHryxgSxtnlOLBEle-PM8\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/irflzEU1C_NxQHyDRKExZd4eUWU\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/search-16.gif",
         "x32": "https://www.google.com/images/icons/product/search-32.gif"
@@ -889,7 +889,7 @@
             }
         }
     },
-    "revision": "20141113",
+    "revision": "20141124",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Dataset": {
@@ -1501,6 +1501,10 @@
                     "format": "int64",
                     "type": "string"
                 },
+                "extract": {
+                    "$ref": "JobStatistics4",
+                    "description": "[Output-only] Statistics for an extract job."
+                },
                 "load": {
                     "$ref": "JobStatistics3",
                     "description": "[Output-only] Statistics for a load job."
@@ -1563,6 +1567,20 @@
             },
             "type": "object"
         },
+        "JobStatistics4": {
+            "id": "JobStatistics4",
+            "properties": {
+                "destinationUriFileCounts": {
+                    "description": "[Output-only] Number of files per destination URI or URI pattern specified in the extract configuration. These values will be in the same order as the URIs specified in the 'destinationUris' field.",
+                    "items": {
+                        "format": "int64",
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
         "JobStatus": {
             "id": "JobStatus",
             "properties": {
diff --git a/discovery/googleapis/blogger__v3.json b/discovery/googleapis/blogger__v3.json
index 19b9237..b3f5351 100644
--- a/discovery/googleapis/blogger__v3.json
+++ b/discovery/googleapis/blogger__v3.json
@@ -17,7 +17,7 @@
     "description": "API for access to the data within Blogger.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/blogger/docs/3.0/getting_started",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/I7tzOwxkXmchrTG5SGJOMVoYTBw\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/I7tzOwxkXmchrTG5SGJOMVoYTBw\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/blogger-16.png",
         "x32": "https://www.google.com/images/icons/product/blogger-32.png"
diff --git a/discovery/googleapis/books__v1.json b/discovery/googleapis/books__v1.json
index 466f7a0..b35df99 100644
--- a/discovery/googleapis/books__v1.json
+++ b/discovery/googleapis/books__v1.json
@@ -14,10 +14,10 @@
     "description": "Lets you search for books and manage your Google Books library.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/books/docs/v1/getting_started",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/XYINYydMW1yxY9sZ7pYYpIG24qI\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/dPbUdi5gPnAdRztFfCAhfKJ-jSQ\"",
     "icons": {
-        "x16": "http://www.google.com/images/icons/product/ebooks-16.png",
-        "x32": "http://www.google.com/images/icons/product/ebooks-32.png"
+        "x16": "https://www.google.com/images/icons/product/ebooks-16.png",
+        "x32": "https://www.google.com/images/icons/product/ebooks-32.png"
     },
     "id": "books:v1",
     "kind": "discovery#restDescription",
@@ -270,6 +270,33 @@
                 }
             }
         },
+        "dictionary": {
+            "methods": {
+                "listOfflineMetadata": {
+                    "description": "Returns a list of offline dictionary meatadata available",
+                    "httpMethod": "GET",
+                    "id": "books.dictionary.listOfflineMetadata",
+                    "parameterOrder": [
+                        "cpksver"
+                    ],
+                    "parameters": {
+                        "cpksver": {
+                            "description": "The device/version ID from which to request the data.",
+                            "location": "query",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "dictionary/listOfflineMetadata",
+                    "response": {
+                        "$ref": "Metadata"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/books"
+                    ]
+                }
+            }
+        },
         "layers": {
             "methods": {
                 "get": {
@@ -926,6 +953,11 @@
                             "httpMethod": "POST",
                             "id": "books.mylibrary.annotations.insert",
                             "parameters": {
+                                "country": {
+                                    "description": "ISO-3166-1 code to override the IP-based location.",
+                                    "location": "query",
+                                    "type": "string"
+                                },
                                 "showOnlySummaryInResponse": {
                                     "description": "Requests that only the summary of the specified layer be provided in the response.",
                                     "location": "query",
@@ -2069,7 +2101,7 @@
             }
         }
     },
-    "revision": "20140507",
+    "revision": "20141112",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Annotation": {
@@ -2999,6 +3031,43 @@
             },
             "type": "object"
         },
+        "Metadata": {
+            "id": "Metadata",
+            "properties": {
+                "items": {
+                    "description": "A list of offline dictionary metadata.",
+                    "items": {
+                        "properties": {
+                            "download_url": {
+                                "type": "string"
+                            },
+                            "encrypted_key": {
+                                "type": "string"
+                            },
+                            "language": {
+                                "type": "string"
+                            },
+                            "size": {
+                                "format": "int64",
+                                "type": "string"
+                            },
+                            "version": {
+                                "format": "int64",
+                                "type": "string"
+                            }
+                        },
+                        "type": "object"
+                    },
+                    "type": "array"
+                },
+                "kind": {
+                    "default": "dictionary#metadata",
+                    "description": "Resource type.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
         "Offers": {
             "id": "Offers",
             "properties": {
diff --git a/discovery/googleapis/calendar__v3.json b/discovery/googleapis/calendar__v3.json
index 3ae7d2b..f5ca305 100644
--- a/discovery/googleapis/calendar__v3.json
+++ b/discovery/googleapis/calendar__v3.json
@@ -17,7 +17,7 @@
     "description": "Lets you manipulate events and other calendar data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/calendar/firstapp",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ChhI5_AHHLTSiJjr6RSC6c9iFo0\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/OzLKWVbn8Y37ZwpATx3RtdJvu34\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/calendar-16.png",
         "x32": "http://www.google.com/images/icons/product/calendar-32.png"
@@ -1535,7 +1535,7 @@
             }
         }
     },
-    "revision": "20141020",
+    "revision": "20141112",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Acl": {
@@ -2238,12 +2238,6 @@
         },
         "EventAttachment": {
             "id": "EventAttachment",
-            "properties": {
-                "title": {
-                    "description": "File name.",
-                    "type": "string"
-                }
-            },
             "type": "object"
         },
         "EventAttendee": {
diff --git a/discovery/googleapis/civicinfo__us_v1.json b/discovery/googleapis/civicinfo__us_v1.json
index 747e02a..a39158d 100644
--- a/discovery/googleapis/civicinfo__us_v1.json
+++ b/discovery/googleapis/civicinfo__us_v1.json
@@ -6,7 +6,7 @@
     "description": "An API for accessing civic information.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/civic-information",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ixlTlCZ6lprJQCHG1SmuBjDXiaM\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/ixlTlCZ6lprJQCHG1SmuBjDXiaM\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/civicinfo__v1.json b/discovery/googleapis/civicinfo__v1.json
index a96fafb..d047cf7 100644
--- a/discovery/googleapis/civicinfo__v1.json
+++ b/discovery/googleapis/civicinfo__v1.json
@@ -6,7 +6,7 @@
     "description": "An API for accessing civic information.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/civic-information",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/m-jfWpr9P6EusWc0QHxRJ5ZUj0Y\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/m-jfWpr9P6EusWc0QHxRJ5ZUj0Y\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/civicinfo__v2.json b/discovery/googleapis/civicinfo__v2.json
index 96da214..1568baf 100644
--- a/discovery/googleapis/civicinfo__v2.json
+++ b/discovery/googleapis/civicinfo__v2.json
@@ -6,7 +6,7 @@
     "description": "An API for accessing civic information.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/civic-information",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/EeZdKz92LCL9J1uCQTeAts36EP0\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/EeZdKz92LCL9J1uCQTeAts36EP0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/compute__v1.json b/discovery/googleapis/compute__v1.json
index 27a3c01..6730e66 100644
--- a/discovery/googleapis/compute__v1.json
+++ b/discovery/googleapis/compute__v1.json
@@ -26,7 +26,7 @@
     "description": "API for the Google Compute Engine service.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/compute/docs/reference/latest/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/-BgSACntyU8GgmwDEZuxapImoKg\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/vsvLdIv49o6nVslSjOWeUZPaQTM\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/compute_engine-16.png",
         "x32": "https://www.google.com/images/icons/product/compute_engine-32.png"
@@ -3156,7 +3156,7 @@
                             "type": "string"
                         },
                         "project": {
-                            "description": "Name of the project scoping this request.",
+                            "description": "Project ID for this request.",
                             "location": "path",
                             "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
                             "required": true,
@@ -3190,7 +3190,7 @@
                             "type": "string"
                         },
                         "project": {
-                            "description": "Name of the project scoping this request.",
+                            "description": "Project ID for this request.",
                             "location": "path",
                             "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
                             "required": true,
@@ -3242,7 +3242,7 @@
                             "type": "string"
                         },
                         "project": {
-                            "description": "Name of the project scoping this request.",
+                            "description": "Project ID for this request.",
                             "location": "path",
                             "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
                             "required": true,
@@ -5289,7 +5289,7 @@
             }
         }
     },
-    "revision": "20141105",
+    "revision": "20141112",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AccessConfig": {
@@ -7306,7 +7306,7 @@
             "id": "MachineType",
             "properties": {
                 "creationTimestamp": {
-                    "description": "Creation timestamp in RFC3339 text format (output only).",
+                    "description": "[Output Only] Creation timestamp in RFC3339 text format.",
                     "type": "string"
                 },
                 "deprecated": {
@@ -7323,7 +7323,7 @@
                     "type": "integer"
                 },
                 "id": {
-                    "description": "Unique identifier for the resource; defined by the server (output only).",
+                    "description": "[Output Only] Unique identifier for the resource; defined by the server.",
                     "format": "uint64",
                     "type": "string"
                 },
@@ -7372,11 +7372,11 @@
                     "type": "array"
                 },
                 "selfLink": {
-                    "description": "Server defined URL for the resource (output only).",
+                    "description": "[Output Only] Server defined URL for the resource.",
                     "type": "string"
                 },
                 "zone": {
-                    "description": "Url of the zone where the machine type resides (output only).",
+                    "description": "[Output Only] The name of the zone where the machine type resides, such as us-central1-a.",
                     "type": "string"
                 }
             },
@@ -7386,7 +7386,7 @@
             "id": "MachineTypeAggregatedList",
             "properties": {
                 "id": {
-                    "description": "Unique identifier for the resource; defined by the server (output only).",
+                    "description": "[Output Only] Unique identifier for the resource; defined by the server.",
                     "type": "string"
                 },
                 "items": {
@@ -7403,7 +7403,7 @@
                     "type": "string"
                 },
                 "nextPageToken": {
-                    "description": "A token used to continue a truncated list request (output only).",
+                    "description": "[Output Only] A token used to continue a truncated list request.",
                     "type": "string"
                 },
                 "selfLink": {
@@ -7455,7 +7455,7 @@
                     "type": "array"
                 },
                 "warning": {
-                    "description": "Informational warning which replaces the list of machine types when the list is empty.",
+                    "description": "An informational warning that appears when the machine types list is empty.",
                     "properties": {
                         "code": {
                             "description": "The warning type identifier for this warning.",
diff --git a/discovery/googleapis/content__v2.json b/discovery/googleapis/content__v2.json
index c58c13f..39ce1c8 100644
--- a/discovery/googleapis/content__v2.json
+++ b/discovery/googleapis/content__v2.json
@@ -15,7 +15,7 @@
     "description": "Manage product items, inventory, and Merchant Center accounts for Google Shopping.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/shopping-content/v2/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ADeUU-V-naXCepYNgqNyFFV3IzA\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/ADeUU-V-naXCepYNgqNyFFV3IzA\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/coordinate__v1.json b/discovery/googleapis/coordinate__v1.json
index d6ddecd..d7c0a83 100644
--- a/discovery/googleapis/coordinate__v1.json
+++ b/discovery/googleapis/coordinate__v1.json
@@ -17,7 +17,7 @@
     "description": "Lets you view and manage jobs in a Coordinate team.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/coordinate/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ckefd3M0PpbhIY5DVZQuUY4ElY0\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/ckefd3M0PpbhIY5DVZQuUY4ElY0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/customsearch__v1.json b/discovery/googleapis/customsearch__v1.json
index a8b5acf..992ae56 100644
--- a/discovery/googleapis/customsearch__v1.json
+++ b/discovery/googleapis/customsearch__v1.json
@@ -5,7 +5,7 @@
     "description": "Lets you search over a website or collection of websites",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/custom-search/v1/using_rest",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/KsgpNVP8dzFmgPzAjDdH7uBJP_M\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/KsgpNVP8dzFmgPzAjDdH7uBJP_M\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/dfareporting__v1.3.json b/discovery/googleapis/dfareporting__v1.3.json
index b21a1e3..3ca76b1 100644
--- a/discovery/googleapis/dfareporting__v1.3.json
+++ b/discovery/googleapis/dfareporting__v1.3.json
@@ -14,7 +14,7 @@
     "description": "Lets you create, run and download reports.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/doubleclick-advertisers/reporting/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/MWMfv6FhKF4U3Z385phCHGvJ6w0\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/MWMfv6FhKF4U3Z385phCHGvJ6w0\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
diff --git a/discovery/googleapis/discovery__v1.json b/discovery/googleapis/discovery__v1.json
index b97ccd1..22ea2c9 100644
--- a/discovery/googleapis/discovery__v1.json
+++ b/discovery/googleapis/discovery__v1.json
@@ -5,7 +5,7 @@
     "description": "Lets you discover information about other Google APIs, such as what APIs are available, the resource and method details for each API.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/discovery/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/UNFMI_ENJ3hAFRWSi4GLSerTeFg\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/UNFMI_ENJ3hAFRWSi4GLSerTeFg\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/feature/filing_cabinet_search-g16.png",
         "x32": "http://www.google.com/images/icons/feature/filing_cabinet_search-g32.png"
diff --git a/discovery/googleapis/doubleclickbidmanager__v1.json b/discovery/googleapis/doubleclickbidmanager__v1.json
index 5602268..374f711 100644
--- a/discovery/googleapis/doubleclickbidmanager__v1.json
+++ b/discovery/googleapis/doubleclickbidmanager__v1.json
@@ -6,7 +6,7 @@
     "description": "API for viewing and managing your reports in DoubleClick Bid Manager.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/bid-manager/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/Xt8yN3tZcmaa98PBixxfMwJ2TF0\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/Xt8yN3tZcmaa98PBixxfMwJ2TF0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/doubleclicksearch__v2.json b/discovery/googleapis/doubleclicksearch__v2.json
index 18dc283..9af5042 100644
--- a/discovery/googleapis/doubleclicksearch__v2.json
+++ b/discovery/googleapis/doubleclicksearch__v2.json
@@ -14,7 +14,7 @@
     "description": "Report and modify your advertising data in DoubleClick Search (for example, campaigns, ad groups, keywords, and conversions).",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/doubleclick-search/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/olnNoM2FZr43Cdq75yAMe9UNVWM\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/iox0BHqWM54fnf8jaiSWZ0a8oFc\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -430,7 +430,7 @@
             }
         }
     },
-    "revision": "20141021",
+    "revision": "20141105",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Availability": {
@@ -512,6 +512,10 @@
                     "format": "int64",
                     "type": "string"
                 },
+                "attributionModel": {
+                    "description": "Attribution model name.",
+                    "type": "string"
+                },
                 "campaignId": {
                     "description": "DS campaign ID.",
                     "format": "int64",
@@ -545,6 +549,11 @@
                     "format": "uint64",
                     "type": "string"
                 },
+                "countMillis": {
+                    "description": "Conversion count in millis.",
+                    "format": "int64",
+                    "type": "string"
+                },
                 "criterionId": {
                     "description": "DS criterion (keyword) ID.",
                     "format": "int64",
diff --git a/discovery/googleapis/drive__v2.json b/discovery/googleapis/drive__v2.json
index 310e79d..7a32120 100644
--- a/discovery/googleapis/drive__v2.json
+++ b/discovery/googleapis/drive__v2.json
@@ -32,7 +32,7 @@
     "description": "The API to interact with Drive.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/drive/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/8QMIKXQb4gLNnKU_aYZeGRdMS08\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/YirXzybzfM1MXvxL7d6pa4HZPKc\"",
     "icons": {
         "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png",
         "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png"
@@ -1170,6 +1170,7 @@
                     },
                     "scopes": [
                         "https://www.googleapis.com/auth/drive",
+                        "https://www.googleapis.com/auth/drive.appdata",
                         "https://www.googleapis.com/auth/drive.apps.readonly",
                         "https://www.googleapis.com/auth/drive.file"
                     ]
@@ -1195,6 +1196,7 @@
                     },
                     "scopes": [
                         "https://www.googleapis.com/auth/drive",
+                        "https://www.googleapis.com/auth/drive.appdata",
                         "https://www.googleapis.com/auth/drive.apps.readonly",
                         "https://www.googleapis.com/auth/drive.file"
                     ]
@@ -2442,7 +2444,7 @@
             }
         }
     },
-    "revision": "20141024",
+    "revision": "20141112",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "About": {
diff --git a/discovery/googleapis/fitness__v1.json b/discovery/googleapis/fitness__v1.json
index a877306..0c0d242 100644
--- a/discovery/googleapis/fitness__v1.json
+++ b/discovery/googleapis/fitness__v1.json
@@ -29,7 +29,7 @@
     "description": "Google Fit API",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/fit/rest/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/yxNeceYSHu-EXL2AcqvgpSJSqDU\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/gKV_MRd0rwxyq49wtWHS6wrGc3Y\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -331,6 +331,12 @@
                                             "required": true,
                                             "type": "string"
                                         },
+                                        "limit": {
+                                            "description": "If specified, no more than this many data points will be included in the dataset. If the there are more data points in the dataset, nextPageToken will be set in the dataset response.",
+                                            "format": "int32",
+                                            "location": "query",
+                                            "type": "integer"
+                                        },
                                         "pageToken": {
                                             "description": "The continuation token, which is used to page through large datasets. To get the next page of a dataset, set this parameter to the value of nextPageToken from the previous response. Each subsequent call will yield a partial dataset with data point end timestamps that are strictly smaller than those in the previous partial response.",
                                             "location": "query",
@@ -535,7 +541,7 @@
             }
         }
     },
-    "revision": "20141107",
+    "revision": "20141115",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Application": {
diff --git a/discovery/googleapis/freebase__v1.json b/discovery/googleapis/freebase__v1.json
index f60b108..8e46256 100644
--- a/discovery/googleapis/freebase__v1.json
+++ b/discovery/googleapis/freebase__v1.json
@@ -5,7 +5,7 @@
     "description": "Find Freebase entities using textual queries and other constraints.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/freebase/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/kTDiVESNLycoqIbveRofH5KPD08\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/kTDiVESNLycoqIbveRofH5KPD08\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/freebase-16.png",
         "x32": "http://www.google.com/images/icons/product/freebase-32.png"
diff --git a/discovery/googleapis/fusiontables__v1.json b/discovery/googleapis/fusiontables__v1.json
index d165606..225cfe3 100644
--- a/discovery/googleapis/fusiontables__v1.json
+++ b/discovery/googleapis/fusiontables__v1.json
@@ -17,7 +17,7 @@
     "description": "API for working with Fusion Tables data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/fusiontables",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/TZ3s_brTRvCVQr4tORNWoh5ImIo\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/SYuz2YU3ZsxTEiZdfXCeGmNn9r0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -1127,7 +1127,7 @@
             }
         }
     },
-    "revision": "20141028",
+    "revision": "20141113",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Bucket": {
diff --git a/discovery/googleapis/gamesManagement__v1management.json b/discovery/googleapis/gamesManagement__v1management.json
index e1e5ee3..3005345 100644
--- a/discovery/googleapis/gamesManagement__v1management.json
+++ b/discovery/googleapis/gamesManagement__v1management.json
@@ -18,7 +18,7 @@
     "description": "The Management API for Google Play Game Services.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/CVNOAZtJjho8DleC2xvg9LDLK9k\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/N_g-yFLQqXlIINGLIW9YbHCU_fY\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -553,7 +553,7 @@
             }
         }
     },
-    "revision": "20141110",
+    "revision": "20141117",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AchievementResetAllResponse": {
diff --git a/discovery/googleapis/games__v1.json b/discovery/googleapis/games__v1.json
index 4bf753c..a7dc28d 100644
--- a/discovery/googleapis/games__v1.json
+++ b/discovery/googleapis/games__v1.json
@@ -21,7 +21,7 @@
     "description": "The API for Google Play Game Services.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/X205vi-lHIQPeaJAK8iraDs_fJ8\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/R502OqkJUTNmFdETN_9V-vd0e0A\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -1907,7 +1907,7 @@
             }
         }
     },
-    "revision": "20141110",
+    "revision": "20141117",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AchievementDefinition": {
diff --git a/discovery/googleapis/gmail__v1.json b/discovery/googleapis/gmail__v1.json
index 16d66d5..4c1b578 100644
--- a/discovery/googleapis/gmail__v1.json
+++ b/discovery/googleapis/gmail__v1.json
@@ -23,7 +23,7 @@
     "description": "The Gmail REST API.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/gmail/api/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/oTc1ZFBBKYPWVfuhl_PGLzRZK7E\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/oTc1ZFBBKYPWVfuhl_PGLzRZK7E\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/googlemail-16.png",
         "x32": "https://www.google.com/images/icons/product/googlemail-32.png"
diff --git a/discovery/googleapis/groupsmigration__v1.json b/discovery/googleapis/groupsmigration__v1.json
index 68ef64c..c6ed13a 100644
--- a/discovery/googleapis/groupsmigration__v1.json
+++ b/discovery/googleapis/groupsmigration__v1.json
@@ -6,7 +6,7 @@
     "description": "Groups Migration Api.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/groups-migration/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/uMvgRqCygYBIh2d3lXb4f8cUWOw\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/uMvgRqCygYBIh2d3lXb4f8cUWOw\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/discussions-16.gif",
         "x32": "http://www.google.com/images/icons/product/discussions-32.gif"
diff --git a/discovery/googleapis/groupssettings__v1.json b/discovery/googleapis/groupssettings__v1.json
index a720e98..e42de13 100644
--- a/discovery/googleapis/groupssettings__v1.json
+++ b/discovery/googleapis/groupssettings__v1.json
@@ -14,7 +14,7 @@
     "description": "Lets you manage permission levels and related settings of a group.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/groups-settings/get_started",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/-WzKihq8ROq_FQdrGtr_UG9N-4Y\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/-WzKihq8ROq_FQdrGtr_UG9N-4Y\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/identitytoolkit__v3.json b/discovery/googleapis/identitytoolkit__v3.json
index 4a83cef..c7523bf 100644
--- a/discovery/googleapis/identitytoolkit__v3.json
+++ b/discovery/googleapis/identitytoolkit__v3.json
@@ -6,7 +6,7 @@
     "description": "Help the third party sites to implement federated login.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/identity-toolkit/v3/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/jfVz2w61e7LPgd-72fW_8rrOqOc\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/jfVz2w61e7LPgd-72fW_8rrOqOc\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/licensing__v1.json b/discovery/googleapis/licensing__v1.json
index e28d9b3..9447946 100644
--- a/discovery/googleapis/licensing__v1.json
+++ b/discovery/googleapis/licensing__v1.json
@@ -5,7 +5,7 @@
     "description": "Licensing API to view and manage license for your domain.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/licensing/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/5nv4m0pBrnwpGqw9jwk2yynQNrg\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/5nv4m0pBrnwpGqw9jwk2yynQNrg\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/mapsengine__v1.json b/discovery/googleapis/mapsengine__v1.json
index e3411da..fb523db 100644
--- a/discovery/googleapis/mapsengine__v1.json
+++ b/discovery/googleapis/mapsengine__v1.json
@@ -3,10 +3,10 @@
         "oauth2": {
             "scopes": {
                 "https://www.googleapis.com/auth/mapsengine": {
-                    "description": "View and manage your Google Maps Engine data"
+                    "description": "View and manage your Google My Maps data"
                 },
                 "https://www.googleapis.com/auth/mapsengine.readonly": {
-                    "description": "View your Google Maps Engine data"
+                    "description": "View your Google My Maps data"
                 }
             }
         }
@@ -18,7 +18,7 @@
     "description": "The Google Maps Engine API allows developers to store and query geospatial vector and raster data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/maps-engine/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/S3CrUoJ8uvc_hw3CQly01B5yfX4\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/yYnxzo1XQvFrShjfnboGeo8rHnM\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/maps_engine-16.png",
         "x32": "https://www.google.com/images/icons/product/maps_engine-32.png"
@@ -2796,7 +2796,7 @@
             }
         }
     },
-    "revision": "20141030",
+    "revision": "20141126",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AcquisitionTime": {
diff --git a/discovery/googleapis/mirror__v1.json b/discovery/googleapis/mirror__v1.json
index 2df6423..8650351 100644
--- a/discovery/googleapis/mirror__v1.json
+++ b/discovery/googleapis/mirror__v1.json
@@ -17,7 +17,7 @@
     "description": "API for interacting with Glass users via the timeline.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/glass",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/4u180rbq7vJSO43GLhTeaTLsY2M\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/aKrG4GrAlr18ND3tGm9p7CAJslQ\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -735,7 +735,7 @@
             }
         }
     },
-    "revision": "20141103",
+    "revision": "20141113",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/oauth2__v2.json b/discovery/googleapis/oauth2__v2.json
index eb9d7c8..cefea82 100644
--- a/discovery/googleapis/oauth2__v2.json
+++ b/discovery/googleapis/oauth2__v2.json
@@ -23,7 +23,7 @@
     "description": "Lets you access OAuth2 protocol related APIs.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/accounts/docs/OAuth2",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/lOq-EfXYTtqcVyexIQuHUyJSWYs\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/lOq-EfXYTtqcVyexIQuHUyJSWYs\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/pagespeedonline__v1.json b/discovery/googleapis/pagespeedonline__v1.json
index 27aec64..d23e2c3 100644
--- a/discovery/googleapis/pagespeedonline__v1.json
+++ b/discovery/googleapis/pagespeedonline__v1.json
@@ -5,7 +5,7 @@
     "description": "Lets you analyze the performance of a web page and get tailored suggestions to make that page faster.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/speed/docs/insights/v1/getting_started",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/k7__axf7Cxo27tXc6R4odLjm2cg\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/lZgLUR-u9fchB55RuwjunuEyxn0\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/pagespeed-16.png",
         "x32": "https://www.google.com/images/icons/product/pagespeed-32.png"
@@ -126,7 +126,7 @@
             }
         }
     },
-    "revision": "20141027",
+    "revision": "20141114",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Result": {
diff --git a/discovery/googleapis/plusDomains__v1.json b/discovery/googleapis/plusDomains__v1.json
index f2dc510..4c8840a 100644
--- a/discovery/googleapis/plusDomains__v1.json
+++ b/discovery/googleapis/plusDomains__v1.json
@@ -41,7 +41,7 @@
     "description": "The Google+ API enables developers to build on top of the Google+ platform.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/+/domains/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/lIhHS7DoVBl_17P9dXhS2hX6ltI\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/lIhHS7DoVBl_17P9dXhS2hX6ltI\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/gplus-16.png",
         "x32": "http://www.google.com/images/icons/product/gplus-32.png"
diff --git a/discovery/googleapis/plus__v1.json b/discovery/googleapis/plus__v1.json
index 1076230..ed5075c 100644
--- a/discovery/googleapis/plus__v1.json
+++ b/discovery/googleapis/plus__v1.json
@@ -23,7 +23,7 @@
     "description": "The Google+ API enables developers to build on top of the Google+ platform.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/+/api/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/coFsFX-6G9a6OGXfgmttCenjdfM\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/coFsFX-6G9a6OGXfgmttCenjdfM\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/gplus-16.png",
         "x32": "http://www.google.com/images/icons/product/gplus-32.png"
diff --git a/discovery/googleapis/prediction__v1.6.json b/discovery/googleapis/prediction__v1.6.json
index 49d0c54..4a5f68a 100644
--- a/discovery/googleapis/prediction__v1.6.json
+++ b/discovery/googleapis/prediction__v1.6.json
@@ -23,7 +23,7 @@
     "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/prediction/docs/developer-guide",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/XH5kx6DVwHOxcDh-sCub5wYn1Ss\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/XH5kx6DVwHOxcDh-sCub5wYn1Ss\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png",
         "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png"
diff --git a/discovery/googleapis/qpxExpress__v1.json b/discovery/googleapis/qpxExpress__v1.json
index d9369b9..ba86293 100644
--- a/discovery/googleapis/qpxExpress__v1.json
+++ b/discovery/googleapis/qpxExpress__v1.json
@@ -6,7 +6,7 @@
     "description": "Lets you find the least expensive flights between an origin and a destination.",
     "discoveryVersion": "v1",
     "documentationLink": "http://developers.google.com/qpx-express",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/oRXkfQJbU2CyvfsUv40EHopWGd0\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/oRXkfQJbU2CyvfsUv40EHopWGd0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/reseller__v1.json b/discovery/googleapis/reseller__v1.json
index 4aa466b..7ba41e7 100644
--- a/discovery/googleapis/reseller__v1.json
+++ b/discovery/googleapis/reseller__v1.json
@@ -17,7 +17,7 @@
     "description": "Lets you create and manage your customers and their subscriptions.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/reseller/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/zxsqVn0Yn5fs87TjHWbdqkRtKVI\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/30NaCo58E-23RA5z0DPpA4cSWB8\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -331,12 +331,14 @@
                             "enum": [
                                 "cancel",
                                 "downgrade",
-                                "suspend"
+                                "suspend",
+                                "transfer_to_direct"
                             ],
                             "enumDescriptions": [
                                 "Cancels the subscription immediately",
                                 "Downgrades a Google Apps for Business subscription to Google Apps",
-                                "Suspends the subscriptions for 4 days before cancelling it"
+                                "Suspends the subscriptions for 4 days before cancelling it",
+                                "Transfers a subscription directly to Google"
                             ],
                             "location": "query",
                             "required": true,
@@ -522,7 +524,7 @@
             }
         }
     },
-    "revision": "20140821",
+    "revision": "20141112",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Address": {
@@ -659,7 +661,7 @@
                     "type": "string"
                 },
                 "licensedNumberOfSeats": {
-                    "description": "Read only field containing the current number of licensed seats. Resellers can utilize this field to gather insights into usage for FLEXIBLE Google-Apps subscriptions and other secondary subscriptions (e.g. Google-Vault, Drive-storage).",
+                    "description": "Read-only field containing the current number of licensed seats for FLEXIBLE Google-Apps subscriptions and secondary subscriptions such as Google-Vault and Drive-storage.",
                     "format": "int32",
                     "type": "integer"
                 },
@@ -680,6 +682,10 @@
             "description": "JSON template for a subscription.",
             "id": "Subscription",
             "properties": {
+                "billingMethod": {
+                    "description": "Billing method of this subscription.",
+                    "type": "string"
+                },
                 "creationTime": {
                     "description": "Creation time of this subscription in milliseconds since Unix epoch.",
                     "format": "int64",
diff --git a/discovery/googleapis/siteVerification__v1.json b/discovery/googleapis/siteVerification__v1.json
index 4a3fa7a..f85550d 100644
--- a/discovery/googleapis/siteVerification__v1.json
+++ b/discovery/googleapis/siteVerification__v1.json
@@ -17,7 +17,7 @@
     "description": "Lets you programatically verify ownership of websites or domains with Google.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/site-verification/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/RwYHc_wr_RI-M8LU9rCXtGC2FOg\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/RwYHc_wr_RI-M8LU9rCXtGC2FOg\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/storage__v1.json b/discovery/googleapis/storage__v1.json
index c6134bf..60ad835 100644
--- a/discovery/googleapis/storage__v1.json
+++ b/discovery/googleapis/storage__v1.json
@@ -23,7 +23,7 @@
     "description": "Lets you store and retrieve potentially-large, immutable data objects.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/storage/docs/json_api/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/acCGeSfvBu6hz26iACn2w5ZgITg\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/acCGeSfvBu6hz26iACn2w5ZgITg\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png",
         "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png"
diff --git a/discovery/googleapis/tagmanager__v1.json b/discovery/googleapis/tagmanager__v1.json
index 9bd064e..bf54a57 100644
--- a/discovery/googleapis/tagmanager__v1.json
+++ b/discovery/googleapis/tagmanager__v1.json
@@ -33,7 +33,7 @@
     "description": "API for accessing Tag Manager accounts and containers.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/tag-manager/api/v1/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/pVfb1ajMeYIw5IrU4jq20F5dMAg\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/xcGgQKwhk2lzAuNnzm2cQsk-PZM\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -1696,7 +1696,7 @@
             }
         }
     },
-    "revision": "20141024",
+    "revision": "20141112",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
@@ -1826,6 +1826,75 @@
                     },
                     "type": "array"
                 },
+                "enabledBuiltInVariable": {
+                    "description": "List of enabled built-in variables.",
+                    "items": {
+                        "enum": [
+                            "clickClasses",
+                            "clickElement",
+                            "clickId",
+                            "clickTarget",
+                            "clickText",
+                            "clickUrl",
+                            "containerId",
+                            "containerVersion",
+                            "debugMode",
+                            "errorLine",
+                            "errorMessage",
+                            "errorUrl",
+                            "event",
+                            "formClasses",
+                            "formElement",
+                            "formId",
+                            "formTarget",
+                            "formText",
+                            "formUrl",
+                            "historySource",
+                            "newHistoryFragment",
+                            "newHistoryState",
+                            "oldHistoryFragment",
+                            "oldHistoryState",
+                            "pageHostname",
+                            "pagePath",
+                            "pageUrl",
+                            "randomNumber",
+                            "referrer"
+                        ],
+                        "enumDescriptions": [
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            ""
+                        ],
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
                 "fingerprint": {
                     "description": "The fingerprint of the GTM Container as computed at storage time. This value is recomputed whenever the account is modified.",
                     "type": "string"
@@ -2428,10 +2497,6 @@
                     "description": "GTM Container ID.",
                     "type": "string"
                 },
-                "dependencies": {
-                    "$ref": "Parameter",
-                    "description": "An optional list of tag names that this tag depends on to fire. Execution of this tag will be prevented until the tags with the given names complete their execution."
-                },
                 "fingerprint": {
                     "description": "The fingerprint of the GTM Tag as computed at storage time. This value is recomputed whenever the tag is modified.",
                     "type": "string"
diff --git a/discovery/googleapis/tasks__v1.json b/discovery/googleapis/tasks__v1.json
index 421dfc5..383bda9 100644
--- a/discovery/googleapis/tasks__v1.json
+++ b/discovery/googleapis/tasks__v1.json
@@ -17,7 +17,7 @@
     "description": "Lets you manage your tasks and task lists.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/tasks/firstapp",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/KGWAadJXyIQhHMwmLhtcS8SUf-4\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/0TjOHp0h7jdMsIEfc7wjsU7Gx9k\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/tasks-16.png",
         "x32": "https://www.google.com/images/icons/product/tasks-32.png"
@@ -515,7 +515,7 @@
             }
         }
     },
-    "revision": "20141024",
+    "revision": "20141121",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Task": {
diff --git a/discovery/googleapis/translate__v2.json b/discovery/googleapis/translate__v2.json
index 11ade92..33c2286 100644
--- a/discovery/googleapis/translate__v2.json
+++ b/discovery/googleapis/translate__v2.json
@@ -5,13 +5,13 @@
     "description": "Lets you translate text from one language to another",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/translate/v2/using_rest",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/x8y0eeapVY09xfAj-RIWaraLUFU\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/1Db23Cwr9s4MHtGjE0y-QSzRBMg\"",
     "features": [
         "dataWrapper"
     ],
     "icons": {
-        "x16": "http://www.google.com/images/icons/product/translate-16.png",
-        "x32": "http://www.google.com/images/icons/product/translate-32.png"
+        "x16": "https://www.google.com/images/icons/product/translate-16.png",
+        "x32": "https://www.google.com/images/icons/product/translate-32.png"
     },
     "id": "translate:v2",
     "kind": "discovery#restDescription",
@@ -167,7 +167,7 @@
             }
         }
     },
-    "revision": "20140417",
+    "revision": "20141123",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "DetectionsListResponse": {
diff --git a/discovery/googleapis/urlshortener__v1.json b/discovery/googleapis/urlshortener__v1.json
index bef6c37..d35c735 100644
--- a/discovery/googleapis/urlshortener__v1.json
+++ b/discovery/googleapis/urlshortener__v1.json
@@ -14,7 +14,7 @@
     "description": "Lets you create, inspect, and manage goo.gl short URLs",
     "discoveryVersion": "v1",
     "documentationLink": "http://code.google.com/apis/urlshortener/v1/getting_started.html",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/T4bB77XUfbpGWn7xKXxC7yFKgeE\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/T4bB77XUfbpGWn7xKXxC7yFKgeE\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/webfonts__v1.json b/discovery/googleapis/webfonts__v1.json
index d4b7ee3..0112100 100644
--- a/discovery/googleapis/webfonts__v1.json
+++ b/discovery/googleapis/webfonts__v1.json
@@ -5,7 +5,7 @@
     "description": "The Google Fonts Developer API.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/fonts/docs/developer_api",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/uRZcMEbTVS9rWZxqJQOe5kJsXfo\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/uRZcMEbTVS9rWZxqJQOe5kJsXfo\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/feature/font_api-16.png",
         "x32": "http://www.google.com/images/icons/feature/font_api-32.gif"
diff --git a/discovery/googleapis/webmasters__v3.json b/discovery/googleapis/webmasters__v3.json
index 71db4a5..1077032 100644
--- a/discovery/googleapis/webmasters__v3.json
+++ b/discovery/googleapis/webmasters__v3.json
@@ -17,7 +17,7 @@
     "description": "Lets you view Google Webmaster Tools data for your verified sites.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/webmaster-tools/v3/welcome",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/sCAxuVQJb4ynjZxsnsm28T2muEw\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/sCAxuVQJb4ynjZxsnsm28T2muEw\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/webmaster_tools-16.png",
         "x32": "https://www.google.com/images/icons/product/webmaster_tools-32.png"
diff --git a/discovery/googleapis/youtubeAnalytics__v1.json b/discovery/googleapis/youtubeAnalytics__v1.json
index 4a4ac93..dd2c518 100644
--- a/discovery/googleapis/youtubeAnalytics__v1.json
+++ b/discovery/googleapis/youtubeAnalytics__v1.json
@@ -18,10 +18,10 @@
     "description": "Retrieve your YouTube Analytics reports.",
     "discoveryVersion": "v1",
     "documentationLink": "http://developers.google.com/youtube/analytics/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/nlDKGR94Mbaj_YAIBNSZijmIvJQ\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/eGqJquL_sNm8tPEGcWYyPXL72uM\"",
     "icons": {
-        "x16": "http://www.google.com/images/icons/product/youtube-16.png",
-        "x32": "http://www.google.com/images/icons/product/youtube-32.png"
+        "x16": "https://www.google.com/images/icons/product/youtube-16.png",
+        "x32": "https://www.google.com/images/icons/product/youtube-32.png"
     },
     "id": "youtubeAnalytics:v1",
     "kind": "discovery#restDescription",
@@ -225,96 +225,22 @@
             }
         }
     },
-    "revision": "20140724",
+    "revision": "20141124",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
-        "BatchReportDefinitionList": {
-            "description": "A paginated list of batchReportDefinition resources returned in response to a youtubeAnalytics.batchReportDefinitions.list request.",
-            "id": "BatchReportDefinitionList",
-            "properties": {
-                "items": {
-                    "description": "A list of batchReportDefinition resources that match the request criteria.",
-                    "items": {
-                        "$ref": "BatchReportDefinitionTemplate"
-                    },
-                    "type": "array"
-                },
-                "kind": {
-                    "default": "youtubeAnalytics#batchReportDefinitionList",
-                    "description": "This value specifies the type of data included in the API response. For the list method, the kind property value is youtubeAnalytics#batchReportDefinitionList.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "BatchReportDefinitionTemplate": {
-            "description": "Contains single batchReportDefinition resource.",
-            "id": "BatchReportDefinitionTemplate",
-            "properties": {
-                "defaultOutput": {
-                    "description": "Default report definition's output.",
-                    "items": {
-                        "properties": {
-                            "format": {
-                                "description": "Format of the output.",
-                                "type": "string"
-                            },
-                            "type": {
-                                "default": "cloudStorageOutput",
-                                "description": "Type of the output.",
-                                "type": "string"
-                            }
-                        },
-                        "type": "object"
-                    },
-                    "type": "array"
-                },
-                "id": {
-                    "description": "The ID that YouTube assigns and uses to uniquely identify the report definition.",
-                    "type": "string"
-                },
-                "name": {
-                    "description": "Name of the report definition.",
-                    "type": "string"
-                },
-                "status": {
-                    "description": "Status of the report definition.",
-                    "type": "string"
-                },
-                "type": {
-                    "description": "Type of the report definition.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "BatchReportList": {
-            "description": "A paginated list of batchReport resources returned in response to a youtubeAnalytics.batchReport.list request.",
-            "id": "BatchReportList",
-            "properties": {
-                "items": {
-                    "description": "A list of batchReport resources that match the request criteria.",
-                    "items": {
-                        "$ref": "BatchReportTemplate"
-                    },
-                    "type": "array"
-                },
-                "kind": {
-                    "default": "youtubeAnalytics#batchReportList",
-                    "description": "This value specifies the type of data included in the API response. For the list method, the kind property value is youtubeAnalytics#batchReportList.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "BatchReportTemplate": {
+        "BatchReport": {
             "description": "Contains single batchReport resource.",
-            "id": "BatchReportTemplate",
+            "id": "BatchReport",
             "properties": {
                 "id": {
                     "description": "The ID that YouTube assigns and uses to uniquely identify the report.",
                     "type": "string"
                 },
+                "kind": {
+                    "default": "youtubeAnalytics#batchReport",
+                    "description": "This value specifies the type of data of this item. For batch report the kind property value is youtubeAnalytics#batchReport.",
+                    "type": "string"
+                },
                 "outputs": {
                     "description": "Report outputs.",
                     "items": {
@@ -337,7 +263,7 @@
                     },
                     "type": "array"
                 },
-                "report_id": {
+                "reportId": {
                     "description": "The ID of the the report definition.",
                     "type": "string"
                 },
@@ -365,6 +291,72 @@
             },
             "type": "object"
         },
+        "BatchReportDefinition": {
+            "description": "Contains single batchReportDefinition resource.",
+            "id": "BatchReportDefinition",
+            "properties": {
+                "id": {
+                    "description": "The ID that YouTube assigns and uses to uniquely identify the report definition.",
+                    "type": "string"
+                },
+                "kind": {
+                    "default": "youtubeAnalytics#batchReportDefinition",
+                    "description": "This value specifies the type of data of this item. For batch report definition the kind property value is youtubeAnalytics#batchReportDefinition.",
+                    "type": "string"
+                },
+                "name": {
+                    "description": "Name of the report definition.",
+                    "type": "string"
+                },
+                "status": {
+                    "description": "Status of the report definition.",
+                    "type": "string"
+                },
+                "type": {
+                    "description": "Type of the report definition.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "BatchReportDefinitionList": {
+            "description": "A paginated list of batchReportDefinition resources returned in response to a youtubeAnalytics.batchReportDefinitions.list request.",
+            "id": "BatchReportDefinitionList",
+            "properties": {
+                "items": {
+                    "description": "A list of batchReportDefinition resources that match the request criteria.",
+                    "items": {
+                        "$ref": "BatchReportDefinition"
+                    },
+                    "type": "array"
+                },
+                "kind": {
+                    "default": "youtubeAnalytics#batchReportDefinitionList",
+                    "description": "This value specifies the type of data included in the API response. For the list method, the kind property value is youtubeAnalytics#batchReportDefinitionList.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "BatchReportList": {
+            "description": "A paginated list of batchReport resources returned in response to a youtubeAnalytics.batchReport.list request.",
+            "id": "BatchReportList",
+            "properties": {
+                "items": {
+                    "description": "A list of batchReport resources that match the request criteria.",
+                    "items": {
+                        "$ref": "BatchReport"
+                    },
+                    "type": "array"
+                },
+                "kind": {
+                    "default": "youtubeAnalytics#batchReportList",
+                    "description": "This value specifies the type of data included in the API response. For the list method, the kind property value is youtubeAnalytics#batchReportList.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
         "ResultTable": {
             "description": "Contains a single result table. The table is returned as an array of rows that contain the values for the cells of the table. Depending on the metric or dimension, the cell can contain a string (video ID, country code) or a number (number of views or number of likes).",
             "id": "ResultTable",
diff --git a/discovery/googleapis/youtube__v3.json b/discovery/googleapis/youtube__v3.json
index c66779f..6979ab8 100644
--- a/discovery/googleapis/youtube__v3.json
+++ b/discovery/googleapis/youtube__v3.json
@@ -27,7 +27,7 @@
     "description": "Programmatic access to YouTube features.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/youtube/v3",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/cf7c5ZG6Hlk1gdHCokdY0_0FpV8\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/zFXBHo_XoP3u5i4h1cV-J_NP6rE\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/youtube-16.png",
         "x32": "https://www.google.com/images/icons/product/youtube-32.png"
@@ -2325,7 +2325,7 @@
             }
         }
     },
-    "revision": "20141030",
+    "revision": "20141119",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AccessPolicy": {
@@ -2794,9 +2794,11 @@
                     },
                     "description": "The method or protocol used to transmit the video stream.",
                     "enum": [
+                        "dash",
                         "rtmp"
                     ],
                     "enumDescriptions": [
+                        "",
                         ""
                     ],
                     "type": "string"
@@ -7015,6 +7017,10 @@
                     "description": "Etag of this resource.",
                     "type": "string"
                 },
+                "eventId": {
+                    "description": "Serialized EventId of the request which produced this response.",
+                    "type": "string"
+                },
                 "items": {
                     "description": "A list of ratings that match the request criteria.",
                     "items": {
@@ -7026,6 +7032,10 @@
                     "default": "youtube#videoGetRatingResponse",
                     "description": "Identifies what kind of resource this is. Value: the fixed string \"youtube#videoGetRatingResponse\".",
                     "type": "string"
+                },
+                "visitorId": {
+                    "description": "The visitorId identifies the visitor.",
+                    "type": "string"
                 }
             },
             "type": "object"
diff --git a/discovery/googleapis_beta/autoscaler__v1beta2.json b/discovery/googleapis_beta/autoscaler__v1beta2.json
index 661a706..cb4ef6c 100644
--- a/discovery/googleapis_beta/autoscaler__v1beta2.json
+++ b/discovery/googleapis_beta/autoscaler__v1beta2.json
@@ -17,7 +17,7 @@
     "description": "The Google Compute Engine Autoscaler API provides autoscaling for groups of Cloud VMs.",
     "discoveryVersion": "v1",
     "documentationLink": "http://developers.google.com/compute/docs/autoscaler",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/5UzSOWUO3ZYn_NUebnJd-hd4w8w\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/5UzSOWUO3ZYn_NUebnJd-hd4w8w\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/cloudmonitoring__v2beta1.json b/discovery/googleapis_beta/cloudmonitoring__v2beta1.json
index 2b5a577..1efe033 100644
--- a/discovery/googleapis_beta/cloudmonitoring__v2beta1.json
+++ b/discovery/googleapis_beta/cloudmonitoring__v2beta1.json
@@ -15,7 +15,7 @@
     "description": "API for accessing Google Cloud and API monitoring data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/cloud-monitoring/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/wAZyG-GeB6RDgEIDYcjMLEDF9WU\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/1z1tbouoo-_VIrN2zuzSKRhsXbw\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -274,7 +274,7 @@
             }
         }
     },
-    "revision": "20141110",
+    "revision": "20141112",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "ListMetricDescriptorsRequest": {
diff --git a/discovery/googleapis_beta/container__v1beta1.json b/discovery/googleapis_beta/container__v1beta1.json
index 7819777..284ad88 100644
--- a/discovery/googleapis_beta/container__v1beta1.json
+++ b/discovery/googleapis_beta/container__v1beta1.json
@@ -13,7 +13,8 @@
     "batchPath": "batch",
     "description": "The Google Container Engine API is used for building and managing container based applications, powered by the open source Kubernetes technology.",
     "discoveryVersion": "v1",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ZrZBeDfQYPqAxFURJt0IhCOLUHQ\"",
+    "documentationLink": "https://cloud.google.com/container-engine/docs/v1beta1/",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/UyZr6gRNA--6ruBaV-TxMA3zr8s\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -345,7 +346,7 @@
             }
         }
     },
-    "revision": "20141103",
+    "revision": "20141112",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Cluster": {
@@ -379,6 +380,10 @@
                     "description": "The name of this cluster. The name must be unique within this project and zone, and can be up to 40 characters with the following restrictions:  \n- Lowercase letters, numbers, and hyphens only.\n- Must start with a letter.\n- Must end with a number or a letter.",
                     "type": "string"
                 },
+                "network": {
+                    "description": "The name of the Google Compute Engine network to which the cluster is connected.",
+                    "type": "string"
+                },
                 "nodeConfig": {
                     "$ref": "NodeConfig",
                     "description": "The machine type and image to use for all nodes in this cluster. See the descriptions of the child properties of nodeConfig."
@@ -538,6 +543,10 @@
                     ],
                     "type": "string"
                 },
+                "selfLink": {
+                    "description": "Server-defined URL for the resource.",
+                    "type": "string"
+                },
                 "status": {
                     "description": "The current status of the operation.",
                     "enum": [
diff --git a/discovery/googleapis_beta/datastore__v1beta2.json b/discovery/googleapis_beta/datastore__v1beta2.json
index 099c450..c436071 100644
--- a/discovery/googleapis_beta/datastore__v1beta2.json
+++ b/discovery/googleapis_beta/datastore__v1beta2.json
@@ -20,7 +20,7 @@
     "description": "API for accessing Google Cloud Datastore.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/datastore/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/LDhSkY4UxrCPhfQmh9G4U2uaRlU\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/LDhSkY4UxrCPhfQmh9G4U2uaRlU\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/dns__v1beta1.json b/discovery/googleapis_beta/dns__v1beta1.json
index 1db9349..ad04b84 100644
--- a/discovery/googleapis_beta/dns__v1beta1.json
+++ b/discovery/googleapis_beta/dns__v1beta1.json
@@ -20,7 +20,7 @@
     "description": "The Google Cloud DNS API provides services for configuring and serving authoritative DNS records.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/cloud-dns",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/8dmWjBwqXLQv5ILN4PEcDad3Jq8\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/8dmWjBwqXLQv5ILN4PEcDad3Jq8\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/genomics__v1beta.json b/discovery/googleapis_beta/genomics__v1beta.json
index 9772352..0031a34 100644
--- a/discovery/googleapis_beta/genomics__v1beta.json
+++ b/discovery/googleapis_beta/genomics__v1beta.json
@@ -23,7 +23,7 @@
     "description": "Provides access to Genomics data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/genomics/v1beta/reference",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/9YMXCI622MfKMEFReyjm7WXUyAw\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/B0lKb8XGh88EiJrHdugdN2knb-A\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -977,7 +977,7 @@
             }
         }
     },
-    "revision": "20141112",
+    "revision": "20141113",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Call": {
diff --git a/discovery/googleapis_beta/genomics__v1beta2.json b/discovery/googleapis_beta/genomics__v1beta2.json
index 9980cdb..666af1f 100644
--- a/discovery/googleapis_beta/genomics__v1beta2.json
+++ b/discovery/googleapis_beta/genomics__v1beta2.json
@@ -23,7 +23,7 @@
     "description": "Provides access to Genomics data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/genomics/v1beta2/reference",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/6ckREvRjfWsdC7sKQKylGfPy3tY\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/B0U3dL3DEjo6LTLutBKsRG1fa1o\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -1171,7 +1171,7 @@
             }
         }
     },
-    "revision": "20141112",
+    "revision": "20141113",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AlignReadGroupSetsRequest": {
@@ -2012,7 +2012,7 @@
             "type": "object"
         },
         "Read": {
-            "description": "A read alignment describes a linear alignment of a string of DNA to a reference sequence, in addition to metadata about the fragment (the molecule of DNA sequenced) and the read (the bases which were read by the sequencer). A read is equivalent to a line in a SAM file. A read belongs to exactly one read group and exactly one read group set.",
+            "description": "A read alignment describes a linear alignment of a string of DNA to a reference sequence, in addition to metadata about the fragment (the molecule of DNA sequenced) and the read (the bases which were read by the sequencer). A read is equivalent to a line in a SAM file. A read belongs to exactly one read group and exactly one read group set. Generating a reference-aligned sequence string When interacting with mapped reads, it's often useful to produce a string representing the local alignment of the read to reference. The following pseudocode demonstrates one way of doing this:\nout = \"\" offset = 0 for c in read.alignment.cigar { switch c.operation { case \"ALIGNMENT_MATCH\", \"SEQUENCE_MATCH\", \"SEQUENCE_MISMATCH\": out += read.alignedSequence[offset:offset+c.operationLength] offset += c.operationLength break case \"CLIP_SOFT\", \"INSERT\": offset += c.operationLength break case \"PAD\": out += repeat(\"*\", c.operationLength) break case \"DELETE\": out += repeat(\"-\", c.operationLength) break case \"SKIP\": out += repeat(\" \", c.operationLength) break case \"CLIP_HARD\": break } } return out\nConverting to SAM's CIGAR string The following pseudocode generates a SAM CIGAR string from the cigar field. Note that this is a lossy conversion (cigar.referenceSequence is lost).\ncigarMap = { \"ALIGNMENT_MATCH\": \"M\", \"INSERT\": \"I\", \"DELETE\": \"D\", \"SKIP\": \"N\", \"CLIP_SOFT\": \"S\", \"CLIP_HARD\": \"H\", \"PAD\": \"P\", \"SEQUENCE_MATCH\": \"=\", \"SEQUENCE_MISMATCH\": \"X\", } cigarStr = \"\" for c in read.alignment.cigar { cigarStr += c.operationLength + cigarMap[c.operation] } return cigarStr",
             "id": "Read",
             "properties": {
                 "alignedQuality": {
@@ -2024,7 +2024,7 @@
                     "type": "array"
                 },
                 "alignedSequence": {
-                    "description": "The bases of the read sequence contained in this alignment record. alignedSequence and alignedQuality may be shorter than the full read sequence and quality. This will occur if the alignment is part of a chimeric alignment, or if the read was trimmed. When this occurs, the CIGAR for this read will begin/end with a hard clip operator that will indicate the length of the excised sequence.",
+                    "description": "The bases of the read sequence contained in this alignment record, without CIGAR operations applied. alignedSequence and alignedQuality may be shorter than the full read sequence and quality. This will occur if the alignment is part of a chimeric alignment, or if the read was trimmed. When this occurs, the CIGAR for this read will begin/end with a hard clip operator that will indicate the length of the excised sequence.",
                     "type": "string"
                 },
                 "alignment": {
diff --git a/discovery/googleapis_beta/manager__v1beta2.json b/discovery/googleapis_beta/manager__v1beta2.json
index 87431ef..6b981d7 100644
--- a/discovery/googleapis_beta/manager__v1beta2.json
+++ b/discovery/googleapis_beta/manager__v1beta2.json
@@ -29,7 +29,7 @@
     "description": "The Deployment Manager API allows users to declaratively configure, deploy and run complex solutions on the Google Cloud Platform.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/deployment-manager/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/iGUA1MFJvjag5CPQwb2aT371UTs\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/iGUA1MFJvjag5CPQwb2aT371UTs\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/pubsub__v1beta1.json b/discovery/googleapis_beta/pubsub__v1beta1.json
index 350e960..a78a9bb 100644
--- a/discovery/googleapis_beta/pubsub__v1beta1.json
+++ b/discovery/googleapis_beta/pubsub__v1beta1.json
@@ -17,7 +17,7 @@
     "description": "Provides reliable, many-to-many, asynchronous messaging between applications.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/pubsub/v1beta1",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/xuml-cR3i2tpiaxCozjiT_iUO9o\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/xuml-cR3i2tpiaxCozjiT_iUO9o\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/search-16.gif",
         "x32": "https://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/replicapool__v1beta2.json b/discovery/googleapis_beta/replicapool__v1beta2.json
index 4ea6921..169ee89 100644
--- a/discovery/googleapis_beta/replicapool__v1beta2.json
+++ b/discovery/googleapis_beta/replicapool__v1beta2.json
@@ -20,7 +20,7 @@
     "description": "The Google Compute Engine Instance Group Manager API provides groups of homogenous Compute Engine Instances.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/compute/docs/instance-groups/manager/v1beta2",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/o8KVD2TZK8SqQA452IHtm6GW-J8\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/o8KVD2TZK8SqQA452IHtm6GW-J8\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/replicapoolupdater__v1beta1.json b/discovery/googleapis_beta/replicapoolupdater__v1beta1.json
index 95981f9..b816998 100644
--- a/discovery/googleapis_beta/replicapoolupdater__v1beta1.json
+++ b/discovery/googleapis_beta/replicapoolupdater__v1beta1.json
@@ -19,8 +19,8 @@
     "batchPath": "batch",
     "description": "The Google Compute Engine Instance Group Updater API provides services for updating groups of Compute Engine Instances.",
     "discoveryVersion": "v1",
-    "documentationLink": "https://developers.google.com/compute/docs/instance-groups/manager/v1beta2",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/MkEFbbfro6Rau0xbZXwz9DhAfqM\"",
+    "documentationLink": "https://cloud.google.com/compute/docs/instance-groups/manager/#applying_rolling_updates_using_the_updater_service",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/p4N2iDg-K9khNxP-otwGtbGFX0M\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -265,7 +265,7 @@
                     ]
                 },
                 "pause": {
-                    "description": "Called on the particular Update endpoint. Pauses the update in state from { ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state PAUSED.",
+                    "description": "Called on the particular Update endpoint. Pauses the update in state ROLLING_FORWARD or ROLLING_BACK. No-op if invoked in state PAUSED.",
                     "httpMethod": "POST",
                     "id": "replicapoolupdater.updates.pause",
                     "parameterOrder": [
@@ -307,7 +307,7 @@
                     ]
                 },
                 "rollback": {
-                    "description": "Called on the particular Update endpoint. Rolls back the update in state from { ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state ROLLED_BACK.",
+                    "description": "Called on the particular Update endpoint. Rolls back the update in state ROLLING_FORWARD or PAUSED. No-op if invoked in state ROLLED_BACK or ROLLING_BACK.",
                     "httpMethod": "POST",
                     "id": "replicapoolupdater.updates.rollback",
                     "parameterOrder": [
@@ -349,7 +349,7 @@
                     ]
                 },
                 "rollforward": {
-                    "description": "Called on the particular Update endpoint. Rolls forward the update in state from { ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state ROLLED_OUT.",
+                    "description": "Called on the particular Update endpoint. Rolls forward the update in state ROLLING_BACK or PAUSED. No-op if invoked in state ROLLED_OUT or ROLLING_FORWARD.",
                     "httpMethod": "POST",
                     "id": "replicapoolupdater.updates.rollforward",
                     "parameterOrder": [
@@ -393,7 +393,7 @@
             }
         }
     },
-    "revision": "20141105",
+    "revision": "20141117",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "InsertResponse": {
@@ -416,7 +416,7 @@
                     "type": "string"
                 },
                 "state": {
-                    "description": "State of an instance update.",
+                    "description": "State of an instance update. Possible values are:  \n- \"PENDING/code>\": The instance update is pending execution. \n- \"ROLLING_FORWARD\": The instance update is going forward. \n- \"ROLLING_BACK\": The instance update being rolled back. \n- \"PAUSED\": The instance update is temporarily paused (inactive). \n- \"ROLLED_OUT\": The instance update is finished, the instance is running the new template. \n- \"ROLLED_BACK\": The instance update is finished, the instance has been reverted to the previous template. \n- \"CANCELLED\": The instance update is paused and no longer can be resumed, undefined in which template the instance is running.",
                     "type": "string"
                 }
             },
@@ -426,12 +426,16 @@
             "description": "Resource describing a single update (rollout) of an instance group to the given template.",
             "id": "Update",
             "properties": {
+                "creationTimestamp": {
+                    "description": "[Output only] The time the update was created, in RFC3339 text format.",
+                    "type": "string"
+                },
                 "details": {
-                    "description": "[Output Only] Human-readable description of an update progress.",
+                    "description": "[Output only] Human-readable description of an update progress.",
                     "type": "string"
                 },
                 "handle": {
-                    "description": "[Output Only] Unique (in the context of a group) handle assigned to this update.",
+                    "description": "[Output only] Unique (in the context of a group) handle assigned to this update.",
                     "type": "string"
                 },
                 "instanceTemplate": {
@@ -439,7 +443,7 @@
                     "type": "string"
                 },
                 "instanceUpdates": {
-                    "description": "[Output Only] Collection of instance updates.",
+                    "description": "[Output only] Collection of instance updates.",
                     "items": {
                         "$ref": "InstanceUpdate"
                     },
@@ -459,11 +463,15 @@
                     "type": "string"
                 },
                 "state": {
-                    "description": "[Output Only] Current state of an update.",
+                    "description": "[Output only] Current state of an update. Possible values are:  \n- \"ROLLING_FORWARD\": The update is going forward. \n- \"ROLLING_BACK\": The update is being rolled back. \n- \"PAUSED\": The update is temporarily paused (inactive). \n- \"ROLLED_OUT\": The update is finished, all instances have been updated successfully. \n- \"ROLLED_BACK\": The update is finished, all instances have been reverted to the previous template. \n- \"CANCELLED\": The update is paused and no longer can be resumed, undefined how many instances are running in which template.",
                     "type": "string"
                 },
                 "targetState": {
-                    "description": "[Output Only] Requested state of an update. This is the state that the updater is moving towards. Acceptable values are:  \n- \"ROLLED_OUT\": The user has requested the update to go forward. \n- \"ROLLED_BACK\": The user has requested the update to be rolled back. \n- \"PAUSED\": The user has requested the update to be paused.\n \n- \"CANCELLED\": The user has requested the update to be cancelled. The updater service is in the process of canceling the update.",
+                    "description": "[Output only] Requested state of an update. This is the state that the updater is moving towards. Acceptable values are:  \n- \"ROLLED_OUT\": The user has requested the update to go forward. \n- \"ROLLED_BACK\": The user has requested the update to be rolled back. \n- \"PAUSED\": The user has requested the update to be paused.\n \n- \"CANCELLED\": The user has requested the update to be cancelled. The updater service is in the process of canceling the update.",
+                    "type": "string"
+                },
+                "user": {
+                    "description": "[Output only] User who requested the update, for example: user@example.com.",
                     "type": "string"
                 }
             },
diff --git a/discovery/googleapis_beta/resourceviews__v1beta1.json b/discovery/googleapis_beta/resourceviews__v1beta1.json
index aaadcbe..e33196c 100644
--- a/discovery/googleapis_beta/resourceviews__v1beta1.json
+++ b/discovery/googleapis_beta/resourceviews__v1beta1.json
@@ -26,7 +26,7 @@
     "description": "The Resource View API allows users to create and manage logical sets of Google Compute Engine instances.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/compute/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/2oa8SMSfpFS6UKNS3wRm4F3v1wQ\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/2oa8SMSfpFS6UKNS3wRm4F3v1wQ\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/resourceviews__v1beta2.json b/discovery/googleapis_beta/resourceviews__v1beta2.json
index d1d1e8c..3f39a2f 100644
--- a/discovery/googleapis_beta/resourceviews__v1beta2.json
+++ b/discovery/googleapis_beta/resourceviews__v1beta2.json
@@ -26,7 +26,7 @@
     "description": "The Resource View API allows users to create and manage logical sets of Google Compute Engine instances.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/compute/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/h07P0KWaqrcoR1sKo_9XnasKmIs\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/h07P0KWaqrcoR1sKo_9XnasKmIs\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/sqladmin__v1beta3.json b/discovery/googleapis_beta/sqladmin__v1beta3.json
index 6e1b695..08dc5bb 100644
--- a/discovery/googleapis_beta/sqladmin__v1beta3.json
+++ b/discovery/googleapis_beta/sqladmin__v1beta3.json
@@ -18,7 +18,7 @@
     "description": "API for Cloud SQL database instance management.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/cloud-sql/docs/admin-api/",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/hSgBYRvTI2dDR9CzjHO6eIajaXc\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/hSgBYRvTI2dDR9CzjHO6eIajaXc\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/taskqueue__v1beta2.json b/discovery/googleapis_beta/taskqueue__v1beta2.json
index 68a74b3..221eba9 100644
--- a/discovery/googleapis_beta/taskqueue__v1beta2.json
+++ b/discovery/googleapis_beta/taskqueue__v1beta2.json
@@ -17,7 +17,7 @@
     "description": "Lets you access a Google App Engine Pull Task Queue over REST.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/appengine/docs/python/taskqueue/rest",
-    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/LPLXKKjaGUbCz_MfuhQ-STkNWfw\"",
+    "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/LPLXKKjaGUbCz_MfuhQ-STkNWfw\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/app_engine-16.png",
         "x32": "https://www.google.com/images/icons/product/app_engine-32.png"
diff --git a/generated/googleapis/CHANGELOG.md b/generated/googleapis/CHANGELOG.md
index b4cd654..00c07c0 100644
--- a/generated/googleapis/CHANGELOG.md
+++ b/generated/googleapis/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 0.5.0
+
+* [apis] bigquery:v2: schema changes
+* [apis] books:v1: additional resource/schema changes
+* [apis] doubleclicksearch:v2: schema changes
+* [apis] fitness:v1: method changes
+* [apis] reseller:v1: schema changes
+* [apis] youtube:v3: schema changes
+* [apis-breaking] calendar:v3: Removed title from EventAttachment
+* [apis-breaking] tagmanager:v1: Removed dependencies from Tag and schema changes
+* [apis-breaking] youtubeanalytics:v1: schema changes
+
+
 ## 0.4.1
 
 * [apis] bigquery:v2: schema changes
diff --git a/generated/googleapis/README.md b/generated/googleapis/README.md
index 01baa64..91a27b4 100644
--- a/generated/googleapis/README.md
+++ b/generated/googleapis/README.md
@@ -152,7 +152,7 @@
 
 Official API documentation: https://developers.google.com/blogger/docs/3.0/getting_started
 
-#### ![Logo](http://www.google.com/images/icons/product/ebooks-16.png) Books API - books v1
+#### ![Logo](https://www.google.com/images/icons/product/ebooks-16.png) Books API - books v1
 
 Lets you search for books and manage your Google Books library.
 
@@ -254,6 +254,12 @@
 
 Official API documentation: https://developers.google.com/fusiontables
 
+#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Fusion Tables API - fusiontables v2
+
+API for working with Fusion Tables data.
+
+Official API documentation: https://developers.google.com/fusiontables
+
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Play Game Services API - games v1
 
 The API for Google Play Game Services.
@@ -374,7 +380,7 @@
 
 Official API documentation: https://developers.google.com/google-apps/tasks/firstapp
 
-#### ![Logo](http://www.google.com/images/icons/product/translate-16.png) Translate API - translate v2
+#### ![Logo](https://www.google.com/images/icons/product/translate-16.png) Translate API - translate v2
 
 Lets you translate text from one language to another
 
@@ -404,7 +410,7 @@
 
 Official API documentation: https://developers.google.com/youtube/v3
 
-#### ![Logo](http://www.google.com/images/icons/product/youtube-16.png) YouTube Analytics API - youtubeAnalytics v1
+#### ![Logo](https://www.google.com/images/icons/product/youtube-16.png) YouTube Analytics API - youtubeAnalytics v1
 
 Retrieve your YouTube Analytics reports.
 
diff --git a/generated/googleapis/lib/admin/reports_v1.dart b/generated/googleapis/lib/admin/reports_v1.dart
index ce73f05..58b2a14 100644
--- a/generated/googleapis/lib/admin/reports_v1.dart
+++ b/generated/googleapis/lib/admin/reports_v1.dart
@@ -324,7 +324,7 @@
    * [parameters] - Represents the application name, parameter name pairs to
    * fetch in csv as app_name1:param_name1, app_name2:param_name2.
    * Value must have pattern
-   * "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+)".
+   * "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+)".
    *
    * Completes with a [UsageReports].
    *
@@ -397,7 +397,7 @@
    * [filters] - Represents the set of filters including parameter operator
    * value.
    * Value must have pattern
-   * "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+[<,<=,==,>=,>,!=].+)".
+   * "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+[<,<=,==,>=,>,!=].+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+[<,<=,==,>=,>,!=].+)".
    *
    * [maxResults] - Maximum number of results to return. Maximum allowed is 1000
    *
@@ -406,7 +406,7 @@
    * [parameters] - Represents the application name, parameter name pairs to
    * fetch in csv as app_name1:param_name1, app_name2:param_name2.
    * Value must have pattern
-   * "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)):.+)".
+   * "(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+,)*(((accounts)|(cros)|(gmail)|(calendar)|(docs)|(gplus)|(sites)):.+)".
    *
    * Completes with a [UsageReports].
    *
diff --git a/generated/googleapis/lib/analytics/v3.dart b/generated/googleapis/lib/analytics/v3.dart
index d2f7693..7309eaf 100644
--- a/generated/googleapis/lib/analytics/v3.dart
+++ b/generated/googleapis/lib/analytics/v3.dart
@@ -24,6 +24,9 @@
   /** Manage Google Analytics Account users by email address */
   static const AnalyticsManageUsersScope = "https://www.googleapis.com/auth/analytics.manage.users";
 
+  /** View Google Analytics user permissions */
+  static const AnalyticsManageUsersReadonlyScope = "https://www.googleapis.com/auth/analytics.manage.users.readonly";
+
   /**
    * Create a new Google Analytics account along with its default property and
    * view
diff --git a/generated/googleapis/lib/androidpublisher/v2.dart b/generated/googleapis/lib/androidpublisher/v2.dart
index e39a907..46027cd 100644
--- a/generated/googleapis/lib/androidpublisher/v2.dart
+++ b/generated/googleapis/lib/androidpublisher/v2.dart
@@ -1225,6 +1225,8 @@
    * - "promoGraphic"
    * - "sevenInchScreenshots"
    * - "tenInchScreenshots"
+   * - "tvBanner"
+   * - "tvScreenshots"
    *
    * [imageId] - Unique identifier an image within the set of images attached to
    * this edit.
@@ -1295,6 +1297,8 @@
    * - "promoGraphic"
    * - "sevenInchScreenshots"
    * - "tenInchScreenshots"
+   * - "tvBanner"
+   * - "tvScreenshots"
    *
    * Completes with a [ImagesDeleteAllResponse].
    *
@@ -1360,6 +1364,8 @@
    * - "promoGraphic"
    * - "sevenInchScreenshots"
    * - "tenInchScreenshots"
+   * - "tvBanner"
+   * - "tvScreenshots"
    *
    * Completes with a [ImagesListResponse].
    *
@@ -1426,6 +1432,8 @@
    * - "promoGraphic"
    * - "sevenInchScreenshots"
    * - "tenInchScreenshots"
+   * - "tvBanner"
+   * - "tvScreenshots"
    *
    * [uploadMedia] - The media to upload.
    *
diff --git a/generated/googleapis/lib/bigquery/v2.dart b/generated/googleapis/lib/bigquery/v2.dart
index c932ee4..bafca41 100644
--- a/generated/googleapis/lib/bigquery/v2.dart
+++ b/generated/googleapis/lib/bigquery/v2.dart
@@ -2741,6 +2741,9 @@
    */
   core.String endTime;
 
+  /** [Output-only] Statistics for an extract job. */
+  JobStatistics4 extract;
+
   /** [Output-only] Statistics for a load job. */
   JobStatistics3 load;
 
@@ -2770,6 +2773,9 @@
     if (_json.containsKey("endTime")) {
       endTime = _json["endTime"];
     }
+    if (_json.containsKey("extract")) {
+      extract = new JobStatistics4.fromJson(_json["extract"]);
+    }
     if (_json.containsKey("load")) {
       load = new JobStatistics3.fromJson(_json["load"]);
     }
@@ -2792,6 +2798,9 @@
     if (endTime != null) {
       _json["endTime"] = endTime;
     }
+    if (extract != null) {
+      _json["extract"] = (extract).toJson();
+    }
     if (load != null) {
       _json["load"] = (load).toJson();
     }
@@ -2902,6 +2911,34 @@
 
 
 /** Not documented yet. */
+class JobStatistics4 {
+  /**
+   * [Output-only] Number of files per destination URI or URI pattern specified
+   * in the extract configuration. These values will be in the same order as the
+   * URIs specified in the 'destinationUris' field.
+   */
+  core.List<core.String> destinationUriFileCounts;
+
+
+  JobStatistics4();
+
+  JobStatistics4.fromJson(core.Map _json) {
+    if (_json.containsKey("destinationUriFileCounts")) {
+      destinationUriFileCounts = _json["destinationUriFileCounts"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (destinationUriFileCounts != null) {
+      _json["destinationUriFileCounts"] = destinationUriFileCounts;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
 class JobStatus {
   /**
    * [Output-only] Final error result of the job. If present, indicates that the
diff --git a/generated/googleapis/lib/books/v1.dart b/generated/googleapis/lib/books/v1.dart
index 619295d..427b7f0 100644
--- a/generated/googleapis/lib/books/v1.dart
+++ b/generated/googleapis/lib/books/v1.dart
@@ -23,6 +23,7 @@
 
   BookshelvesResourceApi get bookshelves => new BookshelvesResourceApi(_requester);
   CloudloadingResourceApi get cloudloading => new CloudloadingResourceApi(_requester);
+  DictionaryResourceApi get dictionary => new DictionaryResourceApi(_requester);
   LayersResourceApi get layers => new LayersResourceApi(_requester);
   MyconfigResourceApi get myconfig => new MyconfigResourceApi(_requester);
   MylibraryResourceApi get mylibrary => new MylibraryResourceApi(_requester);
@@ -365,6 +366,57 @@
 
 
 /** Not documented yet. */
+class DictionaryResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  DictionaryResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Returns a list of offline dictionary meatadata available
+   *
+   * Request parameters:
+   *
+   * [cpksver] - The device/version ID from which to request the data.
+   *
+   * Completes with a [Metadata].
+   *
+   * Completes with a [common_1.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Metadata> listOfflineMetadata(core.String cpksver) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common_1.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (cpksver == null) {
+      throw new core.ArgumentError("Parameter cpksver is required.");
+    }
+    _queryParams["cpksver"] = [cpksver];
+
+
+    _url = 'dictionary/listOfflineMetadata';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Metadata.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
 class LayersResourceApi {
   final common_internal.ApiRequester _requester;
 
@@ -1224,6 +1276,8 @@
    *
    * Request parameters:
    *
+   * [country] - ISO-3166-1 code to override the IP-based location.
+   *
    * [showOnlySummaryInResponse] - Requests that only the summary of the
    * specified layer be provided in the response.
    *
@@ -1237,7 +1291,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<Annotation> insert(Annotation request, {core.bool showOnlySummaryInResponse, core.String source}) {
+  async.Future<Annotation> insert(Annotation request, {core.String country, core.bool showOnlySummaryInResponse, core.String source}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -1248,6 +1302,9 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
+    if (country != null) {
+      _queryParams["country"] = [country];
+    }
     if (showOnlySummaryInResponse != null) {
       _queryParams["showOnlySummaryInResponse"] = ["${showOnlySummaryInResponse}"];
     }
@@ -5181,6 +5238,99 @@
 
 
 /** Not documented yet. */
+class MetadataItems {
+  /** Not documented yet. */
+  core.String downloadUrl;
+
+  /** Not documented yet. */
+  core.String encryptedKey;
+
+  /** Not documented yet. */
+  core.String language;
+
+  /** Not documented yet. */
+  core.String size;
+
+  /** Not documented yet. */
+  core.String version;
+
+
+  MetadataItems();
+
+  MetadataItems.fromJson(core.Map _json) {
+    if (_json.containsKey("download_url")) {
+      downloadUrl = _json["download_url"];
+    }
+    if (_json.containsKey("encrypted_key")) {
+      encryptedKey = _json["encrypted_key"];
+    }
+    if (_json.containsKey("language")) {
+      language = _json["language"];
+    }
+    if (_json.containsKey("size")) {
+      size = _json["size"];
+    }
+    if (_json.containsKey("version")) {
+      version = _json["version"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (downloadUrl != null) {
+      _json["download_url"] = downloadUrl;
+    }
+    if (encryptedKey != null) {
+      _json["encrypted_key"] = encryptedKey;
+    }
+    if (language != null) {
+      _json["language"] = language;
+    }
+    if (size != null) {
+      _json["size"] = size;
+    }
+    if (version != null) {
+      _json["version"] = version;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class Metadata {
+  /** A list of offline dictionary metadata. */
+  core.List<MetadataItems> items;
+
+  /** Resource type. */
+  core.String kind;
+
+
+  Metadata();
+
+  Metadata.fromJson(core.Map _json) {
+    if (_json.containsKey("items")) {
+      items = _json["items"].map((value) => new MetadataItems.fromJson(value)).toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
 class OffersItemsItems {
   /** Not documented yet. */
   core.String author;
diff --git a/generated/googleapis/lib/calendar/v3.dart b/generated/googleapis/lib/calendar/v3.dart
index c8e4b33..2e1b366 100644
--- a/generated/googleapis/lib/calendar/v3.dart
+++ b/generated/googleapis/lib/calendar/v3.dart
@@ -4034,23 +4034,14 @@
 
 /** Not documented yet. */
 class EventAttachment {
-  /** File name. */
-  core.String title;
-
 
   EventAttachment();
 
   EventAttachment.fromJson(core.Map _json) {
-    if (_json.containsKey("title")) {
-      title = _json["title"];
-    }
   }
 
   core.Map toJson() {
     var _json = new core.Map();
-    if (title != null) {
-      _json["title"] = title;
-    }
     return _json;
   }
 }
diff --git a/generated/googleapis/lib/compute/v1.dart b/generated/googleapis/lib/compute/v1.dart
index 70f212f..217115d 100644
--- a/generated/googleapis/lib/compute/v1.dart
+++ b/generated/googleapis/lib/compute/v1.dart
@@ -4466,7 +4466,7 @@
    *
    * Request parameters:
    *
-   * [project] - Name of the project scoping this request.
+   * [project] - Project ID for this request.
    * Value must have pattern
    * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
    *
@@ -4526,7 +4526,7 @@
    *
    * Request parameters:
    *
-   * [project] - Name of the project scoping this request.
+   * [project] - Project ID for this request.
    * Value must have pattern
    * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
    *
@@ -4581,7 +4581,7 @@
    *
    * Request parameters:
    *
-   * [project] - Name of the project scoping this request.
+   * [project] - Project ID for this request.
    * Value must have pattern
    * "(?:(?:[-a-z0-9]{1,63}\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))".
    *
@@ -11668,7 +11668,7 @@
 
 /** A machine type resource. */
 class MachineType {
-  /** Creation timestamp in RFC3339 text format (output only). */
+  /** [Output Only] Creation timestamp in RFC3339 text format. */
   core.String creationTimestamp;
 
   /** The deprecation status associated with this machine type. */
@@ -11681,7 +11681,7 @@
   core.int guestCpus;
 
   /**
-   * Unique identifier for the resource; defined by the server (output only).
+   * [Output Only] Unique identifier for the resource; defined by the server.
    */
   core.String id;
 
@@ -11706,10 +11706,13 @@
   /** List of extended scratch disks assigned to the instance. */
   core.List<MachineTypeScratchDisks> scratchDisks;
 
-  /** Server defined URL for the resource (output only). */
+  /** [Output Only] Server defined URL for the resource. */
   core.String selfLink;
 
-  /** Url of the zone where the machine type resides (output only). */
+  /**
+   * [Output Only] The name of the zone where the machine type resides, such as
+   * us-central1-a.
+   */
   core.String zone;
 
 
@@ -11812,7 +11815,7 @@
 /** Not documented yet. */
 class MachineTypeAggregatedList {
   /**
-   * Unique identifier for the resource; defined by the server (output only).
+   * [Output Only] Unique identifier for the resource; defined by the server.
    */
   core.String id;
 
@@ -11822,7 +11825,7 @@
   /** Type of resource. */
   core.String kind;
 
-  /** A token used to continue a truncated list request (output only). */
+  /** [Output Only] A token used to continue a truncated list request. */
   core.String nextPageToken;
 
   /** Server defined URL for this resource (output only). */
@@ -11967,8 +11970,7 @@
 
 
 /**
- * Informational warning which replaces the list of machine types when the list
- * is empty.
+ * An informational warning that appears when the machine types list is empty.
  */
 class MachineTypesScopedListWarning {
   /**
@@ -12032,8 +12034,7 @@
   core.List<MachineType> machineTypes;
 
   /**
-   * Informational warning which replaces the list of machine types when the
-   * list is empty.
+   * An informational warning that appears when the machine types list is empty.
    */
   MachineTypesScopedListWarning warning;
 
diff --git a/generated/googleapis/lib/doubleclicksearch/v2.dart b/generated/googleapis/lib/doubleclicksearch/v2.dart
index 2b6ef70..a3bf376 100644
--- a/generated/googleapis/lib/doubleclicksearch/v2.dart
+++ b/generated/googleapis/lib/doubleclicksearch/v2.dart
@@ -684,6 +684,9 @@
   /** DS agency ID. */
   core.String agencyId;
 
+  /** Attribution model name. */
+  core.String attributionModel;
+
   /** DS campaign ID. */
   core.String campaignId;
 
@@ -701,6 +704,9 @@
   /** The time at which the conversion took place, in epoch millis UTC. */
   core.String conversionTimestamp;
 
+  /** Conversion count in millis. */
+  core.String countMillis;
+
   /** DS criterion (keyword) ID. */
   core.String criterionId;
 
@@ -780,6 +786,9 @@
     if (_json.containsKey("agencyId")) {
       agencyId = _json["agencyId"];
     }
+    if (_json.containsKey("attributionModel")) {
+      attributionModel = _json["attributionModel"];
+    }
     if (_json.containsKey("campaignId")) {
       campaignId = _json["campaignId"];
     }
@@ -795,6 +804,9 @@
     if (_json.containsKey("conversionTimestamp")) {
       conversionTimestamp = _json["conversionTimestamp"];
     }
+    if (_json.containsKey("countMillis")) {
+      countMillis = _json["countMillis"];
+    }
     if (_json.containsKey("criterionId")) {
       criterionId = _json["criterionId"];
     }
@@ -853,6 +865,9 @@
     if (agencyId != null) {
       _json["agencyId"] = agencyId;
     }
+    if (attributionModel != null) {
+      _json["attributionModel"] = attributionModel;
+    }
     if (campaignId != null) {
       _json["campaignId"] = campaignId;
     }
@@ -868,6 +883,9 @@
     if (conversionTimestamp != null) {
       _json["conversionTimestamp"] = conversionTimestamp;
     }
+    if (countMillis != null) {
+      _json["countMillis"] = countMillis;
+    }
     if (criterionId != null) {
       _json["criterionId"] = criterionId;
     }
diff --git a/generated/googleapis/lib/fitness/v1.dart b/generated/googleapis/lib/fitness/v1.dart
index 330f8b7..7657f79 100644
--- a/generated/googleapis/lib/fitness/v1.dart
+++ b/generated/googleapis/lib/fitness/v1.dart
@@ -427,6 +427,10 @@
    * from the epoch. The ID is formatted like: "startTime-endTime" where
    * startTime and endTime are 64 bit integers.
    *
+   * [limit] - If specified, no more than this many data points will be included
+   * in the dataset. If the there are more data points in the dataset,
+   * nextPageToken will be set in the dataset response.
+   *
    * [pageToken] - The continuation token, which is used to page through large
    * datasets. To get the next page of a dataset, set this parameter to the
    * value of nextPageToken from the previous response. Each subsequent call
@@ -441,7 +445,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<Dataset> get(core.String userId, core.String dataSourceId, core.String datasetId, {core.String pageToken}) {
+  async.Future<Dataset> get(core.String userId, core.String dataSourceId, core.String datasetId, {core.int limit, core.String pageToken}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -458,6 +462,9 @@
     if (datasetId == null) {
       throw new core.ArgumentError("Parameter datasetId is required.");
     }
+    if (limit != null) {
+      _queryParams["limit"] = ["${limit}"];
+    }
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
diff --git a/generated/googleapis/lib/mapsengine/v1.dart b/generated/googleapis/lib/mapsengine/v1.dart
index a0cf268..d0bc6b8 100644
--- a/generated/googleapis/lib/mapsengine/v1.dart
+++ b/generated/googleapis/lib/mapsengine/v1.dart
@@ -18,10 +18,10 @@
  * vector and raster data.
  */
 class MapsengineApi {
-  /** View and manage your Google Maps Engine data */
+  /** View and manage your Google My Maps data */
   static const MapsengineScope = "https://www.googleapis.com/auth/mapsengine";
 
-  /** View your Google Maps Engine data */
+  /** View your Google My Maps data */
   static const MapsengineReadonlyScope = "https://www.googleapis.com/auth/mapsengine.readonly";
 
 
diff --git a/generated/googleapis/lib/reseller/v1.dart b/generated/googleapis/lib/reseller/v1.dart
index 6d16975..b854c8b 100644
--- a/generated/googleapis/lib/reseller/v1.dart
+++ b/generated/googleapis/lib/reseller/v1.dart
@@ -438,6 +438,7 @@
    * - "downgrade" : Downgrades a Google Apps for Business subscription to
    * Google Apps
    * - "suspend" : Suspends the subscriptions for 4 days before cancelling it
+   * - "transfer_to_direct" : Transfers a subscription directly to Google
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
    * error.
@@ -1016,10 +1017,9 @@
   core.String kind;
 
   /**
-   * Read only field containing the current number of licensed seats. Resellers
-   * can utilize this field to gather insights into usage for FLEXIBLE
-   * Google-Apps subscriptions and other secondary subscriptions (e.g.
-   * Google-Vault, Drive-storage).
+   * Read-only field containing the current number of licensed seats for
+   * FLEXIBLE Google-Apps subscriptions and secondary subscriptions such as
+   * Google-Vault and Drive-storage.
    */
   core.int licensedNumberOfSeats;
 
@@ -1217,6 +1217,9 @@
 
 /** JSON template for a subscription. */
 class Subscription {
+  /** Billing method of this subscription. */
+  core.String billingMethod;
+
   /** Creation time of this subscription in milliseconds since Unix epoch. */
   core.String creationTime;
 
@@ -1260,6 +1263,9 @@
   Subscription();
 
   Subscription.fromJson(core.Map _json) {
+    if (_json.containsKey("billingMethod")) {
+      billingMethod = _json["billingMethod"];
+    }
     if (_json.containsKey("creationTime")) {
       creationTime = _json["creationTime"];
     }
@@ -1303,6 +1309,9 @@
 
   core.Map toJson() {
     var _json = new core.Map();
+    if (billingMethod != null) {
+      _json["billingMethod"] = billingMethod;
+    }
     if (creationTime != null) {
       _json["creationTime"] = creationTime;
     }
diff --git a/generated/googleapis/lib/src/common_internal.dart b/generated/googleapis/lib/src/common_internal.dart
index 2f44e7d..ce0accb 100644
--- a/generated/googleapis/lib/src/common_internal.dart
+++ b/generated/googleapis/lib/src/common_internal.dart
@@ -9,7 +9,7 @@
 import "package:http/http.dart" as http;
 
 const String USER_AGENT_STRING =
-    'google-api-dart-client googleapis/0.4.1';
+    'google-api-dart-client googleapis/0.5.0';
 
 const CONTENT_TYPE_JSON_UTF8 = 'application/json; charset=utf-8';
 
diff --git a/generated/googleapis/lib/tagmanager/v1.dart b/generated/googleapis/lib/tagmanager/v1.dart
index 3a7bad0..f0ff982 100644
--- a/generated/googleapis/lib/tagmanager/v1.dart
+++ b/generated/googleapis/lib/tagmanager/v1.dart
@@ -2572,6 +2572,9 @@
   /** Optional list of domain names associated with the Container. */
   core.List<core.String> domainName;
 
+  /** List of enabled built-in variables. */
+  core.List<core.String> enabledBuiltInVariable;
+
   /**
    * The fingerprint of the GTM Container as computed at storage time. This
    * value is recomputed whenever the account is modified.
@@ -2612,6 +2615,9 @@
     if (_json.containsKey("domainName")) {
       domainName = _json["domainName"];
     }
+    if (_json.containsKey("enabledBuiltInVariable")) {
+      enabledBuiltInVariable = _json["enabledBuiltInVariable"];
+    }
     if (_json.containsKey("fingerprint")) {
       fingerprint = _json["fingerprint"];
     }
@@ -2646,6 +2652,9 @@
     if (domainName != null) {
       _json["domainName"] = domainName;
     }
+    if (enabledBuiltInVariable != null) {
+      _json["enabledBuiltInVariable"] = enabledBuiltInVariable;
+    }
     if (fingerprint != null) {
       _json["fingerprint"] = fingerprint;
     }
@@ -3606,13 +3615,6 @@
   core.String containerId;
 
   /**
-   * An optional list of tag names that this tag depends on to fire. Execution
-   * of this tag will be prevented until the tags with the given names complete
-   * their execution.
-   */
-  Parameter dependencies;
-
-  /**
    * The fingerprint of the GTM Tag as computed at storage time. This value is
    * recomputed whenever the tag is modified.
    */
@@ -3680,9 +3682,6 @@
     if (_json.containsKey("containerId")) {
       containerId = _json["containerId"];
     }
-    if (_json.containsKey("dependencies")) {
-      dependencies = new Parameter.fromJson(_json["dependencies"]);
-    }
     if (_json.containsKey("fingerprint")) {
       fingerprint = _json["fingerprint"];
     }
@@ -3735,9 +3734,6 @@
     if (containerId != null) {
       _json["containerId"] = containerId;
     }
-    if (dependencies != null) {
-      _json["dependencies"] = (dependencies).toJson();
-    }
     if (fingerprint != null) {
       _json["fingerprint"] = fingerprint;
     }
diff --git a/generated/googleapis/lib/youtube/v3.dart b/generated/googleapis/lib/youtube/v3.dart
index ad5adea..d1278a7 100644
--- a/generated/googleapis/lib/youtube/v3.dart
+++ b/generated/googleapis/lib/youtube/v3.dart
@@ -5225,6 +5225,7 @@
   /**
    * The method or protocol used to transmit the video stream.
    * Possible string values are:
+   * - "dash"
    * - "rtmp"
    */
   core.String ingestionType;
@@ -12768,6 +12769,9 @@
   /** Etag of this resource. */
   core.String etag;
 
+  /** Serialized EventId of the request which produced this response. */
+  core.String eventId;
+
   /** A list of ratings that match the request criteria. */
   core.List<VideoRating> items;
 
@@ -12777,6 +12781,9 @@
    */
   core.String kind;
 
+  /** The visitorId identifies the visitor. */
+  core.String visitorId;
+
 
   VideoGetRatingResponse();
 
@@ -12784,12 +12791,18 @@
     if (_json.containsKey("etag")) {
       etag = _json["etag"];
     }
+    if (_json.containsKey("eventId")) {
+      eventId = _json["eventId"];
+    }
     if (_json.containsKey("items")) {
       items = _json["items"].map((value) => new VideoRating.fromJson(value)).toList();
     }
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
+    if (_json.containsKey("visitorId")) {
+      visitorId = _json["visitorId"];
+    }
   }
 
   core.Map toJson() {
@@ -12797,12 +12810,18 @@
     if (etag != null) {
       _json["etag"] = etag;
     }
+    if (eventId != null) {
+      _json["eventId"] = eventId;
+    }
     if (items != null) {
       _json["items"] = items.map((value) => (value).toJson()).toList();
     }
     if (kind != null) {
       _json["kind"] = kind;
     }
+    if (visitorId != null) {
+      _json["visitorId"] = visitorId;
+    }
     return _json;
   }
 }
diff --git a/generated/googleapis/lib/youtubeanalytics/v1.dart b/generated/googleapis/lib/youtubeanalytics/v1.dart
index 9cfc553..43b3073 100644
--- a/generated/googleapis/lib/youtubeanalytics/v1.dart
+++ b/generated/googleapis/lib/youtubeanalytics/v1.dart
@@ -273,185 +273,8 @@
 
 
 
-/**
- * A paginated list of batchReportDefinition resources returned in response to a
- * youtubeAnalytics.batchReportDefinitions.list request.
- */
-class BatchReportDefinitionList {
-  /**
-   * A list of batchReportDefinition resources that match the request criteria.
-   */
-  core.List<BatchReportDefinitionTemplate> items;
-
-  /**
-   * This value specifies the type of data included in the API response. For the
-   * list method, the kind property value is
-   * youtubeAnalytics#batchReportDefinitionList.
-   */
-  core.String kind;
-
-
-  BatchReportDefinitionList();
-
-  BatchReportDefinitionList.fromJson(core.Map _json) {
-    if (_json.containsKey("items")) {
-      items = _json["items"].map((value) => new BatchReportDefinitionTemplate.fromJson(value)).toList();
-    }
-    if (_json.containsKey("kind")) {
-      kind = _json["kind"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (items != null) {
-      _json["items"] = items.map((value) => (value).toJson()).toList();
-    }
-    if (kind != null) {
-      _json["kind"] = kind;
-    }
-    return _json;
-  }
-}
-
-
 /** Not documented yet. */
-class BatchReportDefinitionTemplateDefaultOutput {
-  /** Format of the output. */
-  core.String format;
-
-  /** Type of the output. */
-  core.String type;
-
-
-  BatchReportDefinitionTemplateDefaultOutput();
-
-  BatchReportDefinitionTemplateDefaultOutput.fromJson(core.Map _json) {
-    if (_json.containsKey("format")) {
-      format = _json["format"];
-    }
-    if (_json.containsKey("type")) {
-      type = _json["type"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (format != null) {
-      _json["format"] = format;
-    }
-    if (type != null) {
-      _json["type"] = type;
-    }
-    return _json;
-  }
-}
-
-
-/** Contains single batchReportDefinition resource. */
-class BatchReportDefinitionTemplate {
-  /** Default report definition's output. */
-  core.List<BatchReportDefinitionTemplateDefaultOutput> defaultOutput;
-
-  /**
-   * The ID that YouTube assigns and uses to uniquely identify the report
-   * definition.
-   */
-  core.String id;
-
-  /** Name of the report definition. */
-  core.String name;
-
-  /** Status of the report definition. */
-  core.String status;
-
-  /** Type of the report definition. */
-  core.String type;
-
-
-  BatchReportDefinitionTemplate();
-
-  BatchReportDefinitionTemplate.fromJson(core.Map _json) {
-    if (_json.containsKey("defaultOutput")) {
-      defaultOutput = _json["defaultOutput"].map((value) => new BatchReportDefinitionTemplateDefaultOutput.fromJson(value)).toList();
-    }
-    if (_json.containsKey("id")) {
-      id = _json["id"];
-    }
-    if (_json.containsKey("name")) {
-      name = _json["name"];
-    }
-    if (_json.containsKey("status")) {
-      status = _json["status"];
-    }
-    if (_json.containsKey("type")) {
-      type = _json["type"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (defaultOutput != null) {
-      _json["defaultOutput"] = defaultOutput.map((value) => (value).toJson()).toList();
-    }
-    if (id != null) {
-      _json["id"] = id;
-    }
-    if (name != null) {
-      _json["name"] = name;
-    }
-    if (status != null) {
-      _json["status"] = status;
-    }
-    if (type != null) {
-      _json["type"] = type;
-    }
-    return _json;
-  }
-}
-
-
-/**
- * A paginated list of batchReport resources returned in response to a
- * youtubeAnalytics.batchReport.list request.
- */
-class BatchReportList {
-  /** A list of batchReport resources that match the request criteria. */
-  core.List<BatchReportTemplate> items;
-
-  /**
-   * This value specifies the type of data included in the API response. For the
-   * list method, the kind property value is youtubeAnalytics#batchReportList.
-   */
-  core.String kind;
-
-
-  BatchReportList();
-
-  BatchReportList.fromJson(core.Map _json) {
-    if (_json.containsKey("items")) {
-      items = _json["items"].map((value) => new BatchReportTemplate.fromJson(value)).toList();
-    }
-    if (_json.containsKey("kind")) {
-      kind = _json["kind"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (items != null) {
-      _json["items"] = items.map((value) => (value).toJson()).toList();
-    }
-    if (kind != null) {
-      _json["kind"] = kind;
-    }
-    return _json;
-  }
-}
-
-
-/** Not documented yet. */
-class BatchReportTemplateOutputs {
+class BatchReportOutputs {
   /**
    * Cloud storage URL to download this report. This URL is valid for 30
    * minutes.
@@ -465,9 +288,9 @@
   core.String type;
 
 
-  BatchReportTemplateOutputs();
+  BatchReportOutputs();
 
-  BatchReportTemplateOutputs.fromJson(core.Map _json) {
+  BatchReportOutputs.fromJson(core.Map _json) {
     if (_json.containsKey("downloadUrl")) {
       downloadUrl = _json["downloadUrl"];
     }
@@ -499,7 +322,7 @@
  * Period included in the report. For reports containing all entities endTime is
  * not set. Both startTime and endTime are inclusive.
  */
-class BatchReportTemplateTimeSpan {
+class BatchReportTimeSpan {
   /**
    * End of the period included in the report. Inclusive. For reports containing
    * all entities endTime is not set.
@@ -510,9 +333,9 @@
   core.DateTime startTime;
 
 
-  BatchReportTemplateTimeSpan();
+  BatchReportTimeSpan();
 
-  BatchReportTemplateTimeSpan.fromJson(core.Map _json) {
+  BatchReportTimeSpan.fromJson(core.Map _json) {
     if (_json.containsKey("endTime")) {
       endTime = core.DateTime.parse(_json["endTime"]);
     }
@@ -535,12 +358,18 @@
 
 
 /** Contains single batchReport resource. */
-class BatchReportTemplate {
+class BatchReport {
   /** The ID that YouTube assigns and uses to uniquely identify the report. */
   core.String id;
 
+  /**
+   * This value specifies the type of data of this item. For batch report the
+   * kind property value is youtubeAnalytics#batchReport.
+   */
+  core.String kind;
+
   /** Report outputs. */
-  core.List<BatchReportTemplateOutputs> outputs;
+  core.List<BatchReportOutputs> outputs;
 
   /** The ID of the the report definition. */
   core.String reportId;
@@ -549,26 +378,29 @@
    * Period included in the report. For reports containing all entities endTime
    * is not set. Both startTime and endTime are inclusive.
    */
-  BatchReportTemplateTimeSpan timeSpan;
+  BatchReportTimeSpan timeSpan;
 
   /** The time when the report was updated. */
   core.DateTime timeUpdated;
 
 
-  BatchReportTemplate();
+  BatchReport();
 
-  BatchReportTemplate.fromJson(core.Map _json) {
+  BatchReport.fromJson(core.Map _json) {
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
-    if (_json.containsKey("outputs")) {
-      outputs = _json["outputs"].map((value) => new BatchReportTemplateOutputs.fromJson(value)).toList();
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
     }
-    if (_json.containsKey("report_id")) {
-      reportId = _json["report_id"];
+    if (_json.containsKey("outputs")) {
+      outputs = _json["outputs"].map((value) => new BatchReportOutputs.fromJson(value)).toList();
+    }
+    if (_json.containsKey("reportId")) {
+      reportId = _json["reportId"];
     }
     if (_json.containsKey("timeSpan")) {
-      timeSpan = new BatchReportTemplateTimeSpan.fromJson(_json["timeSpan"]);
+      timeSpan = new BatchReportTimeSpan.fromJson(_json["timeSpan"]);
     }
     if (_json.containsKey("timeUpdated")) {
       timeUpdated = core.DateTime.parse(_json["timeUpdated"]);
@@ -580,11 +412,14 @@
     if (id != null) {
       _json["id"] = id;
     }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
     if (outputs != null) {
       _json["outputs"] = outputs.map((value) => (value).toJson()).toList();
     }
     if (reportId != null) {
-      _json["report_id"] = reportId;
+      _json["reportId"] = reportId;
     }
     if (timeSpan != null) {
       _json["timeSpan"] = (timeSpan).toJson();
@@ -597,6 +432,154 @@
 }
 
 
+/** Contains single batchReportDefinition resource. */
+class BatchReportDefinition {
+  /**
+   * The ID that YouTube assigns and uses to uniquely identify the report
+   * definition.
+   */
+  core.String id;
+
+  /**
+   * This value specifies the type of data of this item. For batch report
+   * definition the kind property value is
+   * youtubeAnalytics#batchReportDefinition.
+   */
+  core.String kind;
+
+  /** Name of the report definition. */
+  core.String name;
+
+  /** Status of the report definition. */
+  core.String status;
+
+  /** Type of the report definition. */
+  core.String type;
+
+
+  BatchReportDefinition();
+
+  BatchReportDefinition.fromJson(core.Map _json) {
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("name")) {
+      name = _json["name"];
+    }
+    if (_json.containsKey("status")) {
+      status = _json["status"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (name != null) {
+      _json["name"] = name;
+    }
+    if (status != null) {
+      _json["status"] = status;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A paginated list of batchReportDefinition resources returned in response to a
+ * youtubeAnalytics.batchReportDefinitions.list request.
+ */
+class BatchReportDefinitionList {
+  /**
+   * A list of batchReportDefinition resources that match the request criteria.
+   */
+  core.List<BatchReportDefinition> items;
+
+  /**
+   * This value specifies the type of data included in the API response. For the
+   * list method, the kind property value is
+   * youtubeAnalytics#batchReportDefinitionList.
+   */
+  core.String kind;
+
+
+  BatchReportDefinitionList();
+
+  BatchReportDefinitionList.fromJson(core.Map _json) {
+    if (_json.containsKey("items")) {
+      items = _json["items"].map((value) => new BatchReportDefinition.fromJson(value)).toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A paginated list of batchReport resources returned in response to a
+ * youtubeAnalytics.batchReport.list request.
+ */
+class BatchReportList {
+  /** A list of batchReport resources that match the request criteria. */
+  core.List<BatchReport> items;
+
+  /**
+   * This value specifies the type of data included in the API response. For the
+   * list method, the kind property value is youtubeAnalytics#batchReportList.
+   */
+  core.String kind;
+
+
+  BatchReportList();
+
+  BatchReportList.fromJson(core.Map _json) {
+    if (_json.containsKey("items")) {
+      items = _json["items"].map((value) => new BatchReport.fromJson(value)).toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (items != null) {
+      _json["items"] = items.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    return _json;
+  }
+}
+
+
 /** Not documented yet. */
 class ResultTableColumnHeaders {
   /** The type of the column (DIMENSION or METRIC). */
diff --git a/generated/googleapis/pubspec.yaml b/generated/googleapis/pubspec.yaml
index 751ca9d..5ff21e9 100644
--- a/generated/googleapis/pubspec.yaml
+++ b/generated/googleapis/pubspec.yaml
@@ -1,7 +1,7 @@
 name: googleapis
-version: 0.4.1
+version: 0.5.0
 author: Dart Team <misc@dartlang.org>
-description: "Auto-generated client libraries for accessing the following APIs:adexchangebuyer:v1.3, adexchangeseller:v1.1, adexchangeseller:v2.0, admin:directory_v1, admin:email_migration_v2, admin:reports_v1, adsense:v1.4, adsensehost:v4.1, analytics:v3, androidpublisher:v2, appsactivity:v1, appstate:v1, bigquery:v2, blogger:v3, books:v1, calendar:v3, civicinfo:us_v1, civicinfo:v1, civicinfo:v2, compute:v1, content:v2, coordinate:v1, customsearch:v1, dfareporting:v1.3, discovery:v1, doubleclickbidmanager:v1, doubleclicksearch:v2, drive:v2, fitness:v1, freebase:v1, fusiontables:v1, games:v1, gamesManagement:v1management, gmail:v1, groupsmigration:v1, groupssettings:v1, identitytoolkit:v3, licensing:v1, mapsengine:v1, mirror:v1, oauth2:v2, pagespeedonline:v1, plus:v1, plusDomains:v1, prediction:v1.6, qpxExpress:v1, reseller:v1, siteVerification:v1, storage:v1, tagmanager:v1, tasks:v1, translate:v2, urlshortener:v1, webfonts:v1, webmasters:v3, youtube:v3, youtubeAnalytics:v1"
+description: "Auto-generated client libraries for accessing the following APIs:adexchangebuyer:v1.3, adexchangeseller:v1.1, adexchangeseller:v2.0, admin:directory_v1, admin:email_migration_v2, admin:reports_v1, adsense:v1.4, adsensehost:v4.1, analytics:v3, androidpublisher:v2, appsactivity:v1, appstate:v1, bigquery:v2, blogger:v3, books:v1, calendar:v3, civicinfo:us_v1, civicinfo:v1, civicinfo:v2, compute:v1, content:v2, coordinate:v1, customsearch:v1, dfareporting:v1.3, discovery:v1, doubleclickbidmanager:v1, doubleclicksearch:v2, drive:v2, fitness:v1, freebase:v1, fusiontables:v1, fusiontables:v2, games:v1, gamesManagement:v1management, gmail:v1, groupsmigration:v1, groupssettings:v1, identitytoolkit:v3, licensing:v1, mapsengine:v1, mirror:v1, oauth2:v2, pagespeedonline:v1, plus:v1, plusDomains:v1, prediction:v1.6, qpxExpress:v1, reseller:v1, siteVerification:v1, storage:v1, tagmanager:v1, tasks:v1, translate:v2, urlshortener:v1, webfonts:v1, webmasters:v3, youtube:v3, youtubeAnalytics:v1"
 homepage: http://www.dartlang.org/googleapis/
 environment:
   sdk: '>=1.0.0 <2.0.0'
diff --git a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
index 9d7c7b7..0bb3ffb 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
@@ -39,14 +39,14 @@
   buildCounterAccountBidderLocation--;
 }
 
-buildUnnamed555() {
+buildUnnamed0() {
   var o = new core.List<api.AccountBidderLocation>();
   o.add(buildAccountBidderLocation());
   o.add(buildAccountBidderLocation());
   return o;
 }
 
-checkUnnamed555(core.List<api.AccountBidderLocation> o) {
+checkUnnamed0(core.List<api.AccountBidderLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountBidderLocation(o[0]);
   checkAccountBidderLocation(o[1]);
@@ -57,7 +57,7 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.bidderLocation = buildUnnamed555();
+    o.bidderLocation = buildUnnamed0();
     o.cookieMatchingNid = "foo";
     o.cookieMatchingUrl = "foo";
     o.id = 42;
@@ -73,7 +73,7 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed555(o.bidderLocation);
+    checkUnnamed0(o.bidderLocation);
     unittest.expect(o.cookieMatchingNid, unittest.equals('foo'));
     unittest.expect(o.cookieMatchingUrl, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals(42));
@@ -85,14 +85,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed556() {
+buildUnnamed1() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed556(core.List<api.Account> o) {
+checkUnnamed1(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -103,7 +103,7 @@
   var o = new api.AccountsList();
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    o.items = buildUnnamed556();
+    o.items = buildUnnamed1();
     o.kind = "foo";
   }
   buildCounterAccountsList--;
@@ -113,20 +113,20 @@
 checkAccountsList(api.AccountsList o) {
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    checkUnnamed556(o.items);
+    checkUnnamed1(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsList--;
 }
 
-buildUnnamed557() {
+buildUnnamed2() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed557(core.List<core.String> o) {
+checkUnnamed2(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -139,7 +139,7 @@
   if (buildCounterBillingInfo < 3) {
     o.accountId = 42;
     o.accountName = "foo";
-    o.billingId = buildUnnamed557();
+    o.billingId = buildUnnamed2();
     o.kind = "foo";
   }
   buildCounterBillingInfo--;
@@ -151,20 +151,20 @@
   if (buildCounterBillingInfo < 3) {
     unittest.expect(o.accountId, unittest.equals(42));
     unittest.expect(o.accountName, unittest.equals('foo'));
-    checkUnnamed557(o.billingId);
+    checkUnnamed2(o.billingId);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfo--;
 }
 
-buildUnnamed558() {
+buildUnnamed3() {
   var o = new core.List<api.BillingInfo>();
   o.add(buildBillingInfo());
   o.add(buildBillingInfo());
   return o;
 }
 
-checkUnnamed558(core.List<api.BillingInfo> o) {
+checkUnnamed3(core.List<api.BillingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBillingInfo(o[0]);
   checkBillingInfo(o[1]);
@@ -175,7 +175,7 @@
   var o = new api.BillingInfoList();
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    o.items = buildUnnamed558();
+    o.items = buildUnnamed3();
     o.kind = "foo";
   }
   buildCounterBillingInfoList--;
@@ -185,59 +185,59 @@
 checkBillingInfoList(api.BillingInfoList o) {
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    checkUnnamed558(o.items);
+    checkUnnamed3(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfoList--;
 }
 
-buildUnnamed559() {
+buildUnnamed4() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed559(core.List<core.String> o) {
+checkUnnamed4(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed560() {
+buildUnnamed5() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed560(core.List<core.int> o) {
+checkUnnamed5(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed561() {
+buildUnnamed6() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed561(core.List<core.String> o) {
+checkUnnamed6(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed562() {
+buildUnnamed7() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed562(core.List<core.String> o) {
+checkUnnamed7(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -248,7 +248,7 @@
   var o = new api.CreativeCorrections();
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    o.details = buildUnnamed562();
+    o.details = buildUnnamed7();
     o.reason = "foo";
   }
   buildCounterCreativeCorrections--;
@@ -258,33 +258,33 @@
 checkCreativeCorrections(api.CreativeCorrections o) {
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    checkUnnamed562(o.details);
+    checkUnnamed7(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeCorrections--;
 }
 
-buildUnnamed563() {
+buildUnnamed8() {
   var o = new core.List<api.CreativeCorrections>();
   o.add(buildCreativeCorrections());
   o.add(buildCreativeCorrections());
   return o;
 }
 
-checkUnnamed563(core.List<api.CreativeCorrections> o) {
+checkUnnamed8(core.List<api.CreativeCorrections> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCorrections(o[0]);
   checkCreativeCorrections(o[1]);
 }
 
-buildUnnamed564() {
+buildUnnamed9() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed564(core.List<core.String> o) {
+checkUnnamed9(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -295,7 +295,7 @@
   var o = new api.CreativeDisapprovalReasons();
   buildCounterCreativeDisapprovalReasons++;
   if (buildCounterCreativeDisapprovalReasons < 3) {
-    o.details = buildUnnamed564();
+    o.details = buildUnnamed9();
     o.reason = "foo";
   }
   buildCounterCreativeDisapprovalReasons--;
@@ -305,20 +305,20 @@
 checkCreativeDisapprovalReasons(api.CreativeDisapprovalReasons o) {
   buildCounterCreativeDisapprovalReasons++;
   if (buildCounterCreativeDisapprovalReasons < 3) {
-    checkUnnamed564(o.details);
+    checkUnnamed9(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeDisapprovalReasons--;
 }
 
-buildUnnamed565() {
+buildUnnamed10() {
   var o = new core.List<api.CreativeDisapprovalReasons>();
   o.add(buildCreativeDisapprovalReasons());
   o.add(buildCreativeDisapprovalReasons());
   return o;
 }
 
-checkUnnamed565(core.List<api.CreativeDisapprovalReasons> o) {
+checkUnnamed10(core.List<api.CreativeDisapprovalReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeDisapprovalReasons(o[0]);
   checkCreativeDisapprovalReasons(o[1]);
@@ -345,14 +345,14 @@
   buildCounterCreativeFilteringReasonsReasons--;
 }
 
-buildUnnamed566() {
+buildUnnamed11() {
   var o = new core.List<api.CreativeFilteringReasonsReasons>();
   o.add(buildCreativeFilteringReasonsReasons());
   o.add(buildCreativeFilteringReasonsReasons());
   return o;
 }
 
-checkUnnamed566(core.List<api.CreativeFilteringReasonsReasons> o) {
+checkUnnamed11(core.List<api.CreativeFilteringReasonsReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeFilteringReasonsReasons(o[0]);
   checkCreativeFilteringReasonsReasons(o[1]);
@@ -364,7 +364,7 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     o.date = "foo";
-    o.reasons = buildUnnamed566();
+    o.reasons = buildUnnamed11();
   }
   buildCounterCreativeFilteringReasons--;
   return o;
@@ -374,58 +374,58 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     unittest.expect(o.date, unittest.equals('foo'));
-    checkUnnamed566(o.reasons);
+    checkUnnamed11(o.reasons);
   }
   buildCounterCreativeFilteringReasons--;
 }
 
-buildUnnamed567() {
+buildUnnamed12() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed567(core.List<core.int> o) {
+checkUnnamed12(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed568() {
+buildUnnamed13() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed568(core.List<core.int> o) {
+checkUnnamed13(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed569() {
+buildUnnamed14() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed569(core.List<core.int> o) {
+checkUnnamed14(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed570() {
+buildUnnamed15() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed570(core.List<core.int> o) {
+checkUnnamed15(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -438,22 +438,22 @@
   if (buildCounterCreative < 3) {
     o.HTMLSnippet = "foo";
     o.accountId = 42;
-    o.advertiserId = buildUnnamed559();
+    o.advertiserId = buildUnnamed4();
     o.advertiserName = "foo";
     o.agencyId = "foo";
-    o.attribute = buildUnnamed560();
+    o.attribute = buildUnnamed5();
     o.buyerCreativeId = "foo";
-    o.clickThroughUrl = buildUnnamed561();
-    o.corrections = buildUnnamed563();
-    o.disapprovalReasons = buildUnnamed565();
+    o.clickThroughUrl = buildUnnamed6();
+    o.corrections = buildUnnamed8();
+    o.disapprovalReasons = buildUnnamed10();
     o.filteringReasons = buildCreativeFilteringReasons();
     o.height = 42;
     o.kind = "foo";
-    o.productCategories = buildUnnamed567();
-    o.restrictedCategories = buildUnnamed568();
-    o.sensitiveCategories = buildUnnamed569();
+    o.productCategories = buildUnnamed12();
+    o.restrictedCategories = buildUnnamed13();
+    o.sensitiveCategories = buildUnnamed14();
     o.status = "foo";
-    o.vendorType = buildUnnamed570();
+    o.vendorType = buildUnnamed15();
     o.videoURL = "foo";
     o.width = 42;
   }
@@ -466,36 +466,36 @@
   if (buildCounterCreative < 3) {
     unittest.expect(o.HTMLSnippet, unittest.equals('foo'));
     unittest.expect(o.accountId, unittest.equals(42));
-    checkUnnamed559(o.advertiserId);
+    checkUnnamed4(o.advertiserId);
     unittest.expect(o.advertiserName, unittest.equals('foo'));
     unittest.expect(o.agencyId, unittest.equals('foo'));
-    checkUnnamed560(o.attribute);
+    checkUnnamed5(o.attribute);
     unittest.expect(o.buyerCreativeId, unittest.equals('foo'));
-    checkUnnamed561(o.clickThroughUrl);
-    checkUnnamed563(o.corrections);
-    checkUnnamed565(o.disapprovalReasons);
+    checkUnnamed6(o.clickThroughUrl);
+    checkUnnamed8(o.corrections);
+    checkUnnamed10(o.disapprovalReasons);
     checkCreativeFilteringReasons(o.filteringReasons);
     unittest.expect(o.height, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed567(o.productCategories);
-    checkUnnamed568(o.restrictedCategories);
-    checkUnnamed569(o.sensitiveCategories);
+    checkUnnamed12(o.productCategories);
+    checkUnnamed13(o.restrictedCategories);
+    checkUnnamed14(o.sensitiveCategories);
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed570(o.vendorType);
+    checkUnnamed15(o.vendorType);
     unittest.expect(o.videoURL, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
   }
   buildCounterCreative--;
 }
 
-buildUnnamed571() {
+buildUnnamed16() {
   var o = new core.List<api.Creative>();
   o.add(buildCreative());
   o.add(buildCreative());
   return o;
 }
 
-checkUnnamed571(core.List<api.Creative> o) {
+checkUnnamed16(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreative(o[0]);
   checkCreative(o[1]);
@@ -506,7 +506,7 @@
   var o = new api.CreativesList();
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    o.items = buildUnnamed571();
+    o.items = buildUnnamed16();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -517,7 +517,7 @@
 checkCreativesList(api.CreativesList o) {
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    checkUnnamed571(o.items);
+    checkUnnamed16(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -565,14 +565,14 @@
   buildCounterDirectDeal--;
 }
 
-buildUnnamed572() {
+buildUnnamed17() {
   var o = new core.List<api.DirectDeal>();
   o.add(buildDirectDeal());
   o.add(buildDirectDeal());
   return o;
 }
 
-checkUnnamed572(core.List<api.DirectDeal> o) {
+checkUnnamed17(core.List<api.DirectDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectDeal(o[0]);
   checkDirectDeal(o[1]);
@@ -583,7 +583,7 @@
   var o = new api.DirectDealsList();
   buildCounterDirectDealsList++;
   if (buildCounterDirectDealsList < 3) {
-    o.directDeals = buildUnnamed572();
+    o.directDeals = buildUnnamed17();
     o.kind = "foo";
   }
   buildCounterDirectDealsList--;
@@ -593,59 +593,59 @@
 checkDirectDealsList(api.DirectDealsList o) {
   buildCounterDirectDealsList++;
   if (buildCounterDirectDealsList < 3) {
-    checkUnnamed572(o.directDeals);
+    checkUnnamed17(o.directDeals);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDirectDealsList--;
 }
 
-buildUnnamed573() {
+buildUnnamed18() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed573(core.List<core.Object> o) {
+checkUnnamed18(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed574() {
+buildUnnamed19() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed574(core.List<core.Object> o) {
+checkUnnamed19(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
   var casted4 = (o[1]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed575() {
+buildUnnamed20() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed575(core.List<core.Object> o) {
+checkUnnamed20(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o[0]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
   var casted6 = (o[1]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed576() {
+buildUnnamed21() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed576(core.List<core.Object> o) {
+checkUnnamed21(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o[0]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
   var casted8 = (o[1]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
@@ -656,10 +656,10 @@
   var o = new api.PerformanceReport();
   buildCounterPerformanceReport++;
   if (buildCounterPerformanceReport < 3) {
-    o.calloutStatusRate = buildUnnamed573();
-    o.cookieMatcherStatusRate = buildUnnamed574();
-    o.creativeStatusRate = buildUnnamed575();
-    o.hostedMatchStatusRate = buildUnnamed576();
+    o.calloutStatusRate = buildUnnamed18();
+    o.cookieMatcherStatusRate = buildUnnamed19();
+    o.creativeStatusRate = buildUnnamed20();
+    o.hostedMatchStatusRate = buildUnnamed21();
     o.kind = "foo";
     o.latency50thPercentile = 42.0;
     o.latency85thPercentile = 42.0;
@@ -680,10 +680,10 @@
 checkPerformanceReport(api.PerformanceReport o) {
   buildCounterPerformanceReport++;
   if (buildCounterPerformanceReport < 3) {
-    checkUnnamed573(o.calloutStatusRate);
-    checkUnnamed574(o.cookieMatcherStatusRate);
-    checkUnnamed575(o.creativeStatusRate);
-    checkUnnamed576(o.hostedMatchStatusRate);
+    checkUnnamed18(o.calloutStatusRate);
+    checkUnnamed19(o.cookieMatcherStatusRate);
+    checkUnnamed20(o.creativeStatusRate);
+    checkUnnamed21(o.hostedMatchStatusRate);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.latency50thPercentile, unittest.equals(42.0));
     unittest.expect(o.latency85thPercentile, unittest.equals(42.0));
@@ -700,14 +700,14 @@
   buildCounterPerformanceReport--;
 }
 
-buildUnnamed577() {
+buildUnnamed22() {
   var o = new core.List<api.PerformanceReport>();
   o.add(buildPerformanceReport());
   o.add(buildPerformanceReport());
   return o;
 }
 
-checkUnnamed577(core.List<api.PerformanceReport> o) {
+checkUnnamed22(core.List<api.PerformanceReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerformanceReport(o[0]);
   checkPerformanceReport(o[1]);
@@ -719,7 +719,7 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     o.kind = "foo";
-    o.performanceReport = buildUnnamed577();
+    o.performanceReport = buildUnnamed22();
   }
   buildCounterPerformanceReportList--;
   return o;
@@ -729,19 +729,19 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed577(o.performanceReport);
+    checkUnnamed22(o.performanceReport);
   }
   buildCounterPerformanceReportList--;
 }
 
-buildUnnamed578() {
+buildUnnamed23() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed578(core.List<core.String> o) {
+checkUnnamed23(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -768,40 +768,40 @@
   buildCounterPretargetingConfigDimensions--;
 }
 
-buildUnnamed579() {
+buildUnnamed24() {
   var o = new core.List<api.PretargetingConfigDimensions>();
   o.add(buildPretargetingConfigDimensions());
   o.add(buildPretargetingConfigDimensions());
   return o;
 }
 
-checkUnnamed579(core.List<api.PretargetingConfigDimensions> o) {
+checkUnnamed24(core.List<api.PretargetingConfigDimensions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigDimensions(o[0]);
   checkPretargetingConfigDimensions(o[1]);
 }
 
-buildUnnamed580() {
+buildUnnamed25() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed580(core.List<core.String> o) {
+checkUnnamed25(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed581() {
+buildUnnamed26() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed581(core.List<core.String> o) {
+checkUnnamed26(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -828,105 +828,105 @@
   buildCounterPretargetingConfigExcludedPlacements--;
 }
 
-buildUnnamed582() {
+buildUnnamed27() {
   var o = new core.List<api.PretargetingConfigExcludedPlacements>();
   o.add(buildPretargetingConfigExcludedPlacements());
   o.add(buildPretargetingConfigExcludedPlacements());
   return o;
 }
 
-checkUnnamed582(core.List<api.PretargetingConfigExcludedPlacements> o) {
+checkUnnamed27(core.List<api.PretargetingConfigExcludedPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigExcludedPlacements(o[0]);
   checkPretargetingConfigExcludedPlacements(o[1]);
 }
 
-buildUnnamed583() {
+buildUnnamed28() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed583(core.List<core.String> o) {
+checkUnnamed28(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed584() {
+buildUnnamed29() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed584(core.List<core.String> o) {
+checkUnnamed29(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed585() {
+buildUnnamed30() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed585(core.List<core.String> o) {
+checkUnnamed30(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed586() {
+buildUnnamed31() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed586(core.List<core.String> o) {
+checkUnnamed31(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed587() {
+buildUnnamed32() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed587(core.List<core.String> o) {
+checkUnnamed32(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed588() {
+buildUnnamed33() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed588(core.List<core.String> o) {
+checkUnnamed33(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed589() {
+buildUnnamed34() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed589(core.List<core.String> o) {
+checkUnnamed34(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -953,79 +953,79 @@
   buildCounterPretargetingConfigPlacements--;
 }
 
-buildUnnamed590() {
+buildUnnamed35() {
   var o = new core.List<api.PretargetingConfigPlacements>();
   o.add(buildPretargetingConfigPlacements());
   o.add(buildPretargetingConfigPlacements());
   return o;
 }
 
-checkUnnamed590(core.List<api.PretargetingConfigPlacements> o) {
+checkUnnamed35(core.List<api.PretargetingConfigPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigPlacements(o[0]);
   checkPretargetingConfigPlacements(o[1]);
 }
 
-buildUnnamed591() {
+buildUnnamed36() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed591(core.List<core.String> o) {
+checkUnnamed36(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed592() {
+buildUnnamed37() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed592(core.List<core.String> o) {
+checkUnnamed37(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed593() {
+buildUnnamed38() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed593(core.List<core.String> o) {
+checkUnnamed38(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed594() {
+buildUnnamed39() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed594(core.List<core.String> o) {
+checkUnnamed39(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed595() {
+buildUnnamed40() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed595(core.List<core.String> o) {
+checkUnnamed40(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1039,26 +1039,26 @@
     o.billingId = "foo";
     o.configId = "foo";
     o.configName = "foo";
-    o.creativeType = buildUnnamed578();
-    o.dimensions = buildUnnamed579();
-    o.excludedContentLabels = buildUnnamed580();
-    o.excludedGeoCriteriaIds = buildUnnamed581();
-    o.excludedPlacements = buildUnnamed582();
-    o.excludedUserLists = buildUnnamed583();
-    o.excludedVerticals = buildUnnamed584();
-    o.geoCriteriaIds = buildUnnamed585();
+    o.creativeType = buildUnnamed23();
+    o.dimensions = buildUnnamed24();
+    o.excludedContentLabels = buildUnnamed25();
+    o.excludedGeoCriteriaIds = buildUnnamed26();
+    o.excludedPlacements = buildUnnamed27();
+    o.excludedUserLists = buildUnnamed28();
+    o.excludedVerticals = buildUnnamed29();
+    o.geoCriteriaIds = buildUnnamed30();
     o.isActive = true;
     o.kind = "foo";
-    o.languages = buildUnnamed586();
-    o.mobileCarriers = buildUnnamed587();
-    o.mobileDevices = buildUnnamed588();
-    o.mobileOperatingSystemVersions = buildUnnamed589();
-    o.placements = buildUnnamed590();
-    o.platforms = buildUnnamed591();
-    o.supportedCreativeAttributes = buildUnnamed592();
-    o.userLists = buildUnnamed593();
-    o.vendorTypes = buildUnnamed594();
-    o.verticals = buildUnnamed595();
+    o.languages = buildUnnamed31();
+    o.mobileCarriers = buildUnnamed32();
+    o.mobileDevices = buildUnnamed33();
+    o.mobileOperatingSystemVersions = buildUnnamed34();
+    o.placements = buildUnnamed35();
+    o.platforms = buildUnnamed36();
+    o.supportedCreativeAttributes = buildUnnamed37();
+    o.userLists = buildUnnamed38();
+    o.vendorTypes = buildUnnamed39();
+    o.verticals = buildUnnamed40();
   }
   buildCounterPretargetingConfig--;
   return o;
@@ -1070,38 +1070,38 @@
     unittest.expect(o.billingId, unittest.equals('foo'));
     unittest.expect(o.configId, unittest.equals('foo'));
     unittest.expect(o.configName, unittest.equals('foo'));
-    checkUnnamed578(o.creativeType);
-    checkUnnamed579(o.dimensions);
-    checkUnnamed580(o.excludedContentLabels);
-    checkUnnamed581(o.excludedGeoCriteriaIds);
-    checkUnnamed582(o.excludedPlacements);
-    checkUnnamed583(o.excludedUserLists);
-    checkUnnamed584(o.excludedVerticals);
-    checkUnnamed585(o.geoCriteriaIds);
+    checkUnnamed23(o.creativeType);
+    checkUnnamed24(o.dimensions);
+    checkUnnamed25(o.excludedContentLabels);
+    checkUnnamed26(o.excludedGeoCriteriaIds);
+    checkUnnamed27(o.excludedPlacements);
+    checkUnnamed28(o.excludedUserLists);
+    checkUnnamed29(o.excludedVerticals);
+    checkUnnamed30(o.geoCriteriaIds);
     unittest.expect(o.isActive, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed586(o.languages);
-    checkUnnamed587(o.mobileCarriers);
-    checkUnnamed588(o.mobileDevices);
-    checkUnnamed589(o.mobileOperatingSystemVersions);
-    checkUnnamed590(o.placements);
-    checkUnnamed591(o.platforms);
-    checkUnnamed592(o.supportedCreativeAttributes);
-    checkUnnamed593(o.userLists);
-    checkUnnamed594(o.vendorTypes);
-    checkUnnamed595(o.verticals);
+    checkUnnamed31(o.languages);
+    checkUnnamed32(o.mobileCarriers);
+    checkUnnamed33(o.mobileDevices);
+    checkUnnamed34(o.mobileOperatingSystemVersions);
+    checkUnnamed35(o.placements);
+    checkUnnamed36(o.platforms);
+    checkUnnamed37(o.supportedCreativeAttributes);
+    checkUnnamed38(o.userLists);
+    checkUnnamed39(o.vendorTypes);
+    checkUnnamed40(o.verticals);
   }
   buildCounterPretargetingConfig--;
 }
 
-buildUnnamed596() {
+buildUnnamed41() {
   var o = new core.List<api.PretargetingConfig>();
   o.add(buildPretargetingConfig());
   o.add(buildPretargetingConfig());
   return o;
 }
 
-checkUnnamed596(core.List<api.PretargetingConfig> o) {
+checkUnnamed41(core.List<api.PretargetingConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfig(o[0]);
   checkPretargetingConfig(o[1]);
@@ -1112,7 +1112,7 @@
   var o = new api.PretargetingConfigList();
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    o.items = buildUnnamed596();
+    o.items = buildUnnamed41();
     o.kind = "foo";
   }
   buildCounterPretargetingConfigList--;
@@ -1122,33 +1122,33 @@
 checkPretargetingConfigList(api.PretargetingConfigList o) {
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    checkUnnamed596(o.items);
+    checkUnnamed41(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPretargetingConfigList--;
 }
 
-buildUnnamed597() {
+buildUnnamed42() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed597(core.List<core.int> o) {
+checkUnnamed42(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed598() {
+buildUnnamed43() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed598(core.List<core.String> o) {
+checkUnnamed43(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1749,8 +1749,8 @@
 
       var mock = new common_test.HttpServerMock();
       api.CreativesResourceApi res = new api.AdexchangebuyerApi(mock).creatives;
-      var arg_accountId = buildUnnamed597();
-      var arg_buyerCreativeId = buildUnnamed598();
+      var arg_accountId = buildUnnamed42();
+      var arg_buyerCreativeId = buildUnnamed43();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_statusFilter = "foo";
diff --git a/generated/googleapis/test/adexchangeseller/v1_1_test.dart b/generated/googleapis/test/adexchangeseller/v1_1_test.dart
index c2f1456..f2a2206 100644
--- a/generated/googleapis/test/adexchangeseller/v1_1_test.dart
+++ b/generated/googleapis/test/adexchangeseller/v1_1_test.dart
@@ -66,14 +66,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed243() {
+buildUnnamed44() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed243(core.List<api.AdClient> o) {
+checkUnnamed44(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -85,7 +85,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed243();
+    o.items = buildUnnamed44();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -97,7 +97,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed243(o.items);
+    checkUnnamed44(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -131,14 +131,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed244() {
+buildUnnamed45() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed244(core.List<api.AdUnit> o) {
+checkUnnamed45(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -150,7 +150,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed244();
+    o.items = buildUnnamed45();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -162,7 +162,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed244(o.items);
+    checkUnnamed45(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -196,14 +196,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed245() {
+buildUnnamed46() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed245(core.List<api.Alert> o) {
+checkUnnamed46(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -214,7 +214,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed245();
+    o.items = buildUnnamed46();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -224,7 +224,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed245(o.items);
+    checkUnnamed46(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -282,14 +282,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed246() {
+buildUnnamed47() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed246(core.List<api.CustomChannel> o) {
+checkUnnamed47(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -301,7 +301,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed246();
+    o.items = buildUnnamed47();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -313,21 +313,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed246(o.items);
+    checkUnnamed47(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed247() {
+buildUnnamed48() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed247(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed48(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -338,7 +338,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed247();
+    o.items = buildUnnamed48();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -348,7 +348,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed247(o.items);
+    checkUnnamed48(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -387,14 +387,14 @@
   buildCounterPreferredDeal--;
 }
 
-buildUnnamed248() {
+buildUnnamed49() {
   var o = new core.List<api.PreferredDeal>();
   o.add(buildPreferredDeal());
   o.add(buildPreferredDeal());
   return o;
 }
 
-checkUnnamed248(core.List<api.PreferredDeal> o) {
+checkUnnamed49(core.List<api.PreferredDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPreferredDeal(o[0]);
   checkPreferredDeal(o[1]);
@@ -405,7 +405,7 @@
   var o = new api.PreferredDeals();
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    o.items = buildUnnamed248();
+    o.items = buildUnnamed49();
     o.kind = "foo";
   }
   buildCounterPreferredDeals--;
@@ -415,20 +415,20 @@
 checkPreferredDeals(api.PreferredDeals o) {
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    checkUnnamed248(o.items);
+    checkUnnamed49(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPreferredDeals--;
 }
 
-buildUnnamed249() {
+buildUnnamed50() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed249(core.List<core.String> o) {
+checkUnnamed50(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -457,66 +457,66 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed250() {
+buildUnnamed51() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed250(core.List<api.ReportHeaders> o) {
+checkUnnamed51(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed251() {
+buildUnnamed52() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed251(core.List<core.String> o) {
+checkUnnamed52(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed252() {
+buildUnnamed53() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed251());
-  o.add(buildUnnamed251());
+  o.add(buildUnnamed52());
+  o.add(buildUnnamed52());
   return o;
 }
 
-checkUnnamed252(core.List<core.List<core.String>> o) {
+checkUnnamed53(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed251(o[0]);
-  checkUnnamed251(o[1]);
+  checkUnnamed52(o[0]);
+  checkUnnamed52(o[1]);
 }
 
-buildUnnamed253() {
+buildUnnamed54() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed253(core.List<core.String> o) {
+checkUnnamed54(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed254() {
+buildUnnamed55() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed254(core.List<core.String> o) {
+checkUnnamed55(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -527,13 +527,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed249();
-    o.headers = buildUnnamed250();
+    o.averages = buildUnnamed50();
+    o.headers = buildUnnamed51();
     o.kind = "foo";
-    o.rows = buildUnnamed252();
+    o.rows = buildUnnamed53();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed253();
-    o.warnings = buildUnnamed254();
+    o.totals = buildUnnamed54();
+    o.warnings = buildUnnamed55();
   }
   buildCounterReport--;
   return o;
@@ -542,77 +542,77 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed249(o.averages);
-    checkUnnamed250(o.headers);
+    checkUnnamed50(o.averages);
+    checkUnnamed51(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed252(o.rows);
+    checkUnnamed53(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed253(o.totals);
-    checkUnnamed254(o.warnings);
+    checkUnnamed54(o.totals);
+    checkUnnamed55(o.warnings);
   }
   buildCounterReport--;
 }
 
-buildUnnamed255() {
+buildUnnamed56() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed255(core.List<core.String> o) {
+checkUnnamed56(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed256() {
+buildUnnamed57() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed256(core.List<core.String> o) {
+checkUnnamed57(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed257() {
+buildUnnamed58() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed257(core.List<core.String> o) {
+checkUnnamed58(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed258() {
+buildUnnamed59() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed258(core.List<core.String> o) {
+checkUnnamed59(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed259() {
+buildUnnamed60() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed259(core.List<core.String> o) {
+checkUnnamed60(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -623,13 +623,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed255();
-    o.compatibleMetrics = buildUnnamed256();
+    o.compatibleDimensions = buildUnnamed56();
+    o.compatibleMetrics = buildUnnamed57();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed257();
-    o.requiredMetrics = buildUnnamed258();
-    o.supportedProducts = buildUnnamed259();
+    o.requiredDimensions = buildUnnamed58();
+    o.requiredMetrics = buildUnnamed59();
+    o.supportedProducts = buildUnnamed60();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -638,13 +638,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed255(o.compatibleDimensions);
-    checkUnnamed256(o.compatibleMetrics);
+    checkUnnamed56(o.compatibleDimensions);
+    checkUnnamed57(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed257(o.requiredDimensions);
-    checkUnnamed258(o.requiredMetrics);
-    checkUnnamed259(o.supportedProducts);
+    checkUnnamed58(o.requiredDimensions);
+    checkUnnamed59(o.requiredMetrics);
+    checkUnnamed60(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -672,14 +672,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed260() {
+buildUnnamed61() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed260(core.List<api.SavedReport> o) {
+checkUnnamed61(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -691,7 +691,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed260();
+    o.items = buildUnnamed61();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -703,7 +703,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed260(o.items);
+    checkUnnamed61(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -733,14 +733,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed261() {
+buildUnnamed62() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed261(core.List<api.UrlChannel> o) {
+checkUnnamed62(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -752,7 +752,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed261();
+    o.items = buildUnnamed62();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -764,60 +764,60 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed261(o.items);
+    checkUnnamed62(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed262() {
+buildUnnamed63() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed262(core.List<core.String> o) {
+checkUnnamed63(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed263() {
+buildUnnamed64() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed263(core.List<core.String> o) {
+checkUnnamed64(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed264() {
+buildUnnamed65() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed264(core.List<core.String> o) {
+checkUnnamed65(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed265() {
+buildUnnamed66() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed265(core.List<core.String> o) {
+checkUnnamed66(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1745,12 +1745,12 @@
       api.ReportsResourceApi res = new api.AdexchangesellerApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed262();
-      var arg_filter = buildUnnamed263();
+      var arg_dimension = buildUnnamed63();
+      var arg_filter = buildUnnamed64();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed264();
-      var arg_sort = buildUnnamed265();
+      var arg_metric = buildUnnamed65();
+      var arg_sort = buildUnnamed66();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/adexchangeseller/v2_0_test.dart b/generated/googleapis/test/adexchangeseller/v2_0_test.dart
index 82114af..24196e8 100644
--- a/generated/googleapis/test/adexchangeseller/v2_0_test.dart
+++ b/generated/googleapis/test/adexchangeseller/v2_0_test.dart
@@ -39,14 +39,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed821() {
+buildUnnamed67() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed821(core.List<api.Account> o) {
+checkUnnamed67(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -58,7 +58,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed821();
+    o.items = buildUnnamed67();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -70,7 +70,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed821(o.items);
+    checkUnnamed67(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -104,14 +104,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed822() {
+buildUnnamed68() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed822(core.List<api.AdClient> o) {
+checkUnnamed68(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -123,7 +123,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed822();
+    o.items = buildUnnamed68();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -135,7 +135,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed822(o.items);
+    checkUnnamed68(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -169,14 +169,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed823() {
+buildUnnamed69() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed823(core.List<api.Alert> o) {
+checkUnnamed69(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -187,7 +187,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed823();
+    o.items = buildUnnamed69();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -197,7 +197,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed823(o.items);
+    checkUnnamed69(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -255,14 +255,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed824() {
+buildUnnamed70() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed824(core.List<api.CustomChannel> o) {
+checkUnnamed70(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -274,7 +274,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed824();
+    o.items = buildUnnamed70();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -286,21 +286,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed824(o.items);
+    checkUnnamed70(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed825() {
+buildUnnamed71() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed825(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed71(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -311,7 +311,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed825();
+    o.items = buildUnnamed71();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -321,7 +321,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed825(o.items);
+    checkUnnamed71(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -360,14 +360,14 @@
   buildCounterPreferredDeal--;
 }
 
-buildUnnamed826() {
+buildUnnamed72() {
   var o = new core.List<api.PreferredDeal>();
   o.add(buildPreferredDeal());
   o.add(buildPreferredDeal());
   return o;
 }
 
-checkUnnamed826(core.List<api.PreferredDeal> o) {
+checkUnnamed72(core.List<api.PreferredDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPreferredDeal(o[0]);
   checkPreferredDeal(o[1]);
@@ -378,7 +378,7 @@
   var o = new api.PreferredDeals();
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    o.items = buildUnnamed826();
+    o.items = buildUnnamed72();
     o.kind = "foo";
   }
   buildCounterPreferredDeals--;
@@ -388,20 +388,20 @@
 checkPreferredDeals(api.PreferredDeals o) {
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    checkUnnamed826(o.items);
+    checkUnnamed72(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPreferredDeals--;
 }
 
-buildUnnamed827() {
+buildUnnamed73() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed827(core.List<core.String> o) {
+checkUnnamed73(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -430,66 +430,66 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed828() {
+buildUnnamed74() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed828(core.List<api.ReportHeaders> o) {
+checkUnnamed74(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed829() {
+buildUnnamed75() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed829(core.List<core.String> o) {
+checkUnnamed75(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed830() {
+buildUnnamed76() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed829());
-  o.add(buildUnnamed829());
+  o.add(buildUnnamed75());
+  o.add(buildUnnamed75());
   return o;
 }
 
-checkUnnamed830(core.List<core.List<core.String>> o) {
+checkUnnamed76(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed829(o[0]);
-  checkUnnamed829(o[1]);
+  checkUnnamed75(o[0]);
+  checkUnnamed75(o[1]);
 }
 
-buildUnnamed831() {
+buildUnnamed77() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed831(core.List<core.String> o) {
+checkUnnamed77(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed832() {
+buildUnnamed78() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed832(core.List<core.String> o) {
+checkUnnamed78(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -500,13 +500,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed827();
-    o.headers = buildUnnamed828();
+    o.averages = buildUnnamed73();
+    o.headers = buildUnnamed74();
     o.kind = "foo";
-    o.rows = buildUnnamed830();
+    o.rows = buildUnnamed76();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed831();
-    o.warnings = buildUnnamed832();
+    o.totals = buildUnnamed77();
+    o.warnings = buildUnnamed78();
   }
   buildCounterReport--;
   return o;
@@ -515,77 +515,77 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed827(o.averages);
-    checkUnnamed828(o.headers);
+    checkUnnamed73(o.averages);
+    checkUnnamed74(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed830(o.rows);
+    checkUnnamed76(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed831(o.totals);
-    checkUnnamed832(o.warnings);
+    checkUnnamed77(o.totals);
+    checkUnnamed78(o.warnings);
   }
   buildCounterReport--;
 }
 
-buildUnnamed833() {
+buildUnnamed79() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed833(core.List<core.String> o) {
+checkUnnamed79(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed834() {
+buildUnnamed80() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed834(core.List<core.String> o) {
+checkUnnamed80(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed835() {
+buildUnnamed81() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed835(core.List<core.String> o) {
+checkUnnamed81(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed836() {
+buildUnnamed82() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed836(core.List<core.String> o) {
+checkUnnamed82(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed837() {
+buildUnnamed83() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed837(core.List<core.String> o) {
+checkUnnamed83(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -596,13 +596,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed833();
-    o.compatibleMetrics = buildUnnamed834();
+    o.compatibleDimensions = buildUnnamed79();
+    o.compatibleMetrics = buildUnnamed80();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed835();
-    o.requiredMetrics = buildUnnamed836();
-    o.supportedProducts = buildUnnamed837();
+    o.requiredDimensions = buildUnnamed81();
+    o.requiredMetrics = buildUnnamed82();
+    o.supportedProducts = buildUnnamed83();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -611,13 +611,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed833(o.compatibleDimensions);
-    checkUnnamed834(o.compatibleMetrics);
+    checkUnnamed79(o.compatibleDimensions);
+    checkUnnamed80(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed835(o.requiredDimensions);
-    checkUnnamed836(o.requiredMetrics);
-    checkUnnamed837(o.supportedProducts);
+    checkUnnamed81(o.requiredDimensions);
+    checkUnnamed82(o.requiredMetrics);
+    checkUnnamed83(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -645,14 +645,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed838() {
+buildUnnamed84() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed838(core.List<api.SavedReport> o) {
+checkUnnamed84(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -664,7 +664,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed838();
+    o.items = buildUnnamed84();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -676,7 +676,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed838(o.items);
+    checkUnnamed84(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -706,14 +706,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed839() {
+buildUnnamed85() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed839(core.List<api.UrlChannel> o) {
+checkUnnamed85(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -725,7 +725,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed839();
+    o.items = buildUnnamed85();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -737,60 +737,60 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed839(o.items);
+    checkUnnamed85(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed840() {
+buildUnnamed86() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed840(core.List<core.String> o) {
+checkUnnamed86(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed841() {
+buildUnnamed87() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed841(core.List<core.String> o) {
+checkUnnamed87(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed842() {
+buildUnnamed88() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed842(core.List<core.String> o) {
+checkUnnamed88(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed843() {
+buildUnnamed89() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed843(core.List<core.String> o) {
+checkUnnamed89(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1563,12 +1563,12 @@
       var arg_accountId = "foo";
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed840();
-      var arg_filter = buildUnnamed841();
+      var arg_dimension = buildUnnamed86();
+      var arg_filter = buildUnnamed87();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed842();
-      var arg_sort = buildUnnamed843();
+      var arg_metric = buildUnnamed88();
+      var arg_sort = buildUnnamed89();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/admin/directory_v1_test.dart b/generated/googleapis/test/admin/directory_v1_test.dart
index dfd602b..57dafbb 100644
--- a/generated/googleapis/test/admin/directory_v1_test.dart
+++ b/generated/googleapis/test/admin/directory_v1_test.dart
@@ -43,14 +43,14 @@
   buildCounterAlias--;
 }
 
-buildUnnamed470() {
+buildUnnamed90() {
   var o = new core.List<api.Alias>();
   o.add(buildAlias());
   o.add(buildAlias());
   return o;
 }
 
-checkUnnamed470(core.List<api.Alias> o) {
+checkUnnamed90(core.List<api.Alias> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlias(o[0]);
   checkAlias(o[1]);
@@ -61,7 +61,7 @@
   var o = new api.Aliases();
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    o.aliases = buildUnnamed470();
+    o.aliases = buildUnnamed90();
     o.etag = "foo";
     o.kind = "foo";
   }
@@ -72,7 +72,7 @@
 checkAliases(api.Aliases o) {
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    checkUnnamed470(o.aliases);
+    checkUnnamed90(o.aliases);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
@@ -110,14 +110,14 @@
   buildCounterAsp--;
 }
 
-buildUnnamed471() {
+buildUnnamed91() {
   var o = new core.List<api.Asp>();
   o.add(buildAsp());
   o.add(buildAsp());
   return o;
 }
 
-checkUnnamed471(core.List<api.Asp> o) {
+checkUnnamed91(core.List<api.Asp> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAsp(o[0]);
   checkAsp(o[1]);
@@ -129,7 +129,7 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed471();
+    o.items = buildUnnamed91();
     o.kind = "foo";
   }
   buildCounterAsps--;
@@ -140,20 +140,20 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed471(o.items);
+    checkUnnamed91(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAsps--;
 }
 
-buildUnnamed472() {
+buildUnnamed92() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed472(core.Map<core.String, core.String> o) {
+checkUnnamed92(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -168,7 +168,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed472();
+    o.params = buildUnnamed92();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -186,7 +186,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed472(o.params);
+    checkUnnamed92(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -217,14 +217,14 @@
   buildCounterChromeOsDeviceActiveTimeRanges--;
 }
 
-buildUnnamed473() {
+buildUnnamed93() {
   var o = new core.List<api.ChromeOsDeviceActiveTimeRanges>();
   o.add(buildChromeOsDeviceActiveTimeRanges());
   o.add(buildChromeOsDeviceActiveTimeRanges());
   return o;
 }
 
-checkUnnamed473(core.List<api.ChromeOsDeviceActiveTimeRanges> o) {
+checkUnnamed93(core.List<api.ChromeOsDeviceActiveTimeRanges> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDeviceActiveTimeRanges(o[0]);
   checkChromeOsDeviceActiveTimeRanges(o[1]);
@@ -251,14 +251,14 @@
   buildCounterChromeOsDeviceRecentUsers--;
 }
 
-buildUnnamed474() {
+buildUnnamed94() {
   var o = new core.List<api.ChromeOsDeviceRecentUsers>();
   o.add(buildChromeOsDeviceRecentUsers());
   o.add(buildChromeOsDeviceRecentUsers());
   return o;
 }
 
-checkUnnamed474(core.List<api.ChromeOsDeviceRecentUsers> o) {
+checkUnnamed94(core.List<api.ChromeOsDeviceRecentUsers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDeviceRecentUsers(o[0]);
   checkChromeOsDeviceRecentUsers(o[1]);
@@ -269,7 +269,7 @@
   var o = new api.ChromeOsDevice();
   buildCounterChromeOsDevice++;
   if (buildCounterChromeOsDevice < 3) {
-    o.activeTimeRanges = buildUnnamed473();
+    o.activeTimeRanges = buildUnnamed93();
     o.annotatedLocation = "foo";
     o.annotatedUser = "foo";
     o.bootMode = "foo";
@@ -288,7 +288,7 @@
     o.orgUnitPath = "foo";
     o.osVersion = "foo";
     o.platformVersion = "foo";
-    o.recentUsers = buildUnnamed474();
+    o.recentUsers = buildUnnamed94();
     o.serialNumber = "foo";
     o.status = "foo";
     o.supportEndDate = core.DateTime.parse("2002-02-27T14:01:02");
@@ -301,7 +301,7 @@
 checkChromeOsDevice(api.ChromeOsDevice o) {
   buildCounterChromeOsDevice++;
   if (buildCounterChromeOsDevice < 3) {
-    checkUnnamed473(o.activeTimeRanges);
+    checkUnnamed93(o.activeTimeRanges);
     unittest.expect(o.annotatedLocation, unittest.equals('foo'));
     unittest.expect(o.annotatedUser, unittest.equals('foo'));
     unittest.expect(o.bootMode, unittest.equals('foo'));
@@ -320,7 +320,7 @@
     unittest.expect(o.orgUnitPath, unittest.equals('foo'));
     unittest.expect(o.osVersion, unittest.equals('foo'));
     unittest.expect(o.platformVersion, unittest.equals('foo'));
-    checkUnnamed474(o.recentUsers);
+    checkUnnamed94(o.recentUsers);
     unittest.expect(o.serialNumber, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.supportEndDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -329,14 +329,14 @@
   buildCounterChromeOsDevice--;
 }
 
-buildUnnamed475() {
+buildUnnamed95() {
   var o = new core.List<api.ChromeOsDevice>();
   o.add(buildChromeOsDevice());
   o.add(buildChromeOsDevice());
   return o;
 }
 
-checkUnnamed475(core.List<api.ChromeOsDevice> o) {
+checkUnnamed95(core.List<api.ChromeOsDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDevice(o[0]);
   checkChromeOsDevice(o[1]);
@@ -347,7 +347,7 @@
   var o = new api.ChromeOsDevices();
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    o.chromeosdevices = buildUnnamed475();
+    o.chromeosdevices = buildUnnamed95();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -359,7 +359,7 @@
 checkChromeOsDevices(api.ChromeOsDevices o) {
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    checkUnnamed475(o.chromeosdevices);
+    checkUnnamed95(o.chromeosdevices);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -367,27 +367,27 @@
   buildCounterChromeOsDevices--;
 }
 
-buildUnnamed476() {
+buildUnnamed96() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed476(core.List<core.String> o) {
+checkUnnamed96(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed477() {
+buildUnnamed97() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed477(core.List<core.String> o) {
+checkUnnamed97(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -399,7 +399,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     o.adminCreated = true;
-    o.aliases = buildUnnamed476();
+    o.aliases = buildUnnamed96();
     o.description = "foo";
     o.directMembersCount = "foo";
     o.email = "foo";
@@ -407,7 +407,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.nonEditableAliases = buildUnnamed477();
+    o.nonEditableAliases = buildUnnamed97();
   }
   buildCounterGroup--;
   return o;
@@ -417,7 +417,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     unittest.expect(o.adminCreated, unittest.isTrue);
-    checkUnnamed476(o.aliases);
+    checkUnnamed96(o.aliases);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.directMembersCount, unittest.equals('foo'));
     unittest.expect(o.email, unittest.equals('foo'));
@@ -425,19 +425,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed477(o.nonEditableAliases);
+    checkUnnamed97(o.nonEditableAliases);
   }
   buildCounterGroup--;
 }
 
-buildUnnamed478() {
+buildUnnamed98() {
   var o = new core.List<api.Group>();
   o.add(buildGroup());
   o.add(buildGroup());
   return o;
 }
 
-checkUnnamed478(core.List<api.Group> o) {
+checkUnnamed98(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroup(o[0]);
   checkGroup(o[1]);
@@ -449,7 +449,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     o.etag = "foo";
-    o.groups = buildUnnamed478();
+    o.groups = buildUnnamed98();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -461,7 +461,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed478(o.groups);
+    checkUnnamed98(o.groups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -497,14 +497,14 @@
   buildCounterMember--;
 }
 
-buildUnnamed479() {
+buildUnnamed99() {
   var o = new core.List<api.Member>();
   o.add(buildMember());
   o.add(buildMember());
   return o;
 }
 
-checkUnnamed479(core.List<api.Member> o) {
+checkUnnamed99(core.List<api.Member> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMember(o[0]);
   checkMember(o[1]);
@@ -517,7 +517,7 @@
   if (buildCounterMembers < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.members = buildUnnamed479();
+    o.members = buildUnnamed99();
     o.nextPageToken = "foo";
   }
   buildCounterMembers--;
@@ -529,20 +529,20 @@
   if (buildCounterMembers < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed479(o.members);
+    checkUnnamed99(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMembers--;
 }
 
-buildUnnamed480() {
+buildUnnamed100() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed480(core.List<core.String> o) {
+checkUnnamed100(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -555,7 +555,7 @@
   if (buildCounterMobileDeviceApplications < 3) {
     o.displayName = "foo";
     o.packageName = "foo";
-    o.permission = buildUnnamed480();
+    o.permission = buildUnnamed100();
     o.versionCode = 42;
     o.versionName = "foo";
   }
@@ -568,47 +568,47 @@
   if (buildCounterMobileDeviceApplications < 3) {
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed480(o.permission);
+    checkUnnamed100(o.permission);
     unittest.expect(o.versionCode, unittest.equals(42));
     unittest.expect(o.versionName, unittest.equals('foo'));
   }
   buildCounterMobileDeviceApplications--;
 }
 
-buildUnnamed481() {
+buildUnnamed101() {
   var o = new core.List<api.MobileDeviceApplications>();
   o.add(buildMobileDeviceApplications());
   o.add(buildMobileDeviceApplications());
   return o;
 }
 
-checkUnnamed481(core.List<api.MobileDeviceApplications> o) {
+checkUnnamed101(core.List<api.MobileDeviceApplications> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileDeviceApplications(o[0]);
   checkMobileDeviceApplications(o[1]);
 }
 
-buildUnnamed482() {
+buildUnnamed102() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed482(core.List<core.String> o) {
+checkUnnamed102(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed483() {
+buildUnnamed103() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed483(core.List<core.String> o) {
+checkUnnamed103(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -619,13 +619,13 @@
   var o = new api.MobileDevice();
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
-    o.applications = buildUnnamed481();
+    o.applications = buildUnnamed101();
     o.basebandVersion = "foo";
     o.buildNumber = "foo";
     o.defaultLanguage = "foo";
     o.deviceCompromisedStatus = "foo";
     o.deviceId = "foo";
-    o.email = buildUnnamed482();
+    o.email = buildUnnamed102();
     o.etag = "foo";
     o.firstSync = core.DateTime.parse("2002-02-27T14:01:02");
     o.hardwareId = "foo";
@@ -636,7 +636,7 @@
     o.managedAccountIsOnOwnerProfile = true;
     o.meid = "foo";
     o.model = "foo";
-    o.name = buildUnnamed483();
+    o.name = buildUnnamed103();
     o.networkOperator = "foo";
     o.os = "foo";
     o.resourceId = "foo";
@@ -653,13 +653,13 @@
 checkMobileDevice(api.MobileDevice o) {
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
-    checkUnnamed481(o.applications);
+    checkUnnamed101(o.applications);
     unittest.expect(o.basebandVersion, unittest.equals('foo'));
     unittest.expect(o.buildNumber, unittest.equals('foo'));
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     unittest.expect(o.deviceCompromisedStatus, unittest.equals('foo'));
     unittest.expect(o.deviceId, unittest.equals('foo'));
-    checkUnnamed482(o.email);
+    checkUnnamed102(o.email);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.firstSync, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.hardwareId, unittest.equals('foo'));
@@ -670,7 +670,7 @@
     unittest.expect(o.managedAccountIsOnOwnerProfile, unittest.isTrue);
     unittest.expect(o.meid, unittest.equals('foo'));
     unittest.expect(o.model, unittest.equals('foo'));
-    checkUnnamed483(o.name);
+    checkUnnamed103(o.name);
     unittest.expect(o.networkOperator, unittest.equals('foo'));
     unittest.expect(o.os, unittest.equals('foo'));
     unittest.expect(o.resourceId, unittest.equals('foo'));
@@ -702,14 +702,14 @@
   buildCounterMobileDeviceAction--;
 }
 
-buildUnnamed484() {
+buildUnnamed104() {
   var o = new core.List<api.MobileDevice>();
   o.add(buildMobileDevice());
   o.add(buildMobileDevice());
   return o;
 }
 
-checkUnnamed484(core.List<api.MobileDevice> o) {
+checkUnnamed104(core.List<api.MobileDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileDevice(o[0]);
   checkMobileDevice(o[1]);
@@ -722,7 +722,7 @@
   if (buildCounterMobileDevices < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.mobiledevices = buildUnnamed484();
+    o.mobiledevices = buildUnnamed104();
     o.nextPageToken = "foo";
   }
   buildCounterMobileDevices--;
@@ -734,7 +734,7 @@
   if (buildCounterMobileDevices < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed484(o.mobiledevices);
+    checkUnnamed104(o.mobiledevices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMobileDevices--;
@@ -773,14 +773,14 @@
   buildCounterNotification--;
 }
 
-buildUnnamed485() {
+buildUnnamed105() {
   var o = new core.List<api.Notification>();
   o.add(buildNotification());
   o.add(buildNotification());
   return o;
 }
 
-checkUnnamed485(core.List<api.Notification> o) {
+checkUnnamed105(core.List<api.Notification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNotification(o[0]);
   checkNotification(o[1]);
@@ -792,7 +792,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed485();
+    o.items = buildUnnamed105();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.unreadNotificationsCount = 42;
@@ -805,7 +805,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed485(o.items);
+    checkUnnamed105(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.unreadNotificationsCount, unittest.equals(42));
@@ -844,14 +844,14 @@
   buildCounterOrgUnit--;
 }
 
-buildUnnamed486() {
+buildUnnamed106() {
   var o = new core.List<api.OrgUnit>();
   o.add(buildOrgUnit());
   o.add(buildOrgUnit());
   return o;
 }
 
-checkUnnamed486(core.List<api.OrgUnit> o) {
+checkUnnamed106(core.List<api.OrgUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrgUnit(o[0]);
   checkOrgUnit(o[1]);
@@ -864,7 +864,7 @@
   if (buildCounterOrgUnits < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.organizationUnits = buildUnnamed486();
+    o.organizationUnits = buildUnnamed106();
   }
   buildCounterOrgUnits--;
   return o;
@@ -875,19 +875,19 @@
   if (buildCounterOrgUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed486(o.organizationUnits);
+    checkUnnamed106(o.organizationUnits);
   }
   buildCounterOrgUnits--;
 }
 
-buildUnnamed487() {
+buildUnnamed107() {
   var o = new core.List<api.SchemaFieldSpec>();
   o.add(buildSchemaFieldSpec());
   o.add(buildSchemaFieldSpec());
   return o;
 }
 
-checkUnnamed487(core.List<api.SchemaFieldSpec> o) {
+checkUnnamed107(core.List<api.SchemaFieldSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSchemaFieldSpec(o[0]);
   checkSchemaFieldSpec(o[1]);
@@ -899,7 +899,7 @@
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
     o.etag = "foo";
-    o.fields = buildUnnamed487();
+    o.fields = buildUnnamed107();
     o.kind = "foo";
     o.schemaId = "foo";
     o.schemaName = "foo";
@@ -912,7 +912,7 @@
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed487(o.fields);
+    checkUnnamed107(o.fields);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.schemaId, unittest.equals('foo'));
     unittest.expect(o.schemaName, unittest.equals('foo'));
@@ -976,14 +976,14 @@
   buildCounterSchemaFieldSpec--;
 }
 
-buildUnnamed488() {
+buildUnnamed108() {
   var o = new core.List<api.Schema>();
   o.add(buildSchema());
   o.add(buildSchema());
   return o;
 }
 
-checkUnnamed488(core.List<api.Schema> o) {
+checkUnnamed108(core.List<api.Schema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSchema(o[0]);
   checkSchema(o[1]);
@@ -996,7 +996,7 @@
   if (buildCounterSchemas < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.schemas = buildUnnamed488();
+    o.schemas = buildUnnamed108();
   }
   buildCounterSchemas--;
   return o;
@@ -1007,19 +1007,19 @@
   if (buildCounterSchemas < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed488(o.schemas);
+    checkUnnamed108(o.schemas);
   }
   buildCounterSchemas--;
 }
 
-buildUnnamed489() {
+buildUnnamed109() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed489(core.List<core.String> o) {
+checkUnnamed109(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1036,7 +1036,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nativeApp = true;
-    o.scopes = buildUnnamed489();
+    o.scopes = buildUnnamed109();
     o.userKey = "foo";
   }
   buildCounterToken--;
@@ -1052,20 +1052,20 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nativeApp, unittest.isTrue);
-    checkUnnamed489(o.scopes);
+    checkUnnamed109(o.scopes);
     unittest.expect(o.userKey, unittest.equals('foo'));
   }
   buildCounterToken--;
 }
 
-buildUnnamed490() {
+buildUnnamed110() {
   var o = new core.List<api.Token>();
   o.add(buildToken());
   o.add(buildToken());
   return o;
 }
 
-checkUnnamed490(core.List<api.Token> o) {
+checkUnnamed110(core.List<api.Token> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkToken(o[0]);
   checkToken(o[1]);
@@ -1077,7 +1077,7 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed490();
+    o.items = buildUnnamed110();
     o.kind = "foo";
   }
   buildCounterTokens--;
@@ -1088,46 +1088,46 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed490(o.items);
+    checkUnnamed110(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTokens--;
 }
 
-buildUnnamed491() {
+buildUnnamed111() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed491(core.List<core.String> o) {
+checkUnnamed111(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed492() {
+buildUnnamed112() {
   var o = new core.Map<core.String, api.UserCustomProperties>();
   o["x"] = buildUserCustomProperties();
   o["y"] = buildUserCustomProperties();
   return o;
 }
 
-checkUnnamed492(core.Map<core.String, api.UserCustomProperties> o) {
+checkUnnamed112(core.Map<core.String, api.UserCustomProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserCustomProperties(o["x"]);
   checkUserCustomProperties(o["y"]);
 }
 
-buildUnnamed493() {
+buildUnnamed113() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed493(core.List<core.String> o) {
+checkUnnamed113(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1140,10 +1140,10 @@
   if (buildCounterUser < 3) {
     o.addresses = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.agreedToTerms = true;
-    o.aliases = buildUnnamed491();
+    o.aliases = buildUnnamed111();
     o.changePasswordAtNextLogin = true;
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.customSchemas = buildUnnamed492();
+    o.customSchemas = buildUnnamed112();
     o.customerId = "foo";
     o.deletionTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.emails = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
@@ -1160,7 +1160,7 @@
     o.kind = "foo";
     o.lastLoginTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.name = buildUserName();
-    o.nonEditableAliases = buildUnnamed493();
+    o.nonEditableAliases = buildUnnamed113();
     o.orgUnitPath = "foo";
     o.organizations = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.password = "foo";
@@ -1180,10 +1180,10 @@
   if (buildCounterUser < 3) {
     var casted1 = (o.addresses) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
     unittest.expect(o.agreedToTerms, unittest.isTrue);
-    checkUnnamed491(o.aliases);
+    checkUnnamed111(o.aliases);
     unittest.expect(o.changePasswordAtNextLogin, unittest.isTrue);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed492(o.customSchemas);
+    checkUnnamed112(o.customSchemas);
     unittest.expect(o.customerId, unittest.equals('foo'));
     unittest.expect(o.deletionTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     var casted2 = (o.emails) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -1200,7 +1200,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastLoginTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUserName(o.name);
-    checkUnnamed493(o.nonEditableAliases);
+    checkUnnamed113(o.nonEditableAliases);
     unittest.expect(o.orgUnitPath, unittest.equals('foo'));
     var casted5 = (o.organizations) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
     unittest.expect(o.password, unittest.equals('foo'));
@@ -1528,14 +1528,14 @@
   buildCounterUserUndelete--;
 }
 
-buildUnnamed494() {
+buildUnnamed114() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed494(core.List<api.User> o) {
+checkUnnamed114(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
@@ -1550,7 +1550,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.triggerEvent = "foo";
-    o.users = buildUnnamed494();
+    o.users = buildUnnamed114();
   }
   buildCounterUsers--;
   return o;
@@ -1563,7 +1563,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.triggerEvent, unittest.equals('foo'));
-    checkUnnamed494(o.users);
+    checkUnnamed114(o.users);
   }
   buildCounterUsers--;
 }
@@ -1593,14 +1593,14 @@
   buildCounterVerificationCode--;
 }
 
-buildUnnamed495() {
+buildUnnamed115() {
   var o = new core.List<api.VerificationCode>();
   o.add(buildVerificationCode());
   o.add(buildVerificationCode());
   return o;
 }
 
-checkUnnamed495(core.List<api.VerificationCode> o) {
+checkUnnamed115(core.List<api.VerificationCode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVerificationCode(o[0]);
   checkVerificationCode(o[1]);
@@ -1612,7 +1612,7 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed495();
+    o.items = buildUnnamed115();
     o.kind = "foo";
   }
   buildCounterVerificationCodes--;
@@ -1623,59 +1623,59 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed495(o.items);
+    checkUnnamed115(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterVerificationCodes--;
 }
 
-buildUnnamed496() {
+buildUnnamed116() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed496(core.List<core.String> o) {
+checkUnnamed116(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed497() {
+buildUnnamed117() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed497(core.List<core.String> o) {
+checkUnnamed117(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed498() {
+buildUnnamed118() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed498(core.List<core.String> o) {
+checkUnnamed118(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed499() {
+buildUnnamed119() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed499(core.List<core.String> o) {
+checkUnnamed119(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3924,7 +3924,7 @@
       var mock = new common_test.HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed496();
+      var arg_orgUnitPath = buildUnnamed116();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3978,7 +3978,7 @@
       var mock = new common_test.HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed497();
+      var arg_orgUnitPath = buildUnnamed117();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4149,7 +4149,7 @@
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed498();
+      var arg_orgUnitPath = buildUnnamed118();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
         checkOrgUnit(obj);
@@ -4209,7 +4209,7 @@
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed499();
+      var arg_orgUnitPath = buildUnnamed119();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
         checkOrgUnit(obj);
diff --git a/generated/googleapis/test/admin/email_migration_v2_test.dart b/generated/googleapis/test/admin/email_migration_v2_test.dart
index 8bb3315..9818823 100644
--- a/generated/googleapis/test/admin/email_migration_v2_test.dart
+++ b/generated/googleapis/test/admin/email_migration_v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed0() {
+buildUnnamed120() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed0(core.List<core.String> o) {
+checkUnnamed120(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -42,7 +42,7 @@
     o.isTrash = true;
     o.isUnread = true;
     o.kind = "foo";
-    o.labels = buildUnnamed0();
+    o.labels = buildUnnamed120();
   }
   buildCounterMailItem--;
   return o;
@@ -59,7 +59,7 @@
     unittest.expect(o.isTrash, unittest.isTrue);
     unittest.expect(o.isUnread, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed0(o.labels);
+    checkUnnamed120(o.labels);
   }
   buildCounterMailItem--;
 }
diff --git a/generated/googleapis/test/admin/reports_v1_test.dart b/generated/googleapis/test/admin/reports_v1_test.dart
index c2ac019..fb9178a 100644
--- a/generated/googleapis/test/admin/reports_v1_test.dart
+++ b/generated/googleapis/test/admin/reports_v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed391() {
+buildUnnamed121() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed391(core.List<api.Activity> o) {
+checkUnnamed121(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -35,7 +35,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed391();
+    o.items = buildUnnamed121();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -47,7 +47,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed391(o.items);
+    checkUnnamed121(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -79,27 +79,27 @@
   buildCounterActivityActor--;
 }
 
-buildUnnamed392() {
+buildUnnamed122() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed392(core.List<core.String> o) {
+checkUnnamed122(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed393() {
+buildUnnamed123() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed393(core.List<core.String> o) {
+checkUnnamed123(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -112,8 +112,8 @@
   if (buildCounterActivityEventsParameters < 3) {
     o.boolValue = true;
     o.intValue = "foo";
-    o.multiIntValue = buildUnnamed392();
-    o.multiValue = buildUnnamed393();
+    o.multiIntValue = buildUnnamed122();
+    o.multiValue = buildUnnamed123();
     o.name = "foo";
     o.value = "foo";
   }
@@ -126,22 +126,22 @@
   if (buildCounterActivityEventsParameters < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkUnnamed392(o.multiIntValue);
-    checkUnnamed393(o.multiValue);
+    checkUnnamed122(o.multiIntValue);
+    checkUnnamed123(o.multiValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterActivityEventsParameters--;
 }
 
-buildUnnamed394() {
+buildUnnamed124() {
   var o = new core.List<api.ActivityEventsParameters>();
   o.add(buildActivityEventsParameters());
   o.add(buildActivityEventsParameters());
   return o;
 }
 
-checkUnnamed394(core.List<api.ActivityEventsParameters> o) {
+checkUnnamed124(core.List<api.ActivityEventsParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEventsParameters(o[0]);
   checkActivityEventsParameters(o[1]);
@@ -153,7 +153,7 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     o.name = "foo";
-    o.parameters = buildUnnamed394();
+    o.parameters = buildUnnamed124();
     o.type = "foo";
   }
   buildCounterActivityEvents--;
@@ -164,20 +164,20 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed394(o.parameters);
+    checkUnnamed124(o.parameters);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterActivityEvents--;
 }
 
-buildUnnamed395() {
+buildUnnamed125() {
   var o = new core.List<api.ActivityEvents>();
   o.add(buildActivityEvents());
   o.add(buildActivityEvents());
   return o;
 }
 
-checkUnnamed395(core.List<api.ActivityEvents> o) {
+checkUnnamed125(core.List<api.ActivityEvents> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEvents(o[0]);
   checkActivityEvents(o[1]);
@@ -215,7 +215,7 @@
   if (buildCounterActivity < 3) {
     o.actor = buildActivityActor();
     o.etag = "foo";
-    o.events = buildUnnamed395();
+    o.events = buildUnnamed125();
     o.id = buildActivityId();
     o.ipAddress = "foo";
     o.kind = "foo";
@@ -230,7 +230,7 @@
   if (buildCounterActivity < 3) {
     checkActivityActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed395(o.events);
+    checkUnnamed125(o.events);
     checkActivityId(o.id);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -239,14 +239,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed396() {
+buildUnnamed126() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed396(core.Map<core.String, core.String> o) {
+checkUnnamed126(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -261,7 +261,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed396();
+    o.params = buildUnnamed126();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -279,7 +279,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed396(o.params);
+    checkUnnamed126(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -314,30 +314,30 @@
   buildCounterUsageReportEntity--;
 }
 
-buildUnnamed397() {
+buildUnnamed127() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   return o;
 }
 
-checkUnnamed397(core.Map<core.String, core.Object> o) {
+checkUnnamed127(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed398() {
+buildUnnamed128() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed397());
-  o.add(buildUnnamed397());
+  o.add(buildUnnamed127());
+  o.add(buildUnnamed127());
   return o;
 }
 
-checkUnnamed398(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed128(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed397(o[0]);
-  checkUnnamed397(o[1]);
+  checkUnnamed127(o[0]);
+  checkUnnamed127(o[1]);
 }
 
 core.int buildCounterUsageReportParameters = 0;
@@ -348,7 +348,7 @@
     o.boolValue = true;
     o.datetimeValue = core.DateTime.parse("2002-02-27T14:01:02");
     o.intValue = "foo";
-    o.msgValue = buildUnnamed398();
+    o.msgValue = buildUnnamed128();
     o.name = "foo";
     o.stringValue = "foo";
   }
@@ -362,21 +362,21 @@
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.datetimeValue, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkUnnamed398(o.msgValue);
+    checkUnnamed128(o.msgValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
   buildCounterUsageReportParameters--;
 }
 
-buildUnnamed399() {
+buildUnnamed129() {
   var o = new core.List<api.UsageReportParameters>();
   o.add(buildUsageReportParameters());
   o.add(buildUsageReportParameters());
   return o;
 }
 
-checkUnnamed399(core.List<api.UsageReportParameters> o) {
+checkUnnamed129(core.List<api.UsageReportParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportParameters(o[0]);
   checkUsageReportParameters(o[1]);
@@ -391,7 +391,7 @@
     o.entity = buildUsageReportEntity();
     o.etag = "foo";
     o.kind = "foo";
-    o.parameters = buildUnnamed399();
+    o.parameters = buildUnnamed129();
   }
   buildCounterUsageReport--;
   return o;
@@ -404,19 +404,19 @@
     checkUsageReportEntity(o.entity);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed399(o.parameters);
+    checkUnnamed129(o.parameters);
   }
   buildCounterUsageReport--;
 }
 
-buildUnnamed400() {
+buildUnnamed130() {
   var o = new core.List<api.UsageReport>();
   o.add(buildUsageReport());
   o.add(buildUsageReport());
   return o;
 }
 
-checkUnnamed400(core.List<api.UsageReport> o) {
+checkUnnamed130(core.List<api.UsageReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReport(o[0]);
   checkUsageReport(o[1]);
@@ -443,14 +443,14 @@
   buildCounterUsageReportsWarningsData--;
 }
 
-buildUnnamed401() {
+buildUnnamed131() {
   var o = new core.List<api.UsageReportsWarningsData>();
   o.add(buildUsageReportsWarningsData());
   o.add(buildUsageReportsWarningsData());
   return o;
 }
 
-checkUnnamed401(core.List<api.UsageReportsWarningsData> o) {
+checkUnnamed131(core.List<api.UsageReportsWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarningsData(o[0]);
   checkUsageReportsWarningsData(o[1]);
@@ -462,7 +462,7 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed401();
+    o.data = buildUnnamed131();
     o.message = "foo";
   }
   buildCounterUsageReportsWarnings--;
@@ -473,20 +473,20 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed401(o.data);
+    checkUnnamed131(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterUsageReportsWarnings--;
 }
 
-buildUnnamed402() {
+buildUnnamed132() {
   var o = new core.List<api.UsageReportsWarnings>();
   o.add(buildUsageReportsWarnings());
   o.add(buildUsageReportsWarnings());
   return o;
 }
 
-checkUnnamed402(core.List<api.UsageReportsWarnings> o) {
+checkUnnamed132(core.List<api.UsageReportsWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarnings(o[0]);
   checkUsageReportsWarnings(o[1]);
@@ -500,8 +500,8 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.usageReports = buildUnnamed400();
-    o.warnings = buildUnnamed402();
+    o.usageReports = buildUnnamed130();
+    o.warnings = buildUnnamed132();
   }
   buildCounterUsageReports--;
   return o;
@@ -513,8 +513,8 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed400(o.usageReports);
-    checkUnnamed402(o.warnings);
+    checkUnnamed130(o.usageReports);
+    checkUnnamed132(o.warnings);
   }
   buildCounterUsageReports--;
 }
diff --git a/generated/googleapis/test/adsense/v1_4_test.dart b/generated/googleapis/test/adsense/v1_4_test.dart
index 44ed22b..fcde049 100644
--- a/generated/googleapis/test/adsense/v1_4_test.dart
+++ b/generated/googleapis/test/adsense/v1_4_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed887() {
+buildUnnamed133() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed887(core.List<api.Account> o) {
+checkUnnamed133(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -38,7 +38,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.premium = true;
-    o.subAccounts = buildUnnamed887();
+    o.subAccounts = buildUnnamed133();
     o.timezone = "foo";
   }
   buildCounterAccount--;
@@ -52,20 +52,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.premium, unittest.isTrue);
-    checkUnnamed887(o.subAccounts);
+    checkUnnamed133(o.subAccounts);
     unittest.expect(o.timezone, unittest.equals('foo'));
   }
   buildCounterAccount--;
 }
 
-buildUnnamed888() {
+buildUnnamed134() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed888(core.List<api.Account> o) {
+checkUnnamed134(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -77,7 +77,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed888();
+    o.items = buildUnnamed134();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -89,7 +89,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed888(o.items);
+    checkUnnamed134(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -125,14 +125,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed889() {
+buildUnnamed135() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed889(core.List<api.AdClient> o) {
+checkUnnamed135(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -144,7 +144,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed889();
+    o.items = buildUnnamed135();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -156,7 +156,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed889(o.items);
+    checkUnnamed135(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -390,14 +390,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed890() {
+buildUnnamed136() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed890(core.List<api.AdUnit> o) {
+checkUnnamed136(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -409,7 +409,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed890();
+    o.items = buildUnnamed136();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -421,21 +421,21 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed890(o.items);
+    checkUnnamed136(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdUnits--;
 }
 
-buildUnnamed891() {
+buildUnnamed137() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed891(core.List<core.String> o) {
+checkUnnamed137(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -464,66 +464,66 @@
   buildCounterAdsenseReportsGenerateResponseHeaders--;
 }
 
-buildUnnamed892() {
+buildUnnamed138() {
   var o = new core.List<api.AdsenseReportsGenerateResponseHeaders>();
   o.add(buildAdsenseReportsGenerateResponseHeaders());
   o.add(buildAdsenseReportsGenerateResponseHeaders());
   return o;
 }
 
-checkUnnamed892(core.List<api.AdsenseReportsGenerateResponseHeaders> o) {
+checkUnnamed138(core.List<api.AdsenseReportsGenerateResponseHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdsenseReportsGenerateResponseHeaders(o[0]);
   checkAdsenseReportsGenerateResponseHeaders(o[1]);
 }
 
-buildUnnamed893() {
+buildUnnamed139() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed893(core.List<core.String> o) {
+checkUnnamed139(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed894() {
+buildUnnamed140() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed893());
-  o.add(buildUnnamed893());
+  o.add(buildUnnamed139());
+  o.add(buildUnnamed139());
   return o;
 }
 
-checkUnnamed894(core.List<core.List<core.String>> o) {
+checkUnnamed140(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed893(o[0]);
-  checkUnnamed893(o[1]);
+  checkUnnamed139(o[0]);
+  checkUnnamed139(o[1]);
 }
 
-buildUnnamed895() {
+buildUnnamed141() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed895(core.List<core.String> o) {
+checkUnnamed141(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed896() {
+buildUnnamed142() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed896(core.List<core.String> o) {
+checkUnnamed142(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -534,15 +534,15 @@
   var o = new api.AdsenseReportsGenerateResponse();
   buildCounterAdsenseReportsGenerateResponse++;
   if (buildCounterAdsenseReportsGenerateResponse < 3) {
-    o.averages = buildUnnamed891();
+    o.averages = buildUnnamed137();
     o.endDate = "foo";
-    o.headers = buildUnnamed892();
+    o.headers = buildUnnamed138();
     o.kind = "foo";
-    o.rows = buildUnnamed894();
+    o.rows = buildUnnamed140();
     o.startDate = "foo";
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed895();
-    o.warnings = buildUnnamed896();
+    o.totals = buildUnnamed141();
+    o.warnings = buildUnnamed142();
   }
   buildCounterAdsenseReportsGenerateResponse--;
   return o;
@@ -551,15 +551,15 @@
 checkAdsenseReportsGenerateResponse(api.AdsenseReportsGenerateResponse o) {
   buildCounterAdsenseReportsGenerateResponse++;
   if (buildCounterAdsenseReportsGenerateResponse < 3) {
-    checkUnnamed891(o.averages);
+    checkUnnamed137(o.averages);
     unittest.expect(o.endDate, unittest.equals('foo'));
-    checkUnnamed892(o.headers);
+    checkUnnamed138(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed894(o.rows);
+    checkUnnamed140(o.rows);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed895(o.totals);
-    checkUnnamed896(o.warnings);
+    checkUnnamed141(o.totals);
+    checkUnnamed142(o.warnings);
   }
   buildCounterAdsenseReportsGenerateResponse--;
 }
@@ -593,14 +593,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed897() {
+buildUnnamed143() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed897(core.List<api.Alert> o) {
+checkUnnamed143(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -611,7 +611,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed897();
+    o.items = buildUnnamed143();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -621,7 +621,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed897(o.items);
+    checkUnnamed143(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -679,14 +679,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed898() {
+buildUnnamed144() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed898(core.List<api.CustomChannel> o) {
+checkUnnamed144(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -698,7 +698,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed898();
+    o.items = buildUnnamed144();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -710,21 +710,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed898(o.items);
+    checkUnnamed144(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed899() {
+buildUnnamed145() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed899(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed145(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -735,7 +735,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed899();
+    o.items = buildUnnamed145();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -745,7 +745,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed899(o.items);
+    checkUnnamed145(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -778,14 +778,14 @@
   buildCounterPayment--;
 }
 
-buildUnnamed900() {
+buildUnnamed146() {
   var o = new core.List<api.Payment>();
   o.add(buildPayment());
   o.add(buildPayment());
   return o;
 }
 
-checkUnnamed900(core.List<api.Payment> o) {
+checkUnnamed146(core.List<api.Payment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPayment(o[0]);
   checkPayment(o[1]);
@@ -796,7 +796,7 @@
   var o = new api.Payments();
   buildCounterPayments++;
   if (buildCounterPayments < 3) {
-    o.items = buildUnnamed900();
+    o.items = buildUnnamed146();
     o.kind = "foo";
   }
   buildCounterPayments--;
@@ -806,72 +806,72 @@
 checkPayments(api.Payments o) {
   buildCounterPayments++;
   if (buildCounterPayments < 3) {
-    checkUnnamed900(o.items);
+    checkUnnamed146(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPayments--;
 }
 
-buildUnnamed901() {
+buildUnnamed147() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed901(core.List<core.String> o) {
+checkUnnamed147(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed902() {
+buildUnnamed148() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed902(core.List<core.String> o) {
+checkUnnamed148(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed903() {
+buildUnnamed149() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed903(core.List<core.String> o) {
+checkUnnamed149(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed904() {
+buildUnnamed150() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed904(core.List<core.String> o) {
+checkUnnamed150(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed905() {
+buildUnnamed151() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed905(core.List<core.String> o) {
+checkUnnamed151(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -882,13 +882,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed901();
-    o.compatibleMetrics = buildUnnamed902();
+    o.compatibleDimensions = buildUnnamed147();
+    o.compatibleMetrics = buildUnnamed148();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed903();
-    o.requiredMetrics = buildUnnamed904();
-    o.supportedProducts = buildUnnamed905();
+    o.requiredDimensions = buildUnnamed149();
+    o.requiredMetrics = buildUnnamed150();
+    o.supportedProducts = buildUnnamed151();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -897,13 +897,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed901(o.compatibleDimensions);
-    checkUnnamed902(o.compatibleMetrics);
+    checkUnnamed147(o.compatibleDimensions);
+    checkUnnamed148(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed903(o.requiredDimensions);
-    checkUnnamed904(o.requiredMetrics);
-    checkUnnamed905(o.supportedProducts);
+    checkUnnamed149(o.requiredDimensions);
+    checkUnnamed150(o.requiredMetrics);
+    checkUnnamed151(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -933,14 +933,14 @@
   buildCounterSavedAdStyle--;
 }
 
-buildUnnamed906() {
+buildUnnamed152() {
   var o = new core.List<api.SavedAdStyle>();
   o.add(buildSavedAdStyle());
   o.add(buildSavedAdStyle());
   return o;
 }
 
-checkUnnamed906(core.List<api.SavedAdStyle> o) {
+checkUnnamed152(core.List<api.SavedAdStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedAdStyle(o[0]);
   checkSavedAdStyle(o[1]);
@@ -952,7 +952,7 @@
   buildCounterSavedAdStyles++;
   if (buildCounterSavedAdStyles < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed906();
+    o.items = buildUnnamed152();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -964,7 +964,7 @@
   buildCounterSavedAdStyles++;
   if (buildCounterSavedAdStyles < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed906(o.items);
+    checkUnnamed152(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -994,14 +994,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed907() {
+buildUnnamed153() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed907(core.List<api.SavedReport> o) {
+checkUnnamed153(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -1013,7 +1013,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed907();
+    o.items = buildUnnamed153();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1025,7 +1025,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed907(o.items);
+    checkUnnamed153(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1055,14 +1055,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed908() {
+buildUnnamed154() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed908(core.List<api.UrlChannel> o) {
+checkUnnamed154(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -1074,7 +1074,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed908();
+    o.items = buildUnnamed154();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1086,125 +1086,125 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed908(o.items);
+    checkUnnamed154(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed909() {
+buildUnnamed155() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed909(core.List<core.String> o) {
+checkUnnamed155(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed910() {
+buildUnnamed156() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed910(core.List<core.String> o) {
+checkUnnamed156(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed911() {
+buildUnnamed157() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed911(core.List<core.String> o) {
+checkUnnamed157(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed912() {
+buildUnnamed158() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed912(core.List<core.String> o) {
+checkUnnamed158(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed913() {
+buildUnnamed159() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed913(core.List<core.String> o) {
+checkUnnamed159(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed914() {
+buildUnnamed160() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed914(core.List<core.String> o) {
+checkUnnamed160(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed915() {
+buildUnnamed161() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed915(core.List<core.String> o) {
+checkUnnamed161(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed916() {
+buildUnnamed162() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed916(core.List<core.String> o) {
+checkUnnamed162(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed917() {
+buildUnnamed163() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed917(core.List<core.String> o) {
+checkUnnamed163(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2333,12 +2333,12 @@
       var arg_startDate = "foo";
       var arg_endDate = "foo";
       var arg_currency = "foo";
-      var arg_dimension = buildUnnamed909();
-      var arg_filter = buildUnnamed910();
+      var arg_dimension = buildUnnamed155();
+      var arg_filter = buildUnnamed156();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed911();
-      var arg_sort = buildUnnamed912();
+      var arg_metric = buildUnnamed157();
+      var arg_sort = buildUnnamed158();
       var arg_startIndex = 42;
       var arg_useTimezoneReporting = true;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -3460,14 +3460,14 @@
       api.ReportsResourceApi res = new api.AdsenseApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_accountId = buildUnnamed913();
+      var arg_accountId = buildUnnamed159();
       var arg_currency = "foo";
-      var arg_dimension = buildUnnamed914();
-      var arg_filter = buildUnnamed915();
+      var arg_dimension = buildUnnamed160();
+      var arg_filter = buildUnnamed161();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed916();
-      var arg_sort = buildUnnamed917();
+      var arg_metric = buildUnnamed162();
+      var arg_sort = buildUnnamed163();
       var arg_startIndex = 42;
       var arg_useTimezoneReporting = true;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/adsensehost/v4_1_test.dart b/generated/googleapis/test/adsensehost/v4_1_test.dart
index 3c7536b..7476d8a 100644
--- a/generated/googleapis/test/adsensehost/v4_1_test.dart
+++ b/generated/googleapis/test/adsensehost/v4_1_test.dart
@@ -41,14 +41,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed1097() {
+buildUnnamed164() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed1097(core.List<api.Account> o) {
+checkUnnamed164(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -60,7 +60,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1097();
+    o.items = buildUnnamed164();
     o.kind = "foo";
   }
   buildCounterAccounts--;
@@ -71,7 +71,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1097(o.items);
+    checkUnnamed164(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccounts--;
@@ -104,14 +104,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed1098() {
+buildUnnamed165() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed1098(core.List<api.AdClient> o) {
+checkUnnamed165(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -123,7 +123,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1098();
+    o.items = buildUnnamed165();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -135,7 +135,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1098(o.items);
+    checkUnnamed165(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -340,14 +340,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed1099() {
+buildUnnamed166() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed1099(core.List<api.AdUnit> o) {
+checkUnnamed166(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -359,7 +359,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1099();
+    o.items = buildUnnamed166();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -371,21 +371,21 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1099(o.items);
+    checkUnnamed166(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdUnits--;
 }
 
-buildUnnamed1100() {
+buildUnnamed167() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1100(core.List<core.String> o) {
+checkUnnamed167(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -399,7 +399,7 @@
     o.accountId = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.productCodes = buildUnnamed1100();
+    o.productCodes = buildUnnamed167();
     o.redirectUrl = "foo";
     o.status = "foo";
     o.userLocale = "foo";
@@ -416,7 +416,7 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1100(o.productCodes);
+    checkUnnamed167(o.productCodes);
     unittest.expect(o.redirectUrl, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.userLocale, unittest.equals('foo'));
@@ -451,14 +451,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed1101() {
+buildUnnamed168() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed1101(core.List<api.CustomChannel> o) {
+checkUnnamed168(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -470,7 +470,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1101();
+    o.items = buildUnnamed168();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -482,21 +482,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1101(o.items);
+    checkUnnamed168(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed1102() {
+buildUnnamed169() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1102(core.List<core.String> o) {
+checkUnnamed169(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -525,66 +525,66 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed1103() {
+buildUnnamed170() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed1103(core.List<api.ReportHeaders> o) {
+checkUnnamed170(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed1104() {
+buildUnnamed171() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1104(core.List<core.String> o) {
+checkUnnamed171(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1105() {
+buildUnnamed172() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed1104());
-  o.add(buildUnnamed1104());
+  o.add(buildUnnamed171());
+  o.add(buildUnnamed171());
   return o;
 }
 
-checkUnnamed1105(core.List<core.List<core.String>> o) {
+checkUnnamed172(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1104(o[0]);
-  checkUnnamed1104(o[1]);
+  checkUnnamed171(o[0]);
+  checkUnnamed171(o[1]);
 }
 
-buildUnnamed1106() {
+buildUnnamed173() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1106(core.List<core.String> o) {
+checkUnnamed173(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1107() {
+buildUnnamed174() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1107(core.List<core.String> o) {
+checkUnnamed174(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -595,13 +595,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed1102();
-    o.headers = buildUnnamed1103();
+    o.averages = buildUnnamed169();
+    o.headers = buildUnnamed170();
     o.kind = "foo";
-    o.rows = buildUnnamed1105();
+    o.rows = buildUnnamed172();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed1106();
-    o.warnings = buildUnnamed1107();
+    o.totals = buildUnnamed173();
+    o.warnings = buildUnnamed174();
   }
   buildCounterReport--;
   return o;
@@ -610,13 +610,13 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed1102(o.averages);
-    checkUnnamed1103(o.headers);
+    checkUnnamed169(o.averages);
+    checkUnnamed170(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1105(o.rows);
+    checkUnnamed172(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed1106(o.totals);
-    checkUnnamed1107(o.warnings);
+    checkUnnamed173(o.totals);
+    checkUnnamed174(o.warnings);
   }
   buildCounterReport--;
 }
@@ -644,14 +644,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed1108() {
+buildUnnamed175() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed1108(core.List<api.UrlChannel> o) {
+checkUnnamed175(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -663,7 +663,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1108();
+    o.items = buildUnnamed175();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -675,151 +675,151 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1108(o.items);
+    checkUnnamed175(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed1109() {
+buildUnnamed176() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1109(core.List<core.String> o) {
+checkUnnamed176(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1110() {
+buildUnnamed177() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1110(core.List<core.String> o) {
+checkUnnamed177(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1111() {
+buildUnnamed178() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1111(core.List<core.String> o) {
+checkUnnamed178(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1112() {
+buildUnnamed179() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1112(core.List<core.String> o) {
+checkUnnamed179(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1113() {
+buildUnnamed180() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1113(core.List<core.String> o) {
+checkUnnamed180(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1114() {
+buildUnnamed181() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1114(core.List<core.String> o) {
+checkUnnamed181(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1115() {
+buildUnnamed182() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1115(core.List<core.String> o) {
+checkUnnamed182(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1116() {
+buildUnnamed183() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1116(core.List<core.String> o) {
+checkUnnamed183(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1117() {
+buildUnnamed184() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1117(core.List<core.String> o) {
+checkUnnamed184(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1118() {
+buildUnnamed185() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1118(core.List<core.String> o) {
+checkUnnamed185(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1119() {
+buildUnnamed186() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1119(core.List<core.String> o) {
+checkUnnamed186(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1061,7 +1061,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.AccountsResourceApi res = new api.AdsensehostApi(mock).accounts;
-      var arg_filterAdClientId = buildUnnamed1109();
+      var arg_filterAdClientId = buildUnnamed176();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1363,7 +1363,7 @@
       var arg_accountId = "foo";
       var arg_adClientId = "foo";
       var arg_adUnitId = "foo";
-      var arg_hostCustomChannelId = buildUnnamed1110();
+      var arg_hostCustomChannelId = buildUnnamed177();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1702,12 +1702,12 @@
       var arg_accountId = "foo";
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed1111();
-      var arg_filter = buildUnnamed1112();
+      var arg_dimension = buildUnnamed178();
+      var arg_filter = buildUnnamed179();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed1113();
-      var arg_sort = buildUnnamed1114();
+      var arg_metric = buildUnnamed180();
+      var arg_sort = buildUnnamed181();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1876,7 +1876,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.AssociationsessionsResourceApi res = new api.AdsensehostApi(mock).associationsessions;
-      var arg_productCode = buildUnnamed1115();
+      var arg_productCode = buildUnnamed182();
       var arg_websiteUrl = "foo";
       var arg_userLocale = "foo";
       var arg_websiteLocale = "foo";
@@ -2330,12 +2330,12 @@
       api.ReportsResourceApi res = new api.AdsensehostApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed1116();
-      var arg_filter = buildUnnamed1117();
+      var arg_dimension = buildUnnamed183();
+      var arg_filter = buildUnnamed184();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed1118();
-      var arg_sort = buildUnnamed1119();
+      var arg_metric = buildUnnamed185();
+      var arg_sort = buildUnnamed186();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/analytics/v3_test.dart b/generated/googleapis/test/analytics/v3_test.dart
index 3457000..a5a07cc 100644
--- a/generated/googleapis/test/analytics/v3_test.dart
+++ b/generated/googleapis/test/analytics/v3_test.dart
@@ -37,14 +37,14 @@
   buildCounterAccountChildLink--;
 }
 
-buildUnnamed599() {
+buildUnnamed187() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed599(core.List<core.String> o) {
+checkUnnamed187(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -55,7 +55,7 @@
   var o = new api.AccountPermissions();
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    o.effective = buildUnnamed599();
+    o.effective = buildUnnamed187();
   }
   buildCounterAccountPermissions--;
   return o;
@@ -64,7 +64,7 @@
 checkAccountPermissions(api.AccountPermissions o) {
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    checkUnnamed599(o.effective);
+    checkUnnamed187(o.effective);
   }
   buildCounterAccountPermissions--;
 }
@@ -127,14 +127,14 @@
   buildCounterAccountRef--;
 }
 
-buildUnnamed600() {
+buildUnnamed188() {
   var o = new core.List<api.AccountSummary>();
   o.add(buildAccountSummary());
   o.add(buildAccountSummary());
   return o;
 }
 
-checkUnnamed600(core.List<api.AccountSummary> o) {
+checkUnnamed188(core.List<api.AccountSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountSummary(o[0]);
   checkAccountSummary(o[1]);
@@ -145,7 +145,7 @@
   var o = new api.AccountSummaries();
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    o.items = buildUnnamed600();
+    o.items = buildUnnamed188();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -161,7 +161,7 @@
 checkAccountSummaries(api.AccountSummaries o) {
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    checkUnnamed600(o.items);
+    checkUnnamed188(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -173,14 +173,14 @@
   buildCounterAccountSummaries--;
 }
 
-buildUnnamed601() {
+buildUnnamed189() {
   var o = new core.List<api.WebPropertySummary>();
   o.add(buildWebPropertySummary());
   o.add(buildWebPropertySummary());
   return o;
 }
 
-checkUnnamed601(core.List<api.WebPropertySummary> o) {
+checkUnnamed189(core.List<api.WebPropertySummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebPropertySummary(o[0]);
   checkWebPropertySummary(o[1]);
@@ -194,7 +194,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.webProperties = buildUnnamed601();
+    o.webProperties = buildUnnamed189();
   }
   buildCounterAccountSummary--;
   return o;
@@ -206,7 +206,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed601(o.webProperties);
+    checkUnnamed189(o.webProperties);
   }
   buildCounterAccountSummary--;
 }
@@ -240,14 +240,14 @@
   buildCounterAccountTicket--;
 }
 
-buildUnnamed602() {
+buildUnnamed190() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed602(core.List<api.Account> o) {
+checkUnnamed190(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -258,7 +258,7 @@
   var o = new api.Accounts();
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    o.items = buildUnnamed602();
+    o.items = buildUnnamed190();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -274,7 +274,7 @@
 checkAccounts(api.Accounts o) {
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    checkUnnamed602(o.items);
+    checkUnnamed190(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -309,14 +309,14 @@
   buildCounterAdWordsAccount--;
 }
 
-buildUnnamed603() {
+buildUnnamed191() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed603(core.List<core.String> o) {
+checkUnnamed191(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -327,7 +327,7 @@
   var o = new api.AnalyticsDataimportDeleteUploadDataRequest();
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    o.customDataImportUids = buildUnnamed603();
+    o.customDataImportUids = buildUnnamed191();
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
   return o;
@@ -336,19 +336,19 @@
 checkAnalyticsDataimportDeleteUploadDataRequest(api.AnalyticsDataimportDeleteUploadDataRequest o) {
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    checkUnnamed603(o.customDataImportUids);
+    checkUnnamed191(o.customDataImportUids);
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
 }
 
-buildUnnamed604() {
+buildUnnamed192() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed604(core.Map<core.String, core.String> o) {
+checkUnnamed192(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -359,7 +359,7 @@
   var o = new api.Column();
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    o.attributes = buildUnnamed604();
+    o.attributes = buildUnnamed192();
     o.id = "foo";
     o.kind = "foo";
   }
@@ -370,34 +370,34 @@
 checkColumn(api.Column o) {
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    checkUnnamed604(o.attributes);
+    checkUnnamed192(o.attributes);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterColumn--;
 }
 
-buildUnnamed605() {
+buildUnnamed193() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed605(core.List<core.String> o) {
+checkUnnamed193(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed606() {
+buildUnnamed194() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed606(core.List<api.Column> o) {
+checkUnnamed194(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -408,9 +408,9 @@
   var o = new api.Columns();
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    o.attributeNames = buildUnnamed605();
+    o.attributeNames = buildUnnamed193();
     o.etag = "foo";
-    o.items = buildUnnamed606();
+    o.items = buildUnnamed194();
     o.kind = "foo";
     o.totalResults = 42;
   }
@@ -421,9 +421,9 @@
 checkColumns(api.Columns o) {
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    checkUnnamed605(o.attributeNames);
+    checkUnnamed193(o.attributeNames);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed606(o.items);
+    checkUnnamed194(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
   }
@@ -472,14 +472,14 @@
   buildCounterCustomDataSourceParentLink--;
 }
 
-buildUnnamed607() {
+buildUnnamed195() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed607(core.List<core.String> o) {
+checkUnnamed195(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -499,7 +499,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.parentLink = buildCustomDataSourceParentLink();
-    o.profilesLinked = buildUnnamed607();
+    o.profilesLinked = buildUnnamed195();
     o.selfLink = "foo";
     o.type = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -522,7 +522,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkCustomDataSourceParentLink(o.parentLink);
-    checkUnnamed607(o.profilesLinked);
+    checkUnnamed195(o.profilesLinked);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -532,14 +532,14 @@
   buildCounterCustomDataSource--;
 }
 
-buildUnnamed608() {
+buildUnnamed196() {
   var o = new core.List<api.CustomDataSource>();
   o.add(buildCustomDataSource());
   o.add(buildCustomDataSource());
   return o;
 }
 
-checkUnnamed608(core.List<api.CustomDataSource> o) {
+checkUnnamed196(core.List<api.CustomDataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDataSource(o[0]);
   checkCustomDataSource(o[1]);
@@ -550,7 +550,7 @@
   var o = new api.CustomDataSources();
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    o.items = buildUnnamed608();
+    o.items = buildUnnamed196();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -566,7 +566,7 @@
 checkCustomDataSources(api.CustomDataSources o) {
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    checkUnnamed608(o.items);
+    checkUnnamed196(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -620,14 +620,14 @@
   buildCounterDailyUploadRecentChanges--;
 }
 
-buildUnnamed609() {
+buildUnnamed197() {
   var o = new core.List<api.DailyUploadRecentChanges>();
   o.add(buildDailyUploadRecentChanges());
   o.add(buildDailyUploadRecentChanges());
   return o;
 }
 
-checkUnnamed609(core.List<api.DailyUploadRecentChanges> o) {
+checkUnnamed197(core.List<api.DailyUploadRecentChanges> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDailyUploadRecentChanges(o[0]);
   checkDailyUploadRecentChanges(o[1]);
@@ -646,7 +646,7 @@
     o.kind = "foo";
     o.modifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.parentLink = buildDailyUploadParentLink();
-    o.recentChanges = buildUnnamed609();
+    o.recentChanges = buildUnnamed197();
     o.selfLink = "foo";
     o.webPropertyId = "foo";
   }
@@ -665,7 +665,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.modifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkDailyUploadParentLink(o.parentLink);
-    checkUnnamed609(o.recentChanges);
+    checkUnnamed197(o.recentChanges);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
   }
@@ -703,14 +703,14 @@
   buildCounterDailyUploadAppend--;
 }
 
-buildUnnamed610() {
+buildUnnamed198() {
   var o = new core.List<api.DailyUpload>();
   o.add(buildDailyUpload());
   o.add(buildDailyUpload());
   return o;
 }
 
-checkUnnamed610(core.List<api.DailyUpload> o) {
+checkUnnamed198(core.List<api.DailyUpload> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDailyUpload(o[0]);
   checkDailyUpload(o[1]);
@@ -721,7 +721,7 @@
   var o = new api.DailyUploads();
   buildCounterDailyUploads++;
   if (buildCounterDailyUploads < 3) {
-    o.items = buildUnnamed610();
+    o.items = buildUnnamed198();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -737,7 +737,7 @@
 checkDailyUploads(api.DailyUploads o) {
   buildCounterDailyUploads++;
   if (buildCounterDailyUploads < 3) {
-    checkUnnamed610(o.items);
+    checkUnnamed198(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -749,14 +749,14 @@
   buildCounterDailyUploads--;
 }
 
-buildUnnamed611() {
+buildUnnamed199() {
   var o = new core.List<api.AdWordsAccount>();
   o.add(buildAdWordsAccount());
   o.add(buildAdWordsAccount());
   return o;
 }
 
-checkUnnamed611(core.List<api.AdWordsAccount> o) {
+checkUnnamed199(core.List<api.AdWordsAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdWordsAccount(o[0]);
   checkAdWordsAccount(o[1]);
@@ -781,14 +781,14 @@
   buildCounterEntityAdWordsLinkEntity--;
 }
 
-buildUnnamed612() {
+buildUnnamed200() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed612(core.List<core.String> o) {
+checkUnnamed200(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -799,12 +799,12 @@
   var o = new api.EntityAdWordsLink();
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    o.adWordsAccounts = buildUnnamed611();
+    o.adWordsAccounts = buildUnnamed199();
     o.entity = buildEntityAdWordsLinkEntity();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.profileIds = buildUnnamed612();
+    o.profileIds = buildUnnamed200();
     o.selfLink = "foo";
   }
   buildCounterEntityAdWordsLink--;
@@ -814,25 +814,25 @@
 checkEntityAdWordsLink(api.EntityAdWordsLink o) {
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    checkUnnamed611(o.adWordsAccounts);
+    checkUnnamed199(o.adWordsAccounts);
     checkEntityAdWordsLinkEntity(o.entity);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed612(o.profileIds);
+    checkUnnamed200(o.profileIds);
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterEntityAdWordsLink--;
 }
 
-buildUnnamed613() {
+buildUnnamed201() {
   var o = new core.List<api.EntityAdWordsLink>();
   o.add(buildEntityAdWordsLink());
   o.add(buildEntityAdWordsLink());
   return o;
 }
 
-checkUnnamed613(core.List<api.EntityAdWordsLink> o) {
+checkUnnamed201(core.List<api.EntityAdWordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAdWordsLink(o[0]);
   checkEntityAdWordsLink(o[1]);
@@ -843,7 +843,7 @@
   var o = new api.EntityAdWordsLinks();
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    o.items = buildUnnamed613();
+    o.items = buildUnnamed201();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -858,7 +858,7 @@
 checkEntityAdWordsLinks(api.EntityAdWordsLinks o) {
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    checkUnnamed613(o.items);
+    checkUnnamed201(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -892,27 +892,27 @@
   buildCounterEntityUserLinkEntity--;
 }
 
-buildUnnamed614() {
+buildUnnamed202() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed614(core.List<core.String> o) {
+checkUnnamed202(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed615() {
+buildUnnamed203() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed615(core.List<core.String> o) {
+checkUnnamed203(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -923,8 +923,8 @@
   var o = new api.EntityUserLinkPermissions();
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    o.effective = buildUnnamed614();
-    o.local = buildUnnamed615();
+    o.effective = buildUnnamed202();
+    o.local = buildUnnamed203();
   }
   buildCounterEntityUserLinkPermissions--;
   return o;
@@ -933,8 +933,8 @@
 checkEntityUserLinkPermissions(api.EntityUserLinkPermissions o) {
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    checkUnnamed614(o.effective);
-    checkUnnamed615(o.local);
+    checkUnnamed202(o.effective);
+    checkUnnamed203(o.local);
   }
   buildCounterEntityUserLinkPermissions--;
 }
@@ -968,14 +968,14 @@
   buildCounterEntityUserLink--;
 }
 
-buildUnnamed616() {
+buildUnnamed204() {
   var o = new core.List<api.EntityUserLink>();
   o.add(buildEntityUserLink());
   o.add(buildEntityUserLink());
   return o;
 }
 
-checkUnnamed616(core.List<api.EntityUserLink> o) {
+checkUnnamed204(core.List<api.EntityUserLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityUserLink(o[0]);
   checkEntityUserLink(o[1]);
@@ -986,7 +986,7 @@
   var o = new api.EntityUserLinks();
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    o.items = buildUnnamed616();
+    o.items = buildUnnamed204();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1001,7 +1001,7 @@
 checkEntityUserLinks(api.EntityUserLinks o) {
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    checkUnnamed616(o.items);
+    checkUnnamed204(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1060,14 +1060,14 @@
   buildCounterExperimentVariations--;
 }
 
-buildUnnamed617() {
+buildUnnamed205() {
   var o = new core.List<api.ExperimentVariations>();
   o.add(buildExperimentVariations());
   o.add(buildExperimentVariations());
   return o;
 }
 
-checkUnnamed617(core.List<api.ExperimentVariations> o) {
+checkUnnamed205(core.List<api.ExperimentVariations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperimentVariations(o[0]);
   checkExperimentVariations(o[1]);
@@ -1102,7 +1102,7 @@
     o.status = "foo";
     o.trafficCoverage = 42.0;
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
-    o.variations = buildUnnamed617();
+    o.variations = buildUnnamed205();
     o.webPropertyId = "foo";
     o.winnerConfidenceLevel = 42.0;
     o.winnerFound = true;
@@ -1138,7 +1138,7 @@
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.trafficCoverage, unittest.equals(42.0));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed617(o.variations);
+    checkUnnamed205(o.variations);
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
     unittest.expect(o.winnerConfidenceLevel, unittest.equals(42.0));
     unittest.expect(o.winnerFound, unittest.isTrue);
@@ -1146,14 +1146,14 @@
   buildCounterExperiment--;
 }
 
-buildUnnamed618() {
+buildUnnamed206() {
   var o = new core.List<api.Experiment>();
   o.add(buildExperiment());
   o.add(buildExperiment());
   return o;
 }
 
-checkUnnamed618(core.List<api.Experiment> o) {
+checkUnnamed206(core.List<api.Experiment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperiment(o[0]);
   checkExperiment(o[1]);
@@ -1164,7 +1164,7 @@
   var o = new api.Experiments();
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    o.items = buildUnnamed618();
+    o.items = buildUnnamed206();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1180,7 +1180,7 @@
 checkExperiments(api.Experiments o) {
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    checkUnnamed618(o.items);
+    checkUnnamed206(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1414,14 +1414,14 @@
   buildCounterFilterRef--;
 }
 
-buildUnnamed619() {
+buildUnnamed207() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed619(core.List<api.Filter> o) {
+checkUnnamed207(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -1432,7 +1432,7 @@
   var o = new api.Filters();
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    o.items = buildUnnamed619();
+    o.items = buildUnnamed207();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1448,7 +1448,7 @@
 checkFilters(api.Filters o) {
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    checkUnnamed619(o.items);
+    checkUnnamed207(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1483,14 +1483,14 @@
   buildCounterGaDataColumnHeaders--;
 }
 
-buildUnnamed620() {
+buildUnnamed208() {
   var o = new core.List<api.GaDataColumnHeaders>();
   o.add(buildGaDataColumnHeaders());
   o.add(buildGaDataColumnHeaders());
   return o;
 }
 
-checkUnnamed620(core.List<api.GaDataColumnHeaders> o) {
+checkUnnamed208(core.List<api.GaDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataColumnHeaders(o[0]);
   checkGaDataColumnHeaders(o[1]);
@@ -1519,14 +1519,14 @@
   buildCounterGaDataDataTableCols--;
 }
 
-buildUnnamed621() {
+buildUnnamed209() {
   var o = new core.List<api.GaDataDataTableCols>();
   o.add(buildGaDataDataTableCols());
   o.add(buildGaDataDataTableCols());
   return o;
 }
 
-checkUnnamed621(core.List<api.GaDataDataTableCols> o) {
+checkUnnamed209(core.List<api.GaDataDataTableCols> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableCols(o[0]);
   checkGaDataDataTableCols(o[1]);
@@ -1551,14 +1551,14 @@
   buildCounterGaDataDataTableRowsC--;
 }
 
-buildUnnamed622() {
+buildUnnamed210() {
   var o = new core.List<api.GaDataDataTableRowsC>();
   o.add(buildGaDataDataTableRowsC());
   o.add(buildGaDataDataTableRowsC());
   return o;
 }
 
-checkUnnamed622(core.List<api.GaDataDataTableRowsC> o) {
+checkUnnamed210(core.List<api.GaDataDataTableRowsC> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRowsC(o[0]);
   checkGaDataDataTableRowsC(o[1]);
@@ -1569,7 +1569,7 @@
   var o = new api.GaDataDataTableRows();
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    o.c = buildUnnamed622();
+    o.c = buildUnnamed210();
   }
   buildCounterGaDataDataTableRows--;
   return o;
@@ -1578,19 +1578,19 @@
 checkGaDataDataTableRows(api.GaDataDataTableRows o) {
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    checkUnnamed622(o.c);
+    checkUnnamed210(o.c);
   }
   buildCounterGaDataDataTableRows--;
 }
 
-buildUnnamed623() {
+buildUnnamed211() {
   var o = new core.List<api.GaDataDataTableRows>();
   o.add(buildGaDataDataTableRows());
   o.add(buildGaDataDataTableRows());
   return o;
 }
 
-checkUnnamed623(core.List<api.GaDataDataTableRows> o) {
+checkUnnamed211(core.List<api.GaDataDataTableRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRows(o[0]);
   checkGaDataDataTableRows(o[1]);
@@ -1601,8 +1601,8 @@
   var o = new api.GaDataDataTable();
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    o.cols = buildUnnamed621();
-    o.rows = buildUnnamed623();
+    o.cols = buildUnnamed209();
+    o.rows = buildUnnamed211();
   }
   buildCounterGaDataDataTable--;
   return o;
@@ -1611,8 +1611,8 @@
 checkGaDataDataTable(api.GaDataDataTable o) {
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    checkUnnamed621(o.cols);
-    checkUnnamed623(o.rows);
+    checkUnnamed209(o.cols);
+    checkUnnamed211(o.rows);
   }
   buildCounterGaDataDataTable--;
 }
@@ -1646,27 +1646,27 @@
   buildCounterGaDataProfileInfo--;
 }
 
-buildUnnamed624() {
+buildUnnamed212() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed624(core.List<core.String> o) {
+checkUnnamed212(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed625() {
+buildUnnamed213() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed625(core.List<core.String> o) {
+checkUnnamed213(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1682,10 +1682,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed624();
+    o.metrics = buildUnnamed212();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed625();
+    o.sort = buildUnnamed213();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -1701,50 +1701,50 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed624(o.metrics);
+    checkUnnamed212(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed625(o.sort);
+    checkUnnamed213(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
   buildCounterGaDataQuery--;
 }
 
-buildUnnamed626() {
+buildUnnamed214() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed626(core.List<core.String> o) {
+checkUnnamed214(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed627() {
+buildUnnamed215() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed626());
-  o.add(buildUnnamed626());
+  o.add(buildUnnamed214());
+  o.add(buildUnnamed214());
   return o;
 }
 
-checkUnnamed627(core.List<core.List<core.String>> o) {
+checkUnnamed215(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed626(o[0]);
-  checkUnnamed626(o[1]);
+  checkUnnamed214(o[0]);
+  checkUnnamed214(o[1]);
 }
 
-buildUnnamed628() {
+buildUnnamed216() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed628(core.Map<core.String, core.String> o) {
+checkUnnamed216(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1755,7 +1755,7 @@
   var o = new api.GaData();
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    o.columnHeaders = buildUnnamed620();
+    o.columnHeaders = buildUnnamed208();
     o.containsSampledData = true;
     o.dataTable = buildGaDataDataTable();
     o.id = "foo";
@@ -1765,12 +1765,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildGaDataProfileInfo();
     o.query = buildGaDataQuery();
-    o.rows = buildUnnamed627();
+    o.rows = buildUnnamed215();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed628();
+    o.totalsForAllResults = buildUnnamed216();
   }
   buildCounterGaData--;
   return o;
@@ -1779,7 +1779,7 @@
 checkGaData(api.GaData o) {
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    checkUnnamed620(o.columnHeaders);
+    checkUnnamed208(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     checkGaDataDataTable(o.dataTable);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1789,12 +1789,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkGaDataProfileInfo(o.profileInfo);
     checkGaDataQuery(o.query);
-    checkUnnamed627(o.rows);
+    checkUnnamed215(o.rows);
     unittest.expect(o.sampleSize, unittest.equals('foo'));
     unittest.expect(o.sampleSpace, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed628(o.totalsForAllResults);
+    checkUnnamed216(o.totalsForAllResults);
   }
   buildCounterGaData--;
 }
@@ -1826,14 +1826,14 @@
   buildCounterGoalEventDetailsEventConditions--;
 }
 
-buildUnnamed629() {
+buildUnnamed217() {
   var o = new core.List<api.GoalEventDetailsEventConditions>();
   o.add(buildGoalEventDetailsEventConditions());
   o.add(buildGoalEventDetailsEventConditions());
   return o;
 }
 
-checkUnnamed629(core.List<api.GoalEventDetailsEventConditions> o) {
+checkUnnamed217(core.List<api.GoalEventDetailsEventConditions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalEventDetailsEventConditions(o[0]);
   checkGoalEventDetailsEventConditions(o[1]);
@@ -1844,7 +1844,7 @@
   var o = new api.GoalEventDetails();
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    o.eventConditions = buildUnnamed629();
+    o.eventConditions = buildUnnamed217();
     o.useEventValue = true;
   }
   buildCounterGoalEventDetails--;
@@ -1854,7 +1854,7 @@
 checkGoalEventDetails(api.GoalEventDetails o) {
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    checkUnnamed629(o.eventConditions);
+    checkUnnamed217(o.eventConditions);
     unittest.expect(o.useEventValue, unittest.isTrue);
   }
   buildCounterGoalEventDetails--;
@@ -1904,14 +1904,14 @@
   buildCounterGoalUrlDestinationDetailsSteps--;
 }
 
-buildUnnamed630() {
+buildUnnamed218() {
   var o = new core.List<api.GoalUrlDestinationDetailsSteps>();
   o.add(buildGoalUrlDestinationDetailsSteps());
   o.add(buildGoalUrlDestinationDetailsSteps());
   return o;
 }
 
-checkUnnamed630(core.List<api.GoalUrlDestinationDetailsSteps> o) {
+checkUnnamed218(core.List<api.GoalUrlDestinationDetailsSteps> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalUrlDestinationDetailsSteps(o[0]);
   checkGoalUrlDestinationDetailsSteps(o[1]);
@@ -1925,7 +1925,7 @@
     o.caseSensitive = true;
     o.firstStepRequired = true;
     o.matchType = "foo";
-    o.steps = buildUnnamed630();
+    o.steps = buildUnnamed218();
     o.url = "foo";
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -1938,7 +1938,7 @@
     unittest.expect(o.caseSensitive, unittest.isTrue);
     unittest.expect(o.firstStepRequired, unittest.isTrue);
     unittest.expect(o.matchType, unittest.equals('foo'));
-    checkUnnamed630(o.steps);
+    checkUnnamed218(o.steps);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -2039,14 +2039,14 @@
   buildCounterGoal--;
 }
 
-buildUnnamed631() {
+buildUnnamed219() {
   var o = new core.List<api.Goal>();
   o.add(buildGoal());
   o.add(buildGoal());
   return o;
 }
 
-checkUnnamed631(core.List<api.Goal> o) {
+checkUnnamed219(core.List<api.Goal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoal(o[0]);
   checkGoal(o[1]);
@@ -2057,7 +2057,7 @@
   var o = new api.Goals();
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    o.items = buildUnnamed631();
+    o.items = buildUnnamed219();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2073,7 +2073,7 @@
 checkGoals(api.Goals o) {
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    checkUnnamed631(o.items);
+    checkUnnamed219(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2108,14 +2108,14 @@
   buildCounterMcfDataColumnHeaders--;
 }
 
-buildUnnamed632() {
+buildUnnamed220() {
   var o = new core.List<api.McfDataColumnHeaders>();
   o.add(buildMcfDataColumnHeaders());
   o.add(buildMcfDataColumnHeaders());
   return o;
 }
 
-checkUnnamed632(core.List<api.McfDataColumnHeaders> o) {
+checkUnnamed220(core.List<api.McfDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataColumnHeaders(o[0]);
   checkMcfDataColumnHeaders(o[1]);
@@ -2150,27 +2150,27 @@
   buildCounterMcfDataProfileInfo--;
 }
 
-buildUnnamed633() {
+buildUnnamed221() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed633(core.List<core.String> o) {
+checkUnnamed221(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed634() {
+buildUnnamed222() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed634(core.List<core.String> o) {
+checkUnnamed222(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2186,10 +2186,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed633();
+    o.metrics = buildUnnamed221();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed634();
+    o.sort = buildUnnamed222();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -2205,10 +2205,10 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed633(o.metrics);
+    checkUnnamed221(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed634(o.sort);
+    checkUnnamed222(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
@@ -2236,14 +2236,14 @@
   buildCounterMcfDataRowsConversionPathValue--;
 }
 
-buildUnnamed635() {
+buildUnnamed223() {
   var o = new core.List<api.McfDataRowsConversionPathValue>();
   o.add(buildMcfDataRowsConversionPathValue());
   o.add(buildMcfDataRowsConversionPathValue());
   return o;
 }
 
-checkUnnamed635(core.List<api.McfDataRowsConversionPathValue> o) {
+checkUnnamed223(core.List<api.McfDataRowsConversionPathValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRowsConversionPathValue(o[0]);
   checkMcfDataRowsConversionPathValue(o[1]);
@@ -2254,7 +2254,7 @@
   var o = new api.McfDataRows();
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    o.conversionPathValue = buildUnnamed635();
+    o.conversionPathValue = buildUnnamed223();
     o.primitiveValue = "foo";
   }
   buildCounterMcfDataRows--;
@@ -2264,46 +2264,46 @@
 checkMcfDataRows(api.McfDataRows o) {
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    checkUnnamed635(o.conversionPathValue);
+    checkUnnamed223(o.conversionPathValue);
     unittest.expect(o.primitiveValue, unittest.equals('foo'));
   }
   buildCounterMcfDataRows--;
 }
 
-buildUnnamed636() {
+buildUnnamed224() {
   var o = new core.List<api.McfDataRows>();
   o.add(buildMcfDataRows());
   o.add(buildMcfDataRows());
   return o;
 }
 
-checkUnnamed636(core.List<api.McfDataRows> o) {
+checkUnnamed224(core.List<api.McfDataRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRows(o[0]);
   checkMcfDataRows(o[1]);
 }
 
-buildUnnamed637() {
+buildUnnamed225() {
   var o = new core.List<core.List<api.McfDataRows>>();
-  o.add(buildUnnamed636());
-  o.add(buildUnnamed636());
+  o.add(buildUnnamed224());
+  o.add(buildUnnamed224());
   return o;
 }
 
-checkUnnamed637(core.List<core.List<api.McfDataRows>> o) {
+checkUnnamed225(core.List<core.List<api.McfDataRows>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed636(o[0]);
-  checkUnnamed636(o[1]);
+  checkUnnamed224(o[0]);
+  checkUnnamed224(o[1]);
 }
 
-buildUnnamed638() {
+buildUnnamed226() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed638(core.Map<core.String, core.String> o) {
+checkUnnamed226(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -2314,7 +2314,7 @@
   var o = new api.McfData();
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    o.columnHeaders = buildUnnamed632();
+    o.columnHeaders = buildUnnamed220();
     o.containsSampledData = true;
     o.id = "foo";
     o.itemsPerPage = 42;
@@ -2323,12 +2323,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildMcfDataProfileInfo();
     o.query = buildMcfDataQuery();
-    o.rows = buildUnnamed637();
+    o.rows = buildUnnamed225();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed638();
+    o.totalsForAllResults = buildUnnamed226();
   }
   buildCounterMcfData--;
   return o;
@@ -2337,7 +2337,7 @@
 checkMcfData(api.McfData o) {
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    checkUnnamed632(o.columnHeaders);
+    checkUnnamed220(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.itemsPerPage, unittest.equals(42));
@@ -2346,12 +2346,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkMcfDataProfileInfo(o.profileInfo);
     checkMcfDataQuery(o.query);
-    checkUnnamed637(o.rows);
+    checkUnnamed225(o.rows);
     unittest.expect(o.sampleSize, unittest.equals('foo'));
     unittest.expect(o.sampleSpace, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed638(o.totalsForAllResults);
+    checkUnnamed226(o.totalsForAllResults);
   }
   buildCounterMcfData--;
 }
@@ -2398,14 +2398,14 @@
   buildCounterProfileParentLink--;
 }
 
-buildUnnamed639() {
+buildUnnamed227() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed639(core.List<core.String> o) {
+checkUnnamed227(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2416,7 +2416,7 @@
   var o = new api.ProfilePermissions();
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    o.effective = buildUnnamed639();
+    o.effective = buildUnnamed227();
   }
   buildCounterProfilePermissions--;
   return o;
@@ -2425,7 +2425,7 @@
 checkProfilePermissions(api.ProfilePermissions o) {
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    checkUnnamed639(o.effective);
+    checkUnnamed227(o.effective);
   }
   buildCounterProfilePermissions--;
 }
@@ -2524,14 +2524,14 @@
   buildCounterProfileFilterLink--;
 }
 
-buildUnnamed640() {
+buildUnnamed228() {
   var o = new core.List<api.ProfileFilterLink>();
   o.add(buildProfileFilterLink());
   o.add(buildProfileFilterLink());
   return o;
 }
 
-checkUnnamed640(core.List<api.ProfileFilterLink> o) {
+checkUnnamed228(core.List<api.ProfileFilterLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileFilterLink(o[0]);
   checkProfileFilterLink(o[1]);
@@ -2542,7 +2542,7 @@
   var o = new api.ProfileFilterLinks();
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    o.items = buildUnnamed640();
+    o.items = buildUnnamed228();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2558,7 +2558,7 @@
 checkProfileFilterLinks(api.ProfileFilterLinks o) {
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    checkUnnamed640(o.items);
+    checkUnnamed228(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2626,14 +2626,14 @@
   buildCounterProfileSummary--;
 }
 
-buildUnnamed641() {
+buildUnnamed229() {
   var o = new core.List<api.Profile>();
   o.add(buildProfile());
   o.add(buildProfile());
   return o;
 }
 
-checkUnnamed641(core.List<api.Profile> o) {
+checkUnnamed229(core.List<api.Profile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfile(o[0]);
   checkProfile(o[1]);
@@ -2644,7 +2644,7 @@
   var o = new api.Profiles();
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    o.items = buildUnnamed641();
+    o.items = buildUnnamed229();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2660,7 +2660,7 @@
 checkProfiles(api.Profiles o) {
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    checkUnnamed641(o.items);
+    checkUnnamed229(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2695,14 +2695,14 @@
   buildCounterRealtimeDataColumnHeaders--;
 }
 
-buildUnnamed642() {
+buildUnnamed230() {
   var o = new core.List<api.RealtimeDataColumnHeaders>();
   o.add(buildRealtimeDataColumnHeaders());
   o.add(buildRealtimeDataColumnHeaders());
   return o;
 }
 
-checkUnnamed642(core.List<api.RealtimeDataColumnHeaders> o) {
+checkUnnamed230(core.List<api.RealtimeDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRealtimeDataColumnHeaders(o[0]);
   checkRealtimeDataColumnHeaders(o[1]);
@@ -2737,27 +2737,27 @@
   buildCounterRealtimeDataProfileInfo--;
 }
 
-buildUnnamed643() {
+buildUnnamed231() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed643(core.List<core.String> o) {
+checkUnnamed231(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed644() {
+buildUnnamed232() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed644(core.List<core.String> o) {
+checkUnnamed232(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2772,8 +2772,8 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed643();
-    o.sort = buildUnnamed644();
+    o.metrics = buildUnnamed231();
+    o.sort = buildUnnamed232();
   }
   buildCounterRealtimeDataQuery--;
   return o;
@@ -2786,46 +2786,46 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed643(o.metrics);
-    checkUnnamed644(o.sort);
+    checkUnnamed231(o.metrics);
+    checkUnnamed232(o.sort);
   }
   buildCounterRealtimeDataQuery--;
 }
 
-buildUnnamed645() {
+buildUnnamed233() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed645(core.List<core.String> o) {
+checkUnnamed233(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed646() {
+buildUnnamed234() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed645());
-  o.add(buildUnnamed645());
+  o.add(buildUnnamed233());
+  o.add(buildUnnamed233());
   return o;
 }
 
-checkUnnamed646(core.List<core.List<core.String>> o) {
+checkUnnamed234(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed645(o[0]);
-  checkUnnamed645(o[1]);
+  checkUnnamed233(o[0]);
+  checkUnnamed233(o[1]);
 }
 
-buildUnnamed647() {
+buildUnnamed235() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed647(core.Map<core.String, core.String> o) {
+checkUnnamed235(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -2836,15 +2836,15 @@
   var o = new api.RealtimeData();
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    o.columnHeaders = buildUnnamed642();
+    o.columnHeaders = buildUnnamed230();
     o.id = "foo";
     o.kind = "foo";
     o.profileInfo = buildRealtimeDataProfileInfo();
     o.query = buildRealtimeDataQuery();
-    o.rows = buildUnnamed646();
+    o.rows = buildUnnamed234();
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed647();
+    o.totalsForAllResults = buildUnnamed235();
   }
   buildCounterRealtimeData--;
   return o;
@@ -2853,15 +2853,15 @@
 checkRealtimeData(api.RealtimeData o) {
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    checkUnnamed642(o.columnHeaders);
+    checkUnnamed230(o.columnHeaders);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkRealtimeDataProfileInfo(o.profileInfo);
     checkRealtimeDataQuery(o.query);
-    checkUnnamed646(o.rows);
+    checkUnnamed234(o.rows);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed647(o.totalsForAllResults);
+    checkUnnamed235(o.totalsForAllResults);
   }
   buildCounterRealtimeData--;
 }
@@ -2901,14 +2901,14 @@
   buildCounterSegment--;
 }
 
-buildUnnamed648() {
+buildUnnamed236() {
   var o = new core.List<api.Segment>();
   o.add(buildSegment());
   o.add(buildSegment());
   return o;
 }
 
-checkUnnamed648(core.List<api.Segment> o) {
+checkUnnamed236(core.List<api.Segment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegment(o[0]);
   checkSegment(o[1]);
@@ -2919,7 +2919,7 @@
   var o = new api.Segments();
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    o.items = buildUnnamed648();
+    o.items = buildUnnamed236();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2935,7 +2935,7 @@
 checkSegments(api.Segments o) {
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    checkUnnamed648(o.items);
+    checkUnnamed236(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3042,14 +3042,14 @@
   buildCounterUnsampledReport--;
 }
 
-buildUnnamed649() {
+buildUnnamed237() {
   var o = new core.List<api.UnsampledReport>();
   o.add(buildUnsampledReport());
   o.add(buildUnsampledReport());
   return o;
 }
 
-checkUnnamed649(core.List<api.UnsampledReport> o) {
+checkUnnamed237(core.List<api.UnsampledReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUnsampledReport(o[0]);
   checkUnsampledReport(o[1]);
@@ -3060,7 +3060,7 @@
   var o = new api.UnsampledReports();
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    o.items = buildUnnamed649();
+    o.items = buildUnnamed237();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3076,7 +3076,7 @@
 checkUnsampledReports(api.UnsampledReports o) {
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    checkUnnamed649(o.items);
+    checkUnnamed237(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3088,14 +3088,14 @@
   buildCounterUnsampledReports--;
 }
 
-buildUnnamed650() {
+buildUnnamed238() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed650(core.List<core.String> o) {
+checkUnnamed238(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3108,7 +3108,7 @@
   if (buildCounterUpload < 3) {
     o.accountId = "foo";
     o.customDataSourceId = "foo";
-    o.errors = buildUnnamed650();
+    o.errors = buildUnnamed238();
     o.id = "foo";
     o.kind = "foo";
     o.status = "foo";
@@ -3122,7 +3122,7 @@
   if (buildCounterUpload < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.customDataSourceId, unittest.equals('foo'));
-    checkUnnamed650(o.errors);
+    checkUnnamed238(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -3130,14 +3130,14 @@
   buildCounterUpload--;
 }
 
-buildUnnamed651() {
+buildUnnamed239() {
   var o = new core.List<api.Upload>();
   o.add(buildUpload());
   o.add(buildUpload());
   return o;
 }
 
-checkUnnamed651(core.List<api.Upload> o) {
+checkUnnamed239(core.List<api.Upload> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpload(o[0]);
   checkUpload(o[1]);
@@ -3148,7 +3148,7 @@
   var o = new api.Uploads();
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    o.items = buildUnnamed651();
+    o.items = buildUnnamed239();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3163,7 +3163,7 @@
 checkUploads(api.Uploads o) {
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    checkUnnamed651(o.items);
+    checkUnnamed239(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3226,14 +3226,14 @@
   buildCounterWebPropertyRef--;
 }
 
-buildUnnamed652() {
+buildUnnamed240() {
   var o = new core.List<api.ProfileSummary>();
   o.add(buildProfileSummary());
   o.add(buildProfileSummary());
   return o;
 }
 
-checkUnnamed652(core.List<api.ProfileSummary> o) {
+checkUnnamed240(core.List<api.ProfileSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileSummary(o[0]);
   checkProfileSummary(o[1]);
@@ -3249,7 +3249,7 @@
     o.kind = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.profiles = buildUnnamed652();
+    o.profiles = buildUnnamed240();
     o.websiteUrl = "foo";
   }
   buildCounterWebPropertySummary--;
@@ -3264,20 +3264,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed652(o.profiles);
+    checkUnnamed240(o.profiles);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterWebPropertySummary--;
 }
 
-buildUnnamed653() {
+buildUnnamed241() {
   var o = new core.List<api.Webproperty>();
   o.add(buildWebproperty());
   o.add(buildWebproperty());
   return o;
 }
 
-checkUnnamed653(core.List<api.Webproperty> o) {
+checkUnnamed241(core.List<api.Webproperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebproperty(o[0]);
   checkWebproperty(o[1]);
@@ -3288,7 +3288,7 @@
   var o = new api.Webproperties();
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    o.items = buildUnnamed653();
+    o.items = buildUnnamed241();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3304,7 +3304,7 @@
 checkWebproperties(api.Webproperties o) {
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    checkUnnamed653(o.items);
+    checkUnnamed241(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3358,14 +3358,14 @@
   buildCounterWebpropertyParentLink--;
 }
 
-buildUnnamed654() {
+buildUnnamed242() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed654(core.List<core.String> o) {
+checkUnnamed242(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3376,7 +3376,7 @@
   var o = new api.WebpropertyPermissions();
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    o.effective = buildUnnamed654();
+    o.effective = buildUnnamed242();
   }
   buildCounterWebpropertyPermissions--;
   return o;
@@ -3385,7 +3385,7 @@
 checkWebpropertyPermissions(api.WebpropertyPermissions o) {
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    checkUnnamed654(o.effective);
+    checkUnnamed242(o.effective);
   }
   buildCounterWebpropertyPermissions--;
 }
diff --git a/generated/googleapis/test/androidpublisher/v2_test.dart b/generated/googleapis/test/androidpublisher/v2_test.dart
index 967ae49..e2a493f 100644
--- a/generated/googleapis/test/androidpublisher/v2_test.dart
+++ b/generated/googleapis/test/androidpublisher/v2_test.dart
@@ -77,14 +77,14 @@
   buildCounterApkListing--;
 }
 
-buildUnnamed1083() {
+buildUnnamed243() {
   var o = new core.List<api.ApkListing>();
   o.add(buildApkListing());
   o.add(buildApkListing());
   return o;
 }
 
-checkUnnamed1083(core.List<api.ApkListing> o) {
+checkUnnamed243(core.List<api.ApkListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApkListing(o[0]);
   checkApkListing(o[1]);
@@ -96,7 +96,7 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed1083();
+    o.listings = buildUnnamed243();
   }
   buildCounterApkListingsListResponse--;
   return o;
@@ -106,19 +106,19 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1083(o.listings);
+    checkUnnamed243(o.listings);
   }
   buildCounterApkListingsListResponse--;
 }
 
-buildUnnamed1084() {
+buildUnnamed244() {
   var o = new core.List<api.Apk>();
   o.add(buildApk());
   o.add(buildApk());
   return o;
 }
 
-checkUnnamed1084(core.List<api.Apk> o) {
+checkUnnamed244(core.List<api.Apk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApk(o[0]);
   checkApk(o[1]);
@@ -129,7 +129,7 @@
   var o = new api.ApksListResponse();
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    o.apks = buildUnnamed1084();
+    o.apks = buildUnnamed244();
     o.kind = "foo";
   }
   buildCounterApksListResponse--;
@@ -139,7 +139,7 @@
 checkApksListResponse(api.ApksListResponse o) {
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    checkUnnamed1084(o.apks);
+    checkUnnamed244(o.apks);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterApksListResponse--;
@@ -254,14 +254,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed1085() {
+buildUnnamed245() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed1085(core.List<api.Image> o) {
+checkUnnamed245(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -272,7 +272,7 @@
   var o = new api.ImagesDeleteAllResponse();
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    o.deleted = buildUnnamed1085();
+    o.deleted = buildUnnamed245();
   }
   buildCounterImagesDeleteAllResponse--;
   return o;
@@ -281,19 +281,19 @@
 checkImagesDeleteAllResponse(api.ImagesDeleteAllResponse o) {
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    checkUnnamed1085(o.deleted);
+    checkUnnamed245(o.deleted);
   }
   buildCounterImagesDeleteAllResponse--;
 }
 
-buildUnnamed1086() {
+buildUnnamed246() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed1086(core.List<api.Image> o) {
+checkUnnamed246(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -304,7 +304,7 @@
   var o = new api.ImagesListResponse();
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    o.images = buildUnnamed1086();
+    o.images = buildUnnamed246();
   }
   buildCounterImagesListResponse--;
   return o;
@@ -313,7 +313,7 @@
 checkImagesListResponse(api.ImagesListResponse o) {
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    checkUnnamed1086(o.images);
+    checkUnnamed246(o.images);
   }
   buildCounterImagesListResponse--;
 }
@@ -337,27 +337,27 @@
   buildCounterImagesUploadResponse--;
 }
 
-buildUnnamed1087() {
+buildUnnamed247() {
   var o = new core.Map<core.String, api.InAppProductListing>();
   o["x"] = buildInAppProductListing();
   o["y"] = buildInAppProductListing();
   return o;
 }
 
-checkUnnamed1087(core.Map<core.String, api.InAppProductListing> o) {
+checkUnnamed247(core.Map<core.String, api.InAppProductListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProductListing(o["x"]);
   checkInAppProductListing(o["y"]);
 }
 
-buildUnnamed1088() {
+buildUnnamed248() {
   var o = new core.Map<core.String, api.Price>();
   o["x"] = buildPrice();
   o["y"] = buildPrice();
   return o;
 }
 
-checkUnnamed1088(core.Map<core.String, api.Price> o) {
+checkUnnamed248(core.Map<core.String, api.Price> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPrice(o["x"]);
   checkPrice(o["y"]);
@@ -370,9 +370,9 @@
   if (buildCounterInAppProduct < 3) {
     o.defaultLanguage = "foo";
     o.defaultPrice = buildPrice();
-    o.listings = buildUnnamed1087();
+    o.listings = buildUnnamed247();
     o.packageName = "foo";
-    o.prices = buildUnnamed1088();
+    o.prices = buildUnnamed248();
     o.purchaseType = "foo";
     o.season = buildSeason();
     o.sku = "foo";
@@ -389,9 +389,9 @@
   if (buildCounterInAppProduct < 3) {
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     checkPrice(o.defaultPrice);
-    checkUnnamed1087(o.listings);
+    checkUnnamed247(o.listings);
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed1088(o.prices);
+    checkUnnamed248(o.prices);
     unittest.expect(o.purchaseType, unittest.equals('foo'));
     checkSeason(o.season);
     unittest.expect(o.sku, unittest.equals('foo'));
@@ -423,14 +423,14 @@
   buildCounterInAppProductListing--;
 }
 
-buildUnnamed1089() {
+buildUnnamed249() {
   var o = new core.List<api.InappproductsBatchRequestEntry>();
   o.add(buildInappproductsBatchRequestEntry());
   o.add(buildInappproductsBatchRequestEntry());
   return o;
 }
 
-checkUnnamed1089(core.List<api.InappproductsBatchRequestEntry> o) {
+checkUnnamed249(core.List<api.InappproductsBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInappproductsBatchRequestEntry(o[0]);
   checkInappproductsBatchRequestEntry(o[1]);
@@ -441,7 +441,7 @@
   var o = new api.InappproductsBatchRequest();
   buildCounterInappproductsBatchRequest++;
   if (buildCounterInappproductsBatchRequest < 3) {
-    o.entrys = buildUnnamed1089();
+    o.entrys = buildUnnamed249();
   }
   buildCounterInappproductsBatchRequest--;
   return o;
@@ -450,7 +450,7 @@
 checkInappproductsBatchRequest(api.InappproductsBatchRequest o) {
   buildCounterInappproductsBatchRequest++;
   if (buildCounterInappproductsBatchRequest < 3) {
-    checkUnnamed1089(o.entrys);
+    checkUnnamed249(o.entrys);
   }
   buildCounterInappproductsBatchRequest--;
 }
@@ -480,14 +480,14 @@
   buildCounterInappproductsBatchRequestEntry--;
 }
 
-buildUnnamed1090() {
+buildUnnamed250() {
   var o = new core.List<api.InappproductsBatchResponseEntry>();
   o.add(buildInappproductsBatchResponseEntry());
   o.add(buildInappproductsBatchResponseEntry());
   return o;
 }
 
-checkUnnamed1090(core.List<api.InappproductsBatchResponseEntry> o) {
+checkUnnamed250(core.List<api.InappproductsBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInappproductsBatchResponseEntry(o[0]);
   checkInappproductsBatchResponseEntry(o[1]);
@@ -498,7 +498,7 @@
   var o = new api.InappproductsBatchResponse();
   buildCounterInappproductsBatchResponse++;
   if (buildCounterInappproductsBatchResponse < 3) {
-    o.entrys = buildUnnamed1090();
+    o.entrys = buildUnnamed250();
     o.kind = "foo";
   }
   buildCounterInappproductsBatchResponse--;
@@ -508,7 +508,7 @@
 checkInappproductsBatchResponse(api.InappproductsBatchResponse o) {
   buildCounterInappproductsBatchResponse++;
   if (buildCounterInappproductsBatchResponse < 3) {
-    checkUnnamed1090(o.entrys);
+    checkUnnamed250(o.entrys);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInappproductsBatchResponse--;
@@ -575,14 +575,14 @@
   buildCounterInappproductsInsertResponse--;
 }
 
-buildUnnamed1091() {
+buildUnnamed251() {
   var o = new core.List<api.InAppProduct>();
   o.add(buildInAppProduct());
   o.add(buildInAppProduct());
   return o;
 }
 
-checkUnnamed1091(core.List<api.InAppProduct> o) {
+checkUnnamed251(core.List<api.InAppProduct> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProduct(o[0]);
   checkInAppProduct(o[1]);
@@ -593,7 +593,7 @@
   var o = new api.InappproductsListResponse();
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    o.inappproduct = buildUnnamed1091();
+    o.inappproduct = buildUnnamed251();
     o.kind = "foo";
     o.pageInfo = buildPageInfo();
     o.tokenPagination = buildTokenPagination();
@@ -605,7 +605,7 @@
 checkInappproductsListResponse(api.InappproductsListResponse o) {
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    checkUnnamed1091(o.inappproduct);
+    checkUnnamed251(o.inappproduct);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
     checkTokenPagination(o.tokenPagination);
@@ -678,14 +678,14 @@
   buildCounterListing--;
 }
 
-buildUnnamed1092() {
+buildUnnamed252() {
   var o = new core.List<api.Listing>();
   o.add(buildListing());
   o.add(buildListing());
   return o;
 }
 
-checkUnnamed1092(core.List<api.Listing> o) {
+checkUnnamed252(core.List<api.Listing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListing(o[0]);
   checkListing(o[1]);
@@ -697,7 +697,7 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed1092();
+    o.listings = buildUnnamed252();
   }
   buildCounterListingsListResponse--;
   return o;
@@ -707,7 +707,7 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1092(o.listings);
+    checkUnnamed252(o.listings);
   }
   buildCounterListingsListResponse--;
 }
@@ -909,27 +909,27 @@
   buildCounterSubscriptionPurchasesDeferResponse--;
 }
 
-buildUnnamed1093() {
+buildUnnamed253() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1093(core.List<core.String> o) {
+checkUnnamed253(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1094() {
+buildUnnamed254() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1094(core.List<core.String> o) {
+checkUnnamed254(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -940,8 +940,8 @@
   var o = new api.Testers();
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    o.googleGroups = buildUnnamed1093();
-    o.googlePlusCommunities = buildUnnamed1094();
+    o.googleGroups = buildUnnamed253();
+    o.googlePlusCommunities = buildUnnamed254();
   }
   buildCounterTesters--;
   return o;
@@ -950,8 +950,8 @@
 checkTesters(api.Testers o) {
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    checkUnnamed1093(o.googleGroups);
-    checkUnnamed1094(o.googlePlusCommunities);
+    checkUnnamed253(o.googleGroups);
+    checkUnnamed254(o.googlePlusCommunities);
   }
   buildCounterTesters--;
 }
@@ -977,14 +977,14 @@
   buildCounterTokenPagination--;
 }
 
-buildUnnamed1095() {
+buildUnnamed255() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1095(core.List<core.int> o) {
+checkUnnamed255(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -997,7 +997,7 @@
   if (buildCounterTrack < 3) {
     o.track = "foo";
     o.userFraction = 42.0;
-    o.versionCodes = buildUnnamed1095();
+    o.versionCodes = buildUnnamed255();
   }
   buildCounterTrack--;
   return o;
@@ -1008,19 +1008,19 @@
   if (buildCounterTrack < 3) {
     unittest.expect(o.track, unittest.equals('foo'));
     unittest.expect(o.userFraction, unittest.equals(42.0));
-    checkUnnamed1095(o.versionCodes);
+    checkUnnamed255(o.versionCodes);
   }
   buildCounterTrack--;
 }
 
-buildUnnamed1096() {
+buildUnnamed256() {
   var o = new core.List<api.Track>();
   o.add(buildTrack());
   o.add(buildTrack());
   return o;
 }
 
-checkUnnamed1096(core.List<api.Track> o) {
+checkUnnamed256(core.List<api.Track> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrack(o[0]);
   checkTrack(o[1]);
@@ -1032,7 +1032,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     o.kind = "foo";
-    o.tracks = buildUnnamed1096();
+    o.tracks = buildUnnamed256();
   }
   buildCounterTracksListResponse--;
   return o;
@@ -1042,7 +1042,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1096(o.tracks);
+    checkUnnamed256(o.tracks);
   }
   buildCounterTracksListResponse--;
 }
diff --git a/generated/googleapis/test/appsactivity/v1_test.dart b/generated/googleapis/test/appsactivity/v1_test.dart
index 68bd247..1c41212 100644
--- a/generated/googleapis/test/appsactivity/v1_test.dart
+++ b/generated/googleapis/test/appsactivity/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed674() {
+buildUnnamed257() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed674(core.List<api.Event> o) {
+checkUnnamed257(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
@@ -35,7 +35,7 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     o.combinedEvent = buildEvent();
-    o.singleEvents = buildUnnamed674();
+    o.singleEvents = buildUnnamed257();
   }
   buildCounterActivity--;
   return o;
@@ -45,32 +45,32 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     checkEvent(o.combinedEvent);
-    checkUnnamed674(o.singleEvents);
+    checkUnnamed257(o.singleEvents);
   }
   buildCounterActivity--;
 }
 
-buildUnnamed675() {
+buildUnnamed258() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed675(core.List<core.String> o) {
+checkUnnamed258(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed676() {
+buildUnnamed259() {
   var o = new core.List<api.PermissionChange>();
   o.add(buildPermissionChange());
   o.add(buildPermissionChange());
   return o;
 }
 
-checkUnnamed676(core.List<api.PermissionChange> o) {
+checkUnnamed259(core.List<api.PermissionChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermissionChange(o[0]);
   checkPermissionChange(o[1]);
@@ -81,11 +81,11 @@
   var o = new api.Event();
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    o.additionalEventTypes = buildUnnamed675();
+    o.additionalEventTypes = buildUnnamed258();
     o.eventTimeMillis = "foo";
     o.fromUserDeletion = true;
     o.move = buildMove();
-    o.permissionChanges = buildUnnamed676();
+    o.permissionChanges = buildUnnamed259();
     o.primaryEventType = "foo";
     o.rename = buildRename();
     o.target = buildTarget();
@@ -98,11 +98,11 @@
 checkEvent(api.Event o) {
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    checkUnnamed675(o.additionalEventTypes);
+    checkUnnamed258(o.additionalEventTypes);
     unittest.expect(o.eventTimeMillis, unittest.equals('foo'));
     unittest.expect(o.fromUserDeletion, unittest.isTrue);
     checkMove(o.move);
-    checkUnnamed676(o.permissionChanges);
+    checkUnnamed259(o.permissionChanges);
     unittest.expect(o.primaryEventType, unittest.equals('foo'));
     checkRename(o.rename);
     checkTarget(o.target);
@@ -111,14 +111,14 @@
   buildCounterEvent--;
 }
 
-buildUnnamed677() {
+buildUnnamed260() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed677(core.List<api.Activity> o) {
+checkUnnamed260(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -129,7 +129,7 @@
   var o = new api.ListActivitiesResponse();
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    o.activities = buildUnnamed677();
+    o.activities = buildUnnamed260();
     o.nextPageToken = "foo";
   }
   buildCounterListActivitiesResponse--;
@@ -139,33 +139,33 @@
 checkListActivitiesResponse(api.ListActivitiesResponse o) {
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    checkUnnamed677(o.activities);
+    checkUnnamed260(o.activities);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListActivitiesResponse--;
 }
 
-buildUnnamed678() {
+buildUnnamed261() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed678(core.List<api.Parent> o) {
+checkUnnamed261(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
 }
 
-buildUnnamed679() {
+buildUnnamed262() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed679(core.List<api.Parent> o) {
+checkUnnamed262(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
@@ -176,8 +176,8 @@
   var o = new api.Move();
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    o.addedParents = buildUnnamed678();
-    o.removedParents = buildUnnamed679();
+    o.addedParents = buildUnnamed261();
+    o.removedParents = buildUnnamed262();
   }
   buildCounterMove--;
   return o;
@@ -186,8 +186,8 @@
 checkMove(api.Move o) {
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    checkUnnamed678(o.addedParents);
-    checkUnnamed679(o.removedParents);
+    checkUnnamed261(o.addedParents);
+    checkUnnamed262(o.removedParents);
   }
   buildCounterMove--;
 }
@@ -244,27 +244,27 @@
   buildCounterPermission--;
 }
 
-buildUnnamed680() {
+buildUnnamed263() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed680(core.List<api.Permission> o) {
+checkUnnamed263(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed681() {
+buildUnnamed264() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed681(core.List<api.Permission> o) {
+checkUnnamed264(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -275,8 +275,8 @@
   var o = new api.PermissionChange();
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    o.addedPermissions = buildUnnamed680();
-    o.removedPermissions = buildUnnamed681();
+    o.addedPermissions = buildUnnamed263();
+    o.removedPermissions = buildUnnamed264();
   }
   buildCounterPermissionChange--;
   return o;
@@ -285,8 +285,8 @@
 checkPermissionChange(api.PermissionChange o) {
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    checkUnnamed680(o.addedPermissions);
-    checkUnnamed681(o.removedPermissions);
+    checkUnnamed263(o.addedPermissions);
+    checkUnnamed264(o.removedPermissions);
   }
   buildCounterPermissionChange--;
 }
diff --git a/generated/googleapis/test/appstate/v1_test.dart b/generated/googleapis/test/appstate/v1_test.dart
index 94c8dc2..3de68e9 100644
--- a/generated/googleapis/test/appstate/v1_test.dart
+++ b/generated/googleapis/test/appstate/v1_test.dart
@@ -41,14 +41,14 @@
   buildCounterGetResponse--;
 }
 
-buildUnnamed1073() {
+buildUnnamed265() {
   var o = new core.List<api.GetResponse>();
   o.add(buildGetResponse());
   o.add(buildGetResponse());
   return o;
 }
 
-checkUnnamed1073(core.List<api.GetResponse> o) {
+checkUnnamed265(core.List<api.GetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGetResponse(o[0]);
   checkGetResponse(o[1]);
@@ -59,7 +59,7 @@
   var o = new api.ListResponse();
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    o.items = buildUnnamed1073();
+    o.items = buildUnnamed265();
     o.kind = "foo";
     o.maximumKeyCount = 42;
   }
@@ -70,7 +70,7 @@
 checkListResponse(api.ListResponse o) {
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    checkUnnamed1073(o.items);
+    checkUnnamed265(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.maximumKeyCount, unittest.equals(42));
   }
diff --git a/generated/googleapis/test/bigquery/v2_test.dart b/generated/googleapis/test/bigquery/v2_test.dart
index 900b907..eb5e2ee 100644
--- a/generated/googleapis/test/bigquery/v2_test.dart
+++ b/generated/googleapis/test/bigquery/v2_test.dart
@@ -45,14 +45,14 @@
   buildCounterDatasetAccess--;
 }
 
-buildUnnamed1143() {
+buildUnnamed266() {
   var o = new core.List<api.DatasetAccess>();
   o.add(buildDatasetAccess());
   o.add(buildDatasetAccess());
   return o;
 }
 
-checkUnnamed1143(core.List<api.DatasetAccess> o) {
+checkUnnamed266(core.List<api.DatasetAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatasetAccess(o[0]);
   checkDatasetAccess(o[1]);
@@ -63,7 +63,7 @@
   var o = new api.Dataset();
   buildCounterDataset++;
   if (buildCounterDataset < 3) {
-    o.access = buildUnnamed1143();
+    o.access = buildUnnamed266();
     o.creationTime = "foo";
     o.datasetReference = buildDatasetReference();
     o.description = "foo";
@@ -81,7 +81,7 @@
 checkDataset(api.Dataset o) {
   buildCounterDataset++;
   if (buildCounterDataset < 3) {
-    checkUnnamed1143(o.access);
+    checkUnnamed266(o.access);
     unittest.expect(o.creationTime, unittest.equals('foo'));
     checkDatasetReference(o.datasetReference);
     unittest.expect(o.description, unittest.equals('foo'));
@@ -120,14 +120,14 @@
   buildCounterDatasetListDatasets--;
 }
 
-buildUnnamed1144() {
+buildUnnamed267() {
   var o = new core.List<api.DatasetListDatasets>();
   o.add(buildDatasetListDatasets());
   o.add(buildDatasetListDatasets());
   return o;
 }
 
-checkUnnamed1144(core.List<api.DatasetListDatasets> o) {
+checkUnnamed267(core.List<api.DatasetListDatasets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatasetListDatasets(o[0]);
   checkDatasetListDatasets(o[1]);
@@ -138,7 +138,7 @@
   var o = new api.DatasetList();
   buildCounterDatasetList++;
   if (buildCounterDatasetList < 3) {
-    o.datasets = buildUnnamed1144();
+    o.datasets = buildUnnamed267();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -150,7 +150,7 @@
 checkDatasetList(api.DatasetList o) {
   buildCounterDatasetList++;
   if (buildCounterDatasetList < 3) {
-    checkUnnamed1144(o.datasets);
+    checkUnnamed267(o.datasets);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -204,14 +204,14 @@
   buildCounterErrorProto--;
 }
 
-buildUnnamed1145() {
+buildUnnamed268() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed1145(core.List<api.TableRow> o) {
+checkUnnamed268(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -228,7 +228,7 @@
     o.jobReference = buildJobReference();
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed1145();
+    o.rows = buildUnnamed268();
     o.schema = buildTableSchema();
     o.totalBytesProcessed = "foo";
     o.totalRows = "foo";
@@ -246,7 +246,7 @@
     checkJobReference(o.jobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1145(o.rows);
+    checkUnnamed268(o.rows);
     checkTableSchema(o.schema);
     unittest.expect(o.totalBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.totalRows, unittest.equals('foo'));
@@ -316,14 +316,14 @@
   buildCounterJobConfiguration--;
 }
 
-buildUnnamed1146() {
+buildUnnamed269() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1146(core.List<core.String> o) {
+checkUnnamed269(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -337,7 +337,7 @@
     o.compression = "foo";
     o.destinationFormat = "foo";
     o.destinationUri = "foo";
-    o.destinationUris = buildUnnamed1146();
+    o.destinationUris = buildUnnamed269();
     o.fieldDelimiter = "foo";
     o.printHeader = true;
     o.sourceTable = buildTableReference();
@@ -352,7 +352,7 @@
     unittest.expect(o.compression, unittest.equals('foo'));
     unittest.expect(o.destinationFormat, unittest.equals('foo'));
     unittest.expect(o.destinationUri, unittest.equals('foo'));
-    checkUnnamed1146(o.destinationUris);
+    checkUnnamed269(o.destinationUris);
     unittest.expect(o.fieldDelimiter, unittest.equals('foo'));
     unittest.expect(o.printHeader, unittest.isTrue);
     checkTableReference(o.sourceTable);
@@ -360,14 +360,14 @@
   buildCounterJobConfigurationExtract--;
 }
 
-buildUnnamed1147() {
+buildUnnamed270() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1147(core.List<core.String> o) {
+checkUnnamed270(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -380,7 +380,7 @@
   if (buildCounterJobConfigurationLink < 3) {
     o.createDisposition = "foo";
     o.destinationTable = buildTableReference();
-    o.sourceUri = buildUnnamed1147();
+    o.sourceUri = buildUnnamed270();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationLink--;
@@ -392,20 +392,20 @@
   if (buildCounterJobConfigurationLink < 3) {
     unittest.expect(o.createDisposition, unittest.equals('foo'));
     checkTableReference(o.destinationTable);
-    checkUnnamed1147(o.sourceUri);
+    checkUnnamed270(o.sourceUri);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationLink--;
 }
 
-buildUnnamed1148() {
+buildUnnamed271() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1148(core.List<core.String> o) {
+checkUnnamed271(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -430,7 +430,7 @@
     o.schemaInlineFormat = "foo";
     o.skipLeadingRows = 42;
     o.sourceFormat = "foo";
-    o.sourceUris = buildUnnamed1148();
+    o.sourceUris = buildUnnamed271();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationLoad--;
@@ -454,7 +454,7 @@
     unittest.expect(o.schemaInlineFormat, unittest.equals('foo'));
     unittest.expect(o.skipLeadingRows, unittest.equals(42));
     unittest.expect(o.sourceFormat, unittest.equals('foo'));
-    checkUnnamed1148(o.sourceUris);
+    checkUnnamed271(o.sourceUris);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationLoad--;
@@ -497,14 +497,14 @@
   buildCounterJobConfigurationQuery--;
 }
 
-buildUnnamed1149() {
+buildUnnamed272() {
   var o = new core.List<api.TableReference>();
   o.add(buildTableReference());
   o.add(buildTableReference());
   return o;
 }
 
-checkUnnamed1149(core.List<api.TableReference> o) {
+checkUnnamed272(core.List<api.TableReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableReference(o[0]);
   checkTableReference(o[1]);
@@ -518,7 +518,7 @@
     o.createDisposition = "foo";
     o.destinationTable = buildTableReference();
     o.sourceTable = buildTableReference();
-    o.sourceTables = buildUnnamed1149();
+    o.sourceTables = buildUnnamed272();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationTableCopy--;
@@ -531,7 +531,7 @@
     unittest.expect(o.createDisposition, unittest.equals('foo'));
     checkTableReference(o.destinationTable);
     checkTableReference(o.sourceTable);
-    checkUnnamed1149(o.sourceTables);
+    checkUnnamed272(o.sourceTables);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationTableCopy--;
@@ -572,14 +572,14 @@
   buildCounterJobListJobs--;
 }
 
-buildUnnamed1150() {
+buildUnnamed273() {
   var o = new core.List<api.JobListJobs>();
   o.add(buildJobListJobs());
   o.add(buildJobListJobs());
   return o;
 }
 
-checkUnnamed1150(core.List<api.JobListJobs> o) {
+checkUnnamed273(core.List<api.JobListJobs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJobListJobs(o[0]);
   checkJobListJobs(o[1]);
@@ -591,7 +591,7 @@
   buildCounterJobList++;
   if (buildCounterJobList < 3) {
     o.etag = "foo";
-    o.jobs = buildUnnamed1150();
+    o.jobs = buildUnnamed273();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -604,7 +604,7 @@
   buildCounterJobList++;
   if (buildCounterJobList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1150(o.jobs);
+    checkUnnamed273(o.jobs);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -640,6 +640,7 @@
   if (buildCounterJobStatistics < 3) {
     o.creationTime = "foo";
     o.endTime = "foo";
+    o.extract = buildJobStatistics4();
     o.load = buildJobStatistics3();
     o.query = buildJobStatistics2();
     o.startTime = "foo";
@@ -654,6 +655,7 @@
   if (buildCounterJobStatistics < 3) {
     unittest.expect(o.creationTime, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
+    checkJobStatistics4(o.extract);
     checkJobStatistics3(o.load);
     checkJobStatistics2(o.query);
     unittest.expect(o.startTime, unittest.equals('foo'));
@@ -708,14 +710,46 @@
   buildCounterJobStatistics3--;
 }
 
-buildUnnamed1151() {
+buildUnnamed274() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed274(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterJobStatistics4 = 0;
+buildJobStatistics4() {
+  var o = new api.JobStatistics4();
+  buildCounterJobStatistics4++;
+  if (buildCounterJobStatistics4 < 3) {
+    o.destinationUriFileCounts = buildUnnamed274();
+  }
+  buildCounterJobStatistics4--;
+  return o;
+}
+
+checkJobStatistics4(api.JobStatistics4 o) {
+  buildCounterJobStatistics4++;
+  if (buildCounterJobStatistics4 < 3) {
+    checkUnnamed274(o.destinationUriFileCounts);
+  }
+  buildCounterJobStatistics4--;
+}
+
+buildUnnamed275() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed1151(core.List<api.ErrorProto> o) {
+checkUnnamed275(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
@@ -727,7 +761,7 @@
   buildCounterJobStatus++;
   if (buildCounterJobStatus < 3) {
     o.errorResult = buildErrorProto();
-    o.errors = buildUnnamed1151();
+    o.errors = buildUnnamed275();
     o.state = "foo";
   }
   buildCounterJobStatus--;
@@ -738,7 +772,7 @@
   buildCounterJobStatus++;
   if (buildCounterJobStatus < 3) {
     checkErrorProto(o.errorResult);
-    checkUnnamed1151(o.errors);
+    checkUnnamed275(o.errors);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterJobStatus--;
@@ -784,14 +818,14 @@
   buildCounterProjectListProjects--;
 }
 
-buildUnnamed1152() {
+buildUnnamed276() {
   var o = new core.List<api.ProjectListProjects>();
   o.add(buildProjectListProjects());
   o.add(buildProjectListProjects());
   return o;
 }
 
-checkUnnamed1152(core.List<api.ProjectListProjects> o) {
+checkUnnamed276(core.List<api.ProjectListProjects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProjectListProjects(o[0]);
   checkProjectListProjects(o[1]);
@@ -805,7 +839,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.projects = buildUnnamed1152();
+    o.projects = buildUnnamed276();
     o.totalItems = 42;
   }
   buildCounterProjectList--;
@@ -818,7 +852,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1152(o.projects);
+    checkUnnamed276(o.projects);
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterProjectList--;
@@ -876,14 +910,14 @@
   buildCounterQueryRequest--;
 }
 
-buildUnnamed1153() {
+buildUnnamed277() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed1153(core.List<api.TableRow> o) {
+checkUnnamed277(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -899,7 +933,7 @@
     o.jobReference = buildJobReference();
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed1153();
+    o.rows = buildUnnamed277();
     o.schema = buildTableSchema();
     o.totalBytesProcessed = "foo";
     o.totalRows = "foo";
@@ -916,7 +950,7 @@
     checkJobReference(o.jobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1153(o.rows);
+    checkUnnamed277(o.rows);
     checkTableSchema(o.schema);
     unittest.expect(o.totalBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.totalRows, unittest.equals('foo'));
@@ -1011,14 +1045,14 @@
   buildCounterTableDataInsertAllRequestRows--;
 }
 
-buildUnnamed1154() {
+buildUnnamed278() {
   var o = new core.List<api.TableDataInsertAllRequestRows>();
   o.add(buildTableDataInsertAllRequestRows());
   o.add(buildTableDataInsertAllRequestRows());
   return o;
 }
 
-checkUnnamed1154(core.List<api.TableDataInsertAllRequestRows> o) {
+checkUnnamed278(core.List<api.TableDataInsertAllRequestRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableDataInsertAllRequestRows(o[0]);
   checkTableDataInsertAllRequestRows(o[1]);
@@ -1030,7 +1064,7 @@
   buildCounterTableDataInsertAllRequest++;
   if (buildCounterTableDataInsertAllRequest < 3) {
     o.kind = "foo";
-    o.rows = buildUnnamed1154();
+    o.rows = buildUnnamed278();
   }
   buildCounterTableDataInsertAllRequest--;
   return o;
@@ -1040,19 +1074,19 @@
   buildCounterTableDataInsertAllRequest++;
   if (buildCounterTableDataInsertAllRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1154(o.rows);
+    checkUnnamed278(o.rows);
   }
   buildCounterTableDataInsertAllRequest--;
 }
 
-buildUnnamed1155() {
+buildUnnamed279() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed1155(core.List<api.ErrorProto> o) {
+checkUnnamed279(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
@@ -1063,7 +1097,7 @@
   var o = new api.TableDataInsertAllResponseInsertErrors();
   buildCounterTableDataInsertAllResponseInsertErrors++;
   if (buildCounterTableDataInsertAllResponseInsertErrors < 3) {
-    o.errors = buildUnnamed1155();
+    o.errors = buildUnnamed279();
     o.index = 42;
   }
   buildCounterTableDataInsertAllResponseInsertErrors--;
@@ -1073,20 +1107,20 @@
 checkTableDataInsertAllResponseInsertErrors(api.TableDataInsertAllResponseInsertErrors o) {
   buildCounterTableDataInsertAllResponseInsertErrors++;
   if (buildCounterTableDataInsertAllResponseInsertErrors < 3) {
-    checkUnnamed1155(o.errors);
+    checkUnnamed279(o.errors);
     unittest.expect(o.index, unittest.equals(42));
   }
   buildCounterTableDataInsertAllResponseInsertErrors--;
 }
 
-buildUnnamed1156() {
+buildUnnamed280() {
   var o = new core.List<api.TableDataInsertAllResponseInsertErrors>();
   o.add(buildTableDataInsertAllResponseInsertErrors());
   o.add(buildTableDataInsertAllResponseInsertErrors());
   return o;
 }
 
-checkUnnamed1156(core.List<api.TableDataInsertAllResponseInsertErrors> o) {
+checkUnnamed280(core.List<api.TableDataInsertAllResponseInsertErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableDataInsertAllResponseInsertErrors(o[0]);
   checkTableDataInsertAllResponseInsertErrors(o[1]);
@@ -1097,7 +1131,7 @@
   var o = new api.TableDataInsertAllResponse();
   buildCounterTableDataInsertAllResponse++;
   if (buildCounterTableDataInsertAllResponse < 3) {
-    o.insertErrors = buildUnnamed1156();
+    o.insertErrors = buildUnnamed280();
     o.kind = "foo";
   }
   buildCounterTableDataInsertAllResponse--;
@@ -1107,20 +1141,20 @@
 checkTableDataInsertAllResponse(api.TableDataInsertAllResponse o) {
   buildCounterTableDataInsertAllResponse++;
   if (buildCounterTableDataInsertAllResponse < 3) {
-    checkUnnamed1156(o.insertErrors);
+    checkUnnamed280(o.insertErrors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTableDataInsertAllResponse--;
 }
 
-buildUnnamed1157() {
+buildUnnamed281() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed1157(core.List<api.TableRow> o) {
+checkUnnamed281(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -1134,7 +1168,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed1157();
+    o.rows = buildUnnamed281();
     o.totalRows = "foo";
   }
   buildCounterTableDataList--;
@@ -1147,20 +1181,20 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1157(o.rows);
+    checkUnnamed281(o.rows);
     unittest.expect(o.totalRows, unittest.equals('foo'));
   }
   buildCounterTableDataList--;
 }
 
-buildUnnamed1158() {
+buildUnnamed282() {
   var o = new core.List<api.TableFieldSchema>();
   o.add(buildTableFieldSchema());
   o.add(buildTableFieldSchema());
   return o;
 }
 
-checkUnnamed1158(core.List<api.TableFieldSchema> o) {
+checkUnnamed282(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableFieldSchema(o[0]);
   checkTableFieldSchema(o[1]);
@@ -1172,7 +1206,7 @@
   buildCounterTableFieldSchema++;
   if (buildCounterTableFieldSchema < 3) {
     o.description = "foo";
-    o.fields = buildUnnamed1158();
+    o.fields = buildUnnamed282();
     o.mode = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -1185,7 +1219,7 @@
   buildCounterTableFieldSchema++;
   if (buildCounterTableFieldSchema < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1158(o.fields);
+    checkUnnamed282(o.fields);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1220,14 +1254,14 @@
   buildCounterTableListTables--;
 }
 
-buildUnnamed1159() {
+buildUnnamed283() {
   var o = new core.List<api.TableListTables>();
   o.add(buildTableListTables());
   o.add(buildTableListTables());
   return o;
 }
 
-checkUnnamed1159(core.List<api.TableListTables> o) {
+checkUnnamed283(core.List<api.TableListTables> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableListTables(o[0]);
   checkTableListTables(o[1]);
@@ -1241,7 +1275,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.tables = buildUnnamed1159();
+    o.tables = buildUnnamed283();
     o.totalItems = 42;
   }
   buildCounterTableList--;
@@ -1254,7 +1288,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1159(o.tables);
+    checkUnnamed283(o.tables);
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterTableList--;
@@ -1283,14 +1317,14 @@
   buildCounterTableReference--;
 }
 
-buildUnnamed1160() {
+buildUnnamed284() {
   var o = new core.List<api.TableCell>();
   o.add(buildTableCell());
   o.add(buildTableCell());
   return o;
 }
 
-checkUnnamed1160(core.List<api.TableCell> o) {
+checkUnnamed284(core.List<api.TableCell> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableCell(o[0]);
   checkTableCell(o[1]);
@@ -1301,7 +1335,7 @@
   var o = new api.TableRow();
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
-    o.f = buildUnnamed1160();
+    o.f = buildUnnamed284();
   }
   buildCounterTableRow--;
   return o;
@@ -1310,19 +1344,19 @@
 checkTableRow(api.TableRow o) {
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
-    checkUnnamed1160(o.f);
+    checkUnnamed284(o.f);
   }
   buildCounterTableRow--;
 }
 
-buildUnnamed1161() {
+buildUnnamed285() {
   var o = new core.List<api.TableFieldSchema>();
   o.add(buildTableFieldSchema());
   o.add(buildTableFieldSchema());
   return o;
 }
 
-checkUnnamed1161(core.List<api.TableFieldSchema> o) {
+checkUnnamed285(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableFieldSchema(o[0]);
   checkTableFieldSchema(o[1]);
@@ -1333,7 +1367,7 @@
   var o = new api.TableSchema();
   buildCounterTableSchema++;
   if (buildCounterTableSchema < 3) {
-    o.fields = buildUnnamed1161();
+    o.fields = buildUnnamed285();
   }
   buildCounterTableSchema--;
   return o;
@@ -1342,7 +1376,7 @@
 checkTableSchema(api.TableSchema o) {
   buildCounterTableSchema++;
   if (buildCounterTableSchema < 3) {
-    checkUnnamed1161(o.fields);
+    checkUnnamed285(o.fields);
   }
   buildCounterTableSchema--;
 }
@@ -1366,14 +1400,14 @@
   buildCounterViewDefinition--;
 }
 
-buildUnnamed1162() {
+buildUnnamed286() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1162(core.List<core.String> o) {
+checkUnnamed286(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1561,6 +1595,15 @@
   });
 
 
+  unittest.group("obj-schema-JobStatistics4", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildJobStatistics4();
+      var od = new api.JobStatistics4.fromJson(o.toJson());
+      checkJobStatistics4(od);
+    });
+  });
+
+
   unittest.group("obj-schema-JobStatus", () {
     unittest.test("to-json--from-json", () {
       var o = buildJobStatus();
@@ -2297,7 +2340,7 @@
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_projection = "foo";
-      var arg_stateFilter = buildUnnamed1162();
+      var arg_stateFilter = buildUnnamed286();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/blogger/v3_test.dart b/generated/googleapis/test/blogger/v3_test.dart
index 9fab319..39097d5 100644
--- a/generated/googleapis/test/blogger/v3_test.dart
+++ b/generated/googleapis/test/blogger/v3_test.dart
@@ -60,14 +60,14 @@
   buildCounterBlogPages--;
 }
 
-buildUnnamed719() {
+buildUnnamed287() {
   var o = new core.List<api.Post>();
   o.add(buildPost());
   o.add(buildPost());
   return o;
 }
 
-checkUnnamed719(core.List<api.Post> o) {
+checkUnnamed287(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPost(o[0]);
   checkPost(o[1]);
@@ -78,7 +78,7 @@
   var o = new api.BlogPosts();
   buildCounterBlogPosts++;
   if (buildCounterBlogPosts < 3) {
-    o.items = buildUnnamed719();
+    o.items = buildUnnamed287();
     o.selfLink = "foo";
     o.totalItems = 42;
   }
@@ -89,7 +89,7 @@
 checkBlogPosts(api.BlogPosts o) {
   buildCounterBlogPosts++;
   if (buildCounterBlogPosts < 3) {
-    checkUnnamed719(o.items);
+    checkUnnamed287(o.items);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
@@ -139,27 +139,27 @@
   buildCounterBlog--;
 }
 
-buildUnnamed720() {
+buildUnnamed288() {
   var o = new core.List<api.BlogUserInfo>();
   o.add(buildBlogUserInfo());
   o.add(buildBlogUserInfo());
   return o;
 }
 
-checkUnnamed720(core.List<api.BlogUserInfo> o) {
+checkUnnamed288(core.List<api.BlogUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlogUserInfo(o[0]);
   checkBlogUserInfo(o[1]);
 }
 
-buildUnnamed721() {
+buildUnnamed289() {
   var o = new core.List<api.Blog>();
   o.add(buildBlog());
   o.add(buildBlog());
   return o;
 }
 
-checkUnnamed721(core.List<api.Blog> o) {
+checkUnnamed289(core.List<api.Blog> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlog(o[0]);
   checkBlog(o[1]);
@@ -170,8 +170,8 @@
   var o = new api.BlogList();
   buildCounterBlogList++;
   if (buildCounterBlogList < 3) {
-    o.blogUserInfos = buildUnnamed720();
-    o.items = buildUnnamed721();
+    o.blogUserInfos = buildUnnamed288();
+    o.items = buildUnnamed289();
     o.kind = "foo";
   }
   buildCounterBlogList--;
@@ -181,8 +181,8 @@
 checkBlogList(api.BlogList o) {
   buildCounterBlogList++;
   if (buildCounterBlogList < 3) {
-    checkUnnamed720(o.blogUserInfos);
-    checkUnnamed721(o.items);
+    checkUnnamed288(o.blogUserInfos);
+    checkUnnamed289(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBlogList--;
@@ -380,14 +380,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed722() {
+buildUnnamed290() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed722(core.List<api.Comment> o) {
+checkUnnamed290(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -398,7 +398,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.items = buildUnnamed722();
+    o.items = buildUnnamed290();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.prevPageToken = "foo";
@@ -410,7 +410,7 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed722(o.items);
+    checkUnnamed290(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
@@ -522,14 +522,14 @@
   buildCounterPage--;
 }
 
-buildUnnamed723() {
+buildUnnamed291() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed723(core.List<api.Page> o) {
+checkUnnamed291(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -540,7 +540,7 @@
   var o = new api.PageList();
   buildCounterPageList++;
   if (buildCounterPageList < 3) {
-    o.items = buildUnnamed723();
+    o.items = buildUnnamed291();
     o.kind = "foo";
   }
   buildCounterPageList--;
@@ -550,7 +550,7 @@
 checkPageList(api.PageList o) {
   buildCounterPageList++;
   if (buildCounterPageList < 3) {
-    checkUnnamed723(o.items);
+    checkUnnamed291(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPageList--;
@@ -577,14 +577,14 @@
   buildCounterPageviewsCounts--;
 }
 
-buildUnnamed724() {
+buildUnnamed292() {
   var o = new core.List<api.PageviewsCounts>();
   o.add(buildPageviewsCounts());
   o.add(buildPageviewsCounts());
   return o;
 }
 
-checkUnnamed724(core.List<api.PageviewsCounts> o) {
+checkUnnamed292(core.List<api.PageviewsCounts> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPageviewsCounts(o[0]);
   checkPageviewsCounts(o[1]);
@@ -596,7 +596,7 @@
   buildCounterPageviews++;
   if (buildCounterPageviews < 3) {
     o.blogId = "foo";
-    o.counts = buildUnnamed724();
+    o.counts = buildUnnamed292();
     o.kind = "foo";
   }
   buildCounterPageviews--;
@@ -607,7 +607,7 @@
   buildCounterPageviews++;
   if (buildCounterPageviews < 3) {
     unittest.expect(o.blogId, unittest.equals('foo'));
-    checkUnnamed724(o.counts);
+    checkUnnamed292(o.counts);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPageviews--;
@@ -695,27 +695,27 @@
   buildCounterPostImages--;
 }
 
-buildUnnamed725() {
+buildUnnamed293() {
   var o = new core.List<api.PostImages>();
   o.add(buildPostImages());
   o.add(buildPostImages());
   return o;
 }
 
-checkUnnamed725(core.List<api.PostImages> o) {
+checkUnnamed293(core.List<api.PostImages> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostImages(o[0]);
   checkPostImages(o[1]);
 }
 
-buildUnnamed726() {
+buildUnnamed294() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed726(core.List<core.String> o) {
+checkUnnamed294(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -746,14 +746,14 @@
   buildCounterPostLocation--;
 }
 
-buildUnnamed727() {
+buildUnnamed295() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed727(core.List<api.Comment> o) {
+checkUnnamed295(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -764,7 +764,7 @@
   var o = new api.PostReplies();
   buildCounterPostReplies++;
   if (buildCounterPostReplies < 3) {
-    o.items = buildUnnamed727();
+    o.items = buildUnnamed295();
     o.selfLink = "foo";
     o.totalItems = "foo";
   }
@@ -775,7 +775,7 @@
 checkPostReplies(api.PostReplies o) {
   buildCounterPostReplies++;
   if (buildCounterPostReplies < 3) {
-    checkUnnamed727(o.items);
+    checkUnnamed295(o.items);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals('foo'));
   }
@@ -793,9 +793,9 @@
     o.customMetaData = "foo";
     o.etag = "foo";
     o.id = "foo";
-    o.images = buildUnnamed725();
+    o.images = buildUnnamed293();
     o.kind = "foo";
-    o.labels = buildUnnamed726();
+    o.labels = buildUnnamed294();
     o.location = buildPostLocation();
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
     o.readerComments = "foo";
@@ -820,9 +820,9 @@
     unittest.expect(o.customMetaData, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed725(o.images);
+    checkUnnamed293(o.images);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed726(o.labels);
+    checkUnnamed294(o.labels);
     checkPostLocation(o.location);
     unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.readerComments, unittest.equals('foo'));
@@ -837,14 +837,14 @@
   buildCounterPost--;
 }
 
-buildUnnamed728() {
+buildUnnamed296() {
   var o = new core.List<api.Post>();
   o.add(buildPost());
   o.add(buildPost());
   return o;
 }
 
-checkUnnamed728(core.List<api.Post> o) {
+checkUnnamed296(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPost(o[0]);
   checkPost(o[1]);
@@ -855,7 +855,7 @@
   var o = new api.PostList();
   buildCounterPostList++;
   if (buildCounterPostList < 3) {
-    o.items = buildUnnamed728();
+    o.items = buildUnnamed296();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -866,7 +866,7 @@
 checkPostList(api.PostList o) {
   buildCounterPostList++;
   if (buildCounterPostList < 3) {
-    checkUnnamed728(o.items);
+    checkUnnamed296(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -923,14 +923,14 @@
   buildCounterPostUserInfo--;
 }
 
-buildUnnamed729() {
+buildUnnamed297() {
   var o = new core.List<api.PostUserInfo>();
   o.add(buildPostUserInfo());
   o.add(buildPostUserInfo());
   return o;
 }
 
-checkUnnamed729(core.List<api.PostUserInfo> o) {
+checkUnnamed297(core.List<api.PostUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostUserInfo(o[0]);
   checkPostUserInfo(o[1]);
@@ -941,7 +941,7 @@
   var o = new api.PostUserInfosList();
   buildCounterPostUserInfosList++;
   if (buildCounterPostUserInfosList < 3) {
-    o.items = buildUnnamed729();
+    o.items = buildUnnamed297();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -952,7 +952,7 @@
 checkPostUserInfosList(api.PostUserInfosList o) {
   buildCounterPostUserInfosList++;
   if (buildCounterPostUserInfosList < 3) {
-    checkUnnamed729(o.items);
+    checkUnnamed297(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1036,92 +1036,92 @@
   buildCounterUser--;
 }
 
-buildUnnamed730() {
+buildUnnamed298() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed730(core.List<core.String> o) {
+checkUnnamed298(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed731() {
+buildUnnamed299() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed731(core.List<core.String> o) {
+checkUnnamed299(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed732() {
+buildUnnamed300() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed732(core.List<core.String> o) {
+checkUnnamed300(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed733() {
+buildUnnamed301() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed733(core.List<core.String> o) {
+checkUnnamed301(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed734() {
+buildUnnamed302() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed734(core.List<core.String> o) {
+checkUnnamed302(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed735() {
+buildUnnamed303() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed735(core.List<core.String> o) {
+checkUnnamed303(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed736() {
+buildUnnamed304() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed736(core.List<core.String> o) {
+checkUnnamed304(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1616,8 +1616,8 @@
       api.BlogsResourceApi res = new api.BloggerApi(mock).blogs;
       var arg_userId = "foo";
       var arg_fetchUserInfo = true;
-      var arg_role = buildUnnamed730();
-      var arg_status = buildUnnamed731();
+      var arg_role = buildUnnamed298();
+      var arg_status = buildUnnamed299();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1885,7 +1885,7 @@
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed732();
+      var arg_status = buildUnnamed300();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2159,7 +2159,7 @@
       var mock = new common_test.HttpServerMock();
       api.PageViewsResourceApi res = new api.BloggerApi(mock).pageViews;
       var arg_blogId = "foo";
-      var arg_range = buildUnnamed733();
+      var arg_range = buildUnnamed301();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2392,7 +2392,7 @@
       api.PagesResourceApi res = new api.BloggerApi(mock).pages;
       var arg_blogId = "foo";
       var arg_fetchBodies = true;
-      var arg_status = buildUnnamed734();
+      var arg_status = buildUnnamed302();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2781,7 +2781,7 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed735();
+      var arg_status = buildUnnamed303();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3106,7 +3106,7 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed736();
+      var arg_status = buildUnnamed304();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/books/v1_test.dart b/generated/googleapis/test/books/v1_test.dart
index 40e6c1b..2e600b1 100644
--- a/generated/googleapis/test/books/v1_test.dart
+++ b/generated/googleapis/test/books/v1_test.dart
@@ -93,14 +93,14 @@
   buildCounterAnnotationLayerSummary--;
 }
 
-buildUnnamed516() {
+buildUnnamed305() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed516(core.List<core.String> o) {
+checkUnnamed305(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -123,7 +123,7 @@
     o.kind = "foo";
     o.layerId = "foo";
     o.layerSummary = buildAnnotationLayerSummary();
-    o.pageIds = buildUnnamed516();
+    o.pageIds = buildUnnamed305();
     o.selectedText = "foo";
     o.selfLink = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -148,7 +148,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.layerId, unittest.equals('foo'));
     checkAnnotationLayerSummary(o.layerSummary);
-    checkUnnamed516(o.pageIds);
+    checkUnnamed305(o.pageIds);
     unittest.expect(o.selectedText, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -192,14 +192,14 @@
   buildCounterAnnotationdata--;
 }
 
-buildUnnamed517() {
+buildUnnamed306() {
   var o = new core.List<api.Annotation>();
   o.add(buildAnnotation());
   o.add(buildAnnotation());
   return o;
 }
 
-checkUnnamed517(core.List<api.Annotation> o) {
+checkUnnamed306(core.List<api.Annotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotation(o[0]);
   checkAnnotation(o[1]);
@@ -210,7 +210,7 @@
   var o = new api.Annotations();
   buildCounterAnnotations++;
   if (buildCounterAnnotations < 3) {
-    o.items = buildUnnamed517();
+    o.items = buildUnnamed306();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -222,7 +222,7 @@
 checkAnnotations(api.Annotations o) {
   buildCounterAnnotations++;
   if (buildCounterAnnotations < 3) {
-    checkUnnamed517(o.items);
+    checkUnnamed306(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -257,14 +257,14 @@
   buildCounterAnnotationsSummaryLayers--;
 }
 
-buildUnnamed518() {
+buildUnnamed307() {
   var o = new core.List<api.AnnotationsSummaryLayers>();
   o.add(buildAnnotationsSummaryLayers());
   o.add(buildAnnotationsSummaryLayers());
   return o;
 }
 
-checkUnnamed518(core.List<api.AnnotationsSummaryLayers> o) {
+checkUnnamed307(core.List<api.AnnotationsSummaryLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotationsSummaryLayers(o[0]);
   checkAnnotationsSummaryLayers(o[1]);
@@ -276,7 +276,7 @@
   buildCounterAnnotationsSummary++;
   if (buildCounterAnnotationsSummary < 3) {
     o.kind = "foo";
-    o.layers = buildUnnamed518();
+    o.layers = buildUnnamed307();
   }
   buildCounterAnnotationsSummary--;
   return o;
@@ -286,19 +286,19 @@
   buildCounterAnnotationsSummary++;
   if (buildCounterAnnotationsSummary < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed518(o.layers);
+    checkUnnamed307(o.layers);
   }
   buildCounterAnnotationsSummary--;
 }
 
-buildUnnamed519() {
+buildUnnamed308() {
   var o = new core.List<api.Annotationdata>();
   o.add(buildAnnotationdata());
   o.add(buildAnnotationdata());
   return o;
 }
 
-checkUnnamed519(core.List<api.Annotationdata> o) {
+checkUnnamed308(core.List<api.Annotationdata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotationdata(o[0]);
   checkAnnotationdata(o[1]);
@@ -309,7 +309,7 @@
   var o = new api.Annotationsdata();
   buildCounterAnnotationsdata++;
   if (buildCounterAnnotationsdata < 3) {
-    o.items = buildUnnamed519();
+    o.items = buildUnnamed308();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -321,7 +321,7 @@
 checkAnnotationsdata(api.Annotationsdata o) {
   buildCounterAnnotationsdata++;
   if (buildCounterAnnotationsdata < 3) {
-    checkUnnamed519(o.items);
+    checkUnnamed308(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -435,14 +435,14 @@
   buildCounterBookshelf--;
 }
 
-buildUnnamed520() {
+buildUnnamed309() {
   var o = new core.List<api.Bookshelf>();
   o.add(buildBookshelf());
   o.add(buildBookshelf());
   return o;
 }
 
-checkUnnamed520(core.List<api.Bookshelf> o) {
+checkUnnamed309(core.List<api.Bookshelf> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBookshelf(o[0]);
   checkBookshelf(o[1]);
@@ -453,7 +453,7 @@
   var o = new api.Bookshelves();
   buildCounterBookshelves++;
   if (buildCounterBookshelves < 3) {
-    o.items = buildUnnamed520();
+    o.items = buildUnnamed309();
     o.kind = "foo";
   }
   buildCounterBookshelves--;
@@ -463,7 +463,7 @@
 checkBookshelves(api.Bookshelves o) {
   buildCounterBookshelves++;
   if (buildCounterBookshelves < 3) {
-    checkUnnamed520(o.items);
+    checkUnnamed309(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBookshelves--;
@@ -590,14 +590,14 @@
   buildCounterDictlayerdataDictWordsDerivatives--;
 }
 
-buildUnnamed521() {
+buildUnnamed310() {
   var o = new core.List<api.DictlayerdataDictWordsDerivatives>();
   o.add(buildDictlayerdataDictWordsDerivatives());
   o.add(buildDictlayerdataDictWordsDerivatives());
   return o;
 }
 
-checkUnnamed521(core.List<api.DictlayerdataDictWordsDerivatives> o) {
+checkUnnamed310(core.List<api.DictlayerdataDictWordsDerivatives> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsDerivatives(o[0]);
   checkDictlayerdataDictWordsDerivatives(o[1]);
@@ -645,14 +645,14 @@
   buildCounterDictlayerdataDictWordsExamples--;
 }
 
-buildUnnamed522() {
+buildUnnamed311() {
   var o = new core.List<api.DictlayerdataDictWordsExamples>();
   o.add(buildDictlayerdataDictWordsExamples());
   o.add(buildDictlayerdataDictWordsExamples());
   return o;
 }
 
-checkUnnamed522(core.List<api.DictlayerdataDictWordsExamples> o) {
+checkUnnamed311(core.List<api.DictlayerdataDictWordsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsExamples(o[0]);
   checkDictlayerdataDictWordsExamples(o[1]);
@@ -679,14 +679,14 @@
   buildCounterDictlayerdataDictWordsSensesConjugations--;
 }
 
-buildUnnamed523() {
+buildUnnamed312() {
   var o = new core.List<api.DictlayerdataDictWordsSensesConjugations>();
   o.add(buildDictlayerdataDictWordsSensesConjugations());
   o.add(buildDictlayerdataDictWordsSensesConjugations());
   return o;
 }
 
-checkUnnamed523(core.List<api.DictlayerdataDictWordsSensesConjugations> o) {
+checkUnnamed312(core.List<api.DictlayerdataDictWordsSensesConjugations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesConjugations(o[0]);
   checkDictlayerdataDictWordsSensesConjugations(o[1]);
@@ -734,14 +734,14 @@
   buildCounterDictlayerdataDictWordsSensesDefinitionsExamples--;
 }
 
-buildUnnamed524() {
+buildUnnamed313() {
   var o = new core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples>();
   o.add(buildDictlayerdataDictWordsSensesDefinitionsExamples());
   o.add(buildDictlayerdataDictWordsSensesDefinitionsExamples());
   return o;
 }
 
-checkUnnamed524(core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples> o) {
+checkUnnamed313(core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesDefinitionsExamples(o[0]);
   checkDictlayerdataDictWordsSensesDefinitionsExamples(o[1]);
@@ -753,7 +753,7 @@
   buildCounterDictlayerdataDictWordsSensesDefinitions++;
   if (buildCounterDictlayerdataDictWordsSensesDefinitions < 3) {
     o.definition = "foo";
-    o.examples = buildUnnamed524();
+    o.examples = buildUnnamed313();
   }
   buildCounterDictlayerdataDictWordsSensesDefinitions--;
   return o;
@@ -763,19 +763,19 @@
   buildCounterDictlayerdataDictWordsSensesDefinitions++;
   if (buildCounterDictlayerdataDictWordsSensesDefinitions < 3) {
     unittest.expect(o.definition, unittest.equals('foo'));
-    checkUnnamed524(o.examples);
+    checkUnnamed313(o.examples);
   }
   buildCounterDictlayerdataDictWordsSensesDefinitions--;
 }
 
-buildUnnamed525() {
+buildUnnamed314() {
   var o = new core.List<api.DictlayerdataDictWordsSensesDefinitions>();
   o.add(buildDictlayerdataDictWordsSensesDefinitions());
   o.add(buildDictlayerdataDictWordsSensesDefinitions());
   return o;
 }
 
-checkUnnamed525(core.List<api.DictlayerdataDictWordsSensesDefinitions> o) {
+checkUnnamed314(core.List<api.DictlayerdataDictWordsSensesDefinitions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesDefinitions(o[0]);
   checkDictlayerdataDictWordsSensesDefinitions(o[1]);
@@ -844,14 +844,14 @@
   buildCounterDictlayerdataDictWordsSensesSynonyms--;
 }
 
-buildUnnamed526() {
+buildUnnamed315() {
   var o = new core.List<api.DictlayerdataDictWordsSensesSynonyms>();
   o.add(buildDictlayerdataDictWordsSensesSynonyms());
   o.add(buildDictlayerdataDictWordsSensesSynonyms());
   return o;
 }
 
-checkUnnamed526(core.List<api.DictlayerdataDictWordsSensesSynonyms> o) {
+checkUnnamed315(core.List<api.DictlayerdataDictWordsSensesSynonyms> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesSynonyms(o[0]);
   checkDictlayerdataDictWordsSensesSynonyms(o[1]);
@@ -862,14 +862,14 @@
   var o = new api.DictlayerdataDictWordsSenses();
   buildCounterDictlayerdataDictWordsSenses++;
   if (buildCounterDictlayerdataDictWordsSenses < 3) {
-    o.conjugations = buildUnnamed523();
-    o.definitions = buildUnnamed525();
+    o.conjugations = buildUnnamed312();
+    o.definitions = buildUnnamed314();
     o.partOfSpeech = "foo";
     o.pronunciation = "foo";
     o.pronunciationUrl = "foo";
     o.source = buildDictlayerdataDictWordsSensesSource();
     o.syllabification = "foo";
-    o.synonyms = buildUnnamed526();
+    o.synonyms = buildUnnamed315();
   }
   buildCounterDictlayerdataDictWordsSenses--;
   return o;
@@ -878,26 +878,26 @@
 checkDictlayerdataDictWordsSenses(api.DictlayerdataDictWordsSenses o) {
   buildCounterDictlayerdataDictWordsSenses++;
   if (buildCounterDictlayerdataDictWordsSenses < 3) {
-    checkUnnamed523(o.conjugations);
-    checkUnnamed525(o.definitions);
+    checkUnnamed312(o.conjugations);
+    checkUnnamed314(o.definitions);
     unittest.expect(o.partOfSpeech, unittest.equals('foo'));
     unittest.expect(o.pronunciation, unittest.equals('foo'));
     unittest.expect(o.pronunciationUrl, unittest.equals('foo'));
     checkDictlayerdataDictWordsSensesSource(o.source);
     unittest.expect(o.syllabification, unittest.equals('foo'));
-    checkUnnamed526(o.synonyms);
+    checkUnnamed315(o.synonyms);
   }
   buildCounterDictlayerdataDictWordsSenses--;
 }
 
-buildUnnamed527() {
+buildUnnamed316() {
   var o = new core.List<api.DictlayerdataDictWordsSenses>();
   o.add(buildDictlayerdataDictWordsSenses());
   o.add(buildDictlayerdataDictWordsSenses());
   return o;
 }
 
-checkUnnamed527(core.List<api.DictlayerdataDictWordsSenses> o) {
+checkUnnamed316(core.List<api.DictlayerdataDictWordsSenses> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSenses(o[0]);
   checkDictlayerdataDictWordsSenses(o[1]);
@@ -929,9 +929,9 @@
   var o = new api.DictlayerdataDictWords();
   buildCounterDictlayerdataDictWords++;
   if (buildCounterDictlayerdataDictWords < 3) {
-    o.derivatives = buildUnnamed521();
-    o.examples = buildUnnamed522();
-    o.senses = buildUnnamed527();
+    o.derivatives = buildUnnamed310();
+    o.examples = buildUnnamed311();
+    o.senses = buildUnnamed316();
     o.source = buildDictlayerdataDictWordsSource();
   }
   buildCounterDictlayerdataDictWords--;
@@ -941,22 +941,22 @@
 checkDictlayerdataDictWords(api.DictlayerdataDictWords o) {
   buildCounterDictlayerdataDictWords++;
   if (buildCounterDictlayerdataDictWords < 3) {
-    checkUnnamed521(o.derivatives);
-    checkUnnamed522(o.examples);
-    checkUnnamed527(o.senses);
+    checkUnnamed310(o.derivatives);
+    checkUnnamed311(o.examples);
+    checkUnnamed316(o.senses);
     checkDictlayerdataDictWordsSource(o.source);
   }
   buildCounterDictlayerdataDictWords--;
 }
 
-buildUnnamed528() {
+buildUnnamed317() {
   var o = new core.List<api.DictlayerdataDictWords>();
   o.add(buildDictlayerdataDictWords());
   o.add(buildDictlayerdataDictWords());
   return o;
 }
 
-checkUnnamed528(core.List<api.DictlayerdataDictWords> o) {
+checkUnnamed317(core.List<api.DictlayerdataDictWords> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWords(o[0]);
   checkDictlayerdataDictWords(o[1]);
@@ -968,7 +968,7 @@
   buildCounterDictlayerdataDict++;
   if (buildCounterDictlayerdataDict < 3) {
     o.source = buildDictlayerdataDictSource();
-    o.words = buildUnnamed528();
+    o.words = buildUnnamed317();
   }
   buildCounterDictlayerdataDict--;
   return o;
@@ -978,7 +978,7 @@
   buildCounterDictlayerdataDict++;
   if (buildCounterDictlayerdataDict < 3) {
     checkDictlayerdataDictSource(o.source);
-    checkUnnamed528(o.words);
+    checkUnnamed317(o.words);
   }
   buildCounterDictlayerdataDict--;
 }
@@ -1047,14 +1047,14 @@
   buildCounterDownloadAccessRestriction--;
 }
 
-buildUnnamed529() {
+buildUnnamed318() {
   var o = new core.List<api.DownloadAccessRestriction>();
   o.add(buildDownloadAccessRestriction());
   o.add(buildDownloadAccessRestriction());
   return o;
 }
 
-checkUnnamed529(core.List<api.DownloadAccessRestriction> o) {
+checkUnnamed318(core.List<api.DownloadAccessRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDownloadAccessRestriction(o[0]);
   checkDownloadAccessRestriction(o[1]);
@@ -1065,7 +1065,7 @@
   var o = new api.DownloadAccesses();
   buildCounterDownloadAccesses++;
   if (buildCounterDownloadAccesses < 3) {
-    o.downloadAccessList = buildUnnamed529();
+    o.downloadAccessList = buildUnnamed318();
     o.kind = "foo";
   }
   buildCounterDownloadAccesses--;
@@ -1075,7 +1075,7 @@
 checkDownloadAccesses(api.DownloadAccesses o) {
   buildCounterDownloadAccesses++;
   if (buildCounterDownloadAccesses < 3) {
-    checkUnnamed529(o.downloadAccessList);
+    checkUnnamed318(o.downloadAccessList);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDownloadAccesses--;
@@ -1129,30 +1129,30 @@
   buildCounterGeolayerdataGeoBoundary--;
 }
 
-buildUnnamed530() {
+buildUnnamed319() {
   var o = new core.List<api.GeolayerdataGeoBoundary>();
   o.add(buildGeolayerdataGeoBoundary());
   o.add(buildGeolayerdataGeoBoundary());
   return o;
 }
 
-checkUnnamed530(core.List<api.GeolayerdataGeoBoundary> o) {
+checkUnnamed319(core.List<api.GeolayerdataGeoBoundary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeolayerdataGeoBoundary(o[0]);
   checkGeolayerdataGeoBoundary(o[1]);
 }
 
-buildUnnamed531() {
+buildUnnamed320() {
   var o = new core.List<core.List<api.GeolayerdataGeoBoundary>>();
-  o.add(buildUnnamed530());
-  o.add(buildUnnamed530());
+  o.add(buildUnnamed319());
+  o.add(buildUnnamed319());
   return o;
 }
 
-checkUnnamed531(core.List<core.List<api.GeolayerdataGeoBoundary>> o) {
+checkUnnamed320(core.List<core.List<api.GeolayerdataGeoBoundary>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed530(o[0]);
-  checkUnnamed530(o[1]);
+  checkUnnamed319(o[0]);
+  checkUnnamed319(o[1]);
 }
 
 core.int buildCounterGeolayerdataGeoViewportHi = 0;
@@ -1223,7 +1223,7 @@
   var o = new api.GeolayerdataGeo();
   buildCounterGeolayerdataGeo++;
   if (buildCounterGeolayerdataGeo < 3) {
-    o.boundary = buildUnnamed531();
+    o.boundary = buildUnnamed320();
     o.cachePolicy = "foo";
     o.countryCode = "foo";
     o.latitude = 42.0;
@@ -1239,7 +1239,7 @@
 checkGeolayerdataGeo(api.GeolayerdataGeo o) {
   buildCounterGeolayerdataGeo++;
   if (buildCounterGeolayerdataGeo < 3) {
-    checkUnnamed531(o.boundary);
+    checkUnnamed320(o.boundary);
     unittest.expect(o.cachePolicy, unittest.equals('foo'));
     unittest.expect(o.countryCode, unittest.equals('foo'));
     unittest.expect(o.latitude, unittest.equals(42.0));
@@ -1274,14 +1274,14 @@
   buildCounterGeolayerdata--;
 }
 
-buildUnnamed532() {
+buildUnnamed321() {
   var o = new core.List<api.Layersummary>();
   o.add(buildLayersummary());
   o.add(buildLayersummary());
   return o;
 }
 
-checkUnnamed532(core.List<api.Layersummary> o) {
+checkUnnamed321(core.List<api.Layersummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLayersummary(o[0]);
   checkLayersummary(o[1]);
@@ -1292,7 +1292,7 @@
   var o = new api.Layersummaries();
   buildCounterLayersummaries++;
   if (buildCounterLayersummaries < 3) {
-    o.items = buildUnnamed532();
+    o.items = buildUnnamed321();
     o.kind = "foo";
     o.totalItems = 42;
   }
@@ -1303,21 +1303,21 @@
 checkLayersummaries(api.Layersummaries o) {
   buildCounterLayersummaries++;
   if (buildCounterLayersummaries < 3) {
-    checkUnnamed532(o.items);
+    checkUnnamed321(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterLayersummaries--;
 }
 
-buildUnnamed533() {
+buildUnnamed322() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed533(core.List<core.String> o) {
+checkUnnamed322(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1329,7 +1329,7 @@
   buildCounterLayersummary++;
   if (buildCounterLayersummary < 3) {
     o.annotationCount = 42;
-    o.annotationTypes = buildUnnamed533();
+    o.annotationTypes = buildUnnamed322();
     o.annotationsDataLink = "foo";
     o.annotationsLink = "foo";
     o.contentVersion = "foo";
@@ -1350,7 +1350,7 @@
   buildCounterLayersummary++;
   if (buildCounterLayersummary < 3) {
     unittest.expect(o.annotationCount, unittest.equals(42));
-    checkUnnamed533(o.annotationTypes);
+    checkUnnamed322(o.annotationTypes);
     unittest.expect(o.annotationsDataLink, unittest.equals('foo'));
     unittest.expect(o.annotationsLink, unittest.equals('foo'));
     unittest.expect(o.contentVersion, unittest.equals('foo'));
@@ -1366,6 +1366,67 @@
   buildCounterLayersummary--;
 }
 
+core.int buildCounterMetadataItems = 0;
+buildMetadataItems() {
+  var o = new api.MetadataItems();
+  buildCounterMetadataItems++;
+  if (buildCounterMetadataItems < 3) {
+    o.downloadUrl = "foo";
+    o.encryptedKey = "foo";
+    o.language = "foo";
+    o.size = "foo";
+    o.version = "foo";
+  }
+  buildCounterMetadataItems--;
+  return o;
+}
+
+checkMetadataItems(api.MetadataItems o) {
+  buildCounterMetadataItems++;
+  if (buildCounterMetadataItems < 3) {
+    unittest.expect(o.downloadUrl, unittest.equals('foo'));
+    unittest.expect(o.encryptedKey, unittest.equals('foo'));
+    unittest.expect(o.language, unittest.equals('foo'));
+    unittest.expect(o.size, unittest.equals('foo'));
+    unittest.expect(o.version, unittest.equals('foo'));
+  }
+  buildCounterMetadataItems--;
+}
+
+buildUnnamed323() {
+  var o = new core.List<api.MetadataItems>();
+  o.add(buildMetadataItems());
+  o.add(buildMetadataItems());
+  return o;
+}
+
+checkUnnamed323(core.List<api.MetadataItems> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkMetadataItems(o[0]);
+  checkMetadataItems(o[1]);
+}
+
+core.int buildCounterMetadata = 0;
+buildMetadata() {
+  var o = new api.Metadata();
+  buildCounterMetadata++;
+  if (buildCounterMetadata < 3) {
+    o.items = buildUnnamed323();
+    o.kind = "foo";
+  }
+  buildCounterMetadata--;
+  return o;
+}
+
+checkMetadata(api.Metadata o) {
+  buildCounterMetadata++;
+  if (buildCounterMetadata < 3) {
+    checkUnnamed323(o.items);
+    unittest.expect(o.kind, unittest.equals('foo'));
+  }
+  buildCounterMetadata--;
+}
+
 core.int buildCounterOffersItemsItems = 0;
 buildOffersItemsItems() {
   var o = new api.OffersItemsItems();
@@ -1395,14 +1456,14 @@
   buildCounterOffersItemsItems--;
 }
 
-buildUnnamed534() {
+buildUnnamed324() {
   var o = new core.List<api.OffersItemsItems>();
   o.add(buildOffersItemsItems());
   o.add(buildOffersItemsItems());
   return o;
 }
 
-checkUnnamed534(core.List<api.OffersItemsItems> o) {
+checkUnnamed324(core.List<api.OffersItemsItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffersItemsItems(o[0]);
   checkOffersItemsItems(o[1]);
@@ -1415,7 +1476,7 @@
   if (buildCounterOffersItems < 3) {
     o.artUrl = "foo";
     o.id = "foo";
-    o.items = buildUnnamed534();
+    o.items = buildUnnamed324();
   }
   buildCounterOffersItems--;
   return o;
@@ -1426,19 +1487,19 @@
   if (buildCounterOffersItems < 3) {
     unittest.expect(o.artUrl, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed534(o.items);
+    checkUnnamed324(o.items);
   }
   buildCounterOffersItems--;
 }
 
-buildUnnamed535() {
+buildUnnamed325() {
   var o = new core.List<api.OffersItems>();
   o.add(buildOffersItems());
   o.add(buildOffersItems());
   return o;
 }
 
-checkUnnamed535(core.List<api.OffersItems> o) {
+checkUnnamed325(core.List<api.OffersItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffersItems(o[0]);
   checkOffersItems(o[1]);
@@ -1449,7 +1510,7 @@
   var o = new api.Offers();
   buildCounterOffers++;
   if (buildCounterOffers < 3) {
-    o.items = buildUnnamed535();
+    o.items = buildUnnamed325();
     o.kind = "foo";
   }
   buildCounterOffers--;
@@ -1459,7 +1520,7 @@
 checkOffers(api.Offers o) {
   buildCounterOffers++;
   if (buildCounterOffers < 3) {
-    checkUnnamed535(o.items);
+    checkUnnamed325(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterOffers--;
@@ -1710,14 +1771,14 @@
   buildCounterVolumeLayerInfoLayers--;
 }
 
-buildUnnamed536() {
+buildUnnamed326() {
   var o = new core.List<api.VolumeLayerInfoLayers>();
   o.add(buildVolumeLayerInfoLayers());
   o.add(buildVolumeLayerInfoLayers());
   return o;
 }
 
-checkUnnamed536(core.List<api.VolumeLayerInfoLayers> o) {
+checkUnnamed326(core.List<api.VolumeLayerInfoLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeLayerInfoLayers(o[0]);
   checkVolumeLayerInfoLayers(o[1]);
@@ -1728,7 +1789,7 @@
   var o = new api.VolumeLayerInfo();
   buildCounterVolumeLayerInfo++;
   if (buildCounterVolumeLayerInfo < 3) {
-    o.layers = buildUnnamed536();
+    o.layers = buildUnnamed326();
   }
   buildCounterVolumeLayerInfo--;
   return o;
@@ -1737,7 +1798,7 @@
 checkVolumeLayerInfo(api.VolumeLayerInfo o) {
   buildCounterVolumeLayerInfo++;
   if (buildCounterVolumeLayerInfo < 3) {
-    checkUnnamed536(o.layers);
+    checkUnnamed326(o.layers);
   }
   buildCounterVolumeLayerInfo--;
 }
@@ -1870,14 +1931,14 @@
   buildCounterVolumeSaleInfoOffers--;
 }
 
-buildUnnamed537() {
+buildUnnamed327() {
   var o = new core.List<api.VolumeSaleInfoOffers>();
   o.add(buildVolumeSaleInfoOffers());
   o.add(buildVolumeSaleInfoOffers());
   return o;
 }
 
-checkUnnamed537(core.List<api.VolumeSaleInfoOffers> o) {
+checkUnnamed327(core.List<api.VolumeSaleInfoOffers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeSaleInfoOffers(o[0]);
   checkVolumeSaleInfoOffers(o[1]);
@@ -1913,7 +1974,7 @@
     o.country = "foo";
     o.isEbook = true;
     o.listPrice = buildVolumeSaleInfoListPrice();
-    o.offers = buildUnnamed537();
+    o.offers = buildUnnamed327();
     o.onSaleDate = core.DateTime.parse("2002-02-27T14:01:02");
     o.retailPrice = buildVolumeSaleInfoRetailPrice();
     o.saleability = "foo";
@@ -1929,7 +1990,7 @@
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.isEbook, unittest.isTrue);
     checkVolumeSaleInfoListPrice(o.listPrice);
-    checkUnnamed537(o.offers);
+    checkUnnamed327(o.offers);
     unittest.expect(o.onSaleDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkVolumeSaleInfoRetailPrice(o.retailPrice);
     unittest.expect(o.saleability, unittest.equals('foo'));
@@ -2060,27 +2121,27 @@
   buildCounterVolumeUserInfo--;
 }
 
-buildUnnamed538() {
+buildUnnamed328() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed538(core.List<core.String> o) {
+checkUnnamed328(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed539() {
+buildUnnamed329() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed539(core.List<core.String> o) {
+checkUnnamed329(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2159,14 +2220,14 @@
   buildCounterVolumeVolumeInfoIndustryIdentifiers--;
 }
 
-buildUnnamed540() {
+buildUnnamed330() {
   var o = new core.List<api.VolumeVolumeInfoIndustryIdentifiers>();
   o.add(buildVolumeVolumeInfoIndustryIdentifiers());
   o.add(buildVolumeVolumeInfoIndustryIdentifiers());
   return o;
 }
 
-checkUnnamed540(core.List<api.VolumeVolumeInfoIndustryIdentifiers> o) {
+checkUnnamed330(core.List<api.VolumeVolumeInfoIndustryIdentifiers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeVolumeInfoIndustryIdentifiers(o[0]);
   checkVolumeVolumeInfoIndustryIdentifiers(o[1]);
@@ -2177,15 +2238,15 @@
   var o = new api.VolumeVolumeInfo();
   buildCounterVolumeVolumeInfo++;
   if (buildCounterVolumeVolumeInfo < 3) {
-    o.authors = buildUnnamed538();
+    o.authors = buildUnnamed328();
     o.averageRating = 42.0;
     o.canonicalVolumeLink = "foo";
-    o.categories = buildUnnamed539();
+    o.categories = buildUnnamed329();
     o.contentVersion = "foo";
     o.description = "foo";
     o.dimensions = buildVolumeVolumeInfoDimensions();
     o.imageLinks = buildVolumeVolumeInfoImageLinks();
-    o.industryIdentifiers = buildUnnamed540();
+    o.industryIdentifiers = buildUnnamed330();
     o.infoLink = "foo";
     o.language = "foo";
     o.mainCategory = "foo";
@@ -2207,15 +2268,15 @@
 checkVolumeVolumeInfo(api.VolumeVolumeInfo o) {
   buildCounterVolumeVolumeInfo++;
   if (buildCounterVolumeVolumeInfo < 3) {
-    checkUnnamed538(o.authors);
+    checkUnnamed328(o.authors);
     unittest.expect(o.averageRating, unittest.equals(42.0));
     unittest.expect(o.canonicalVolumeLink, unittest.equals('foo'));
-    checkUnnamed539(o.categories);
+    checkUnnamed329(o.categories);
     unittest.expect(o.contentVersion, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     checkVolumeVolumeInfoDimensions(o.dimensions);
     checkVolumeVolumeInfoImageLinks(o.imageLinks);
-    checkUnnamed540(o.industryIdentifiers);
+    checkUnnamed330(o.industryIdentifiers);
     unittest.expect(o.infoLink, unittest.equals('foo'));
     unittest.expect(o.language, unittest.equals('foo'));
     unittest.expect(o.mainCategory, unittest.equals('foo'));
@@ -2297,14 +2358,14 @@
   buildCounterVolumeannotationContentRanges--;
 }
 
-buildUnnamed541() {
+buildUnnamed331() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed541(core.List<core.String> o) {
+checkUnnamed331(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2324,7 +2385,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.layerId = "foo";
-    o.pageIds = buildUnnamed541();
+    o.pageIds = buildUnnamed331();
     o.selectedText = "foo";
     o.selfLink = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -2346,7 +2407,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.layerId, unittest.equals('foo'));
-    checkUnnamed541(o.pageIds);
+    checkUnnamed331(o.pageIds);
     unittest.expect(o.selectedText, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -2355,14 +2416,14 @@
   buildCounterVolumeannotation--;
 }
 
-buildUnnamed542() {
+buildUnnamed332() {
   var o = new core.List<api.Volumeannotation>();
   o.add(buildVolumeannotation());
   o.add(buildVolumeannotation());
   return o;
 }
 
-checkUnnamed542(core.List<api.Volumeannotation> o) {
+checkUnnamed332(core.List<api.Volumeannotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeannotation(o[0]);
   checkVolumeannotation(o[1]);
@@ -2373,7 +2434,7 @@
   var o = new api.Volumeannotations();
   buildCounterVolumeannotations++;
   if (buildCounterVolumeannotations < 3) {
-    o.items = buildUnnamed542();
+    o.items = buildUnnamed332();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -2386,7 +2447,7 @@
 checkVolumeannotations(api.Volumeannotations o) {
   buildCounterVolumeannotations++;
   if (buildCounterVolumeannotations < 3) {
-    checkUnnamed542(o.items);
+    checkUnnamed332(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -2395,14 +2456,14 @@
   buildCounterVolumeannotations--;
 }
 
-buildUnnamed543() {
+buildUnnamed333() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed543(core.List<api.Volume> o) {
+checkUnnamed333(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
@@ -2413,7 +2474,7 @@
   var o = new api.Volumes();
   buildCounterVolumes++;
   if (buildCounterVolumes < 3) {
-    o.items = buildUnnamed543();
+    o.items = buildUnnamed333();
     o.kind = "foo";
     o.totalItems = 42;
   }
@@ -2424,151 +2485,151 @@
 checkVolumes(api.Volumes o) {
   buildCounterVolumes++;
   if (buildCounterVolumes < 3) {
-    checkUnnamed543(o.items);
+    checkUnnamed333(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterVolumes--;
 }
 
-buildUnnamed544() {
+buildUnnamed334() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed544(core.List<core.String> o) {
+checkUnnamed334(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed545() {
+buildUnnamed335() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed545(core.List<core.String> o) {
+checkUnnamed335(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed546() {
+buildUnnamed336() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed546(core.List<core.String> o) {
+checkUnnamed336(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed547() {
+buildUnnamed337() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed547(core.List<core.String> o) {
+checkUnnamed337(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed548() {
+buildUnnamed338() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed548(core.List<core.String> o) {
+checkUnnamed338(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed549() {
+buildUnnamed339() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed549(core.List<core.String> o) {
+checkUnnamed339(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed550() {
+buildUnnamed340() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed550(core.List<core.String> o) {
+checkUnnamed340(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed551() {
+buildUnnamed341() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed551(core.List<core.String> o) {
+checkUnnamed341(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed552() {
+buildUnnamed342() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed552(core.List<core.String> o) {
+checkUnnamed342(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed553() {
+buildUnnamed343() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed553(core.List<core.String> o) {
+checkUnnamed343(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed554() {
+buildUnnamed344() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed554(core.List<core.String> o) {
+checkUnnamed344(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2972,6 +3033,24 @@
   });
 
 
+  unittest.group("obj-schema-MetadataItems", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildMetadataItems();
+      var od = new api.MetadataItems.fromJson(o.toJson());
+      checkMetadataItems(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Metadata", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildMetadata();
+      var od = new api.Metadata.fromJson(o.toJson());
+      checkMetadata(od);
+    });
+  });
+
+
   unittest.group("obj-schema-OffersItemsItems", () {
     unittest.test("to-json--from-json", () {
       var o = buildOffersItemsItems();
@@ -3629,6 +3708,57 @@
   });
 
 
+  unittest.group("resource-DictionaryResourceApi", () {
+    unittest.test("method--listOfflineMetadata", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.DictionaryResourceApi res = new api.BooksApi(mock).dictionary;
+      var arg_cpksver = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("dictionary/listOfflineMetadata"));
+        pathOffset += 30;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+        unittest.expect(queryMap["cpksver"].first, unittest.equals(arg_cpksver));
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildMetadata());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.listOfflineMetadata(arg_cpksver).then(unittest.expectAsync(((api.Metadata response) {
+        checkMetadata(response);
+      })));
+    });
+
+  });
+
+
   unittest.group("resource-LayersResourceApi", () {
     unittest.test("method--get", () {
 
@@ -3842,7 +3972,7 @@
       var arg_volumeId = "foo";
       var arg_layerId = "foo";
       var arg_contentVersion = "foo";
-      var arg_annotationDataId = buildUnnamed544();
+      var arg_annotationDataId = buildUnnamed334();
       var arg_h = 42;
       var arg_locale = "foo";
       var arg_maxResults = 42;
@@ -4082,7 +4212,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.MyconfigResourceApi res = new api.BooksApi(mock).myconfig;
-      var arg_volumeIds = buildUnnamed545();
+      var arg_volumeIds = buildUnnamed335();
       var arg_cpksver = "foo";
       var arg_locale = "foo";
       var arg_source = "foo";
@@ -4195,10 +4325,10 @@
       var arg_source = "foo";
       var arg_nonce = "foo";
       var arg_cpksver = "foo";
-      var arg_features = buildUnnamed546();
+      var arg_features = buildUnnamed336();
       var arg_locale = "foo";
       var arg_showPreorders = true;
-      var arg_volumeIds = buildUnnamed547();
+      var arg_volumeIds = buildUnnamed337();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4356,6 +4486,7 @@
       var mock = new common_test.HttpServerMock();
       api.MylibraryAnnotationsResourceApi res = new api.BooksApi(mock).mylibrary.annotations;
       var arg_request = buildAnnotation();
+      var arg_country = "foo";
       var arg_showOnlySummaryInResponse = true;
       var arg_source = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -4389,6 +4520,7 @@
             addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["country"].first, unittest.equals(arg_country));
         unittest.expect(queryMap["showOnlySummaryInResponse"].first, unittest.equals("$arg_showOnlySummaryInResponse"));
         unittest.expect(queryMap["source"].first, unittest.equals(arg_source));
 
@@ -4399,7 +4531,7 @@
         var resp = convert.JSON.encode(buildAnnotation());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.insert(arg_request, showOnlySummaryInResponse: arg_showOnlySummaryInResponse, source: arg_source).then(unittest.expectAsync(((api.Annotation response) {
+      res.insert(arg_request, country: arg_country, showOnlySummaryInResponse: arg_showOnlySummaryInResponse, source: arg_source).then(unittest.expectAsync(((api.Annotation response) {
         checkAnnotation(response);
       })));
     });
@@ -4410,9 +4542,9 @@
       api.MylibraryAnnotationsResourceApi res = new api.BooksApi(mock).mylibrary.annotations;
       var arg_contentVersion = "foo";
       var arg_layerId = "foo";
-      var arg_layerIds = buildUnnamed548();
+      var arg_layerIds = buildUnnamed338();
       var arg_maxResults = 42;
-      var arg_pageIds = buildUnnamed549();
+      var arg_pageIds = buildUnnamed339();
       var arg_pageToken = "foo";
       var arg_showDeleted = true;
       var arg_source = "foo";
@@ -4475,7 +4607,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.MylibraryAnnotationsResourceApi res = new api.BooksApi(mock).mylibrary.annotations;
-      var arg_layerIds = buildUnnamed550();
+      var arg_layerIds = buildUnnamed340();
       var arg_volumeId = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -5468,10 +5600,10 @@
 
       var mock = new common_test.HttpServerMock();
       api.VolumesMybooksResourceApi res = new api.BooksApi(mock).volumes.mybooks;
-      var arg_acquireMethod = buildUnnamed551();
+      var arg_acquireMethod = buildUnnamed341();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_processingState = buildUnnamed552();
+      var arg_processingState = buildUnnamed342();
       var arg_source = "foo";
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -5637,10 +5769,10 @@
       api.VolumesUseruploadedResourceApi res = new api.BooksApi(mock).volumes.useruploaded;
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_processingState = buildUnnamed553();
+      var arg_processingState = buildUnnamed343();
       var arg_source = "foo";
       var arg_startIndex = 42;
-      var arg_volumeId = buildUnnamed554();
+      var arg_volumeId = buildUnnamed344();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/calendar/v3_test.dart b/generated/googleapis/test/calendar/v3_test.dart
index c9e9ac8..c3f1d56 100644
--- a/generated/googleapis/test/calendar/v3_test.dart
+++ b/generated/googleapis/test/calendar/v3_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed682() {
+buildUnnamed345() {
   var o = new core.List<api.AclRule>();
   o.add(buildAclRule());
   o.add(buildAclRule());
   return o;
 }
 
-checkUnnamed682(core.List<api.AclRule> o) {
+checkUnnamed345(core.List<api.AclRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAclRule(o[0]);
   checkAclRule(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed682();
+    o.items = buildUnnamed345();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -48,7 +48,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed682(o.items);
+    checkUnnamed345(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -135,14 +135,14 @@
   buildCounterCalendar--;
 }
 
-buildUnnamed683() {
+buildUnnamed346() {
   var o = new core.List<api.CalendarListEntry>();
   o.add(buildCalendarListEntry());
   o.add(buildCalendarListEntry());
   return o;
 }
 
-checkUnnamed683(core.List<api.CalendarListEntry> o) {
+checkUnnamed346(core.List<api.CalendarListEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarListEntry(o[0]);
   checkCalendarListEntry(o[1]);
@@ -154,7 +154,7 @@
   buildCounterCalendarList++;
   if (buildCounterCalendarList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed683();
+    o.items = buildUnnamed346();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -167,7 +167,7 @@
   buildCounterCalendarList++;
   if (buildCounterCalendarList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed683(o.items);
+    checkUnnamed346(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -175,27 +175,27 @@
   buildCounterCalendarList--;
 }
 
-buildUnnamed684() {
+buildUnnamed347() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed684(core.List<api.EventReminder> o) {
+checkUnnamed347(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
 }
 
-buildUnnamed685() {
+buildUnnamed348() {
   var o = new core.List<api.CalendarNotification>();
   o.add(buildCalendarNotification());
   o.add(buildCalendarNotification());
   return o;
 }
 
-checkUnnamed685(core.List<api.CalendarNotification> o) {
+checkUnnamed348(core.List<api.CalendarNotification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarNotification(o[0]);
   checkCalendarNotification(o[1]);
@@ -206,7 +206,7 @@
   var o = new api.CalendarListEntryNotificationSettings();
   buildCounterCalendarListEntryNotificationSettings++;
   if (buildCounterCalendarListEntryNotificationSettings < 3) {
-    o.notifications = buildUnnamed685();
+    o.notifications = buildUnnamed348();
   }
   buildCounterCalendarListEntryNotificationSettings--;
   return o;
@@ -215,7 +215,7 @@
 checkCalendarListEntryNotificationSettings(api.CalendarListEntryNotificationSettings o) {
   buildCounterCalendarListEntryNotificationSettings++;
   if (buildCounterCalendarListEntryNotificationSettings < 3) {
-    checkUnnamed685(o.notifications);
+    checkUnnamed348(o.notifications);
   }
   buildCounterCalendarListEntryNotificationSettings--;
 }
@@ -228,7 +228,7 @@
     o.accessRole = "foo";
     o.backgroundColor = "foo";
     o.colorId = "foo";
-    o.defaultReminders = buildUnnamed684();
+    o.defaultReminders = buildUnnamed347();
     o.deleted = true;
     o.description = "foo";
     o.etag = "foo";
@@ -254,7 +254,7 @@
     unittest.expect(o.accessRole, unittest.equals('foo'));
     unittest.expect(o.backgroundColor, unittest.equals('foo'));
     unittest.expect(o.colorId, unittest.equals('foo'));
-    checkUnnamed684(o.defaultReminders);
+    checkUnnamed347(o.defaultReminders);
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
@@ -294,14 +294,14 @@
   buildCounterCalendarNotification--;
 }
 
-buildUnnamed686() {
+buildUnnamed349() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed686(core.Map<core.String, core.String> o) {
+checkUnnamed349(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -316,7 +316,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed686();
+    o.params = buildUnnamed349();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -334,7 +334,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed686(o.params);
+    checkUnnamed349(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -365,27 +365,27 @@
   buildCounterColorDefinition--;
 }
 
-buildUnnamed687() {
+buildUnnamed350() {
   var o = new core.Map<core.String, api.ColorDefinition>();
   o["x"] = buildColorDefinition();
   o["y"] = buildColorDefinition();
   return o;
 }
 
-checkUnnamed687(core.Map<core.String, api.ColorDefinition> o) {
+checkUnnamed350(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorDefinition(o["x"]);
   checkColorDefinition(o["y"]);
 }
 
-buildUnnamed688() {
+buildUnnamed351() {
   var o = new core.Map<core.String, api.ColorDefinition>();
   o["x"] = buildColorDefinition();
   o["y"] = buildColorDefinition();
   return o;
 }
 
-checkUnnamed688(core.Map<core.String, api.ColorDefinition> o) {
+checkUnnamed351(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorDefinition(o["x"]);
   checkColorDefinition(o["y"]);
@@ -396,8 +396,8 @@
   var o = new api.Colors();
   buildCounterColors++;
   if (buildCounterColors < 3) {
-    o.calendar = buildUnnamed687();
-    o.event = buildUnnamed688();
+    o.calendar = buildUnnamed350();
+    o.event = buildUnnamed351();
     o.kind = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
   }
@@ -408,8 +408,8 @@
 checkColors(api.Colors o) {
   buildCounterColors++;
   if (buildCounterColors < 3) {
-    checkUnnamed687(o.calendar);
-    checkUnnamed688(o.event);
+    checkUnnamed350(o.calendar);
+    checkUnnamed351(o.event);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
@@ -437,14 +437,14 @@
   buildCounterError--;
 }
 
-buildUnnamed689() {
+buildUnnamed352() {
   var o = new core.List<api.EventAttendee>();
   o.add(buildEventAttendee());
   o.add(buildEventAttendee());
   return o;
 }
 
-checkUnnamed689(core.List<api.EventAttendee> o) {
+checkUnnamed352(core.List<api.EventAttendee> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventAttendee(o[0]);
   checkEventAttendee(o[1]);
@@ -475,27 +475,27 @@
   buildCounterEventCreator--;
 }
 
-buildUnnamed690() {
+buildUnnamed353() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed690(core.Map<core.String, core.String> o) {
+checkUnnamed353(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed691() {
+buildUnnamed354() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed691(core.Map<core.String, core.String> o) {
+checkUnnamed354(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -506,8 +506,8 @@
   var o = new api.EventExtendedProperties();
   buildCounterEventExtendedProperties++;
   if (buildCounterEventExtendedProperties < 3) {
-    o.private = buildUnnamed690();
-    o.shared = buildUnnamed691();
+    o.private = buildUnnamed353();
+    o.shared = buildUnnamed354();
   }
   buildCounterEventExtendedProperties--;
   return o;
@@ -516,20 +516,20 @@
 checkEventExtendedProperties(api.EventExtendedProperties o) {
   buildCounterEventExtendedProperties++;
   if (buildCounterEventExtendedProperties < 3) {
-    checkUnnamed690(o.private);
-    checkUnnamed691(o.shared);
+    checkUnnamed353(o.private);
+    checkUnnamed354(o.shared);
   }
   buildCounterEventExtendedProperties--;
 }
 
-buildUnnamed692() {
+buildUnnamed355() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed692(core.Map<core.String, core.String> o) {
+checkUnnamed355(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -544,7 +544,7 @@
     o.height = 42;
     o.iconLink = "foo";
     o.link = "foo";
-    o.preferences = buildUnnamed692();
+    o.preferences = buildUnnamed355();
     o.title = "foo";
     o.type = "foo";
     o.width = 42;
@@ -560,7 +560,7 @@
     unittest.expect(o.height, unittest.equals(42));
     unittest.expect(o.iconLink, unittest.equals('foo'));
     unittest.expect(o.link, unittest.equals('foo'));
-    checkUnnamed692(o.preferences);
+    checkUnnamed355(o.preferences);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
@@ -593,27 +593,27 @@
   buildCounterEventOrganizer--;
 }
 
-buildUnnamed693() {
+buildUnnamed356() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed693(core.List<core.String> o) {
+checkUnnamed356(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed694() {
+buildUnnamed357() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed694(core.List<api.EventReminder> o) {
+checkUnnamed357(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
@@ -624,7 +624,7 @@
   var o = new api.EventReminders();
   buildCounterEventReminders++;
   if (buildCounterEventReminders < 3) {
-    o.overrides = buildUnnamed694();
+    o.overrides = buildUnnamed357();
     o.useDefault = true;
   }
   buildCounterEventReminders--;
@@ -634,7 +634,7 @@
 checkEventReminders(api.EventReminders o) {
   buildCounterEventReminders++;
   if (buildCounterEventReminders < 3) {
-    checkUnnamed694(o.overrides);
+    checkUnnamed357(o.overrides);
     unittest.expect(o.useDefault, unittest.isTrue);
   }
   buildCounterEventReminders--;
@@ -667,7 +667,7 @@
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
     o.anyoneCanAddSelf = true;
-    o.attendees = buildUnnamed689();
+    o.attendees = buildUnnamed352();
     o.attendeesOmitted = true;
     o.colorId = "foo";
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
@@ -691,7 +691,7 @@
     o.organizer = buildEventOrganizer();
     o.originalStartTime = buildEventDateTime();
     o.privateCopy = true;
-    o.recurrence = buildUnnamed693();
+    o.recurrence = buildUnnamed356();
     o.recurringEventId = "foo";
     o.reminders = buildEventReminders();
     o.sequence = 42;
@@ -711,7 +711,7 @@
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
     unittest.expect(o.anyoneCanAddSelf, unittest.isTrue);
-    checkUnnamed689(o.attendees);
+    checkUnnamed352(o.attendees);
     unittest.expect(o.attendeesOmitted, unittest.isTrue);
     unittest.expect(o.colorId, unittest.equals('foo'));
     unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -735,7 +735,7 @@
     checkEventOrganizer(o.organizer);
     checkEventDateTime(o.originalStartTime);
     unittest.expect(o.privateCopy, unittest.isTrue);
-    checkUnnamed693(o.recurrence);
+    checkUnnamed356(o.recurrence);
     unittest.expect(o.recurringEventId, unittest.equals('foo'));
     checkEventReminders(o.reminders);
     unittest.expect(o.sequence, unittest.equals(42));
@@ -755,7 +755,6 @@
   var o = new api.EventAttachment();
   buildCounterEventAttachment++;
   if (buildCounterEventAttachment < 3) {
-    o.title = "foo";
   }
   buildCounterEventAttachment--;
   return o;
@@ -764,7 +763,6 @@
 checkEventAttachment(api.EventAttachment o) {
   buildCounterEventAttachment++;
   if (buildCounterEventAttachment < 3) {
-    unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterEventAttachment--;
 }
@@ -850,27 +848,27 @@
   buildCounterEventReminder--;
 }
 
-buildUnnamed695() {
+buildUnnamed358() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed695(core.List<api.EventReminder> o) {
+checkUnnamed358(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
 }
 
-buildUnnamed696() {
+buildUnnamed359() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed696(core.List<api.Event> o) {
+checkUnnamed359(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
@@ -882,10 +880,10 @@
   buildCounterEvents++;
   if (buildCounterEvents < 3) {
     o.accessRole = "foo";
-    o.defaultReminders = buildUnnamed695();
+    o.defaultReminders = buildUnnamed358();
     o.description = "foo";
     o.etag = "foo";
-    o.items = buildUnnamed696();
+    o.items = buildUnnamed359();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -901,10 +899,10 @@
   buildCounterEvents++;
   if (buildCounterEvents < 3) {
     unittest.expect(o.accessRole, unittest.equals('foo'));
-    checkUnnamed695(o.defaultReminders);
+    checkUnnamed358(o.defaultReminders);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed696(o.items);
+    checkUnnamed359(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -915,27 +913,27 @@
   buildCounterEvents--;
 }
 
-buildUnnamed697() {
+buildUnnamed360() {
   var o = new core.List<api.TimePeriod>();
   o.add(buildTimePeriod());
   o.add(buildTimePeriod());
   return o;
 }
 
-checkUnnamed697(core.List<api.TimePeriod> o) {
+checkUnnamed360(core.List<api.TimePeriod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimePeriod(o[0]);
   checkTimePeriod(o[1]);
 }
 
-buildUnnamed698() {
+buildUnnamed361() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed698(core.List<api.Error> o) {
+checkUnnamed361(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -946,8 +944,8 @@
   var o = new api.FreeBusyCalendar();
   buildCounterFreeBusyCalendar++;
   if (buildCounterFreeBusyCalendar < 3) {
-    o.busy = buildUnnamed697();
-    o.errors = buildUnnamed698();
+    o.busy = buildUnnamed360();
+    o.errors = buildUnnamed361();
   }
   buildCounterFreeBusyCalendar--;
   return o;
@@ -956,33 +954,33 @@
 checkFreeBusyCalendar(api.FreeBusyCalendar o) {
   buildCounterFreeBusyCalendar++;
   if (buildCounterFreeBusyCalendar < 3) {
-    checkUnnamed697(o.busy);
-    checkUnnamed698(o.errors);
+    checkUnnamed360(o.busy);
+    checkUnnamed361(o.errors);
   }
   buildCounterFreeBusyCalendar--;
 }
 
-buildUnnamed699() {
+buildUnnamed362() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed699(core.List<core.String> o) {
+checkUnnamed362(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed700() {
+buildUnnamed363() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed700(core.List<api.Error> o) {
+checkUnnamed363(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -993,8 +991,8 @@
   var o = new api.FreeBusyGroup();
   buildCounterFreeBusyGroup++;
   if (buildCounterFreeBusyGroup < 3) {
-    o.calendars = buildUnnamed699();
-    o.errors = buildUnnamed700();
+    o.calendars = buildUnnamed362();
+    o.errors = buildUnnamed363();
   }
   buildCounterFreeBusyGroup--;
   return o;
@@ -1003,20 +1001,20 @@
 checkFreeBusyGroup(api.FreeBusyGroup o) {
   buildCounterFreeBusyGroup++;
   if (buildCounterFreeBusyGroup < 3) {
-    checkUnnamed699(o.calendars);
-    checkUnnamed700(o.errors);
+    checkUnnamed362(o.calendars);
+    checkUnnamed363(o.errors);
   }
   buildCounterFreeBusyGroup--;
 }
 
-buildUnnamed701() {
+buildUnnamed364() {
   var o = new core.List<api.FreeBusyRequestItem>();
   o.add(buildFreeBusyRequestItem());
   o.add(buildFreeBusyRequestItem());
   return o;
 }
 
-checkUnnamed701(core.List<api.FreeBusyRequestItem> o) {
+checkUnnamed364(core.List<api.FreeBusyRequestItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyRequestItem(o[0]);
   checkFreeBusyRequestItem(o[1]);
@@ -1029,7 +1027,7 @@
   if (buildCounterFreeBusyRequest < 3) {
     o.calendarExpansionMax = 42;
     o.groupExpansionMax = 42;
-    o.items = buildUnnamed701();
+    o.items = buildUnnamed364();
     o.timeMax = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeMin = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeZone = "foo";
@@ -1043,7 +1041,7 @@
   if (buildCounterFreeBusyRequest < 3) {
     unittest.expect(o.calendarExpansionMax, unittest.equals(42));
     unittest.expect(o.groupExpansionMax, unittest.equals(42));
-    checkUnnamed701(o.items);
+    checkUnnamed364(o.items);
     unittest.expect(o.timeMax, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeMin, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeZone, unittest.equals('foo'));
@@ -1070,27 +1068,27 @@
   buildCounterFreeBusyRequestItem--;
 }
 
-buildUnnamed702() {
+buildUnnamed365() {
   var o = new core.Map<core.String, api.FreeBusyCalendar>();
   o["x"] = buildFreeBusyCalendar();
   o["y"] = buildFreeBusyCalendar();
   return o;
 }
 
-checkUnnamed702(core.Map<core.String, api.FreeBusyCalendar> o) {
+checkUnnamed365(core.Map<core.String, api.FreeBusyCalendar> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyCalendar(o["x"]);
   checkFreeBusyCalendar(o["y"]);
 }
 
-buildUnnamed703() {
+buildUnnamed366() {
   var o = new core.Map<core.String, api.FreeBusyGroup>();
   o["x"] = buildFreeBusyGroup();
   o["y"] = buildFreeBusyGroup();
   return o;
 }
 
-checkUnnamed703(core.Map<core.String, api.FreeBusyGroup> o) {
+checkUnnamed366(core.Map<core.String, api.FreeBusyGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyGroup(o["x"]);
   checkFreeBusyGroup(o["y"]);
@@ -1101,8 +1099,8 @@
   var o = new api.FreeBusyResponse();
   buildCounterFreeBusyResponse++;
   if (buildCounterFreeBusyResponse < 3) {
-    o.calendars = buildUnnamed702();
-    o.groups = buildUnnamed703();
+    o.calendars = buildUnnamed365();
+    o.groups = buildUnnamed366();
     o.kind = "foo";
     o.timeMax = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeMin = core.DateTime.parse("2002-02-27T14:01:02");
@@ -1114,8 +1112,8 @@
 checkFreeBusyResponse(api.FreeBusyResponse o) {
   buildCounterFreeBusyResponse++;
   if (buildCounterFreeBusyResponse < 3) {
-    checkUnnamed702(o.calendars);
-    checkUnnamed703(o.groups);
+    checkUnnamed365(o.calendars);
+    checkUnnamed366(o.groups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.timeMax, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeMin, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -1148,14 +1146,14 @@
   buildCounterSetting--;
 }
 
-buildUnnamed704() {
+buildUnnamed367() {
   var o = new core.List<api.Setting>();
   o.add(buildSetting());
   o.add(buildSetting());
   return o;
 }
 
-checkUnnamed704(core.List<api.Setting> o) {
+checkUnnamed367(core.List<api.Setting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetting(o[0]);
   checkSetting(o[1]);
@@ -1167,7 +1165,7 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed704();
+    o.items = buildUnnamed367();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -1180,7 +1178,7 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed704(o.items);
+    checkUnnamed367(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -1209,53 +1207,53 @@
   buildCounterTimePeriod--;
 }
 
-buildUnnamed705() {
+buildUnnamed368() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed705(core.List<core.String> o) {
+checkUnnamed368(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed706() {
+buildUnnamed369() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed706(core.List<core.String> o) {
+checkUnnamed369(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed707() {
+buildUnnamed370() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed707(core.List<core.String> o) {
+checkUnnamed370(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed708() {
+buildUnnamed371() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed708(core.List<core.String> o) {
+checkUnnamed371(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3086,9 +3084,9 @@
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
-      var arg_privateExtendedProperty = buildUnnamed705();
+      var arg_privateExtendedProperty = buildUnnamed368();
       var arg_q = "foo";
-      var arg_sharedExtendedProperty = buildUnnamed706();
+      var arg_sharedExtendedProperty = buildUnnamed369();
       var arg_showDeleted = true;
       var arg_showHiddenInvitations = true;
       var arg_singleEvents = true;
@@ -3430,9 +3428,9 @@
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
-      var arg_privateExtendedProperty = buildUnnamed707();
+      var arg_privateExtendedProperty = buildUnnamed370();
       var arg_q = "foo";
-      var arg_sharedExtendedProperty = buildUnnamed708();
+      var arg_sharedExtendedProperty = buildUnnamed371();
       var arg_showDeleted = true;
       var arg_showHiddenInvitations = true;
       var arg_singleEvents = true;
diff --git a/generated/googleapis/test/civicinfo/us_v1_test.dart b/generated/googleapis/test/civicinfo/us_v1_test.dart
index d48afc3..e3dd67c 100644
--- a/generated/googleapis/test/civicinfo/us_v1_test.dart
+++ b/generated/googleapis/test/civicinfo/us_v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed860() {
+buildUnnamed372() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed860(core.List<api.Source> o) {
+checkUnnamed372(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -38,7 +38,7 @@
     o.id = "foo";
     o.localJurisdiction = buildAdministrationRegion();
     o.name = "foo";
-    o.sources = buildUnnamed860();
+    o.sources = buildUnnamed372();
   }
   buildCounterAdministrationRegion--;
   return o;
@@ -51,32 +51,32 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkAdministrationRegion(o.localJurisdiction);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed860(o.sources);
+    checkUnnamed372(o.sources);
   }
   buildCounterAdministrationRegion--;
 }
 
-buildUnnamed861() {
+buildUnnamed373() {
   var o = new core.List<api.ElectionOfficial>();
   o.add(buildElectionOfficial());
   o.add(buildElectionOfficial());
   return o;
 }
 
-checkUnnamed861(core.List<api.ElectionOfficial> o) {
+checkUnnamed373(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElectionOfficial(o[0]);
   checkElectionOfficial(o[1]);
 }
 
-buildUnnamed862() {
+buildUnnamed374() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed862(core.List<core.String> o) {
+checkUnnamed374(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -91,14 +91,14 @@
     o.ballotInfoUrl = "foo";
     o.correspondenceAddress = buildSimpleAddressType();
     o.electionInfoUrl = "foo";
-    o.electionOfficials = buildUnnamed861();
+    o.electionOfficials = buildUnnamed373();
     o.electionRegistrationConfirmationUrl = "foo";
     o.electionRegistrationUrl = "foo";
     o.electionRulesUrl = "foo";
     o.hoursOfOperation = "foo";
     o.name = "foo";
     o.physicalAddress = buildSimpleAddressType();
-    o.voterServices = buildUnnamed862();
+    o.voterServices = buildUnnamed374();
     o.votingLocationFinderUrl = "foo";
   }
   buildCounterAdministrativeBody--;
@@ -112,27 +112,27 @@
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
     checkSimpleAddressType(o.correspondenceAddress);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
-    checkUnnamed861(o.electionOfficials);
+    checkUnnamed373(o.electionOfficials);
     unittest.expect(o.electionRegistrationConfirmationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRegistrationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRulesUrl, unittest.equals('foo'));
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkSimpleAddressType(o.physicalAddress);
-    checkUnnamed862(o.voterServices);
+    checkUnnamed374(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
   buildCounterAdministrativeBody--;
 }
 
-buildUnnamed863() {
+buildUnnamed375() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed863(core.List<api.Channel> o) {
+checkUnnamed375(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -144,7 +144,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     o.candidateUrl = "foo";
-    o.channels = buildUnnamed863();
+    o.channels = buildUnnamed375();
     o.email = "foo";
     o.name = "foo";
     o.orderOnBallot = "foo";
@@ -160,7 +160,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     unittest.expect(o.candidateUrl, unittest.equals('foo'));
-    checkUnnamed863(o.channels);
+    checkUnnamed375(o.channels);
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.orderOnBallot, unittest.equals('foo'));
@@ -192,27 +192,27 @@
   buildCounterChannel--;
 }
 
-buildUnnamed864() {
+buildUnnamed376() {
   var o = new core.List<api.Candidate>();
   o.add(buildCandidate());
   o.add(buildCandidate());
   return o;
 }
 
-checkUnnamed864(core.List<api.Candidate> o) {
+checkUnnamed376(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandidate(o[0]);
   checkCandidate(o[1]);
 }
 
-buildUnnamed865() {
+buildUnnamed377() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed865(core.List<api.Source> o) {
+checkUnnamed377(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -224,7 +224,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     o.ballotPlacement = "foo";
-    o.candidates = buildUnnamed864();
+    o.candidates = buildUnnamed376();
     o.district = buildElectoralDistrict();
     o.electorateSpecifications = "foo";
     o.id = "foo";
@@ -236,7 +236,7 @@
     o.referendumSubtitle = "foo";
     o.referendumTitle = "foo";
     o.referendumUrl = "foo";
-    o.sources = buildUnnamed865();
+    o.sources = buildUnnamed377();
     o.special = "foo";
     o.type = "foo";
   }
@@ -248,7 +248,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
-    checkUnnamed864(o.candidates);
+    checkUnnamed376(o.candidates);
     checkElectoralDistrict(o.district);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -260,21 +260,21 @@
     unittest.expect(o.referendumSubtitle, unittest.equals('foo'));
     unittest.expect(o.referendumTitle, unittest.equals('foo'));
     unittest.expect(o.referendumUrl, unittest.equals('foo'));
-    checkUnnamed865(o.sources);
+    checkUnnamed377(o.sources);
     unittest.expect(o.special, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterContest--;
 }
 
-buildUnnamed866() {
+buildUnnamed378() {
   var o = new core.List<api.DivisionSearchResult>();
   o.add(buildDivisionSearchResult());
   o.add(buildDivisionSearchResult());
   return o;
 }
 
-checkUnnamed866(core.List<api.DivisionSearchResult> o) {
+checkUnnamed378(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDivisionSearchResult(o[0]);
   checkDivisionSearchResult(o[1]);
@@ -286,7 +286,7 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed866();
+    o.results = buildUnnamed378();
     o.status = "foo";
   }
   buildCounterDivisionSearchResponse--;
@@ -297,20 +297,20 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed866(o.results);
+    checkUnnamed378(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterDivisionSearchResponse--;
 }
 
-buildUnnamed867() {
+buildUnnamed379() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed867(core.List<core.String> o) {
+checkUnnamed379(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -321,7 +321,7 @@
   var o = new api.DivisionSearchResult();
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    o.aliases = buildUnnamed867();
+    o.aliases = buildUnnamed379();
     o.name = "foo";
     o.ocdId = "foo";
   }
@@ -332,7 +332,7 @@
 checkDivisionSearchResult(api.DivisionSearchResult o) {
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    checkUnnamed867(o.aliases);
+    checkUnnamed379(o.aliases);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ocdId, unittest.equals('foo'));
   }
@@ -389,14 +389,14 @@
   buildCounterElectionOfficial--;
 }
 
-buildUnnamed868() {
+buildUnnamed380() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed868(core.List<api.Election> o) {
+checkUnnamed380(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
@@ -407,7 +407,7 @@
   var o = new api.ElectionsQueryResponse();
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    o.elections = buildUnnamed868();
+    o.elections = buildUnnamed380();
     o.kind = "foo";
   }
   buildCounterElectionsQueryResponse--;
@@ -417,7 +417,7 @@
 checkElectionsQueryResponse(api.ElectionsQueryResponse o) {
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    checkUnnamed868(o.elections);
+    checkUnnamed380(o.elections);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterElectionsQueryResponse--;
@@ -446,27 +446,27 @@
   buildCounterElectoralDistrict--;
 }
 
-buildUnnamed869() {
+buildUnnamed381() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed869(core.List<core.String> o) {
+checkUnnamed381(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed870() {
+buildUnnamed382() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed870(core.List<core.String> o) {
+checkUnnamed382(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -477,9 +477,9 @@
   var o = new api.GeographicDivision();
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    o.alsoKnownAs = buildUnnamed869();
+    o.alsoKnownAs = buildUnnamed381();
     o.name = "foo";
-    o.officeIds = buildUnnamed870();
+    o.officeIds = buildUnnamed382();
     o.scope = "foo";
   }
   buildCounterGeographicDivision--;
@@ -489,35 +489,35 @@
 checkGeographicDivision(api.GeographicDivision o) {
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    checkUnnamed869(o.alsoKnownAs);
+    checkUnnamed381(o.alsoKnownAs);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed870(o.officeIds);
+    checkUnnamed382(o.officeIds);
     unittest.expect(o.scope, unittest.equals('foo'));
   }
   buildCounterGeographicDivision--;
 }
 
-buildUnnamed871() {
+buildUnnamed383() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed871(core.List<core.String> o) {
+checkUnnamed383(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed872() {
+buildUnnamed384() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed872(core.List<api.Source> o) {
+checkUnnamed384(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -531,8 +531,8 @@
     o.divisionId = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.officialIds = buildUnnamed871();
-    o.sources = buildUnnamed872();
+    o.officialIds = buildUnnamed383();
+    o.sources = buildUnnamed384();
   }
   buildCounterOffice--;
   return o;
@@ -544,72 +544,72 @@
     unittest.expect(o.divisionId, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed871(o.officialIds);
-    checkUnnamed872(o.sources);
+    checkUnnamed383(o.officialIds);
+    checkUnnamed384(o.sources);
   }
   buildCounterOffice--;
 }
 
-buildUnnamed873() {
+buildUnnamed385() {
   var o = new core.List<api.SimpleAddressType>();
   o.add(buildSimpleAddressType());
   o.add(buildSimpleAddressType());
   return o;
 }
 
-checkUnnamed873(core.List<api.SimpleAddressType> o) {
+checkUnnamed385(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSimpleAddressType(o[0]);
   checkSimpleAddressType(o[1]);
 }
 
-buildUnnamed874() {
+buildUnnamed386() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed874(core.List<api.Channel> o) {
+checkUnnamed386(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
 }
 
-buildUnnamed875() {
+buildUnnamed387() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed875(core.List<core.String> o) {
+checkUnnamed387(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed876() {
+buildUnnamed388() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed876(core.List<core.String> o) {
+checkUnnamed388(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed877() {
+buildUnnamed389() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed877(core.List<core.String> o) {
+checkUnnamed389(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -620,14 +620,14 @@
   var o = new api.Official();
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    o.address = buildUnnamed873();
-    o.channels = buildUnnamed874();
-    o.emails = buildUnnamed875();
+    o.address = buildUnnamed385();
+    o.channels = buildUnnamed386();
+    o.emails = buildUnnamed387();
     o.name = "foo";
     o.party = "foo";
-    o.phones = buildUnnamed876();
+    o.phones = buildUnnamed388();
     o.photoUrl = "foo";
-    o.urls = buildUnnamed877();
+    o.urls = buildUnnamed389();
   }
   buildCounterOfficial--;
   return o;
@@ -636,26 +636,26 @@
 checkOfficial(api.Official o) {
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    checkUnnamed873(o.address);
-    checkUnnamed874(o.channels);
-    checkUnnamed875(o.emails);
+    checkUnnamed385(o.address);
+    checkUnnamed386(o.channels);
+    checkUnnamed387(o.emails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.party, unittest.equals('foo'));
-    checkUnnamed876(o.phones);
+    checkUnnamed388(o.phones);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed877(o.urls);
+    checkUnnamed389(o.urls);
   }
   buildCounterOfficial--;
 }
 
-buildUnnamed878() {
+buildUnnamed390() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed878(core.List<api.Source> o) {
+checkUnnamed390(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -672,7 +672,7 @@
     o.name = "foo";
     o.notes = "foo";
     o.pollingHours = "foo";
-    o.sources = buildUnnamed878();
+    o.sources = buildUnnamed390();
     o.startDate = "foo";
     o.voterServices = "foo";
   }
@@ -689,7 +689,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.pollingHours, unittest.equals('foo'));
-    checkUnnamed878(o.sources);
+    checkUnnamed390(o.sources);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.voterServices, unittest.equals('foo'));
   }
@@ -715,40 +715,40 @@
   buildCounterRepresentativeInfoRequest--;
 }
 
-buildUnnamed879() {
+buildUnnamed391() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed879(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed391(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed880() {
+buildUnnamed392() {
   var o = new core.Map<core.String, api.Office>();
   o["x"] = buildOffice();
   o["y"] = buildOffice();
   return o;
 }
 
-checkUnnamed880(core.Map<core.String, api.Office> o) {
+checkUnnamed392(core.Map<core.String, api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o["x"]);
   checkOffice(o["y"]);
 }
 
-buildUnnamed881() {
+buildUnnamed393() {
   var o = new core.Map<core.String, api.Official>();
   o["x"] = buildOfficial();
   o["y"] = buildOfficial();
   return o;
 }
 
-checkUnnamed881(core.Map<core.String, api.Official> o) {
+checkUnnamed393(core.Map<core.String, api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o["x"]);
   checkOfficial(o["y"]);
@@ -759,11 +759,11 @@
   var o = new api.RepresentativeInfoResponse();
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    o.divisions = buildUnnamed879();
+    o.divisions = buildUnnamed391();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.offices = buildUnnamed880();
-    o.officials = buildUnnamed881();
+    o.offices = buildUnnamed392();
+    o.officials = buildUnnamed393();
     o.status = "foo";
   }
   buildCounterRepresentativeInfoResponse--;
@@ -773,11 +773,11 @@
 checkRepresentativeInfoResponse(api.RepresentativeInfoResponse o) {
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    checkUnnamed879(o.divisions);
+    checkUnnamed391(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed880(o.offices);
-    checkUnnamed881(o.officials);
+    checkUnnamed392(o.offices);
+    checkUnnamed393(o.officials);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterRepresentativeInfoResponse--;
@@ -854,66 +854,66 @@
   buildCounterVoterInfoRequest--;
 }
 
-buildUnnamed882() {
+buildUnnamed394() {
   var o = new core.List<api.Contest>();
   o.add(buildContest());
   o.add(buildContest());
   return o;
 }
 
-checkUnnamed882(core.List<api.Contest> o) {
+checkUnnamed394(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContest(o[0]);
   checkContest(o[1]);
 }
 
-buildUnnamed883() {
+buildUnnamed395() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed883(core.List<api.PollingLocation> o) {
+checkUnnamed395(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed884() {
+buildUnnamed396() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed884(core.List<api.PollingLocation> o) {
+checkUnnamed396(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed885() {
+buildUnnamed397() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed885(core.List<api.PollingLocation> o) {
+checkUnnamed397(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed886() {
+buildUnnamed398() {
   var o = new core.List<api.AdministrationRegion>();
   o.add(buildAdministrationRegion());
   o.add(buildAdministrationRegion());
   return o;
 }
 
-checkUnnamed886(core.List<api.AdministrationRegion> o) {
+checkUnnamed398(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrationRegion(o[0]);
   checkAdministrationRegion(o[1]);
@@ -924,15 +924,15 @@
   var o = new api.VoterInfoResponse();
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    o.contests = buildUnnamed882();
-    o.dropOffLocations = buildUnnamed883();
-    o.earlyVoteSites = buildUnnamed884();
+    o.contests = buildUnnamed394();
+    o.dropOffLocations = buildUnnamed395();
+    o.earlyVoteSites = buildUnnamed396();
     o.election = buildElection();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.pollingLocations = buildUnnamed885();
+    o.pollingLocations = buildUnnamed397();
     o.precinctId = "foo";
-    o.state = buildUnnamed886();
+    o.state = buildUnnamed398();
     o.status = "foo";
   }
   buildCounterVoterInfoResponse--;
@@ -942,15 +942,15 @@
 checkVoterInfoResponse(api.VoterInfoResponse o) {
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    checkUnnamed882(o.contests);
-    checkUnnamed883(o.dropOffLocations);
-    checkUnnamed884(o.earlyVoteSites);
+    checkUnnamed394(o.contests);
+    checkUnnamed395(o.dropOffLocations);
+    checkUnnamed396(o.earlyVoteSites);
     checkElection(o.election);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed885(o.pollingLocations);
+    checkUnnamed397(o.pollingLocations);
     unittest.expect(o.precinctId, unittest.equals('foo'));
-    checkUnnamed886(o.state);
+    checkUnnamed398(o.state);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterVoterInfoResponse--;
diff --git a/generated/googleapis/test/civicinfo/v1_test.dart b/generated/googleapis/test/civicinfo/v1_test.dart
index cba198a..860679e 100644
--- a/generated/googleapis/test/civicinfo/v1_test.dart
+++ b/generated/googleapis/test/civicinfo/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed65() {
+buildUnnamed399() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed65(core.List<api.Source> o) {
+checkUnnamed399(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -38,7 +38,7 @@
     o.id = "foo";
     o.localJurisdiction = buildAdministrationRegion();
     o.name = "foo";
-    o.sources = buildUnnamed65();
+    o.sources = buildUnnamed399();
   }
   buildCounterAdministrationRegion--;
   return o;
@@ -51,32 +51,32 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkAdministrationRegion(o.localJurisdiction);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed65(o.sources);
+    checkUnnamed399(o.sources);
   }
   buildCounterAdministrationRegion--;
 }
 
-buildUnnamed66() {
+buildUnnamed400() {
   var o = new core.List<api.ElectionOfficial>();
   o.add(buildElectionOfficial());
   o.add(buildElectionOfficial());
   return o;
 }
 
-checkUnnamed66(core.List<api.ElectionOfficial> o) {
+checkUnnamed400(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElectionOfficial(o[0]);
   checkElectionOfficial(o[1]);
 }
 
-buildUnnamed67() {
+buildUnnamed401() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed67(core.List<core.String> o) {
+checkUnnamed401(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -91,14 +91,14 @@
     o.ballotInfoUrl = "foo";
     o.correspondenceAddress = buildSimpleAddressType();
     o.electionInfoUrl = "foo";
-    o.electionOfficials = buildUnnamed66();
+    o.electionOfficials = buildUnnamed400();
     o.electionRegistrationConfirmationUrl = "foo";
     o.electionRegistrationUrl = "foo";
     o.electionRulesUrl = "foo";
     o.hoursOfOperation = "foo";
     o.name = "foo";
     o.physicalAddress = buildSimpleAddressType();
-    o.voterServices = buildUnnamed67();
+    o.voterServices = buildUnnamed401();
     o.votingLocationFinderUrl = "foo";
   }
   buildCounterAdministrativeBody--;
@@ -112,27 +112,27 @@
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
     checkSimpleAddressType(o.correspondenceAddress);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
-    checkUnnamed66(o.electionOfficials);
+    checkUnnamed400(o.electionOfficials);
     unittest.expect(o.electionRegistrationConfirmationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRegistrationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRulesUrl, unittest.equals('foo'));
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkSimpleAddressType(o.physicalAddress);
-    checkUnnamed67(o.voterServices);
+    checkUnnamed401(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
   buildCounterAdministrativeBody--;
 }
 
-buildUnnamed68() {
+buildUnnamed402() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed68(core.List<api.Channel> o) {
+checkUnnamed402(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -144,7 +144,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     o.candidateUrl = "foo";
-    o.channels = buildUnnamed68();
+    o.channels = buildUnnamed402();
     o.email = "foo";
     o.name = "foo";
     o.orderOnBallot = "foo";
@@ -160,7 +160,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     unittest.expect(o.candidateUrl, unittest.equals('foo'));
-    checkUnnamed68(o.channels);
+    checkUnnamed402(o.channels);
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.orderOnBallot, unittest.equals('foo'));
@@ -192,27 +192,27 @@
   buildCounterChannel--;
 }
 
-buildUnnamed69() {
+buildUnnamed403() {
   var o = new core.List<api.Candidate>();
   o.add(buildCandidate());
   o.add(buildCandidate());
   return o;
 }
 
-checkUnnamed69(core.List<api.Candidate> o) {
+checkUnnamed403(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandidate(o[0]);
   checkCandidate(o[1]);
 }
 
-buildUnnamed70() {
+buildUnnamed404() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed70(core.List<api.Source> o) {
+checkUnnamed404(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -224,7 +224,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     o.ballotPlacement = "foo";
-    o.candidates = buildUnnamed69();
+    o.candidates = buildUnnamed403();
     o.district = buildElectoralDistrict();
     o.electorateSpecifications = "foo";
     o.id = "foo";
@@ -236,7 +236,7 @@
     o.referendumSubtitle = "foo";
     o.referendumTitle = "foo";
     o.referendumUrl = "foo";
-    o.sources = buildUnnamed70();
+    o.sources = buildUnnamed404();
     o.special = "foo";
     o.type = "foo";
   }
@@ -248,7 +248,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
-    checkUnnamed69(o.candidates);
+    checkUnnamed403(o.candidates);
     checkElectoralDistrict(o.district);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -260,21 +260,21 @@
     unittest.expect(o.referendumSubtitle, unittest.equals('foo'));
     unittest.expect(o.referendumTitle, unittest.equals('foo'));
     unittest.expect(o.referendumUrl, unittest.equals('foo'));
-    checkUnnamed70(o.sources);
+    checkUnnamed404(o.sources);
     unittest.expect(o.special, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterContest--;
 }
 
-buildUnnamed71() {
+buildUnnamed405() {
   var o = new core.List<api.DivisionSearchResult>();
   o.add(buildDivisionSearchResult());
   o.add(buildDivisionSearchResult());
   return o;
 }
 
-checkUnnamed71(core.List<api.DivisionSearchResult> o) {
+checkUnnamed405(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDivisionSearchResult(o[0]);
   checkDivisionSearchResult(o[1]);
@@ -286,7 +286,7 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed71();
+    o.results = buildUnnamed405();
     o.status = "foo";
   }
   buildCounterDivisionSearchResponse--;
@@ -297,20 +297,20 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed71(o.results);
+    checkUnnamed405(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterDivisionSearchResponse--;
 }
 
-buildUnnamed72() {
+buildUnnamed406() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed72(core.List<core.String> o) {
+checkUnnamed406(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -321,7 +321,7 @@
   var o = new api.DivisionSearchResult();
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    o.aliases = buildUnnamed72();
+    o.aliases = buildUnnamed406();
     o.name = "foo";
     o.ocdId = "foo";
   }
@@ -332,7 +332,7 @@
 checkDivisionSearchResult(api.DivisionSearchResult o) {
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    checkUnnamed72(o.aliases);
+    checkUnnamed406(o.aliases);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ocdId, unittest.equals('foo'));
   }
@@ -389,14 +389,14 @@
   buildCounterElectionOfficial--;
 }
 
-buildUnnamed73() {
+buildUnnamed407() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed73(core.List<api.Election> o) {
+checkUnnamed407(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
@@ -407,7 +407,7 @@
   var o = new api.ElectionsQueryResponse();
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    o.elections = buildUnnamed73();
+    o.elections = buildUnnamed407();
     o.kind = "foo";
   }
   buildCounterElectionsQueryResponse--;
@@ -417,7 +417,7 @@
 checkElectionsQueryResponse(api.ElectionsQueryResponse o) {
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    checkUnnamed73(o.elections);
+    checkUnnamed407(o.elections);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterElectionsQueryResponse--;
@@ -446,27 +446,27 @@
   buildCounterElectoralDistrict--;
 }
 
-buildUnnamed74() {
+buildUnnamed408() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed74(core.List<core.String> o) {
+checkUnnamed408(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed75() {
+buildUnnamed409() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed75(core.List<core.String> o) {
+checkUnnamed409(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -477,9 +477,9 @@
   var o = new api.GeographicDivision();
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    o.alsoKnownAs = buildUnnamed74();
+    o.alsoKnownAs = buildUnnamed408();
     o.name = "foo";
-    o.officeIds = buildUnnamed75();
+    o.officeIds = buildUnnamed409();
     o.scope = "foo";
   }
   buildCounterGeographicDivision--;
@@ -489,35 +489,35 @@
 checkGeographicDivision(api.GeographicDivision o) {
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    checkUnnamed74(o.alsoKnownAs);
+    checkUnnamed408(o.alsoKnownAs);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed75(o.officeIds);
+    checkUnnamed409(o.officeIds);
     unittest.expect(o.scope, unittest.equals('foo'));
   }
   buildCounterGeographicDivision--;
 }
 
-buildUnnamed76() {
+buildUnnamed410() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed76(core.List<core.String> o) {
+checkUnnamed410(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed77() {
+buildUnnamed411() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed77(core.List<api.Source> o) {
+checkUnnamed411(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -531,8 +531,8 @@
     o.divisionId = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.officialIds = buildUnnamed76();
-    o.sources = buildUnnamed77();
+    o.officialIds = buildUnnamed410();
+    o.sources = buildUnnamed411();
   }
   buildCounterOffice--;
   return o;
@@ -544,72 +544,72 @@
     unittest.expect(o.divisionId, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed76(o.officialIds);
-    checkUnnamed77(o.sources);
+    checkUnnamed410(o.officialIds);
+    checkUnnamed411(o.sources);
   }
   buildCounterOffice--;
 }
 
-buildUnnamed78() {
+buildUnnamed412() {
   var o = new core.List<api.SimpleAddressType>();
   o.add(buildSimpleAddressType());
   o.add(buildSimpleAddressType());
   return o;
 }
 
-checkUnnamed78(core.List<api.SimpleAddressType> o) {
+checkUnnamed412(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSimpleAddressType(o[0]);
   checkSimpleAddressType(o[1]);
 }
 
-buildUnnamed79() {
+buildUnnamed413() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed79(core.List<api.Channel> o) {
+checkUnnamed413(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
 }
 
-buildUnnamed80() {
+buildUnnamed414() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed80(core.List<core.String> o) {
+checkUnnamed414(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed81() {
+buildUnnamed415() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed81(core.List<core.String> o) {
+checkUnnamed415(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed82() {
+buildUnnamed416() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed82(core.List<core.String> o) {
+checkUnnamed416(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -620,14 +620,14 @@
   var o = new api.Official();
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    o.address = buildUnnamed78();
-    o.channels = buildUnnamed79();
-    o.emails = buildUnnamed80();
+    o.address = buildUnnamed412();
+    o.channels = buildUnnamed413();
+    o.emails = buildUnnamed414();
     o.name = "foo";
     o.party = "foo";
-    o.phones = buildUnnamed81();
+    o.phones = buildUnnamed415();
     o.photoUrl = "foo";
-    o.urls = buildUnnamed82();
+    o.urls = buildUnnamed416();
   }
   buildCounterOfficial--;
   return o;
@@ -636,26 +636,26 @@
 checkOfficial(api.Official o) {
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    checkUnnamed78(o.address);
-    checkUnnamed79(o.channels);
-    checkUnnamed80(o.emails);
+    checkUnnamed412(o.address);
+    checkUnnamed413(o.channels);
+    checkUnnamed414(o.emails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.party, unittest.equals('foo'));
-    checkUnnamed81(o.phones);
+    checkUnnamed415(o.phones);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed82(o.urls);
+    checkUnnamed416(o.urls);
   }
   buildCounterOfficial--;
 }
 
-buildUnnamed83() {
+buildUnnamed417() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed83(core.List<api.Source> o) {
+checkUnnamed417(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -672,7 +672,7 @@
     o.name = "foo";
     o.notes = "foo";
     o.pollingHours = "foo";
-    o.sources = buildUnnamed83();
+    o.sources = buildUnnamed417();
     o.startDate = "foo";
     o.voterServices = "foo";
   }
@@ -689,7 +689,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.pollingHours, unittest.equals('foo'));
-    checkUnnamed83(o.sources);
+    checkUnnamed417(o.sources);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.voterServices, unittest.equals('foo'));
   }
@@ -715,40 +715,40 @@
   buildCounterRepresentativeInfoRequest--;
 }
 
-buildUnnamed84() {
+buildUnnamed418() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed84(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed418(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed85() {
+buildUnnamed419() {
   var o = new core.Map<core.String, api.Office>();
   o["x"] = buildOffice();
   o["y"] = buildOffice();
   return o;
 }
 
-checkUnnamed85(core.Map<core.String, api.Office> o) {
+checkUnnamed419(core.Map<core.String, api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o["x"]);
   checkOffice(o["y"]);
 }
 
-buildUnnamed86() {
+buildUnnamed420() {
   var o = new core.Map<core.String, api.Official>();
   o["x"] = buildOfficial();
   o["y"] = buildOfficial();
   return o;
 }
 
-checkUnnamed86(core.Map<core.String, api.Official> o) {
+checkUnnamed420(core.Map<core.String, api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o["x"]);
   checkOfficial(o["y"]);
@@ -759,11 +759,11 @@
   var o = new api.RepresentativeInfoResponse();
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    o.divisions = buildUnnamed84();
+    o.divisions = buildUnnamed418();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.offices = buildUnnamed85();
-    o.officials = buildUnnamed86();
+    o.offices = buildUnnamed419();
+    o.officials = buildUnnamed420();
     o.status = "foo";
   }
   buildCounterRepresentativeInfoResponse--;
@@ -773,11 +773,11 @@
 checkRepresentativeInfoResponse(api.RepresentativeInfoResponse o) {
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    checkUnnamed84(o.divisions);
+    checkUnnamed418(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed85(o.offices);
-    checkUnnamed86(o.officials);
+    checkUnnamed419(o.offices);
+    checkUnnamed420(o.officials);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterRepresentativeInfoResponse--;
@@ -854,66 +854,66 @@
   buildCounterVoterInfoRequest--;
 }
 
-buildUnnamed87() {
+buildUnnamed421() {
   var o = new core.List<api.Contest>();
   o.add(buildContest());
   o.add(buildContest());
   return o;
 }
 
-checkUnnamed87(core.List<api.Contest> o) {
+checkUnnamed421(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContest(o[0]);
   checkContest(o[1]);
 }
 
-buildUnnamed88() {
+buildUnnamed422() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed88(core.List<api.PollingLocation> o) {
+checkUnnamed422(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed89() {
+buildUnnamed423() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed89(core.List<api.PollingLocation> o) {
+checkUnnamed423(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed90() {
+buildUnnamed424() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed90(core.List<api.PollingLocation> o) {
+checkUnnamed424(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed91() {
+buildUnnamed425() {
   var o = new core.List<api.AdministrationRegion>();
   o.add(buildAdministrationRegion());
   o.add(buildAdministrationRegion());
   return o;
 }
 
-checkUnnamed91(core.List<api.AdministrationRegion> o) {
+checkUnnamed425(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrationRegion(o[0]);
   checkAdministrationRegion(o[1]);
@@ -924,15 +924,15 @@
   var o = new api.VoterInfoResponse();
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    o.contests = buildUnnamed87();
-    o.dropOffLocations = buildUnnamed88();
-    o.earlyVoteSites = buildUnnamed89();
+    o.contests = buildUnnamed421();
+    o.dropOffLocations = buildUnnamed422();
+    o.earlyVoteSites = buildUnnamed423();
     o.election = buildElection();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.pollingLocations = buildUnnamed90();
+    o.pollingLocations = buildUnnamed424();
     o.precinctId = "foo";
-    o.state = buildUnnamed91();
+    o.state = buildUnnamed425();
     o.status = "foo";
   }
   buildCounterVoterInfoResponse--;
@@ -942,15 +942,15 @@
 checkVoterInfoResponse(api.VoterInfoResponse o) {
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    checkUnnamed87(o.contests);
-    checkUnnamed88(o.dropOffLocations);
-    checkUnnamed89(o.earlyVoteSites);
+    checkUnnamed421(o.contests);
+    checkUnnamed422(o.dropOffLocations);
+    checkUnnamed423(o.earlyVoteSites);
     checkElection(o.election);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed90(o.pollingLocations);
+    checkUnnamed424(o.pollingLocations);
     unittest.expect(o.precinctId, unittest.equals('foo'));
-    checkUnnamed91(o.state);
+    checkUnnamed425(o.state);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterVoterInfoResponse--;
diff --git a/generated/googleapis/test/civicinfo/v2_test.dart b/generated/googleapis/test/civicinfo/v2_test.dart
index db404cd..913db9e 100644
--- a/generated/googleapis/test/civicinfo/v2_test.dart
+++ b/generated/googleapis/test/civicinfo/v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1034() {
+buildUnnamed426() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed1034(core.List<api.Source> o) {
+checkUnnamed426(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -38,7 +38,7 @@
     o.id = "foo";
     o.localJurisdiction = buildAdministrationRegion();
     o.name = "foo";
-    o.sources = buildUnnamed1034();
+    o.sources = buildUnnamed426();
   }
   buildCounterAdministrationRegion--;
   return o;
@@ -51,32 +51,32 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkAdministrationRegion(o.localJurisdiction);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1034(o.sources);
+    checkUnnamed426(o.sources);
   }
   buildCounterAdministrationRegion--;
 }
 
-buildUnnamed1035() {
+buildUnnamed427() {
   var o = new core.List<api.ElectionOfficial>();
   o.add(buildElectionOfficial());
   o.add(buildElectionOfficial());
   return o;
 }
 
-checkUnnamed1035(core.List<api.ElectionOfficial> o) {
+checkUnnamed427(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElectionOfficial(o[0]);
   checkElectionOfficial(o[1]);
 }
 
-buildUnnamed1036() {
+buildUnnamed428() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1036(core.List<core.String> o) {
+checkUnnamed428(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -91,14 +91,14 @@
     o.ballotInfoUrl = "foo";
     o.correspondenceAddress = buildSimpleAddressType();
     o.electionInfoUrl = "foo";
-    o.electionOfficials = buildUnnamed1035();
+    o.electionOfficials = buildUnnamed427();
     o.electionRegistrationConfirmationUrl = "foo";
     o.electionRegistrationUrl = "foo";
     o.electionRulesUrl = "foo";
     o.hoursOfOperation = "foo";
     o.name = "foo";
     o.physicalAddress = buildSimpleAddressType();
-    o.voterServices = buildUnnamed1036();
+    o.voterServices = buildUnnamed428();
     o.votingLocationFinderUrl = "foo";
   }
   buildCounterAdministrativeBody--;
@@ -112,27 +112,27 @@
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
     checkSimpleAddressType(o.correspondenceAddress);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
-    checkUnnamed1035(o.electionOfficials);
+    checkUnnamed427(o.electionOfficials);
     unittest.expect(o.electionRegistrationConfirmationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRegistrationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRulesUrl, unittest.equals('foo'));
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkSimpleAddressType(o.physicalAddress);
-    checkUnnamed1036(o.voterServices);
+    checkUnnamed428(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
   buildCounterAdministrativeBody--;
 }
 
-buildUnnamed1037() {
+buildUnnamed429() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed1037(core.List<api.Channel> o) {
+checkUnnamed429(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -144,7 +144,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     o.candidateUrl = "foo";
-    o.channels = buildUnnamed1037();
+    o.channels = buildUnnamed429();
     o.email = "foo";
     o.name = "foo";
     o.orderOnBallot = "foo";
@@ -160,7 +160,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     unittest.expect(o.candidateUrl, unittest.equals('foo'));
-    checkUnnamed1037(o.channels);
+    checkUnnamed429(o.channels);
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.orderOnBallot, unittest.equals('foo'));
@@ -192,53 +192,53 @@
   buildCounterChannel--;
 }
 
-buildUnnamed1038() {
+buildUnnamed430() {
   var o = new core.List<api.Candidate>();
   o.add(buildCandidate());
   o.add(buildCandidate());
   return o;
 }
 
-checkUnnamed1038(core.List<api.Candidate> o) {
+checkUnnamed430(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandidate(o[0]);
   checkCandidate(o[1]);
 }
 
-buildUnnamed1039() {
+buildUnnamed431() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1039(core.List<core.String> o) {
+checkUnnamed431(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1040() {
+buildUnnamed432() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1040(core.List<core.String> o) {
+checkUnnamed432(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1041() {
+buildUnnamed433() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed1041(core.List<api.Source> o) {
+checkUnnamed433(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -250,11 +250,11 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     o.ballotPlacement = "foo";
-    o.candidates = buildUnnamed1038();
+    o.candidates = buildUnnamed430();
     o.district = buildElectoralDistrict();
     o.electorateSpecifications = "foo";
     o.id = "foo";
-    o.level = buildUnnamed1039();
+    o.level = buildUnnamed431();
     o.numberElected = "foo";
     o.numberVotingFor = "foo";
     o.office = "foo";
@@ -262,8 +262,8 @@
     o.referendumSubtitle = "foo";
     o.referendumTitle = "foo";
     o.referendumUrl = "foo";
-    o.roles = buildUnnamed1040();
-    o.sources = buildUnnamed1041();
+    o.roles = buildUnnamed432();
+    o.sources = buildUnnamed433();
     o.special = "foo";
     o.type = "foo";
   }
@@ -275,11 +275,11 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
-    checkUnnamed1038(o.candidates);
+    checkUnnamed430(o.candidates);
     checkElectoralDistrict(o.district);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1039(o.level);
+    checkUnnamed431(o.level);
     unittest.expect(o.numberElected, unittest.equals('foo'));
     unittest.expect(o.numberVotingFor, unittest.equals('foo'));
     unittest.expect(o.office, unittest.equals('foo'));
@@ -287,22 +287,22 @@
     unittest.expect(o.referendumSubtitle, unittest.equals('foo'));
     unittest.expect(o.referendumTitle, unittest.equals('foo'));
     unittest.expect(o.referendumUrl, unittest.equals('foo'));
-    checkUnnamed1040(o.roles);
-    checkUnnamed1041(o.sources);
+    checkUnnamed432(o.roles);
+    checkUnnamed433(o.sources);
     unittest.expect(o.special, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterContest--;
 }
 
-buildUnnamed1042() {
+buildUnnamed434() {
   var o = new core.List<api.DivisionSearchResult>();
   o.add(buildDivisionSearchResult());
   o.add(buildDivisionSearchResult());
   return o;
 }
 
-checkUnnamed1042(core.List<api.DivisionSearchResult> o) {
+checkUnnamed434(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDivisionSearchResult(o[0]);
   checkDivisionSearchResult(o[1]);
@@ -314,7 +314,7 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed1042();
+    o.results = buildUnnamed434();
   }
   buildCounterDivisionSearchResponse--;
   return o;
@@ -324,19 +324,19 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1042(o.results);
+    checkUnnamed434(o.results);
   }
   buildCounterDivisionSearchResponse--;
 }
 
-buildUnnamed1043() {
+buildUnnamed435() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1043(core.List<core.String> o) {
+checkUnnamed435(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -347,7 +347,7 @@
   var o = new api.DivisionSearchResult();
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    o.aliases = buildUnnamed1043();
+    o.aliases = buildUnnamed435();
     o.name = "foo";
     o.ocdId = "foo";
   }
@@ -358,7 +358,7 @@
 checkDivisionSearchResult(api.DivisionSearchResult o) {
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    checkUnnamed1043(o.aliases);
+    checkUnnamed435(o.aliases);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ocdId, unittest.equals('foo'));
   }
@@ -415,14 +415,14 @@
   buildCounterElectionOfficial--;
 }
 
-buildUnnamed1044() {
+buildUnnamed436() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed1044(core.List<api.Election> o) {
+checkUnnamed436(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
@@ -433,7 +433,7 @@
   var o = new api.ElectionsQueryResponse();
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    o.elections = buildUnnamed1044();
+    o.elections = buildUnnamed436();
     o.kind = "foo";
   }
   buildCounterElectionsQueryResponse--;
@@ -443,7 +443,7 @@
 checkElectionsQueryResponse(api.ElectionsQueryResponse o) {
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    checkUnnamed1044(o.elections);
+    checkUnnamed436(o.elections);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterElectionsQueryResponse--;
@@ -472,27 +472,27 @@
   buildCounterElectoralDistrict--;
 }
 
-buildUnnamed1045() {
+buildUnnamed437() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1045(core.List<core.String> o) {
+checkUnnamed437(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1046() {
+buildUnnamed438() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1046(core.List<core.int> o) {
+checkUnnamed438(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -503,9 +503,9 @@
   var o = new api.GeographicDivision();
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    o.alsoKnownAs = buildUnnamed1045();
+    o.alsoKnownAs = buildUnnamed437();
     o.name = "foo";
-    o.officeIndices = buildUnnamed1046();
+    o.officeIndices = buildUnnamed438();
   }
   buildCounterGeographicDivision--;
   return o;
@@ -514,60 +514,60 @@
 checkGeographicDivision(api.GeographicDivision o) {
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    checkUnnamed1045(o.alsoKnownAs);
+    checkUnnamed437(o.alsoKnownAs);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1046(o.officeIndices);
+    checkUnnamed438(o.officeIndices);
   }
   buildCounterGeographicDivision--;
 }
 
-buildUnnamed1047() {
+buildUnnamed439() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1047(core.List<core.String> o) {
+checkUnnamed439(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1048() {
+buildUnnamed440() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1048(core.List<core.int> o) {
+checkUnnamed440(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed1049() {
+buildUnnamed441() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1049(core.List<core.String> o) {
+checkUnnamed441(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1050() {
+buildUnnamed442() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed1050(core.List<api.Source> o) {
+checkUnnamed442(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -579,11 +579,11 @@
   buildCounterOffice++;
   if (buildCounterOffice < 3) {
     o.divisionId = "foo";
-    o.levels = buildUnnamed1047();
+    o.levels = buildUnnamed439();
     o.name = "foo";
-    o.officialIndices = buildUnnamed1048();
-    o.roles = buildUnnamed1049();
-    o.sources = buildUnnamed1050();
+    o.officialIndices = buildUnnamed440();
+    o.roles = buildUnnamed441();
+    o.sources = buildUnnamed442();
   }
   buildCounterOffice--;
   return o;
@@ -593,75 +593,75 @@
   buildCounterOffice++;
   if (buildCounterOffice < 3) {
     unittest.expect(o.divisionId, unittest.equals('foo'));
-    checkUnnamed1047(o.levels);
+    checkUnnamed439(o.levels);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1048(o.officialIndices);
-    checkUnnamed1049(o.roles);
-    checkUnnamed1050(o.sources);
+    checkUnnamed440(o.officialIndices);
+    checkUnnamed441(o.roles);
+    checkUnnamed442(o.sources);
   }
   buildCounterOffice--;
 }
 
-buildUnnamed1051() {
+buildUnnamed443() {
   var o = new core.List<api.SimpleAddressType>();
   o.add(buildSimpleAddressType());
   o.add(buildSimpleAddressType());
   return o;
 }
 
-checkUnnamed1051(core.List<api.SimpleAddressType> o) {
+checkUnnamed443(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSimpleAddressType(o[0]);
   checkSimpleAddressType(o[1]);
 }
 
-buildUnnamed1052() {
+buildUnnamed444() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed1052(core.List<api.Channel> o) {
+checkUnnamed444(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
 }
 
-buildUnnamed1053() {
+buildUnnamed445() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1053(core.List<core.String> o) {
+checkUnnamed445(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1054() {
+buildUnnamed446() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1054(core.List<core.String> o) {
+checkUnnamed446(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1055() {
+buildUnnamed447() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1055(core.List<core.String> o) {
+checkUnnamed447(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -672,14 +672,14 @@
   var o = new api.Official();
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    o.address = buildUnnamed1051();
-    o.channels = buildUnnamed1052();
-    o.emails = buildUnnamed1053();
+    o.address = buildUnnamed443();
+    o.channels = buildUnnamed444();
+    o.emails = buildUnnamed445();
     o.name = "foo";
     o.party = "foo";
-    o.phones = buildUnnamed1054();
+    o.phones = buildUnnamed446();
     o.photoUrl = "foo";
-    o.urls = buildUnnamed1055();
+    o.urls = buildUnnamed447();
   }
   buildCounterOfficial--;
   return o;
@@ -688,26 +688,26 @@
 checkOfficial(api.Official o) {
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    checkUnnamed1051(o.address);
-    checkUnnamed1052(o.channels);
-    checkUnnamed1053(o.emails);
+    checkUnnamed443(o.address);
+    checkUnnamed444(o.channels);
+    checkUnnamed445(o.emails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.party, unittest.equals('foo'));
-    checkUnnamed1054(o.phones);
+    checkUnnamed446(o.phones);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed1055(o.urls);
+    checkUnnamed447(o.urls);
   }
   buildCounterOfficial--;
 }
 
-buildUnnamed1056() {
+buildUnnamed448() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed1056(core.List<api.Source> o) {
+checkUnnamed448(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -724,7 +724,7 @@
     o.name = "foo";
     o.notes = "foo";
     o.pollingHours = "foo";
-    o.sources = buildUnnamed1056();
+    o.sources = buildUnnamed448();
     o.startDate = "foo";
     o.voterServices = "foo";
   }
@@ -741,47 +741,47 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.pollingHours, unittest.equals('foo'));
-    checkUnnamed1056(o.sources);
+    checkUnnamed448(o.sources);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.voterServices, unittest.equals('foo'));
   }
   buildCounterPollingLocation--;
 }
 
-buildUnnamed1057() {
+buildUnnamed449() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed1057(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed449(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed1058() {
+buildUnnamed450() {
   var o = new core.List<api.Office>();
   o.add(buildOffice());
   o.add(buildOffice());
   return o;
 }
 
-checkUnnamed1058(core.List<api.Office> o) {
+checkUnnamed450(core.List<api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o[0]);
   checkOffice(o[1]);
 }
 
-buildUnnamed1059() {
+buildUnnamed451() {
   var o = new core.List<api.Official>();
   o.add(buildOfficial());
   o.add(buildOfficial());
   return o;
 }
 
-checkUnnamed1059(core.List<api.Official> o) {
+checkUnnamed451(core.List<api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o[0]);
   checkOfficial(o[1]);
@@ -792,9 +792,9 @@
   var o = new api.RepresentativeInfoData();
   buildCounterRepresentativeInfoData++;
   if (buildCounterRepresentativeInfoData < 3) {
-    o.divisions = buildUnnamed1057();
-    o.offices = buildUnnamed1058();
-    o.officials = buildUnnamed1059();
+    o.divisions = buildUnnamed449();
+    o.offices = buildUnnamed450();
+    o.officials = buildUnnamed451();
   }
   buildCounterRepresentativeInfoData--;
   return o;
@@ -803,47 +803,47 @@
 checkRepresentativeInfoData(api.RepresentativeInfoData o) {
   buildCounterRepresentativeInfoData++;
   if (buildCounterRepresentativeInfoData < 3) {
-    checkUnnamed1057(o.divisions);
-    checkUnnamed1058(o.offices);
-    checkUnnamed1059(o.officials);
+    checkUnnamed449(o.divisions);
+    checkUnnamed450(o.offices);
+    checkUnnamed451(o.officials);
   }
   buildCounterRepresentativeInfoData--;
 }
 
-buildUnnamed1060() {
+buildUnnamed452() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed1060(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed452(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed1061() {
+buildUnnamed453() {
   var o = new core.List<api.Office>();
   o.add(buildOffice());
   o.add(buildOffice());
   return o;
 }
 
-checkUnnamed1061(core.List<api.Office> o) {
+checkUnnamed453(core.List<api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o[0]);
   checkOffice(o[1]);
 }
 
-buildUnnamed1062() {
+buildUnnamed454() {
   var o = new core.List<api.Official>();
   o.add(buildOfficial());
   o.add(buildOfficial());
   return o;
 }
 
-checkUnnamed1062(core.List<api.Official> o) {
+checkUnnamed454(core.List<api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o[0]);
   checkOfficial(o[1]);
@@ -854,11 +854,11 @@
   var o = new api.RepresentativeInfoResponse();
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    o.divisions = buildUnnamed1060();
+    o.divisions = buildUnnamed452();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.offices = buildUnnamed1061();
-    o.officials = buildUnnamed1062();
+    o.offices = buildUnnamed453();
+    o.officials = buildUnnamed454();
   }
   buildCounterRepresentativeInfoResponse--;
   return o;
@@ -867,11 +867,11 @@
 checkRepresentativeInfoResponse(api.RepresentativeInfoResponse o) {
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    checkUnnamed1060(o.divisions);
+    checkUnnamed452(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed1061(o.offices);
-    checkUnnamed1062(o.officials);
+    checkUnnamed453(o.offices);
+    checkUnnamed454(o.officials);
   }
   buildCounterRepresentativeInfoResponse--;
 }
@@ -928,79 +928,79 @@
   buildCounterSource--;
 }
 
-buildUnnamed1063() {
+buildUnnamed455() {
   var o = new core.List<api.Contest>();
   o.add(buildContest());
   o.add(buildContest());
   return o;
 }
 
-checkUnnamed1063(core.List<api.Contest> o) {
+checkUnnamed455(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContest(o[0]);
   checkContest(o[1]);
 }
 
-buildUnnamed1064() {
+buildUnnamed456() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed1064(core.List<api.PollingLocation> o) {
+checkUnnamed456(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed1065() {
+buildUnnamed457() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed1065(core.List<api.PollingLocation> o) {
+checkUnnamed457(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed1066() {
+buildUnnamed458() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed1066(core.List<api.Election> o) {
+checkUnnamed458(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
 }
 
-buildUnnamed1067() {
+buildUnnamed459() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed1067(core.List<api.PollingLocation> o) {
+checkUnnamed459(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed1068() {
+buildUnnamed460() {
   var o = new core.List<api.AdministrationRegion>();
   o.add(buildAdministrationRegion());
   o.add(buildAdministrationRegion());
   return o;
 }
 
-checkUnnamed1068(core.List<api.AdministrationRegion> o) {
+checkUnnamed460(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrationRegion(o[0]);
   checkAdministrationRegion(o[1]);
@@ -1011,16 +1011,16 @@
   var o = new api.VoterInfoResponse();
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    o.contests = buildUnnamed1063();
-    o.dropOffLocations = buildUnnamed1064();
-    o.earlyVoteSites = buildUnnamed1065();
+    o.contests = buildUnnamed455();
+    o.dropOffLocations = buildUnnamed456();
+    o.earlyVoteSites = buildUnnamed457();
     o.election = buildElection();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.otherElections = buildUnnamed1066();
-    o.pollingLocations = buildUnnamed1067();
+    o.otherElections = buildUnnamed458();
+    o.pollingLocations = buildUnnamed459();
     o.precinctId = "foo";
-    o.state = buildUnnamed1068();
+    o.state = buildUnnamed460();
   }
   buildCounterVoterInfoResponse--;
   return o;
@@ -1029,67 +1029,67 @@
 checkVoterInfoResponse(api.VoterInfoResponse o) {
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    checkUnnamed1063(o.contests);
-    checkUnnamed1064(o.dropOffLocations);
-    checkUnnamed1065(o.earlyVoteSites);
+    checkUnnamed455(o.contests);
+    checkUnnamed456(o.dropOffLocations);
+    checkUnnamed457(o.earlyVoteSites);
     checkElection(o.election);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed1066(o.otherElections);
-    checkUnnamed1067(o.pollingLocations);
+    checkUnnamed458(o.otherElections);
+    checkUnnamed459(o.pollingLocations);
     unittest.expect(o.precinctId, unittest.equals('foo'));
-    checkUnnamed1068(o.state);
+    checkUnnamed460(o.state);
   }
   buildCounterVoterInfoResponse--;
 }
 
-buildUnnamed1069() {
+buildUnnamed461() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1069(core.List<core.String> o) {
+checkUnnamed461(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1070() {
+buildUnnamed462() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1070(core.List<core.String> o) {
+checkUnnamed462(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1071() {
+buildUnnamed463() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1071(core.List<core.String> o) {
+checkUnnamed463(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1072() {
+buildUnnamed464() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1072(core.List<core.String> o) {
+checkUnnamed464(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1435,8 +1435,8 @@
       api.RepresentativesResourceApi res = new api.CivicinfoApi(mock).representatives;
       var arg_address = "foo";
       var arg_includeOffices = true;
-      var arg_levels = buildUnnamed1069();
-      var arg_roles = buildUnnamed1070();
+      var arg_levels = buildUnnamed461();
+      var arg_roles = buildUnnamed462();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1487,9 +1487,9 @@
       var mock = new common_test.HttpServerMock();
       api.RepresentativesResourceApi res = new api.CivicinfoApi(mock).representatives;
       var arg_ocdId = "foo";
-      var arg_levels = buildUnnamed1071();
+      var arg_levels = buildUnnamed463();
       var arg_recursive = true;
-      var arg_roles = buildUnnamed1072();
+      var arg_roles = buildUnnamed464();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/compute/v1_test.dart b/generated/googleapis/test/compute/v1_test.dart
index aa76b39..c9bd673 100644
--- a/generated/googleapis/test/compute/v1_test.dart
+++ b/generated/googleapis/test/compute/v1_test.dart
@@ -41,14 +41,14 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed926() {
+buildUnnamed465() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed926(core.List<core.String> o) {
+checkUnnamed465(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -68,7 +68,7 @@
     o.region = "foo";
     o.selfLink = "foo";
     o.status = "foo";
-    o.users = buildUnnamed926();
+    o.users = buildUnnamed465();
   }
   buildCounterAddress--;
   return o;
@@ -86,19 +86,19 @@
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed926(o.users);
+    checkUnnamed465(o.users);
   }
   buildCounterAddress--;
 }
 
-buildUnnamed927() {
+buildUnnamed466() {
   var o = new core.Map<core.String, api.AddressesScopedList>();
   o["x"] = buildAddressesScopedList();
   o["y"] = buildAddressesScopedList();
   return o;
 }
 
-checkUnnamed927(core.Map<core.String, api.AddressesScopedList> o) {
+checkUnnamed466(core.Map<core.String, api.AddressesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedList(o["x"]);
   checkAddressesScopedList(o["y"]);
@@ -110,7 +110,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed927();
+    o.items = buildUnnamed466();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -123,7 +123,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed927(o.items);
+    checkUnnamed466(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -131,14 +131,14 @@
   buildCounterAddressAggregatedList--;
 }
 
-buildUnnamed928() {
+buildUnnamed467() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed928(core.List<api.Address> o) {
+checkUnnamed467(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -150,7 +150,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed928();
+    o.items = buildUnnamed467();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -163,7 +163,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed928(o.items);
+    checkUnnamed467(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -171,14 +171,14 @@
   buildCounterAddressList--;
 }
 
-buildUnnamed929() {
+buildUnnamed468() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed929(core.List<api.Address> o) {
+checkUnnamed468(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -205,14 +205,14 @@
   buildCounterAddressesScopedListWarningData--;
 }
 
-buildUnnamed930() {
+buildUnnamed469() {
   var o = new core.List<api.AddressesScopedListWarningData>();
   o.add(buildAddressesScopedListWarningData());
   o.add(buildAddressesScopedListWarningData());
   return o;
 }
 
-checkUnnamed930(core.List<api.AddressesScopedListWarningData> o) {
+checkUnnamed469(core.List<api.AddressesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedListWarningData(o[0]);
   checkAddressesScopedListWarningData(o[1]);
@@ -224,7 +224,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed930();
+    o.data = buildUnnamed469();
     o.message = "foo";
   }
   buildCounterAddressesScopedListWarning--;
@@ -235,7 +235,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed930(o.data);
+    checkUnnamed469(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAddressesScopedListWarning--;
@@ -246,7 +246,7 @@
   var o = new api.AddressesScopedList();
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    o.addresses = buildUnnamed929();
+    o.addresses = buildUnnamed468();
     o.warning = buildAddressesScopedListWarning();
   }
   buildCounterAddressesScopedList--;
@@ -256,20 +256,20 @@
 checkAddressesScopedList(api.AddressesScopedList o) {
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    checkUnnamed929(o.addresses);
+    checkUnnamed468(o.addresses);
     checkAddressesScopedListWarning(o.warning);
   }
   buildCounterAddressesScopedList--;
 }
 
-buildUnnamed931() {
+buildUnnamed470() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed931(core.List<core.String> o) {
+checkUnnamed470(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -287,7 +287,7 @@
     o.initializeParams = buildAttachedDiskInitializeParams();
     o.interface = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed931();
+    o.licenses = buildUnnamed470();
     o.mode = "foo";
     o.source = "foo";
     o.type = "foo";
@@ -306,7 +306,7 @@
     checkAttachedDiskInitializeParams(o.initializeParams);
     unittest.expect(o.interface, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed931(o.licenses);
+    checkUnnamed470(o.licenses);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -370,27 +370,27 @@
   buildCounterBackend--;
 }
 
-buildUnnamed932() {
+buildUnnamed471() {
   var o = new core.List<api.Backend>();
   o.add(buildBackend());
   o.add(buildBackend());
   return o;
 }
 
-checkUnnamed932(core.List<api.Backend> o) {
+checkUnnamed471(core.List<api.Backend> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackend(o[0]);
   checkBackend(o[1]);
 }
 
-buildUnnamed933() {
+buildUnnamed472() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed933(core.List<core.String> o) {
+checkUnnamed472(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -401,11 +401,11 @@
   var o = new api.BackendService();
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
-    o.backends = buildUnnamed932();
+    o.backends = buildUnnamed471();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.fingerprint = "foo";
-    o.healthChecks = buildUnnamed933();
+    o.healthChecks = buildUnnamed472();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -422,11 +422,11 @@
 checkBackendService(api.BackendService o) {
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
-    checkUnnamed932(o.backends);
+    checkUnnamed471(o.backends);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed933(o.healthChecks);
+    checkUnnamed472(o.healthChecks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -439,14 +439,14 @@
   buildCounterBackendService--;
 }
 
-buildUnnamed934() {
+buildUnnamed473() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed934(core.List<api.HealthStatus> o) {
+checkUnnamed473(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -457,7 +457,7 @@
   var o = new api.BackendServiceGroupHealth();
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    o.healthStatus = buildUnnamed934();
+    o.healthStatus = buildUnnamed473();
     o.kind = "foo";
   }
   buildCounterBackendServiceGroupHealth--;
@@ -467,20 +467,20 @@
 checkBackendServiceGroupHealth(api.BackendServiceGroupHealth o) {
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    checkUnnamed934(o.healthStatus);
+    checkUnnamed473(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBackendServiceGroupHealth--;
 }
 
-buildUnnamed935() {
+buildUnnamed474() {
   var o = new core.List<api.BackendService>();
   o.add(buildBackendService());
   o.add(buildBackendService());
   return o;
 }
 
-checkUnnamed935(core.List<api.BackendService> o) {
+checkUnnamed474(core.List<api.BackendService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendService(o[0]);
   checkBackendService(o[1]);
@@ -492,7 +492,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed935();
+    o.items = buildUnnamed474();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -505,7 +505,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed935(o.items);
+    checkUnnamed474(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -540,14 +540,14 @@
   buildCounterDeprecationStatus--;
 }
 
-buildUnnamed936() {
+buildUnnamed475() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed936(core.List<core.String> o) {
+checkUnnamed475(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -562,7 +562,7 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed936();
+    o.licenses = buildUnnamed475();
     o.name = "foo";
     o.options = "foo";
     o.selfLink = "foo";
@@ -586,7 +586,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed936(o.licenses);
+    checkUnnamed475(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.options, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -602,14 +602,14 @@
   buildCounterDisk--;
 }
 
-buildUnnamed937() {
+buildUnnamed476() {
   var o = new core.Map<core.String, api.DisksScopedList>();
   o["x"] = buildDisksScopedList();
   o["y"] = buildDisksScopedList();
   return o;
 }
 
-checkUnnamed937(core.Map<core.String, api.DisksScopedList> o) {
+checkUnnamed476(core.Map<core.String, api.DisksScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedList(o["x"]);
   checkDisksScopedList(o["y"]);
@@ -621,7 +621,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed937();
+    o.items = buildUnnamed476();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -634,7 +634,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed937(o.items);
+    checkUnnamed476(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -642,14 +642,14 @@
   buildCounterDiskAggregatedList--;
 }
 
-buildUnnamed938() {
+buildUnnamed477() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed938(core.List<api.Disk> o) {
+checkUnnamed477(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -661,7 +661,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed938();
+    o.items = buildUnnamed477();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -674,7 +674,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed938(o.items);
+    checkUnnamed477(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -719,14 +719,14 @@
   buildCounterDiskType--;
 }
 
-buildUnnamed939() {
+buildUnnamed478() {
   var o = new core.Map<core.String, api.DiskTypesScopedList>();
   o["x"] = buildDiskTypesScopedList();
   o["y"] = buildDiskTypesScopedList();
   return o;
 }
 
-checkUnnamed939(core.Map<core.String, api.DiskTypesScopedList> o) {
+checkUnnamed478(core.Map<core.String, api.DiskTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedList(o["x"]);
   checkDiskTypesScopedList(o["y"]);
@@ -738,7 +738,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed939();
+    o.items = buildUnnamed478();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -751,7 +751,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed939(o.items);
+    checkUnnamed478(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -759,14 +759,14 @@
   buildCounterDiskTypeAggregatedList--;
 }
 
-buildUnnamed940() {
+buildUnnamed479() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed940(core.List<api.DiskType> o) {
+checkUnnamed479(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -778,7 +778,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed940();
+    o.items = buildUnnamed479();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -791,7 +791,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed940(o.items);
+    checkUnnamed479(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -799,14 +799,14 @@
   buildCounterDiskTypeList--;
 }
 
-buildUnnamed941() {
+buildUnnamed480() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed941(core.List<api.DiskType> o) {
+checkUnnamed480(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -833,14 +833,14 @@
   buildCounterDiskTypesScopedListWarningData--;
 }
 
-buildUnnamed942() {
+buildUnnamed481() {
   var o = new core.List<api.DiskTypesScopedListWarningData>();
   o.add(buildDiskTypesScopedListWarningData());
   o.add(buildDiskTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed942(core.List<api.DiskTypesScopedListWarningData> o) {
+checkUnnamed481(core.List<api.DiskTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedListWarningData(o[0]);
   checkDiskTypesScopedListWarningData(o[1]);
@@ -852,7 +852,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed942();
+    o.data = buildUnnamed481();
     o.message = "foo";
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -863,7 +863,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed942(o.data);
+    checkUnnamed481(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -874,7 +874,7 @@
   var o = new api.DiskTypesScopedList();
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    o.diskTypes = buildUnnamed941();
+    o.diskTypes = buildUnnamed480();
     o.warning = buildDiskTypesScopedListWarning();
   }
   buildCounterDiskTypesScopedList--;
@@ -884,20 +884,20 @@
 checkDiskTypesScopedList(api.DiskTypesScopedList o) {
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    checkUnnamed941(o.diskTypes);
+    checkUnnamed480(o.diskTypes);
     checkDiskTypesScopedListWarning(o.warning);
   }
   buildCounterDiskTypesScopedList--;
 }
 
-buildUnnamed943() {
+buildUnnamed482() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed943(core.List<api.Disk> o) {
+checkUnnamed482(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -924,14 +924,14 @@
   buildCounterDisksScopedListWarningData--;
 }
 
-buildUnnamed944() {
+buildUnnamed483() {
   var o = new core.List<api.DisksScopedListWarningData>();
   o.add(buildDisksScopedListWarningData());
   o.add(buildDisksScopedListWarningData());
   return o;
 }
 
-checkUnnamed944(core.List<api.DisksScopedListWarningData> o) {
+checkUnnamed483(core.List<api.DisksScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedListWarningData(o[0]);
   checkDisksScopedListWarningData(o[1]);
@@ -943,7 +943,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed944();
+    o.data = buildUnnamed483();
     o.message = "foo";
   }
   buildCounterDisksScopedListWarning--;
@@ -954,7 +954,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed944(o.data);
+    checkUnnamed483(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDisksScopedListWarning--;
@@ -965,7 +965,7 @@
   var o = new api.DisksScopedList();
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    o.disks = buildUnnamed943();
+    o.disks = buildUnnamed482();
     o.warning = buildDisksScopedListWarning();
   }
   buildCounterDisksScopedList--;
@@ -975,20 +975,20 @@
 checkDisksScopedList(api.DisksScopedList o) {
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    checkUnnamed943(o.disks);
+    checkUnnamed482(o.disks);
     checkDisksScopedListWarning(o.warning);
   }
   buildCounterDisksScopedList--;
 }
 
-buildUnnamed945() {
+buildUnnamed484() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed945(core.List<core.String> o) {
+checkUnnamed484(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1000,7 +1000,7 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed945();
+    o.ports = buildUnnamed484();
   }
   buildCounterFirewallAllowed--;
   return o;
@@ -1010,58 +1010,58 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed945(o.ports);
+    checkUnnamed484(o.ports);
   }
   buildCounterFirewallAllowed--;
 }
 
-buildUnnamed946() {
+buildUnnamed485() {
   var o = new core.List<api.FirewallAllowed>();
   o.add(buildFirewallAllowed());
   o.add(buildFirewallAllowed());
   return o;
 }
 
-checkUnnamed946(core.List<api.FirewallAllowed> o) {
+checkUnnamed485(core.List<api.FirewallAllowed> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallAllowed(o[0]);
   checkFirewallAllowed(o[1]);
 }
 
-buildUnnamed947() {
+buildUnnamed486() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed947(core.List<core.String> o) {
+checkUnnamed486(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed948() {
+buildUnnamed487() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed948(core.List<core.String> o) {
+checkUnnamed487(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed949() {
+buildUnnamed488() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed949(core.List<core.String> o) {
+checkUnnamed488(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1072,7 +1072,7 @@
   var o = new api.Firewall();
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    o.allowed = buildUnnamed946();
+    o.allowed = buildUnnamed485();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.id = "foo";
@@ -1080,9 +1080,9 @@
     o.name = "foo";
     o.network = "foo";
     o.selfLink = "foo";
-    o.sourceRanges = buildUnnamed947();
-    o.sourceTags = buildUnnamed948();
-    o.targetTags = buildUnnamed949();
+    o.sourceRanges = buildUnnamed486();
+    o.sourceTags = buildUnnamed487();
+    o.targetTags = buildUnnamed488();
   }
   buildCounterFirewall--;
   return o;
@@ -1091,7 +1091,7 @@
 checkFirewall(api.Firewall o) {
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    checkUnnamed946(o.allowed);
+    checkUnnamed485(o.allowed);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1099,21 +1099,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed947(o.sourceRanges);
-    checkUnnamed948(o.sourceTags);
-    checkUnnamed949(o.targetTags);
+    checkUnnamed486(o.sourceRanges);
+    checkUnnamed487(o.sourceTags);
+    checkUnnamed488(o.targetTags);
   }
   buildCounterFirewall--;
 }
 
-buildUnnamed950() {
+buildUnnamed489() {
   var o = new core.List<api.Firewall>();
   o.add(buildFirewall());
   o.add(buildFirewall());
   return o;
 }
 
-checkUnnamed950(core.List<api.Firewall> o) {
+checkUnnamed489(core.List<api.Firewall> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewall(o[0]);
   checkFirewall(o[1]);
@@ -1125,7 +1125,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed950();
+    o.items = buildUnnamed489();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1138,7 +1138,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed950(o.items);
+    checkUnnamed489(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1185,14 +1185,14 @@
   buildCounterForwardingRule--;
 }
 
-buildUnnamed951() {
+buildUnnamed490() {
   var o = new core.Map<core.String, api.ForwardingRulesScopedList>();
   o["x"] = buildForwardingRulesScopedList();
   o["y"] = buildForwardingRulesScopedList();
   return o;
 }
 
-checkUnnamed951(core.Map<core.String, api.ForwardingRulesScopedList> o) {
+checkUnnamed490(core.Map<core.String, api.ForwardingRulesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedList(o["x"]);
   checkForwardingRulesScopedList(o["y"]);
@@ -1204,7 +1204,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed951();
+    o.items = buildUnnamed490();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1217,7 +1217,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed951(o.items);
+    checkUnnamed490(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1225,14 +1225,14 @@
   buildCounterForwardingRuleAggregatedList--;
 }
 
-buildUnnamed952() {
+buildUnnamed491() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed952(core.List<api.ForwardingRule> o) {
+checkUnnamed491(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -1244,7 +1244,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed952();
+    o.items = buildUnnamed491();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1257,7 +1257,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed952(o.items);
+    checkUnnamed491(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1265,14 +1265,14 @@
   buildCounterForwardingRuleList--;
 }
 
-buildUnnamed953() {
+buildUnnamed492() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed953(core.List<api.ForwardingRule> o) {
+checkUnnamed492(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -1299,14 +1299,14 @@
   buildCounterForwardingRulesScopedListWarningData--;
 }
 
-buildUnnamed954() {
+buildUnnamed493() {
   var o = new core.List<api.ForwardingRulesScopedListWarningData>();
   o.add(buildForwardingRulesScopedListWarningData());
   o.add(buildForwardingRulesScopedListWarningData());
   return o;
 }
 
-checkUnnamed954(core.List<api.ForwardingRulesScopedListWarningData> o) {
+checkUnnamed493(core.List<api.ForwardingRulesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedListWarningData(o[0]);
   checkForwardingRulesScopedListWarningData(o[1]);
@@ -1318,7 +1318,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed954();
+    o.data = buildUnnamed493();
     o.message = "foo";
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -1329,7 +1329,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed954(o.data);
+    checkUnnamed493(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -1340,7 +1340,7 @@
   var o = new api.ForwardingRulesScopedList();
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    o.forwardingRules = buildUnnamed953();
+    o.forwardingRules = buildUnnamed492();
     o.warning = buildForwardingRulesScopedListWarning();
   }
   buildCounterForwardingRulesScopedList--;
@@ -1350,7 +1350,7 @@
 checkForwardingRulesScopedList(api.ForwardingRulesScopedList o) {
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    checkUnnamed953(o.forwardingRules);
+    checkUnnamed492(o.forwardingRules);
     checkForwardingRulesScopedListWarning(o.warning);
   }
   buildCounterForwardingRulesScopedList--;
@@ -1400,14 +1400,14 @@
   buildCounterHealthStatus--;
 }
 
-buildUnnamed955() {
+buildUnnamed494() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed955(core.List<core.String> o) {
+checkUnnamed494(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1419,7 +1419,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     o.description = "foo";
-    o.hosts = buildUnnamed955();
+    o.hosts = buildUnnamed494();
     o.pathMatcher = "foo";
   }
   buildCounterHostRule--;
@@ -1430,7 +1430,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed955(o.hosts);
+    checkUnnamed494(o.hosts);
     unittest.expect(o.pathMatcher, unittest.equals('foo'));
   }
   buildCounterHostRule--;
@@ -1479,14 +1479,14 @@
   buildCounterHttpHealthCheck--;
 }
 
-buildUnnamed956() {
+buildUnnamed495() {
   var o = new core.List<api.HttpHealthCheck>();
   o.add(buildHttpHealthCheck());
   o.add(buildHttpHealthCheck());
   return o;
 }
 
-checkUnnamed956(core.List<api.HttpHealthCheck> o) {
+checkUnnamed495(core.List<api.HttpHealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpHealthCheck(o[0]);
   checkHttpHealthCheck(o[1]);
@@ -1498,7 +1498,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed956();
+    o.items = buildUnnamed495();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1511,7 +1511,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed956(o.items);
+    checkUnnamed495(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1519,14 +1519,14 @@
   buildCounterHttpHealthCheckList--;
 }
 
-buildUnnamed957() {
+buildUnnamed496() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed957(core.List<core.String> o) {
+checkUnnamed496(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1567,7 +1567,7 @@
     o.diskSizeGb = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed957();
+    o.licenses = buildUnnamed496();
     o.name = "foo";
     o.rawDisk = buildImageRawDisk();
     o.selfLink = "foo";
@@ -1590,7 +1590,7 @@
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed957(o.licenses);
+    checkUnnamed496(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     checkImageRawDisk(o.rawDisk);
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1602,14 +1602,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed958() {
+buildUnnamed497() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed958(core.List<api.Image> o) {
+checkUnnamed497(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -1621,7 +1621,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed958();
+    o.items = buildUnnamed497();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1634,7 +1634,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed958(o.items);
+    checkUnnamed497(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1642,40 +1642,40 @@
   buildCounterImageList--;
 }
 
-buildUnnamed959() {
+buildUnnamed498() {
   var o = new core.List<api.AttachedDisk>();
   o.add(buildAttachedDisk());
   o.add(buildAttachedDisk());
   return o;
 }
 
-checkUnnamed959(core.List<api.AttachedDisk> o) {
+checkUnnamed498(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachedDisk(o[0]);
   checkAttachedDisk(o[1]);
 }
 
-buildUnnamed960() {
+buildUnnamed499() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed960(core.List<api.NetworkInterface> o) {
+checkUnnamed499(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed961() {
+buildUnnamed500() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed961(core.List<api.ServiceAccount> o) {
+checkUnnamed500(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -1689,16 +1689,16 @@
     o.canIpForward = true;
     o.creationTimestamp = "foo";
     o.description = "foo";
-    o.disks = buildUnnamed959();
+    o.disks = buildUnnamed498();
     o.id = "foo";
     o.kind = "foo";
     o.machineType = "foo";
     o.metadata = buildMetadata();
     o.name = "foo";
-    o.networkInterfaces = buildUnnamed960();
+    o.networkInterfaces = buildUnnamed499();
     o.scheduling = buildScheduling();
     o.selfLink = "foo";
-    o.serviceAccounts = buildUnnamed961();
+    o.serviceAccounts = buildUnnamed500();
     o.status = "foo";
     o.statusMessage = "foo";
     o.tags = buildTags();
@@ -1714,16 +1714,16 @@
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed959(o.disks);
+    checkUnnamed498(o.disks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed960(o.networkInterfaces);
+    checkUnnamed499(o.networkInterfaces);
     checkScheduling(o.scheduling);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed961(o.serviceAccounts);
+    checkUnnamed500(o.serviceAccounts);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusMessage, unittest.equals('foo'));
     checkTags(o.tags);
@@ -1732,14 +1732,14 @@
   buildCounterInstance--;
 }
 
-buildUnnamed962() {
+buildUnnamed501() {
   var o = new core.Map<core.String, api.InstancesScopedList>();
   o["x"] = buildInstancesScopedList();
   o["y"] = buildInstancesScopedList();
   return o;
 }
 
-checkUnnamed962(core.Map<core.String, api.InstancesScopedList> o) {
+checkUnnamed501(core.Map<core.String, api.InstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedList(o["x"]);
   checkInstancesScopedList(o["y"]);
@@ -1751,7 +1751,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed962();
+    o.items = buildUnnamed501();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1764,7 +1764,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed962(o.items);
+    checkUnnamed501(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1772,14 +1772,14 @@
   buildCounterInstanceAggregatedList--;
 }
 
-buildUnnamed963() {
+buildUnnamed502() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed963(core.List<api.Instance> o) {
+checkUnnamed502(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -1791,7 +1791,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed963();
+    o.items = buildUnnamed502();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1804,7 +1804,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed963(o.items);
+    checkUnnamed502(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1812,40 +1812,40 @@
   buildCounterInstanceList--;
 }
 
-buildUnnamed964() {
+buildUnnamed503() {
   var o = new core.List<api.AttachedDisk>();
   o.add(buildAttachedDisk());
   o.add(buildAttachedDisk());
   return o;
 }
 
-checkUnnamed964(core.List<api.AttachedDisk> o) {
+checkUnnamed503(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachedDisk(o[0]);
   checkAttachedDisk(o[1]);
 }
 
-buildUnnamed965() {
+buildUnnamed504() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed965(core.List<api.NetworkInterface> o) {
+checkUnnamed504(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed966() {
+buildUnnamed505() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed966(core.List<api.ServiceAccount> o) {
+checkUnnamed505(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -1858,12 +1858,12 @@
   if (buildCounterInstanceProperties < 3) {
     o.canIpForward = true;
     o.description = "foo";
-    o.disks = buildUnnamed964();
+    o.disks = buildUnnamed503();
     o.machineType = "foo";
     o.metadata = buildMetadata();
-    o.networkInterfaces = buildUnnamed965();
+    o.networkInterfaces = buildUnnamed504();
     o.scheduling = buildScheduling();
-    o.serviceAccounts = buildUnnamed966();
+    o.serviceAccounts = buildUnnamed505();
     o.tags = buildTags();
   }
   buildCounterInstanceProperties--;
@@ -1875,12 +1875,12 @@
   if (buildCounterInstanceProperties < 3) {
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed964(o.disks);
+    checkUnnamed503(o.disks);
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
-    checkUnnamed965(o.networkInterfaces);
+    checkUnnamed504(o.networkInterfaces);
     checkScheduling(o.scheduling);
-    checkUnnamed966(o.serviceAccounts);
+    checkUnnamed505(o.serviceAccounts);
     checkTags(o.tags);
   }
   buildCounterInstanceProperties--;
@@ -1936,14 +1936,14 @@
   buildCounterInstanceTemplate--;
 }
 
-buildUnnamed967() {
+buildUnnamed506() {
   var o = new core.List<api.InstanceTemplate>();
   o.add(buildInstanceTemplate());
   o.add(buildInstanceTemplate());
   return o;
 }
 
-checkUnnamed967(core.List<api.InstanceTemplate> o) {
+checkUnnamed506(core.List<api.InstanceTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceTemplate(o[0]);
   checkInstanceTemplate(o[1]);
@@ -1955,7 +1955,7 @@
   buildCounterInstanceTemplateList++;
   if (buildCounterInstanceTemplateList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed967();
+    o.items = buildUnnamed506();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1968,7 +1968,7 @@
   buildCounterInstanceTemplateList++;
   if (buildCounterInstanceTemplateList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed967(o.items);
+    checkUnnamed506(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1976,14 +1976,14 @@
   buildCounterInstanceTemplateList--;
 }
 
-buildUnnamed968() {
+buildUnnamed507() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed968(core.List<api.Instance> o) {
+checkUnnamed507(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -2010,14 +2010,14 @@
   buildCounterInstancesScopedListWarningData--;
 }
 
-buildUnnamed969() {
+buildUnnamed508() {
   var o = new core.List<api.InstancesScopedListWarningData>();
   o.add(buildInstancesScopedListWarningData());
   o.add(buildInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed969(core.List<api.InstancesScopedListWarningData> o) {
+checkUnnamed508(core.List<api.InstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedListWarningData(o[0]);
   checkInstancesScopedListWarningData(o[1]);
@@ -2029,7 +2029,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed969();
+    o.data = buildUnnamed508();
     o.message = "foo";
   }
   buildCounterInstancesScopedListWarning--;
@@ -2040,7 +2040,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed969(o.data);
+    checkUnnamed508(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstancesScopedListWarning--;
@@ -2051,7 +2051,7 @@
   var o = new api.InstancesScopedList();
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    o.instances = buildUnnamed968();
+    o.instances = buildUnnamed507();
     o.warning = buildInstancesScopedListWarning();
   }
   buildCounterInstancesScopedList--;
@@ -2061,7 +2061,7 @@
 checkInstancesScopedList(api.InstancesScopedList o) {
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    checkUnnamed968(o.instances);
+    checkUnnamed507(o.instances);
     checkInstancesScopedListWarning(o.warning);
   }
   buildCounterInstancesScopedList--;
@@ -2111,14 +2111,14 @@
   buildCounterMachineTypeScratchDisks--;
 }
 
-buildUnnamed970() {
+buildUnnamed509() {
   var o = new core.List<api.MachineTypeScratchDisks>();
   o.add(buildMachineTypeScratchDisks());
   o.add(buildMachineTypeScratchDisks());
   return o;
 }
 
-checkUnnamed970(core.List<api.MachineTypeScratchDisks> o) {
+checkUnnamed509(core.List<api.MachineTypeScratchDisks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypeScratchDisks(o[0]);
   checkMachineTypeScratchDisks(o[1]);
@@ -2140,7 +2140,7 @@
     o.maximumPersistentDisksSizeGb = "foo";
     o.memoryMb = 42;
     o.name = "foo";
-    o.scratchDisks = buildUnnamed970();
+    o.scratchDisks = buildUnnamed509();
     o.selfLink = "foo";
     o.zone = "foo";
   }
@@ -2162,21 +2162,21 @@
     unittest.expect(o.maximumPersistentDisksSizeGb, unittest.equals('foo'));
     unittest.expect(o.memoryMb, unittest.equals(42));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed970(o.scratchDisks);
+    checkUnnamed509(o.scratchDisks);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterMachineType--;
 }
 
-buildUnnamed971() {
+buildUnnamed510() {
   var o = new core.Map<core.String, api.MachineTypesScopedList>();
   o["x"] = buildMachineTypesScopedList();
   o["y"] = buildMachineTypesScopedList();
   return o;
 }
 
-checkUnnamed971(core.Map<core.String, api.MachineTypesScopedList> o) {
+checkUnnamed510(core.Map<core.String, api.MachineTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedList(o["x"]);
   checkMachineTypesScopedList(o["y"]);
@@ -2188,7 +2188,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed971();
+    o.items = buildUnnamed510();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2201,7 +2201,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed971(o.items);
+    checkUnnamed510(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2209,14 +2209,14 @@
   buildCounterMachineTypeAggregatedList--;
 }
 
-buildUnnamed972() {
+buildUnnamed511() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed972(core.List<api.MachineType> o) {
+checkUnnamed511(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -2228,7 +2228,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed972();
+    o.items = buildUnnamed511();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2241,7 +2241,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed972(o.items);
+    checkUnnamed511(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2249,14 +2249,14 @@
   buildCounterMachineTypeList--;
 }
 
-buildUnnamed973() {
+buildUnnamed512() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed973(core.List<api.MachineType> o) {
+checkUnnamed512(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -2283,14 +2283,14 @@
   buildCounterMachineTypesScopedListWarningData--;
 }
 
-buildUnnamed974() {
+buildUnnamed513() {
   var o = new core.List<api.MachineTypesScopedListWarningData>();
   o.add(buildMachineTypesScopedListWarningData());
   o.add(buildMachineTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed974(core.List<api.MachineTypesScopedListWarningData> o) {
+checkUnnamed513(core.List<api.MachineTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedListWarningData(o[0]);
   checkMachineTypesScopedListWarningData(o[1]);
@@ -2302,7 +2302,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed974();
+    o.data = buildUnnamed513();
     o.message = "foo";
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -2313,7 +2313,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed974(o.data);
+    checkUnnamed513(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -2324,7 +2324,7 @@
   var o = new api.MachineTypesScopedList();
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    o.machineTypes = buildUnnamed973();
+    o.machineTypes = buildUnnamed512();
     o.warning = buildMachineTypesScopedListWarning();
   }
   buildCounterMachineTypesScopedList--;
@@ -2334,7 +2334,7 @@
 checkMachineTypesScopedList(api.MachineTypesScopedList o) {
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    checkUnnamed973(o.machineTypes);
+    checkUnnamed512(o.machineTypes);
     checkMachineTypesScopedListWarning(o.warning);
   }
   buildCounterMachineTypesScopedList--;
@@ -2361,14 +2361,14 @@
   buildCounterMetadataItems--;
 }
 
-buildUnnamed975() {
+buildUnnamed514() {
   var o = new core.List<api.MetadataItems>();
   o.add(buildMetadataItems());
   o.add(buildMetadataItems());
   return o;
 }
 
-checkUnnamed975(core.List<api.MetadataItems> o) {
+checkUnnamed514(core.List<api.MetadataItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItems(o[0]);
   checkMetadataItems(o[1]);
@@ -2380,7 +2380,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed975();
+    o.items = buildUnnamed514();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -2391,7 +2391,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed975(o.items);
+    checkUnnamed514(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -2430,14 +2430,14 @@
   buildCounterNetwork--;
 }
 
-buildUnnamed976() {
+buildUnnamed515() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed976(core.List<api.AccessConfig> o) {
+checkUnnamed515(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
@@ -2448,7 +2448,7 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed976();
+    o.accessConfigs = buildUnnamed515();
     o.name = "foo";
     o.network = "foo";
     o.networkIP = "foo";
@@ -2460,7 +2460,7 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed976(o.accessConfigs);
+    checkUnnamed515(o.accessConfigs);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.networkIP, unittest.equals('foo'));
@@ -2468,14 +2468,14 @@
   buildCounterNetworkInterface--;
 }
 
-buildUnnamed977() {
+buildUnnamed516() {
   var o = new core.List<api.Network>();
   o.add(buildNetwork());
   o.add(buildNetwork());
   return o;
 }
 
-checkUnnamed977(core.List<api.Network> o) {
+checkUnnamed516(core.List<api.Network> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetwork(o[0]);
   checkNetwork(o[1]);
@@ -2487,7 +2487,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed977();
+    o.items = buildUnnamed516();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2500,7 +2500,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed977(o.items);
+    checkUnnamed516(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2531,14 +2531,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed978() {
+buildUnnamed517() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed978(core.List<api.OperationErrorErrors> o) {
+checkUnnamed517(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -2549,7 +2549,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed978();
+    o.errors = buildUnnamed517();
   }
   buildCounterOperationError--;
   return o;
@@ -2558,7 +2558,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed978(o.errors);
+    checkUnnamed517(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -2584,14 +2584,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed979() {
+buildUnnamed518() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed979(core.List<api.OperationWarningsData> o) {
+checkUnnamed518(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -2603,7 +2603,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed979();
+    o.data = buildUnnamed518();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -2614,20 +2614,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed979(o.data);
+    checkUnnamed518(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed980() {
+buildUnnamed519() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed980(core.List<api.OperationWarnings> o) {
+checkUnnamed519(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -2658,7 +2658,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed980();
+    o.warnings = buildUnnamed519();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -2688,20 +2688,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed980(o.warnings);
+    checkUnnamed519(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed981() {
+buildUnnamed520() {
   var o = new core.Map<core.String, api.OperationsScopedList>();
   o["x"] = buildOperationsScopedList();
   o["y"] = buildOperationsScopedList();
   return o;
 }
 
-checkUnnamed981(core.Map<core.String, api.OperationsScopedList> o) {
+checkUnnamed520(core.Map<core.String, api.OperationsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedList(o["x"]);
   checkOperationsScopedList(o["y"]);
@@ -2713,7 +2713,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed981();
+    o.items = buildUnnamed520();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2726,7 +2726,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed981(o.items);
+    checkUnnamed520(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2734,14 +2734,14 @@
   buildCounterOperationAggregatedList--;
 }
 
-buildUnnamed982() {
+buildUnnamed521() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed982(core.List<api.Operation> o) {
+checkUnnamed521(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -2753,7 +2753,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed982();
+    o.items = buildUnnamed521();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2766,7 +2766,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed982(o.items);
+    checkUnnamed521(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2774,14 +2774,14 @@
   buildCounterOperationList--;
 }
 
-buildUnnamed983() {
+buildUnnamed522() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed983(core.List<api.Operation> o) {
+checkUnnamed522(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -2808,14 +2808,14 @@
   buildCounterOperationsScopedListWarningData--;
 }
 
-buildUnnamed984() {
+buildUnnamed523() {
   var o = new core.List<api.OperationsScopedListWarningData>();
   o.add(buildOperationsScopedListWarningData());
   o.add(buildOperationsScopedListWarningData());
   return o;
 }
 
-checkUnnamed984(core.List<api.OperationsScopedListWarningData> o) {
+checkUnnamed523(core.List<api.OperationsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedListWarningData(o[0]);
   checkOperationsScopedListWarningData(o[1]);
@@ -2827,7 +2827,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed984();
+    o.data = buildUnnamed523();
     o.message = "foo";
   }
   buildCounterOperationsScopedListWarning--;
@@ -2838,7 +2838,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed984(o.data);
+    checkUnnamed523(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationsScopedListWarning--;
@@ -2849,7 +2849,7 @@
   var o = new api.OperationsScopedList();
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    o.operations = buildUnnamed983();
+    o.operations = buildUnnamed522();
     o.warning = buildOperationsScopedListWarning();
   }
   buildCounterOperationsScopedList--;
@@ -2859,20 +2859,20 @@
 checkOperationsScopedList(api.OperationsScopedList o) {
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    checkUnnamed983(o.operations);
+    checkUnnamed522(o.operations);
     checkOperationsScopedListWarning(o.warning);
   }
   buildCounterOperationsScopedList--;
 }
 
-buildUnnamed985() {
+buildUnnamed524() {
   var o = new core.List<api.PathRule>();
   o.add(buildPathRule());
   o.add(buildPathRule());
   return o;
 }
 
-checkUnnamed985(core.List<api.PathRule> o) {
+checkUnnamed524(core.List<api.PathRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathRule(o[0]);
   checkPathRule(o[1]);
@@ -2886,7 +2886,7 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.name = "foo";
-    o.pathRules = buildUnnamed985();
+    o.pathRules = buildUnnamed524();
   }
   buildCounterPathMatcher--;
   return o;
@@ -2898,19 +2898,19 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed985(o.pathRules);
+    checkUnnamed524(o.pathRules);
   }
   buildCounterPathMatcher--;
 }
 
-buildUnnamed986() {
+buildUnnamed525() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed986(core.List<core.String> o) {
+checkUnnamed525(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2921,7 +2921,7 @@
   var o = new api.PathRule();
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    o.paths = buildUnnamed986();
+    o.paths = buildUnnamed525();
     o.service = "foo";
   }
   buildCounterPathRule--;
@@ -2931,20 +2931,20 @@
 checkPathRule(api.PathRule o) {
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    checkUnnamed986(o.paths);
+    checkUnnamed525(o.paths);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterPathRule--;
 }
 
-buildUnnamed987() {
+buildUnnamed526() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed987(core.List<api.Quota> o) {
+checkUnnamed526(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
@@ -2961,7 +2961,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed987();
+    o.quotas = buildUnnamed526();
     o.selfLink = "foo";
     o.usageExportLocation = buildUsageExportLocation();
   }
@@ -2978,7 +2978,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed987(o.quotas);
+    checkUnnamed526(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUsageExportLocation(o.usageExportLocation);
   }
@@ -3008,27 +3008,27 @@
   buildCounterQuota--;
 }
 
-buildUnnamed988() {
+buildUnnamed527() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed988(core.List<api.Quota> o) {
+checkUnnamed527(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
 }
 
-buildUnnamed989() {
+buildUnnamed528() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed989(core.List<core.String> o) {
+checkUnnamed528(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3045,10 +3045,10 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed988();
+    o.quotas = buildUnnamed527();
     o.selfLink = "foo";
     o.status = "foo";
-    o.zones = buildUnnamed989();
+    o.zones = buildUnnamed528();
   }
   buildCounterRegion--;
   return o;
@@ -3063,22 +3063,22 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed988(o.quotas);
+    checkUnnamed527(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed989(o.zones);
+    checkUnnamed528(o.zones);
   }
   buildCounterRegion--;
 }
 
-buildUnnamed990() {
+buildUnnamed529() {
   var o = new core.List<api.Region>();
   o.add(buildRegion());
   o.add(buildRegion());
   return o;
 }
 
-checkUnnamed990(core.List<api.Region> o) {
+checkUnnamed529(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegion(o[0]);
   checkRegion(o[1]);
@@ -3090,7 +3090,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed990();
+    o.items = buildUnnamed529();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3103,7 +3103,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed990(o.items);
+    checkUnnamed529(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3130,14 +3130,14 @@
   buildCounterResourceGroupReference--;
 }
 
-buildUnnamed991() {
+buildUnnamed530() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed991(core.List<core.String> o) {
+checkUnnamed530(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3164,14 +3164,14 @@
   buildCounterRouteWarningsData--;
 }
 
-buildUnnamed992() {
+buildUnnamed531() {
   var o = new core.List<api.RouteWarningsData>();
   o.add(buildRouteWarningsData());
   o.add(buildRouteWarningsData());
   return o;
 }
 
-checkUnnamed992(core.List<api.RouteWarningsData> o) {
+checkUnnamed531(core.List<api.RouteWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarningsData(o[0]);
   checkRouteWarningsData(o[1]);
@@ -3183,7 +3183,7 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed992();
+    o.data = buildUnnamed531();
     o.message = "foo";
   }
   buildCounterRouteWarnings--;
@@ -3194,20 +3194,20 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed992(o.data);
+    checkUnnamed531(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRouteWarnings--;
 }
 
-buildUnnamed993() {
+buildUnnamed532() {
   var o = new core.List<api.RouteWarnings>();
   o.add(buildRouteWarnings());
   o.add(buildRouteWarnings());
   return o;
 }
 
-checkUnnamed993(core.List<api.RouteWarnings> o) {
+checkUnnamed532(core.List<api.RouteWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarnings(o[0]);
   checkRouteWarnings(o[1]);
@@ -3231,8 +3231,8 @@
     o.nextHopNetwork = "foo";
     o.priority = 42;
     o.selfLink = "foo";
-    o.tags = buildUnnamed991();
-    o.warnings = buildUnnamed993();
+    o.tags = buildUnnamed530();
+    o.warnings = buildUnnamed532();
   }
   buildCounterRoute--;
   return o;
@@ -3254,20 +3254,20 @@
     unittest.expect(o.nextHopNetwork, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed991(o.tags);
-    checkUnnamed993(o.warnings);
+    checkUnnamed530(o.tags);
+    checkUnnamed532(o.warnings);
   }
   buildCounterRoute--;
 }
 
-buildUnnamed994() {
+buildUnnamed533() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed994(core.List<api.Route> o) {
+checkUnnamed533(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
@@ -3279,7 +3279,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed994();
+    o.items = buildUnnamed533();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3292,7 +3292,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed994(o.items);
+    checkUnnamed533(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3344,14 +3344,14 @@
   buildCounterSerialPortOutput--;
 }
 
-buildUnnamed995() {
+buildUnnamed534() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed995(core.List<core.String> o) {
+checkUnnamed534(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3363,7 +3363,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed995();
+    o.scopes = buildUnnamed534();
   }
   buildCounterServiceAccount--;
   return o;
@@ -3373,19 +3373,19 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed995(o.scopes);
+    checkUnnamed534(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed996() {
+buildUnnamed535() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed996(core.List<core.String> o) {
+checkUnnamed535(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3401,7 +3401,7 @@
     o.diskSizeGb = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed996();
+    o.licenses = buildUnnamed535();
     o.name = "foo";
     o.selfLink = "foo";
     o.sourceDisk = "foo";
@@ -3422,7 +3422,7 @@
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed996(o.licenses);
+    checkUnnamed535(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sourceDisk, unittest.equals('foo'));
@@ -3434,14 +3434,14 @@
   buildCounterSnapshot--;
 }
 
-buildUnnamed997() {
+buildUnnamed536() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed997(core.List<api.Snapshot> o) {
+checkUnnamed536(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -3453,7 +3453,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed997();
+    o.items = buildUnnamed536();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3466,7 +3466,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed997(o.items);
+    checkUnnamed536(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3474,14 +3474,14 @@
   buildCounterSnapshotList--;
 }
 
-buildUnnamed998() {
+buildUnnamed537() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed998(core.List<core.String> o) {
+checkUnnamed537(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3493,7 +3493,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed998();
+    o.items = buildUnnamed537();
   }
   buildCounterTags--;
   return o;
@@ -3503,7 +3503,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed998(o.items);
+    checkUnnamed537(o.items);
   }
   buildCounterTags--;
 }
@@ -3539,14 +3539,14 @@
   buildCounterTargetHttpProxy--;
 }
 
-buildUnnamed999() {
+buildUnnamed538() {
   var o = new core.List<api.TargetHttpProxy>();
   o.add(buildTargetHttpProxy());
   o.add(buildTargetHttpProxy());
   return o;
 }
 
-checkUnnamed999(core.List<api.TargetHttpProxy> o) {
+checkUnnamed538(core.List<api.TargetHttpProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetHttpProxy(o[0]);
   checkTargetHttpProxy(o[1]);
@@ -3558,7 +3558,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed999();
+    o.items = buildUnnamed538();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3571,7 +3571,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed999(o.items);
+    checkUnnamed538(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3614,14 +3614,14 @@
   buildCounterTargetInstance--;
 }
 
-buildUnnamed1000() {
+buildUnnamed539() {
   var o = new core.Map<core.String, api.TargetInstancesScopedList>();
   o["x"] = buildTargetInstancesScopedList();
   o["y"] = buildTargetInstancesScopedList();
   return o;
 }
 
-checkUnnamed1000(core.Map<core.String, api.TargetInstancesScopedList> o) {
+checkUnnamed539(core.Map<core.String, api.TargetInstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedList(o["x"]);
   checkTargetInstancesScopedList(o["y"]);
@@ -3633,7 +3633,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1000();
+    o.items = buildUnnamed539();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3646,7 +3646,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1000(o.items);
+    checkUnnamed539(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3654,14 +3654,14 @@
   buildCounterTargetInstanceAggregatedList--;
 }
 
-buildUnnamed1001() {
+buildUnnamed540() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed1001(core.List<api.TargetInstance> o) {
+checkUnnamed540(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -3673,7 +3673,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1001();
+    o.items = buildUnnamed540();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3686,7 +3686,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1001(o.items);
+    checkUnnamed540(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3694,14 +3694,14 @@
   buildCounterTargetInstanceList--;
 }
 
-buildUnnamed1002() {
+buildUnnamed541() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed1002(core.List<api.TargetInstance> o) {
+checkUnnamed541(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -3728,14 +3728,14 @@
   buildCounterTargetInstancesScopedListWarningData--;
 }
 
-buildUnnamed1003() {
+buildUnnamed542() {
   var o = new core.List<api.TargetInstancesScopedListWarningData>();
   o.add(buildTargetInstancesScopedListWarningData());
   o.add(buildTargetInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed1003(core.List<api.TargetInstancesScopedListWarningData> o) {
+checkUnnamed542(core.List<api.TargetInstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedListWarningData(o[0]);
   checkTargetInstancesScopedListWarningData(o[1]);
@@ -3747,7 +3747,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed1003();
+    o.data = buildUnnamed542();
     o.message = "foo";
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -3758,7 +3758,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed1003(o.data);
+    checkUnnamed542(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -3769,7 +3769,7 @@
   var o = new api.TargetInstancesScopedList();
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    o.targetInstances = buildUnnamed1002();
+    o.targetInstances = buildUnnamed541();
     o.warning = buildTargetInstancesScopedListWarning();
   }
   buildCounterTargetInstancesScopedList--;
@@ -3779,33 +3779,33 @@
 checkTargetInstancesScopedList(api.TargetInstancesScopedList o) {
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    checkUnnamed1002(o.targetInstances);
+    checkUnnamed541(o.targetInstances);
     checkTargetInstancesScopedListWarning(o.warning);
   }
   buildCounterTargetInstancesScopedList--;
 }
 
-buildUnnamed1004() {
+buildUnnamed543() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1004(core.List<core.String> o) {
+checkUnnamed543(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1005() {
+buildUnnamed544() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1005(core.List<core.String> o) {
+checkUnnamed544(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3820,9 +3820,9 @@
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.failoverRatio = 42.0;
-    o.healthChecks = buildUnnamed1004();
+    o.healthChecks = buildUnnamed543();
     o.id = "foo";
-    o.instances = buildUnnamed1005();
+    o.instances = buildUnnamed544();
     o.kind = "foo";
     o.name = "foo";
     o.region = "foo";
@@ -3840,9 +3840,9 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.failoverRatio, unittest.equals(42.0));
-    checkUnnamed1004(o.healthChecks);
+    checkUnnamed543(o.healthChecks);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1005(o.instances);
+    checkUnnamed544(o.instances);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
@@ -3852,14 +3852,14 @@
   buildCounterTargetPool--;
 }
 
-buildUnnamed1006() {
+buildUnnamed545() {
   var o = new core.Map<core.String, api.TargetPoolsScopedList>();
   o["x"] = buildTargetPoolsScopedList();
   o["y"] = buildTargetPoolsScopedList();
   return o;
 }
 
-checkUnnamed1006(core.Map<core.String, api.TargetPoolsScopedList> o) {
+checkUnnamed545(core.Map<core.String, api.TargetPoolsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedList(o["x"]);
   checkTargetPoolsScopedList(o["y"]);
@@ -3871,7 +3871,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1006();
+    o.items = buildUnnamed545();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3884,7 +3884,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1006(o.items);
+    checkUnnamed545(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3892,14 +3892,14 @@
   buildCounterTargetPoolAggregatedList--;
 }
 
-buildUnnamed1007() {
+buildUnnamed546() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed1007(core.List<api.HealthStatus> o) {
+checkUnnamed546(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -3910,7 +3910,7 @@
   var o = new api.TargetPoolInstanceHealth();
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    o.healthStatus = buildUnnamed1007();
+    o.healthStatus = buildUnnamed546();
     o.kind = "foo";
   }
   buildCounterTargetPoolInstanceHealth--;
@@ -3920,20 +3920,20 @@
 checkTargetPoolInstanceHealth(api.TargetPoolInstanceHealth o) {
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    checkUnnamed1007(o.healthStatus);
+    checkUnnamed546(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTargetPoolInstanceHealth--;
 }
 
-buildUnnamed1008() {
+buildUnnamed547() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed1008(core.List<api.TargetPool> o) {
+checkUnnamed547(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -3945,7 +3945,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1008();
+    o.items = buildUnnamed547();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3958,7 +3958,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1008(o.items);
+    checkUnnamed547(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3966,14 +3966,14 @@
   buildCounterTargetPoolList--;
 }
 
-buildUnnamed1009() {
+buildUnnamed548() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed1009(core.List<api.HealthCheckReference> o) {
+checkUnnamed548(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -3984,7 +3984,7 @@
   var o = new api.TargetPoolsAddHealthCheckRequest();
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed1009();
+    o.healthChecks = buildUnnamed548();
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
   return o;
@@ -3993,19 +3993,19 @@
 checkTargetPoolsAddHealthCheckRequest(api.TargetPoolsAddHealthCheckRequest o) {
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    checkUnnamed1009(o.healthChecks);
+    checkUnnamed548(o.healthChecks);
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
 }
 
-buildUnnamed1010() {
+buildUnnamed549() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed1010(core.List<api.InstanceReference> o) {
+checkUnnamed549(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -4016,7 +4016,7 @@
   var o = new api.TargetPoolsAddInstanceRequest();
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    o.instances = buildUnnamed1010();
+    o.instances = buildUnnamed549();
   }
   buildCounterTargetPoolsAddInstanceRequest--;
   return o;
@@ -4025,19 +4025,19 @@
 checkTargetPoolsAddInstanceRequest(api.TargetPoolsAddInstanceRequest o) {
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    checkUnnamed1010(o.instances);
+    checkUnnamed549(o.instances);
   }
   buildCounterTargetPoolsAddInstanceRequest--;
 }
 
-buildUnnamed1011() {
+buildUnnamed550() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed1011(core.List<api.HealthCheckReference> o) {
+checkUnnamed550(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -4048,7 +4048,7 @@
   var o = new api.TargetPoolsRemoveHealthCheckRequest();
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed1011();
+    o.healthChecks = buildUnnamed550();
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
   return o;
@@ -4057,19 +4057,19 @@
 checkTargetPoolsRemoveHealthCheckRequest(api.TargetPoolsRemoveHealthCheckRequest o) {
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    checkUnnamed1011(o.healthChecks);
+    checkUnnamed550(o.healthChecks);
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
 }
 
-buildUnnamed1012() {
+buildUnnamed551() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed1012(core.List<api.InstanceReference> o) {
+checkUnnamed551(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -4080,7 +4080,7 @@
   var o = new api.TargetPoolsRemoveInstanceRequest();
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    o.instances = buildUnnamed1012();
+    o.instances = buildUnnamed551();
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
   return o;
@@ -4089,19 +4089,19 @@
 checkTargetPoolsRemoveInstanceRequest(api.TargetPoolsRemoveInstanceRequest o) {
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    checkUnnamed1012(o.instances);
+    checkUnnamed551(o.instances);
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
 }
 
-buildUnnamed1013() {
+buildUnnamed552() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed1013(core.List<api.TargetPool> o) {
+checkUnnamed552(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -4128,14 +4128,14 @@
   buildCounterTargetPoolsScopedListWarningData--;
 }
 
-buildUnnamed1014() {
+buildUnnamed553() {
   var o = new core.List<api.TargetPoolsScopedListWarningData>();
   o.add(buildTargetPoolsScopedListWarningData());
   o.add(buildTargetPoolsScopedListWarningData());
   return o;
 }
 
-checkUnnamed1014(core.List<api.TargetPoolsScopedListWarningData> o) {
+checkUnnamed553(core.List<api.TargetPoolsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedListWarningData(o[0]);
   checkTargetPoolsScopedListWarningData(o[1]);
@@ -4147,7 +4147,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed1014();
+    o.data = buildUnnamed553();
     o.message = "foo";
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -4158,7 +4158,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed1014(o.data);
+    checkUnnamed553(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -4169,7 +4169,7 @@
   var o = new api.TargetPoolsScopedList();
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    o.targetPools = buildUnnamed1013();
+    o.targetPools = buildUnnamed552();
     o.warning = buildTargetPoolsScopedListWarning();
   }
   buildCounterTargetPoolsScopedList--;
@@ -4179,7 +4179,7 @@
 checkTargetPoolsScopedList(api.TargetPoolsScopedList o) {
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    checkUnnamed1013(o.targetPools);
+    checkUnnamed552(o.targetPools);
     checkTargetPoolsScopedListWarning(o.warning);
   }
   buildCounterTargetPoolsScopedList--;
@@ -4229,40 +4229,40 @@
   buildCounterTestFailure--;
 }
 
-buildUnnamed1015() {
+buildUnnamed554() {
   var o = new core.List<api.HostRule>();
   o.add(buildHostRule());
   o.add(buildHostRule());
   return o;
 }
 
-checkUnnamed1015(core.List<api.HostRule> o) {
+checkUnnamed554(core.List<api.HostRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHostRule(o[0]);
   checkHostRule(o[1]);
 }
 
-buildUnnamed1016() {
+buildUnnamed555() {
   var o = new core.List<api.PathMatcher>();
   o.add(buildPathMatcher());
   o.add(buildPathMatcher());
   return o;
 }
 
-checkUnnamed1016(core.List<api.PathMatcher> o) {
+checkUnnamed555(core.List<api.PathMatcher> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathMatcher(o[0]);
   checkPathMatcher(o[1]);
 }
 
-buildUnnamed1017() {
+buildUnnamed556() {
   var o = new core.List<api.UrlMapTest>();
   o.add(buildUrlMapTest());
   o.add(buildUrlMapTest());
   return o;
 }
 
-checkUnnamed1017(core.List<api.UrlMapTest> o) {
+checkUnnamed556(core.List<api.UrlMapTest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMapTest(o[0]);
   checkUrlMapTest(o[1]);
@@ -4277,13 +4277,13 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.fingerprint = "foo";
-    o.hostRules = buildUnnamed1015();
+    o.hostRules = buildUnnamed554();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.pathMatchers = buildUnnamed1016();
+    o.pathMatchers = buildUnnamed555();
     o.selfLink = "foo";
-    o.tests = buildUnnamed1017();
+    o.tests = buildUnnamed556();
   }
   buildCounterUrlMap--;
   return o;
@@ -4296,25 +4296,25 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed1015(o.hostRules);
+    checkUnnamed554(o.hostRules);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1016(o.pathMatchers);
+    checkUnnamed555(o.pathMatchers);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed1017(o.tests);
+    checkUnnamed556(o.tests);
   }
   buildCounterUrlMap--;
 }
 
-buildUnnamed1018() {
+buildUnnamed557() {
   var o = new core.List<api.UrlMap>();
   o.add(buildUrlMap());
   o.add(buildUrlMap());
   return o;
 }
 
-checkUnnamed1018(core.List<api.UrlMap> o) {
+checkUnnamed557(core.List<api.UrlMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMap(o[0]);
   checkUrlMap(o[1]);
@@ -4326,7 +4326,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1018();
+    o.items = buildUnnamed557();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4339,7 +4339,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1018(o.items);
+    checkUnnamed557(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4391,27 +4391,27 @@
   buildCounterUrlMapTest--;
 }
 
-buildUnnamed1019() {
+buildUnnamed558() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1019(core.List<core.String> o) {
+checkUnnamed558(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1020() {
+buildUnnamed559() {
   var o = new core.List<api.TestFailure>();
   o.add(buildTestFailure());
   o.add(buildTestFailure());
   return o;
 }
 
-checkUnnamed1020(core.List<api.TestFailure> o) {
+checkUnnamed559(core.List<api.TestFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestFailure(o[0]);
   checkTestFailure(o[1]);
@@ -4422,9 +4422,9 @@
   var o = new api.UrlMapValidationResult();
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    o.loadErrors = buildUnnamed1019();
+    o.loadErrors = buildUnnamed558();
     o.loadSucceeded = true;
-    o.testFailures = buildUnnamed1020();
+    o.testFailures = buildUnnamed559();
     o.testPassed = true;
   }
   buildCounterUrlMapValidationResult--;
@@ -4434,9 +4434,9 @@
 checkUrlMapValidationResult(api.UrlMapValidationResult o) {
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    checkUnnamed1019(o.loadErrors);
+    checkUnnamed558(o.loadErrors);
     unittest.expect(o.loadSucceeded, unittest.isTrue);
-    checkUnnamed1020(o.testFailures);
+    checkUnnamed559(o.testFailures);
     unittest.expect(o.testPassed, unittest.isTrue);
   }
   buildCounterUrlMapValidationResult--;
@@ -4526,14 +4526,14 @@
   buildCounterZoneMaintenanceWindows--;
 }
 
-buildUnnamed1021() {
+buildUnnamed560() {
   var o = new core.List<api.ZoneMaintenanceWindows>();
   o.add(buildZoneMaintenanceWindows());
   o.add(buildZoneMaintenanceWindows());
   return o;
 }
 
-checkUnnamed1021(core.List<api.ZoneMaintenanceWindows> o) {
+checkUnnamed560(core.List<api.ZoneMaintenanceWindows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZoneMaintenanceWindows(o[0]);
   checkZoneMaintenanceWindows(o[1]);
@@ -4549,7 +4549,7 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.maintenanceWindows = buildUnnamed1021();
+    o.maintenanceWindows = buildUnnamed560();
     o.name = "foo";
     o.region = "foo";
     o.selfLink = "foo";
@@ -4567,7 +4567,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1021(o.maintenanceWindows);
+    checkUnnamed560(o.maintenanceWindows);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4576,14 +4576,14 @@
   buildCounterZone--;
 }
 
-buildUnnamed1022() {
+buildUnnamed561() {
   var o = new core.List<api.Zone>();
   o.add(buildZone());
   o.add(buildZone());
   return o;
 }
 
-checkUnnamed1022(core.List<api.Zone> o) {
+checkUnnamed561(core.List<api.Zone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZone(o[0]);
   checkZone(o[1]);
@@ -4595,7 +4595,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1022();
+    o.items = buildUnnamed561();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4608,7 +4608,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1022(o.items);
+    checkUnnamed561(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
diff --git a/generated/googleapis/test/content/v2_test.dart b/generated/googleapis/test/content/v2_test.dart
index 548e58c..22ce25d 100644
--- a/generated/googleapis/test/content/v2_test.dart
+++ b/generated/googleapis/test/content/v2_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed297() {
+buildUnnamed562() {
   var o = new core.List<api.AccountAdwordsLink>();
   o.add(buildAccountAdwordsLink());
   o.add(buildAccountAdwordsLink());
   return o;
 }
 
-checkUnnamed297(core.List<api.AccountAdwordsLink> o) {
+checkUnnamed562(core.List<api.AccountAdwordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountAdwordsLink(o[0]);
   checkAccountAdwordsLink(o[1]);
 }
 
-buildUnnamed298() {
+buildUnnamed563() {
   var o = new core.List<api.AccountUser>();
   o.add(buildAccountUser());
   o.add(buildAccountUser());
   return o;
 }
 
-checkUnnamed298(core.List<api.AccountUser> o) {
+checkUnnamed563(core.List<api.AccountUser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountUser(o[0]);
   checkAccountUser(o[1]);
@@ -48,13 +48,13 @@
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
     o.adultContent = true;
-    o.adwordsLinks = buildUnnamed297();
+    o.adwordsLinks = buildUnnamed562();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
     o.reviewsUrl = "foo";
     o.sellerId = "foo";
-    o.users = buildUnnamed298();
+    o.users = buildUnnamed563();
     o.websiteUrl = "foo";
   }
   buildCounterAccount--;
@@ -65,13 +65,13 @@
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
     unittest.expect(o.adultContent, unittest.isTrue);
-    checkUnnamed297(o.adwordsLinks);
+    checkUnnamed562(o.adwordsLinks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.reviewsUrl, unittest.equals('foo'));
     unittest.expect(o.sellerId, unittest.equals('foo'));
-    checkUnnamed298(o.users);
+    checkUnnamed563(o.users);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterAccount--;
@@ -98,14 +98,14 @@
   buildCounterAccountAdwordsLink--;
 }
 
-buildUnnamed299() {
+buildUnnamed564() {
   var o = new core.List<api.AccountStatusDataQualityIssue>();
   o.add(buildAccountStatusDataQualityIssue());
   o.add(buildAccountStatusDataQualityIssue());
   return o;
 }
 
-checkUnnamed299(core.List<api.AccountStatusDataQualityIssue> o) {
+checkUnnamed564(core.List<api.AccountStatusDataQualityIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatusDataQualityIssue(o[0]);
   checkAccountStatusDataQualityIssue(o[1]);
@@ -117,7 +117,7 @@
   buildCounterAccountStatus++;
   if (buildCounterAccountStatus < 3) {
     o.accountId = "foo";
-    o.dataQualityIssues = buildUnnamed299();
+    o.dataQualityIssues = buildUnnamed564();
     o.kind = "foo";
   }
   buildCounterAccountStatus--;
@@ -128,20 +128,20 @@
   buildCounterAccountStatus++;
   if (buildCounterAccountStatus < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed299(o.dataQualityIssues);
+    checkUnnamed564(o.dataQualityIssues);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountStatus--;
 }
 
-buildUnnamed300() {
+buildUnnamed565() {
   var o = new core.List<api.AccountStatusExampleItem>();
   o.add(buildAccountStatusExampleItem());
   o.add(buildAccountStatusExampleItem());
   return o;
 }
 
-checkUnnamed300(core.List<api.AccountStatusExampleItem> o) {
+checkUnnamed565(core.List<api.AccountStatusExampleItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatusExampleItem(o[0]);
   checkAccountStatusExampleItem(o[1]);
@@ -154,7 +154,7 @@
   if (buildCounterAccountStatusDataQualityIssue < 3) {
     o.country = "foo";
     o.displayedValue = "foo";
-    o.exampleItems = buildUnnamed300();
+    o.exampleItems = buildUnnamed565();
     o.id = "foo";
     o.lastChecked = "foo";
     o.numItems = 42;
@@ -170,7 +170,7 @@
   if (buildCounterAccountStatusDataQualityIssue < 3) {
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.displayedValue, unittest.equals('foo'));
-    checkUnnamed300(o.exampleItems);
+    checkUnnamed565(o.exampleItems);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastChecked, unittest.equals('foo'));
     unittest.expect(o.numItems, unittest.equals(42));
@@ -228,14 +228,14 @@
   buildCounterAccountUser--;
 }
 
-buildUnnamed301() {
+buildUnnamed566() {
   var o = new core.List<api.AccountsCustomBatchRequestEntry>();
   o.add(buildAccountsCustomBatchRequestEntry());
   o.add(buildAccountsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed301(core.List<api.AccountsCustomBatchRequestEntry> o) {
+checkUnnamed566(core.List<api.AccountsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountsCustomBatchRequestEntry(o[0]);
   checkAccountsCustomBatchRequestEntry(o[1]);
@@ -246,7 +246,7 @@
   var o = new api.AccountsCustomBatchRequest();
   buildCounterAccountsCustomBatchRequest++;
   if (buildCounterAccountsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed301();
+    o.entries = buildUnnamed566();
   }
   buildCounterAccountsCustomBatchRequest--;
   return o;
@@ -255,7 +255,7 @@
 checkAccountsCustomBatchRequest(api.AccountsCustomBatchRequest o) {
   buildCounterAccountsCustomBatchRequest++;
   if (buildCounterAccountsCustomBatchRequest < 3) {
-    checkUnnamed301(o.entries);
+    checkUnnamed566(o.entries);
   }
   buildCounterAccountsCustomBatchRequest--;
 }
@@ -287,14 +287,14 @@
   buildCounterAccountsCustomBatchRequestEntry--;
 }
 
-buildUnnamed302() {
+buildUnnamed567() {
   var o = new core.List<api.AccountsCustomBatchResponseEntry>();
   o.add(buildAccountsCustomBatchResponseEntry());
   o.add(buildAccountsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed302(core.List<api.AccountsCustomBatchResponseEntry> o) {
+checkUnnamed567(core.List<api.AccountsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountsCustomBatchResponseEntry(o[0]);
   checkAccountsCustomBatchResponseEntry(o[1]);
@@ -305,7 +305,7 @@
   var o = new api.AccountsCustomBatchResponse();
   buildCounterAccountsCustomBatchResponse++;
   if (buildCounterAccountsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed302();
+    o.entries = buildUnnamed567();
     o.kind = "foo";
   }
   buildCounterAccountsCustomBatchResponse--;
@@ -315,7 +315,7 @@
 checkAccountsCustomBatchResponse(api.AccountsCustomBatchResponse o) {
   buildCounterAccountsCustomBatchResponse++;
   if (buildCounterAccountsCustomBatchResponse < 3) {
-    checkUnnamed302(o.entries);
+    checkUnnamed567(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsCustomBatchResponse--;
@@ -346,14 +346,14 @@
   buildCounterAccountsCustomBatchResponseEntry--;
 }
 
-buildUnnamed303() {
+buildUnnamed568() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed303(core.List<api.Account> o) {
+checkUnnamed568(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -366,7 +366,7 @@
   if (buildCounterAccountsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed303();
+    o.resources = buildUnnamed568();
   }
   buildCounterAccountsListResponse--;
   return o;
@@ -377,19 +377,19 @@
   if (buildCounterAccountsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed303(o.resources);
+    checkUnnamed568(o.resources);
   }
   buildCounterAccountsListResponse--;
 }
 
-buildUnnamed304() {
+buildUnnamed569() {
   var o = new core.List<api.AccountstatusesCustomBatchRequestEntry>();
   o.add(buildAccountstatusesCustomBatchRequestEntry());
   o.add(buildAccountstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed304(core.List<api.AccountstatusesCustomBatchRequestEntry> o) {
+checkUnnamed569(core.List<api.AccountstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountstatusesCustomBatchRequestEntry(o[0]);
   checkAccountstatusesCustomBatchRequestEntry(o[1]);
@@ -400,7 +400,7 @@
   var o = new api.AccountstatusesCustomBatchRequest();
   buildCounterAccountstatusesCustomBatchRequest++;
   if (buildCounterAccountstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed304();
+    o.entries = buildUnnamed569();
   }
   buildCounterAccountstatusesCustomBatchRequest--;
   return o;
@@ -409,7 +409,7 @@
 checkAccountstatusesCustomBatchRequest(api.AccountstatusesCustomBatchRequest o) {
   buildCounterAccountstatusesCustomBatchRequest++;
   if (buildCounterAccountstatusesCustomBatchRequest < 3) {
-    checkUnnamed304(o.entries);
+    checkUnnamed569(o.entries);
   }
   buildCounterAccountstatusesCustomBatchRequest--;
 }
@@ -439,14 +439,14 @@
   buildCounterAccountstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed305() {
+buildUnnamed570() {
   var o = new core.List<api.AccountstatusesCustomBatchResponseEntry>();
   o.add(buildAccountstatusesCustomBatchResponseEntry());
   o.add(buildAccountstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed305(core.List<api.AccountstatusesCustomBatchResponseEntry> o) {
+checkUnnamed570(core.List<api.AccountstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountstatusesCustomBatchResponseEntry(o[0]);
   checkAccountstatusesCustomBatchResponseEntry(o[1]);
@@ -457,7 +457,7 @@
   var o = new api.AccountstatusesCustomBatchResponse();
   buildCounterAccountstatusesCustomBatchResponse++;
   if (buildCounterAccountstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed305();
+    o.entries = buildUnnamed570();
     o.kind = "foo";
   }
   buildCounterAccountstatusesCustomBatchResponse--;
@@ -467,7 +467,7 @@
 checkAccountstatusesCustomBatchResponse(api.AccountstatusesCustomBatchResponse o) {
   buildCounterAccountstatusesCustomBatchResponse++;
   if (buildCounterAccountstatusesCustomBatchResponse < 3) {
-    checkUnnamed305(o.entries);
+    checkUnnamed570(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountstatusesCustomBatchResponse--;
@@ -496,14 +496,14 @@
   buildCounterAccountstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed306() {
+buildUnnamed571() {
   var o = new core.List<api.AccountStatus>();
   o.add(buildAccountStatus());
   o.add(buildAccountStatus());
   return o;
 }
 
-checkUnnamed306(core.List<api.AccountStatus> o) {
+checkUnnamed571(core.List<api.AccountStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatus(o[0]);
   checkAccountStatus(o[1]);
@@ -516,7 +516,7 @@
   if (buildCounterAccountstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed306();
+    o.resources = buildUnnamed571();
   }
   buildCounterAccountstatusesListResponse--;
   return o;
@@ -527,19 +527,19 @@
   if (buildCounterAccountstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed306(o.resources);
+    checkUnnamed571(o.resources);
   }
   buildCounterAccountstatusesListResponse--;
 }
 
-buildUnnamed307() {
+buildUnnamed572() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed307(core.List<core.String> o) {
+checkUnnamed572(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -557,7 +557,7 @@
     o.fileName = "foo";
     o.format = buildDatafeedFormat();
     o.id = "foo";
-    o.intendedDestinations = buildUnnamed307();
+    o.intendedDestinations = buildUnnamed572();
     o.kind = "foo";
     o.name = "foo";
     o.targetCountry = "foo";
@@ -576,7 +576,7 @@
     unittest.expect(o.fileName, unittest.equals('foo'));
     checkDatafeedFormat(o.format);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed307(o.intendedDestinations);
+    checkUnnamed572(o.intendedDestinations);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.targetCountry, unittest.equals('foo'));
@@ -638,27 +638,27 @@
   buildCounterDatafeedFormat--;
 }
 
-buildUnnamed308() {
+buildUnnamed573() {
   var o = new core.List<api.DatafeedStatusError>();
   o.add(buildDatafeedStatusError());
   o.add(buildDatafeedStatusError());
   return o;
 }
 
-checkUnnamed308(core.List<api.DatafeedStatusError> o) {
+checkUnnamed573(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusError(o[0]);
   checkDatafeedStatusError(o[1]);
 }
 
-buildUnnamed309() {
+buildUnnamed574() {
   var o = new core.List<api.DatafeedStatusError>();
   o.add(buildDatafeedStatusError());
   o.add(buildDatafeedStatusError());
   return o;
 }
 
-checkUnnamed309(core.List<api.DatafeedStatusError> o) {
+checkUnnamed574(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusError(o[0]);
   checkDatafeedStatusError(o[1]);
@@ -670,12 +670,12 @@
   buildCounterDatafeedStatus++;
   if (buildCounterDatafeedStatus < 3) {
     o.datafeedId = "foo";
-    o.errors = buildUnnamed308();
+    o.errors = buildUnnamed573();
     o.itemsTotal = "foo";
     o.itemsValid = "foo";
     o.kind = "foo";
     o.processingStatus = "foo";
-    o.warnings = buildUnnamed309();
+    o.warnings = buildUnnamed574();
   }
   buildCounterDatafeedStatus--;
   return o;
@@ -685,24 +685,24 @@
   buildCounterDatafeedStatus++;
   if (buildCounterDatafeedStatus < 3) {
     unittest.expect(o.datafeedId, unittest.equals('foo'));
-    checkUnnamed308(o.errors);
+    checkUnnamed573(o.errors);
     unittest.expect(o.itemsTotal, unittest.equals('foo'));
     unittest.expect(o.itemsValid, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.processingStatus, unittest.equals('foo'));
-    checkUnnamed309(o.warnings);
+    checkUnnamed574(o.warnings);
   }
   buildCounterDatafeedStatus--;
 }
 
-buildUnnamed310() {
+buildUnnamed575() {
   var o = new core.List<api.DatafeedStatusExample>();
   o.add(buildDatafeedStatusExample());
   o.add(buildDatafeedStatusExample());
   return o;
 }
 
-checkUnnamed310(core.List<api.DatafeedStatusExample> o) {
+checkUnnamed575(core.List<api.DatafeedStatusExample> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusExample(o[0]);
   checkDatafeedStatusExample(o[1]);
@@ -715,7 +715,7 @@
   if (buildCounterDatafeedStatusError < 3) {
     o.code = "foo";
     o.count = "foo";
-    o.examples = buildUnnamed310();
+    o.examples = buildUnnamed575();
     o.message = "foo";
   }
   buildCounterDatafeedStatusError--;
@@ -727,7 +727,7 @@
   if (buildCounterDatafeedStatusError < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
     unittest.expect(o.count, unittest.equals('foo'));
-    checkUnnamed310(o.examples);
+    checkUnnamed575(o.examples);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDatafeedStatusError--;
@@ -756,14 +756,14 @@
   buildCounterDatafeedStatusExample--;
 }
 
-buildUnnamed311() {
+buildUnnamed576() {
   var o = new core.List<api.DatafeedsCustomBatchRequestEntry>();
   o.add(buildDatafeedsCustomBatchRequestEntry());
   o.add(buildDatafeedsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed311(core.List<api.DatafeedsCustomBatchRequestEntry> o) {
+checkUnnamed576(core.List<api.DatafeedsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedsCustomBatchRequestEntry(o[0]);
   checkDatafeedsCustomBatchRequestEntry(o[1]);
@@ -774,7 +774,7 @@
   var o = new api.DatafeedsCustomBatchRequest();
   buildCounterDatafeedsCustomBatchRequest++;
   if (buildCounterDatafeedsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed311();
+    o.entries = buildUnnamed576();
   }
   buildCounterDatafeedsCustomBatchRequest--;
   return o;
@@ -783,7 +783,7 @@
 checkDatafeedsCustomBatchRequest(api.DatafeedsCustomBatchRequest o) {
   buildCounterDatafeedsCustomBatchRequest++;
   if (buildCounterDatafeedsCustomBatchRequest < 3) {
-    checkUnnamed311(o.entries);
+    checkUnnamed576(o.entries);
   }
   buildCounterDatafeedsCustomBatchRequest--;
 }
@@ -815,14 +815,14 @@
   buildCounterDatafeedsCustomBatchRequestEntry--;
 }
 
-buildUnnamed312() {
+buildUnnamed577() {
   var o = new core.List<api.DatafeedsCustomBatchResponseEntry>();
   o.add(buildDatafeedsCustomBatchResponseEntry());
   o.add(buildDatafeedsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed312(core.List<api.DatafeedsCustomBatchResponseEntry> o) {
+checkUnnamed577(core.List<api.DatafeedsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedsCustomBatchResponseEntry(o[0]);
   checkDatafeedsCustomBatchResponseEntry(o[1]);
@@ -833,7 +833,7 @@
   var o = new api.DatafeedsCustomBatchResponse();
   buildCounterDatafeedsCustomBatchResponse++;
   if (buildCounterDatafeedsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed312();
+    o.entries = buildUnnamed577();
     o.kind = "foo";
   }
   buildCounterDatafeedsCustomBatchResponse--;
@@ -843,7 +843,7 @@
 checkDatafeedsCustomBatchResponse(api.DatafeedsCustomBatchResponse o) {
   buildCounterDatafeedsCustomBatchResponse++;
   if (buildCounterDatafeedsCustomBatchResponse < 3) {
-    checkUnnamed312(o.entries);
+    checkUnnamed577(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDatafeedsCustomBatchResponse--;
@@ -872,14 +872,14 @@
   buildCounterDatafeedsCustomBatchResponseEntry--;
 }
 
-buildUnnamed313() {
+buildUnnamed578() {
   var o = new core.List<api.Datafeed>();
   o.add(buildDatafeed());
   o.add(buildDatafeed());
   return o;
 }
 
-checkUnnamed313(core.List<api.Datafeed> o) {
+checkUnnamed578(core.List<api.Datafeed> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeed(o[0]);
   checkDatafeed(o[1]);
@@ -892,7 +892,7 @@
   if (buildCounterDatafeedsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed313();
+    o.resources = buildUnnamed578();
   }
   buildCounterDatafeedsListResponse--;
   return o;
@@ -903,19 +903,19 @@
   if (buildCounterDatafeedsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed313(o.resources);
+    checkUnnamed578(o.resources);
   }
   buildCounterDatafeedsListResponse--;
 }
 
-buildUnnamed314() {
+buildUnnamed579() {
   var o = new core.List<api.DatafeedstatusesCustomBatchRequestEntry>();
   o.add(buildDatafeedstatusesCustomBatchRequestEntry());
   o.add(buildDatafeedstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed314(core.List<api.DatafeedstatusesCustomBatchRequestEntry> o) {
+checkUnnamed579(core.List<api.DatafeedstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedstatusesCustomBatchRequestEntry(o[0]);
   checkDatafeedstatusesCustomBatchRequestEntry(o[1]);
@@ -926,7 +926,7 @@
   var o = new api.DatafeedstatusesCustomBatchRequest();
   buildCounterDatafeedstatusesCustomBatchRequest++;
   if (buildCounterDatafeedstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed314();
+    o.entries = buildUnnamed579();
   }
   buildCounterDatafeedstatusesCustomBatchRequest--;
   return o;
@@ -935,7 +935,7 @@
 checkDatafeedstatusesCustomBatchRequest(api.DatafeedstatusesCustomBatchRequest o) {
   buildCounterDatafeedstatusesCustomBatchRequest++;
   if (buildCounterDatafeedstatusesCustomBatchRequest < 3) {
-    checkUnnamed314(o.entries);
+    checkUnnamed579(o.entries);
   }
   buildCounterDatafeedstatusesCustomBatchRequest--;
 }
@@ -965,14 +965,14 @@
   buildCounterDatafeedstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed315() {
+buildUnnamed580() {
   var o = new core.List<api.DatafeedstatusesCustomBatchResponseEntry>();
   o.add(buildDatafeedstatusesCustomBatchResponseEntry());
   o.add(buildDatafeedstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed315(core.List<api.DatafeedstatusesCustomBatchResponseEntry> o) {
+checkUnnamed580(core.List<api.DatafeedstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedstatusesCustomBatchResponseEntry(o[0]);
   checkDatafeedstatusesCustomBatchResponseEntry(o[1]);
@@ -983,7 +983,7 @@
   var o = new api.DatafeedstatusesCustomBatchResponse();
   buildCounterDatafeedstatusesCustomBatchResponse++;
   if (buildCounterDatafeedstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed315();
+    o.entries = buildUnnamed580();
     o.kind = "foo";
   }
   buildCounterDatafeedstatusesCustomBatchResponse--;
@@ -993,7 +993,7 @@
 checkDatafeedstatusesCustomBatchResponse(api.DatafeedstatusesCustomBatchResponse o) {
   buildCounterDatafeedstatusesCustomBatchResponse++;
   if (buildCounterDatafeedstatusesCustomBatchResponse < 3) {
-    checkUnnamed315(o.entries);
+    checkUnnamed580(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDatafeedstatusesCustomBatchResponse--;
@@ -1022,14 +1022,14 @@
   buildCounterDatafeedstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed316() {
+buildUnnamed581() {
   var o = new core.List<api.DatafeedStatus>();
   o.add(buildDatafeedStatus());
   o.add(buildDatafeedStatus());
   return o;
 }
 
-checkUnnamed316(core.List<api.DatafeedStatus> o) {
+checkUnnamed581(core.List<api.DatafeedStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatus(o[0]);
   checkDatafeedStatus(o[1]);
@@ -1042,7 +1042,7 @@
   if (buildCounterDatafeedstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed316();
+    o.resources = buildUnnamed581();
   }
   buildCounterDatafeedstatusesListResponse--;
   return o;
@@ -1053,7 +1053,7 @@
   if (buildCounterDatafeedstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed316(o.resources);
+    checkUnnamed581(o.resources);
   }
   buildCounterDatafeedstatusesListResponse--;
 }
@@ -1081,14 +1081,14 @@
   buildCounterError--;
 }
 
-buildUnnamed317() {
+buildUnnamed582() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed317(core.List<api.Error> o) {
+checkUnnamed582(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -1100,7 +1100,7 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     o.code = 42;
-    o.errors = buildUnnamed317();
+    o.errors = buildUnnamed582();
     o.message = "foo";
   }
   buildCounterErrors--;
@@ -1111,7 +1111,7 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed317(o.errors);
+    checkUnnamed582(o.errors);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterErrors--;
@@ -1146,14 +1146,14 @@
   buildCounterInventory--;
 }
 
-buildUnnamed318() {
+buildUnnamed583() {
   var o = new core.List<api.InventoryCustomBatchRequestEntry>();
   o.add(buildInventoryCustomBatchRequestEntry());
   o.add(buildInventoryCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed318(core.List<api.InventoryCustomBatchRequestEntry> o) {
+checkUnnamed583(core.List<api.InventoryCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryCustomBatchRequestEntry(o[0]);
   checkInventoryCustomBatchRequestEntry(o[1]);
@@ -1164,7 +1164,7 @@
   var o = new api.InventoryCustomBatchRequest();
   buildCounterInventoryCustomBatchRequest++;
   if (buildCounterInventoryCustomBatchRequest < 3) {
-    o.entries = buildUnnamed318();
+    o.entries = buildUnnamed583();
   }
   buildCounterInventoryCustomBatchRequest--;
   return o;
@@ -1173,7 +1173,7 @@
 checkInventoryCustomBatchRequest(api.InventoryCustomBatchRequest o) {
   buildCounterInventoryCustomBatchRequest++;
   if (buildCounterInventoryCustomBatchRequest < 3) {
-    checkUnnamed318(o.entries);
+    checkUnnamed583(o.entries);
   }
   buildCounterInventoryCustomBatchRequest--;
 }
@@ -1205,14 +1205,14 @@
   buildCounterInventoryCustomBatchRequestEntry--;
 }
 
-buildUnnamed319() {
+buildUnnamed584() {
   var o = new core.List<api.InventoryCustomBatchResponseEntry>();
   o.add(buildInventoryCustomBatchResponseEntry());
   o.add(buildInventoryCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed319(core.List<api.InventoryCustomBatchResponseEntry> o) {
+checkUnnamed584(core.List<api.InventoryCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryCustomBatchResponseEntry(o[0]);
   checkInventoryCustomBatchResponseEntry(o[1]);
@@ -1223,7 +1223,7 @@
   var o = new api.InventoryCustomBatchResponse();
   buildCounterInventoryCustomBatchResponse++;
   if (buildCounterInventoryCustomBatchResponse < 3) {
-    o.entries = buildUnnamed319();
+    o.entries = buildUnnamed584();
     o.kind = "foo";
   }
   buildCounterInventoryCustomBatchResponse--;
@@ -1233,7 +1233,7 @@
 checkInventoryCustomBatchResponse(api.InventoryCustomBatchResponse o) {
   buildCounterInventoryCustomBatchResponse++;
   if (buildCounterInventoryCustomBatchResponse < 3) {
-    checkUnnamed319(o.entries);
+    checkUnnamed584(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInventoryCustomBatchResponse--;
@@ -1352,131 +1352,131 @@
   buildCounterPrice--;
 }
 
-buildUnnamed320() {
+buildUnnamed585() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed320(core.List<core.String> o) {
+checkUnnamed585(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed321() {
+buildUnnamed586() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed321(core.List<core.String> o) {
+checkUnnamed586(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed322() {
+buildUnnamed587() {
   var o = new core.List<api.ProductCustomAttribute>();
   o.add(buildProductCustomAttribute());
   o.add(buildProductCustomAttribute());
   return o;
 }
 
-checkUnnamed322(core.List<api.ProductCustomAttribute> o) {
+checkUnnamed587(core.List<api.ProductCustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomAttribute(o[0]);
   checkProductCustomAttribute(o[1]);
 }
 
-buildUnnamed323() {
+buildUnnamed588() {
   var o = new core.List<api.ProductCustomGroup>();
   o.add(buildProductCustomGroup());
   o.add(buildProductCustomGroup());
   return o;
 }
 
-checkUnnamed323(core.List<api.ProductCustomGroup> o) {
+checkUnnamed588(core.List<api.ProductCustomGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomGroup(o[0]);
   checkProductCustomGroup(o[1]);
 }
 
-buildUnnamed324() {
+buildUnnamed589() {
   var o = new core.List<api.ProductDestination>();
   o.add(buildProductDestination());
   o.add(buildProductDestination());
   return o;
 }
 
-checkUnnamed324(core.List<api.ProductDestination> o) {
+checkUnnamed589(core.List<api.ProductDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductDestination(o[0]);
   checkProductDestination(o[1]);
 }
 
-buildUnnamed325() {
+buildUnnamed590() {
   var o = new core.List<api.ProductShipping>();
   o.add(buildProductShipping());
   o.add(buildProductShipping());
   return o;
 }
 
-checkUnnamed325(core.List<api.ProductShipping> o) {
+checkUnnamed590(core.List<api.ProductShipping> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductShipping(o[0]);
   checkProductShipping(o[1]);
 }
 
-buildUnnamed326() {
+buildUnnamed591() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed326(core.List<core.String> o) {
+checkUnnamed591(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed327() {
+buildUnnamed592() {
   var o = new core.List<api.ProductTax>();
   o.add(buildProductTax());
   o.add(buildProductTax());
   return o;
 }
 
-checkUnnamed327(core.List<api.ProductTax> o) {
+checkUnnamed592(core.List<api.ProductTax> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductTax(o[0]);
   checkProductTax(o[1]);
 }
 
-buildUnnamed328() {
+buildUnnamed593() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed328(core.List<core.String> o) {
+checkUnnamed593(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed329() {
+buildUnnamed594() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed329(core.List<api.Error> o) {
+checkUnnamed594(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -1487,10 +1487,10 @@
   var o = new api.Product();
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    o.additionalImageLinks = buildUnnamed320();
+    o.additionalImageLinks = buildUnnamed585();
     o.adult = true;
     o.adwordsGrouping = "foo";
-    o.adwordsLabels = buildUnnamed321();
+    o.adwordsLabels = buildUnnamed586();
     o.adwordsRedirect = "foo";
     o.ageGroup = "foo";
     o.availability = "foo";
@@ -1500,15 +1500,15 @@
     o.color = "foo";
     o.condition = "foo";
     o.contentLanguage = "foo";
-    o.customAttributes = buildUnnamed322();
-    o.customGroups = buildUnnamed323();
+    o.customAttributes = buildUnnamed587();
+    o.customGroups = buildUnnamed588();
     o.customLabel0 = "foo";
     o.customLabel1 = "foo";
     o.customLabel2 = "foo";
     o.customLabel3 = "foo";
     o.customLabel4 = "foo";
     o.description = "foo";
-    o.destinations = buildUnnamed324();
+    o.destinations = buildUnnamed589();
     o.energyEfficiencyClass = "foo";
     o.expirationDate = "foo";
     o.gender = "foo";
@@ -1534,19 +1534,19 @@
     o.productType = "foo";
     o.salePrice = buildPrice();
     o.salePriceEffectiveDate = "foo";
-    o.shipping = buildUnnamed325();
+    o.shipping = buildUnnamed590();
     o.shippingLabel = "foo";
     o.shippingWeight = buildProductShippingWeight();
     o.sizeSystem = "foo";
     o.sizeType = "foo";
-    o.sizes = buildUnnamed326();
+    o.sizes = buildUnnamed591();
     o.targetCountry = "foo";
-    o.taxes = buildUnnamed327();
+    o.taxes = buildUnnamed592();
     o.title = "foo";
     o.unitPricingBaseMeasure = buildProductUnitPricingBaseMeasure();
     o.unitPricingMeasure = buildProductUnitPricingMeasure();
-    o.validatedDestinations = buildUnnamed328();
-    o.warnings = buildUnnamed329();
+    o.validatedDestinations = buildUnnamed593();
+    o.warnings = buildUnnamed594();
   }
   buildCounterProduct--;
   return o;
@@ -1555,10 +1555,10 @@
 checkProduct(api.Product o) {
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    checkUnnamed320(o.additionalImageLinks);
+    checkUnnamed585(o.additionalImageLinks);
     unittest.expect(o.adult, unittest.isTrue);
     unittest.expect(o.adwordsGrouping, unittest.equals('foo'));
-    checkUnnamed321(o.adwordsLabels);
+    checkUnnamed586(o.adwordsLabels);
     unittest.expect(o.adwordsRedirect, unittest.equals('foo'));
     unittest.expect(o.ageGroup, unittest.equals('foo'));
     unittest.expect(o.availability, unittest.equals('foo'));
@@ -1568,15 +1568,15 @@
     unittest.expect(o.color, unittest.equals('foo'));
     unittest.expect(o.condition, unittest.equals('foo'));
     unittest.expect(o.contentLanguage, unittest.equals('foo'));
-    checkUnnamed322(o.customAttributes);
-    checkUnnamed323(o.customGroups);
+    checkUnnamed587(o.customAttributes);
+    checkUnnamed588(o.customGroups);
     unittest.expect(o.customLabel0, unittest.equals('foo'));
     unittest.expect(o.customLabel1, unittest.equals('foo'));
     unittest.expect(o.customLabel2, unittest.equals('foo'));
     unittest.expect(o.customLabel3, unittest.equals('foo'));
     unittest.expect(o.customLabel4, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed324(o.destinations);
+    checkUnnamed589(o.destinations);
     unittest.expect(o.energyEfficiencyClass, unittest.equals('foo'));
     unittest.expect(o.expirationDate, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
@@ -1602,19 +1602,19 @@
     unittest.expect(o.productType, unittest.equals('foo'));
     checkPrice(o.salePrice);
     unittest.expect(o.salePriceEffectiveDate, unittest.equals('foo'));
-    checkUnnamed325(o.shipping);
+    checkUnnamed590(o.shipping);
     unittest.expect(o.shippingLabel, unittest.equals('foo'));
     checkProductShippingWeight(o.shippingWeight);
     unittest.expect(o.sizeSystem, unittest.equals('foo'));
     unittest.expect(o.sizeType, unittest.equals('foo'));
-    checkUnnamed326(o.sizes);
+    checkUnnamed591(o.sizes);
     unittest.expect(o.targetCountry, unittest.equals('foo'));
-    checkUnnamed327(o.taxes);
+    checkUnnamed592(o.taxes);
     unittest.expect(o.title, unittest.equals('foo'));
     checkProductUnitPricingBaseMeasure(o.unitPricingBaseMeasure);
     checkProductUnitPricingMeasure(o.unitPricingMeasure);
-    checkUnnamed328(o.validatedDestinations);
-    checkUnnamed329(o.warnings);
+    checkUnnamed593(o.validatedDestinations);
+    checkUnnamed594(o.warnings);
   }
   buildCounterProduct--;
 }
@@ -1644,14 +1644,14 @@
   buildCounterProductCustomAttribute--;
 }
 
-buildUnnamed330() {
+buildUnnamed595() {
   var o = new core.List<api.ProductCustomAttribute>();
   o.add(buildProductCustomAttribute());
   o.add(buildProductCustomAttribute());
   return o;
 }
 
-checkUnnamed330(core.List<api.ProductCustomAttribute> o) {
+checkUnnamed595(core.List<api.ProductCustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomAttribute(o[0]);
   checkProductCustomAttribute(o[1]);
@@ -1662,7 +1662,7 @@
   var o = new api.ProductCustomGroup();
   buildCounterProductCustomGroup++;
   if (buildCounterProductCustomGroup < 3) {
-    o.attributes = buildUnnamed330();
+    o.attributes = buildUnnamed595();
     o.name = "foo";
   }
   buildCounterProductCustomGroup--;
@@ -1672,7 +1672,7 @@
 checkProductCustomGroup(api.ProductCustomGroup o) {
   buildCounterProductCustomGroup++;
   if (buildCounterProductCustomGroup < 3) {
-    checkUnnamed330(o.attributes);
+    checkUnnamed595(o.attributes);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterProductCustomGroup--;
@@ -1772,27 +1772,27 @@
   buildCounterProductShippingWeight--;
 }
 
-buildUnnamed331() {
+buildUnnamed596() {
   var o = new core.List<api.ProductStatusDataQualityIssue>();
   o.add(buildProductStatusDataQualityIssue());
   o.add(buildProductStatusDataQualityIssue());
   return o;
 }
 
-checkUnnamed331(core.List<api.ProductStatusDataQualityIssue> o) {
+checkUnnamed596(core.List<api.ProductStatusDataQualityIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatusDataQualityIssue(o[0]);
   checkProductStatusDataQualityIssue(o[1]);
 }
 
-buildUnnamed332() {
+buildUnnamed597() {
   var o = new core.List<api.ProductStatusDestinationStatus>();
   o.add(buildProductStatusDestinationStatus());
   o.add(buildProductStatusDestinationStatus());
   return o;
 }
 
-checkUnnamed332(core.List<api.ProductStatusDestinationStatus> o) {
+checkUnnamed597(core.List<api.ProductStatusDestinationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatusDestinationStatus(o[0]);
   checkProductStatusDestinationStatus(o[1]);
@@ -1803,8 +1803,8 @@
   var o = new api.ProductStatus();
   buildCounterProductStatus++;
   if (buildCounterProductStatus < 3) {
-    o.dataQualityIssues = buildUnnamed331();
-    o.destinationStatuses = buildUnnamed332();
+    o.dataQualityIssues = buildUnnamed596();
+    o.destinationStatuses = buildUnnamed597();
     o.kind = "foo";
     o.link = "foo";
     o.productId = "foo";
@@ -1817,8 +1817,8 @@
 checkProductStatus(api.ProductStatus o) {
   buildCounterProductStatus++;
   if (buildCounterProductStatus < 3) {
-    checkUnnamed331(o.dataQualityIssues);
-    checkUnnamed332(o.destinationStatuses);
+    checkUnnamed596(o.dataQualityIssues);
+    checkUnnamed597(o.destinationStatuses);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.productId, unittest.equals('foo'));
@@ -1952,14 +1952,14 @@
   buildCounterProductUnitPricingMeasure--;
 }
 
-buildUnnamed333() {
+buildUnnamed598() {
   var o = new core.List<api.ProductsCustomBatchRequestEntry>();
   o.add(buildProductsCustomBatchRequestEntry());
   o.add(buildProductsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed333(core.List<api.ProductsCustomBatchRequestEntry> o) {
+checkUnnamed598(core.List<api.ProductsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductsCustomBatchRequestEntry(o[0]);
   checkProductsCustomBatchRequestEntry(o[1]);
@@ -1970,7 +1970,7 @@
   var o = new api.ProductsCustomBatchRequest();
   buildCounterProductsCustomBatchRequest++;
   if (buildCounterProductsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed333();
+    o.entries = buildUnnamed598();
   }
   buildCounterProductsCustomBatchRequest--;
   return o;
@@ -1979,7 +1979,7 @@
 checkProductsCustomBatchRequest(api.ProductsCustomBatchRequest o) {
   buildCounterProductsCustomBatchRequest++;
   if (buildCounterProductsCustomBatchRequest < 3) {
-    checkUnnamed333(o.entries);
+    checkUnnamed598(o.entries);
   }
   buildCounterProductsCustomBatchRequest--;
 }
@@ -2011,14 +2011,14 @@
   buildCounterProductsCustomBatchRequestEntry--;
 }
 
-buildUnnamed334() {
+buildUnnamed599() {
   var o = new core.List<api.ProductsCustomBatchResponseEntry>();
   o.add(buildProductsCustomBatchResponseEntry());
   o.add(buildProductsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed334(core.List<api.ProductsCustomBatchResponseEntry> o) {
+checkUnnamed599(core.List<api.ProductsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductsCustomBatchResponseEntry(o[0]);
   checkProductsCustomBatchResponseEntry(o[1]);
@@ -2029,7 +2029,7 @@
   var o = new api.ProductsCustomBatchResponse();
   buildCounterProductsCustomBatchResponse++;
   if (buildCounterProductsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed334();
+    o.entries = buildUnnamed599();
     o.kind = "foo";
   }
   buildCounterProductsCustomBatchResponse--;
@@ -2039,7 +2039,7 @@
 checkProductsCustomBatchResponse(api.ProductsCustomBatchResponse o) {
   buildCounterProductsCustomBatchResponse++;
   if (buildCounterProductsCustomBatchResponse < 3) {
-    checkUnnamed334(o.entries);
+    checkUnnamed599(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterProductsCustomBatchResponse--;
@@ -2070,14 +2070,14 @@
   buildCounterProductsCustomBatchResponseEntry--;
 }
 
-buildUnnamed335() {
+buildUnnamed600() {
   var o = new core.List<api.Product>();
   o.add(buildProduct());
   o.add(buildProduct());
   return o;
 }
 
-checkUnnamed335(core.List<api.Product> o) {
+checkUnnamed600(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProduct(o[0]);
   checkProduct(o[1]);
@@ -2090,7 +2090,7 @@
   if (buildCounterProductsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed335();
+    o.resources = buildUnnamed600();
   }
   buildCounterProductsListResponse--;
   return o;
@@ -2101,19 +2101,19 @@
   if (buildCounterProductsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed335(o.resources);
+    checkUnnamed600(o.resources);
   }
   buildCounterProductsListResponse--;
 }
 
-buildUnnamed336() {
+buildUnnamed601() {
   var o = new core.List<api.ProductstatusesCustomBatchRequestEntry>();
   o.add(buildProductstatusesCustomBatchRequestEntry());
   o.add(buildProductstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed336(core.List<api.ProductstatusesCustomBatchRequestEntry> o) {
+checkUnnamed601(core.List<api.ProductstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductstatusesCustomBatchRequestEntry(o[0]);
   checkProductstatusesCustomBatchRequestEntry(o[1]);
@@ -2124,7 +2124,7 @@
   var o = new api.ProductstatusesCustomBatchRequest();
   buildCounterProductstatusesCustomBatchRequest++;
   if (buildCounterProductstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed336();
+    o.entries = buildUnnamed601();
   }
   buildCounterProductstatusesCustomBatchRequest--;
   return o;
@@ -2133,7 +2133,7 @@
 checkProductstatusesCustomBatchRequest(api.ProductstatusesCustomBatchRequest o) {
   buildCounterProductstatusesCustomBatchRequest++;
   if (buildCounterProductstatusesCustomBatchRequest < 3) {
-    checkUnnamed336(o.entries);
+    checkUnnamed601(o.entries);
   }
   buildCounterProductstatusesCustomBatchRequest--;
 }
@@ -2163,14 +2163,14 @@
   buildCounterProductstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed337() {
+buildUnnamed602() {
   var o = new core.List<api.ProductstatusesCustomBatchResponseEntry>();
   o.add(buildProductstatusesCustomBatchResponseEntry());
   o.add(buildProductstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed337(core.List<api.ProductstatusesCustomBatchResponseEntry> o) {
+checkUnnamed602(core.List<api.ProductstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductstatusesCustomBatchResponseEntry(o[0]);
   checkProductstatusesCustomBatchResponseEntry(o[1]);
@@ -2181,7 +2181,7 @@
   var o = new api.ProductstatusesCustomBatchResponse();
   buildCounterProductstatusesCustomBatchResponse++;
   if (buildCounterProductstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed337();
+    o.entries = buildUnnamed602();
     o.kind = "foo";
   }
   buildCounterProductstatusesCustomBatchResponse--;
@@ -2191,7 +2191,7 @@
 checkProductstatusesCustomBatchResponse(api.ProductstatusesCustomBatchResponse o) {
   buildCounterProductstatusesCustomBatchResponse++;
   if (buildCounterProductstatusesCustomBatchResponse < 3) {
-    checkUnnamed337(o.entries);
+    checkUnnamed602(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterProductstatusesCustomBatchResponse--;
@@ -2222,14 +2222,14 @@
   buildCounterProductstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed338() {
+buildUnnamed603() {
   var o = new core.List<api.ProductStatus>();
   o.add(buildProductStatus());
   o.add(buildProductStatus());
   return o;
 }
 
-checkUnnamed338(core.List<api.ProductStatus> o) {
+checkUnnamed603(core.List<api.ProductStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatus(o[0]);
   checkProductStatus(o[1]);
@@ -2242,7 +2242,7 @@
   if (buildCounterProductstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed338();
+    o.resources = buildUnnamed603();
   }
   buildCounterProductstatusesListResponse--;
   return o;
@@ -2253,7 +2253,7 @@
   if (buildCounterProductstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed338(o.resources);
+    checkUnnamed603(o.resources);
   }
   buildCounterProductstatusesListResponse--;
 }
diff --git a/generated/googleapis/test/coordinate/v1_test.dart b/generated/googleapis/test/coordinate/v1_test.dart
index 2079a78..40ba14d 100644
--- a/generated/googleapis/test/coordinate/v1_test.dart
+++ b/generated/googleapis/test/coordinate/v1_test.dart
@@ -68,14 +68,14 @@
   buildCounterCustomFieldDef--;
 }
 
-buildUnnamed459() {
+buildUnnamed604() {
   var o = new core.List<api.CustomFieldDef>();
   o.add(buildCustomFieldDef());
   o.add(buildCustomFieldDef());
   return o;
 }
 
-checkUnnamed459(core.List<api.CustomFieldDef> o) {
+checkUnnamed604(core.List<api.CustomFieldDef> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomFieldDef(o[0]);
   checkCustomFieldDef(o[1]);
@@ -86,7 +86,7 @@
   var o = new api.CustomFieldDefListResponse();
   buildCounterCustomFieldDefListResponse++;
   if (buildCounterCustomFieldDefListResponse < 3) {
-    o.items = buildUnnamed459();
+    o.items = buildUnnamed604();
     o.kind = "foo";
   }
   buildCounterCustomFieldDefListResponse--;
@@ -96,20 +96,20 @@
 checkCustomFieldDefListResponse(api.CustomFieldDefListResponse o) {
   buildCounterCustomFieldDefListResponse++;
   if (buildCounterCustomFieldDefListResponse < 3) {
-    checkUnnamed459(o.items);
+    checkUnnamed604(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomFieldDefListResponse--;
 }
 
-buildUnnamed460() {
+buildUnnamed605() {
   var o = new core.List<api.CustomField>();
   o.add(buildCustomField());
   o.add(buildCustomField());
   return o;
 }
 
-checkUnnamed460(core.List<api.CustomField> o) {
+checkUnnamed605(core.List<api.CustomField> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomField(o[0]);
   checkCustomField(o[1]);
@@ -120,7 +120,7 @@
   var o = new api.CustomFields();
   buildCounterCustomFields++;
   if (buildCounterCustomFields < 3) {
-    o.customField = buildUnnamed460();
+    o.customField = buildUnnamed605();
     o.kind = "foo";
   }
   buildCounterCustomFields--;
@@ -130,20 +130,20 @@
 checkCustomFields(api.CustomFields o) {
   buildCounterCustomFields++;
   if (buildCounterCustomFields < 3) {
-    checkUnnamed460(o.customField);
+    checkUnnamed605(o.customField);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomFields--;
 }
 
-buildUnnamed461() {
+buildUnnamed606() {
   var o = new core.List<api.JobChange>();
   o.add(buildJobChange());
   o.add(buildJobChange());
   return o;
 }
 
-checkUnnamed461(core.List<api.JobChange> o) {
+checkUnnamed606(core.List<api.JobChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJobChange(o[0]);
   checkJobChange(o[1]);
@@ -155,7 +155,7 @@
   buildCounterJob++;
   if (buildCounterJob < 3) {
     o.id = "foo";
-    o.jobChange = buildUnnamed461();
+    o.jobChange = buildUnnamed606();
     o.kind = "foo";
     o.state = buildJobState();
   }
@@ -167,7 +167,7 @@
   buildCounterJob++;
   if (buildCounterJob < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed461(o.jobChange);
+    checkUnnamed606(o.jobChange);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkJobState(o.state);
   }
@@ -197,14 +197,14 @@
   buildCounterJobChange--;
 }
 
-buildUnnamed462() {
+buildUnnamed607() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed462(core.List<api.Job> o) {
+checkUnnamed607(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -215,7 +215,7 @@
   var o = new api.JobListResponse();
   buildCounterJobListResponse++;
   if (buildCounterJobListResponse < 3) {
-    o.items = buildUnnamed462();
+    o.items = buildUnnamed607();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -226,21 +226,21 @@
 checkJobListResponse(api.JobListResponse o) {
   buildCounterJobListResponse++;
   if (buildCounterJobListResponse < 3) {
-    checkUnnamed462(o.items);
+    checkUnnamed607(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterJobListResponse--;
 }
 
-buildUnnamed463() {
+buildUnnamed608() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed463(core.List<core.String> o) {
+checkUnnamed608(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -257,7 +257,7 @@
     o.customerPhoneNumber = "foo";
     o.kind = "foo";
     o.location = buildLocation();
-    o.note = buildUnnamed463();
+    o.note = buildUnnamed608();
     o.progress = "foo";
     o.title = "foo";
   }
@@ -274,21 +274,21 @@
     unittest.expect(o.customerPhoneNumber, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLocation(o.location);
-    checkUnnamed463(o.note);
+    checkUnnamed608(o.note);
     unittest.expect(o.progress, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterJobState--;
 }
 
-buildUnnamed464() {
+buildUnnamed609() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed464(core.List<core.String> o) {
+checkUnnamed609(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -299,7 +299,7 @@
   var o = new api.Location();
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    o.addressLine = buildUnnamed464();
+    o.addressLine = buildUnnamed609();
     o.kind = "foo";
     o.lat = 42.0;
     o.lng = 42.0;
@@ -311,7 +311,7 @@
 checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkUnnamed464(o.addressLine);
+    checkUnnamed609(o.addressLine);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lat, unittest.equals(42.0));
     unittest.expect(o.lng, unittest.equals(42.0));
@@ -319,14 +319,14 @@
   buildCounterLocation--;
 }
 
-buildUnnamed465() {
+buildUnnamed610() {
   var o = new core.List<api.LocationRecord>();
   o.add(buildLocationRecord());
   o.add(buildLocationRecord());
   return o;
 }
 
-checkUnnamed465(core.List<api.LocationRecord> o) {
+checkUnnamed610(core.List<api.LocationRecord> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocationRecord(o[0]);
   checkLocationRecord(o[1]);
@@ -337,7 +337,7 @@
   var o = new api.LocationListResponse();
   buildCounterLocationListResponse++;
   if (buildCounterLocationListResponse < 3) {
-    o.items = buildUnnamed465();
+    o.items = buildUnnamed610();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.tokenPagination = buildTokenPagination();
@@ -349,7 +349,7 @@
 checkLocationListResponse(api.LocationListResponse o) {
   buildCounterLocationListResponse++;
   if (buildCounterLocationListResponse < 3) {
-    checkUnnamed465(o.items);
+    checkUnnamed610(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkTokenPagination(o.tokenPagination);
@@ -455,14 +455,14 @@
   buildCounterWorker--;
 }
 
-buildUnnamed466() {
+buildUnnamed611() {
   var o = new core.List<api.Worker>();
   o.add(buildWorker());
   o.add(buildWorker());
   return o;
 }
 
-checkUnnamed466(core.List<api.Worker> o) {
+checkUnnamed611(core.List<api.Worker> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWorker(o[0]);
   checkWorker(o[1]);
@@ -473,7 +473,7 @@
   var o = new api.WorkerListResponse();
   buildCounterWorkerListResponse++;
   if (buildCounterWorkerListResponse < 3) {
-    o.items = buildUnnamed466();
+    o.items = buildUnnamed611();
     o.kind = "foo";
   }
   buildCounterWorkerListResponse--;
@@ -483,46 +483,46 @@
 checkWorkerListResponse(api.WorkerListResponse o) {
   buildCounterWorkerListResponse++;
   if (buildCounterWorkerListResponse < 3) {
-    checkUnnamed466(o.items);
+    checkUnnamed611(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterWorkerListResponse--;
 }
 
-buildUnnamed467() {
+buildUnnamed612() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed467(core.List<core.String> o) {
+checkUnnamed612(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed468() {
+buildUnnamed613() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed468(core.List<core.String> o) {
+checkUnnamed613(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed469() {
+buildUnnamed614() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed469(core.List<core.String> o) {
+checkUnnamed614(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -766,7 +766,7 @@
       var arg_lng = 42.0;
       var arg_title = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed467();
+      var arg_customField = buildUnnamed612();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_note = "foo";
@@ -876,7 +876,7 @@
       var arg_jobId = "foo";
       var arg_address = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed468();
+      var arg_customField = buildUnnamed613();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_lat = 42.0;
@@ -943,7 +943,7 @@
       var arg_jobId = "foo";
       var arg_address = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed469();
+      var arg_customField = buildUnnamed614();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_lat = 42.0;
diff --git a/generated/googleapis/test/customsearch/v1_test.dart b/generated/googleapis/test/customsearch/v1_test.dart
index 74266bd..af809f1 100644
--- a/generated/googleapis/test/customsearch/v1_test.dart
+++ b/generated/googleapis/test/customsearch/v1_test.dart
@@ -39,30 +39,30 @@
   buildCounterContextFacets--;
 }
 
-buildUnnamed266() {
+buildUnnamed615() {
   var o = new core.List<api.ContextFacets>();
   o.add(buildContextFacets());
   o.add(buildContextFacets());
   return o;
 }
 
-checkUnnamed266(core.List<api.ContextFacets> o) {
+checkUnnamed615(core.List<api.ContextFacets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContextFacets(o[0]);
   checkContextFacets(o[1]);
 }
 
-buildUnnamed267() {
+buildUnnamed616() {
   var o = new core.List<core.List<api.ContextFacets>>();
-  o.add(buildUnnamed266());
-  o.add(buildUnnamed266());
+  o.add(buildUnnamed615());
+  o.add(buildUnnamed615());
   return o;
 }
 
-checkUnnamed267(core.List<core.List<api.ContextFacets>> o) {
+checkUnnamed616(core.List<core.List<api.ContextFacets>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed266(o[0]);
-  checkUnnamed266(o[1]);
+  checkUnnamed615(o[0]);
+  checkUnnamed615(o[1]);
 }
 
 core.int buildCounterContext = 0;
@@ -70,7 +70,7 @@
   var o = new api.Context();
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    o.facets = buildUnnamed267();
+    o.facets = buildUnnamed616();
     o.title = "foo";
   }
   buildCounterContext--;
@@ -80,7 +80,7 @@
 checkContext(api.Context o) {
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    checkUnnamed267(o.facets);
+    checkUnnamed616(o.facets);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterContext--;
@@ -111,14 +111,14 @@
   buildCounterPromotionBodyLines--;
 }
 
-buildUnnamed268() {
+buildUnnamed617() {
   var o = new core.List<api.PromotionBodyLines>();
   o.add(buildPromotionBodyLines());
   o.add(buildPromotionBodyLines());
   return o;
 }
 
-checkUnnamed268(core.List<api.PromotionBodyLines> o) {
+checkUnnamed617(core.List<api.PromotionBodyLines> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotionBodyLines(o[0]);
   checkPromotionBodyLines(o[1]);
@@ -152,7 +152,7 @@
   var o = new api.Promotion();
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    o.bodyLines = buildUnnamed268();
+    o.bodyLines = buildUnnamed617();
     o.displayLink = "foo";
     o.htmlTitle = "foo";
     o.image = buildPromotionImage();
@@ -166,7 +166,7 @@
 checkPromotion(api.Promotion o) {
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    checkUnnamed268(o.bodyLines);
+    checkUnnamed617(o.bodyLines);
     unittest.expect(o.displayLink, unittest.equals('foo'));
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkPromotionImage(o.image);
@@ -321,56 +321,56 @@
   buildCounterResultLabels--;
 }
 
-buildUnnamed269() {
+buildUnnamed618() {
   var o = new core.List<api.ResultLabels>();
   o.add(buildResultLabels());
   o.add(buildResultLabels());
   return o;
 }
 
-checkUnnamed269(core.List<api.ResultLabels> o) {
+checkUnnamed618(core.List<api.ResultLabels> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultLabels(o[0]);
   checkResultLabels(o[1]);
 }
 
-buildUnnamed270() {
+buildUnnamed619() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   return o;
 }
 
-checkUnnamed270(core.Map<core.String, core.Object> o) {
+checkUnnamed619(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed271() {
+buildUnnamed620() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed270());
-  o.add(buildUnnamed270());
+  o.add(buildUnnamed619());
+  o.add(buildUnnamed619());
   return o;
 }
 
-checkUnnamed271(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed620(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed270(o[0]);
-  checkUnnamed270(o[1]);
+  checkUnnamed619(o[0]);
+  checkUnnamed619(o[1]);
 }
 
-buildUnnamed272() {
+buildUnnamed621() {
   var o = new core.Map<core.String, core.List<core.Map<core.String, core.Object>>>();
-  o["x"] = buildUnnamed271();
-  o["y"] = buildUnnamed271();
+  o["x"] = buildUnnamed620();
+  o["y"] = buildUnnamed620();
   return o;
 }
 
-checkUnnamed272(core.Map<core.String, core.List<core.Map<core.String, core.Object>>> o) {
+checkUnnamed621(core.Map<core.String, core.List<core.Map<core.String, core.Object>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed271(o["x"]);
-  checkUnnamed271(o["y"]);
+  checkUnnamed620(o["x"]);
+  checkUnnamed620(o["y"]);
 }
 
 core.int buildCounterResult = 0;
@@ -387,10 +387,10 @@
     o.htmlTitle = "foo";
     o.image = buildResultImage();
     o.kind = "foo";
-    o.labels = buildUnnamed269();
+    o.labels = buildUnnamed618();
     o.link = "foo";
     o.mime = "foo";
-    o.pagemap = buildUnnamed272();
+    o.pagemap = buildUnnamed621();
     o.snippet = "foo";
     o.title = "foo";
   }
@@ -410,66 +410,66 @@
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkResultImage(o.image);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed269(o.labels);
+    checkUnnamed618(o.labels);
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.mime, unittest.equals('foo'));
-    checkUnnamed272(o.pagemap);
+    checkUnnamed621(o.pagemap);
     unittest.expect(o.snippet, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterResult--;
 }
 
-buildUnnamed273() {
+buildUnnamed622() {
   var o = new core.List<api.Result>();
   o.add(buildResult());
   o.add(buildResult());
   return o;
 }
 
-checkUnnamed273(core.List<api.Result> o) {
+checkUnnamed622(core.List<api.Result> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResult(o[0]);
   checkResult(o[1]);
 }
 
-buildUnnamed274() {
+buildUnnamed623() {
   var o = new core.List<api.Promotion>();
   o.add(buildPromotion());
   o.add(buildPromotion());
   return o;
 }
 
-checkUnnamed274(core.List<api.Promotion> o) {
+checkUnnamed623(core.List<api.Promotion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotion(o[0]);
   checkPromotion(o[1]);
 }
 
-buildUnnamed275() {
+buildUnnamed624() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed275(core.List<api.Query> o) {
+checkUnnamed624(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
 }
 
-buildUnnamed276() {
+buildUnnamed625() {
   var o = new core.Map<core.String, core.List<api.Query>>();
-  o["x"] = buildUnnamed275();
-  o["y"] = buildUnnamed275();
+  o["x"] = buildUnnamed624();
+  o["y"] = buildUnnamed624();
   return o;
 }
 
-checkUnnamed276(core.Map<core.String, core.List<api.Query>> o) {
+checkUnnamed625(core.Map<core.String, core.List<api.Query>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed275(o["x"]);
-  checkUnnamed275(o["y"]);
+  checkUnnamed624(o["x"]);
+  checkUnnamed624(o["y"]);
 }
 
 core.int buildCounterSearchSearchInformation = 0;
@@ -545,10 +545,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     o.context = buildContext();
-    o.items = buildUnnamed273();
+    o.items = buildUnnamed622();
     o.kind = "foo";
-    o.promotions = buildUnnamed274();
-    o.queries = buildUnnamed276();
+    o.promotions = buildUnnamed623();
+    o.queries = buildUnnamed625();
     o.searchInformation = buildSearchSearchInformation();
     o.spelling = buildSearchSpelling();
     o.url = buildSearchUrl();
@@ -561,10 +561,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     checkContext(o.context);
-    checkUnnamed273(o.items);
+    checkUnnamed622(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed274(o.promotions);
-    checkUnnamed276(o.queries);
+    checkUnnamed623(o.promotions);
+    checkUnnamed625(o.queries);
     checkSearchSearchInformation(o.searchInformation);
     checkSearchSpelling(o.spelling);
     checkSearchUrl(o.url);
diff --git a/generated/googleapis/test/dfareporting/v1_3_test.dart b/generated/googleapis/test/dfareporting/v1_3_test.dart
index e89f23c..08b6ad3 100644
--- a/generated/googleapis/test/dfareporting/v1_3_test.dart
+++ b/generated/googleapis/test/dfareporting/v1_3_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed189() {
+buildUnnamed626() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed189(core.List<api.DimensionValue> o) {
+checkUnnamed626(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed190() {
+buildUnnamed627() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed190(core.List<core.String> o) {
+checkUnnamed627(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -47,9 +47,9 @@
   var o = new api.Activities();
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    o.filters = buildUnnamed189();
+    o.filters = buildUnnamed626();
     o.kind = "foo";
-    o.metricNames = buildUnnamed190();
+    o.metricNames = buildUnnamed627();
   }
   buildCounterActivities--;
   return o;
@@ -58,9 +58,9 @@
 checkActivities(api.Activities o) {
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    checkUnnamed189(o.filters);
+    checkUnnamed626(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed190(o.metricNames);
+    checkUnnamed627(o.metricNames);
   }
   buildCounterActivities--;
 }
@@ -94,53 +94,53 @@
   buildCounterCompatibleFields--;
 }
 
-buildUnnamed191() {
+buildUnnamed628() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed191(core.List<api.Dimension> o) {
+checkUnnamed628(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed192() {
+buildUnnamed629() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed192(core.List<api.Dimension> o) {
+checkUnnamed629(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed193() {
+buildUnnamed630() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed193(core.List<api.Metric> o) {
+checkUnnamed630(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed194() {
+buildUnnamed631() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed194(core.List<api.Metric> o) {
+checkUnnamed631(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -151,11 +151,11 @@
   var o = new api.CrossDimensionReachReportCompatibleFields();
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    o.breakdown = buildUnnamed191();
-    o.dimensionFilters = buildUnnamed192();
+    o.breakdown = buildUnnamed628();
+    o.dimensionFilters = buildUnnamed629();
     o.kind = "foo";
-    o.metrics = buildUnnamed193();
-    o.overlapMetrics = buildUnnamed194();
+    o.metrics = buildUnnamed630();
+    o.overlapMetrics = buildUnnamed631();
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
   return o;
@@ -164,23 +164,23 @@
 checkCrossDimensionReachReportCompatibleFields(api.CrossDimensionReachReportCompatibleFields o) {
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    checkUnnamed191(o.breakdown);
-    checkUnnamed192(o.dimensionFilters);
+    checkUnnamed628(o.breakdown);
+    checkUnnamed629(o.dimensionFilters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed193(o.metrics);
-    checkUnnamed194(o.overlapMetrics);
+    checkUnnamed630(o.metrics);
+    checkUnnamed631(o.overlapMetrics);
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
 }
 
-buildUnnamed195() {
+buildUnnamed632() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed195(core.List<api.DimensionValue> o) {
+checkUnnamed632(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -191,7 +191,7 @@
   var o = new api.CustomRichMediaEvents();
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    o.filteredEventIds = buildUnnamed195();
+    o.filteredEventIds = buildUnnamed632();
     o.kind = "foo";
   }
   buildCounterCustomRichMediaEvents--;
@@ -201,7 +201,7 @@
 checkCustomRichMediaEvents(api.CustomRichMediaEvents o) {
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    checkUnnamed195(o.filteredEventIds);
+    checkUnnamed632(o.filteredEventIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomRichMediaEvents--;
@@ -305,14 +305,14 @@
   buildCounterDimensionValue--;
 }
 
-buildUnnamed196() {
+buildUnnamed633() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed196(core.List<api.DimensionValue> o) {
+checkUnnamed633(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -324,7 +324,7 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed196();
+    o.items = buildUnnamed633();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -336,21 +336,21 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed196(o.items);
+    checkUnnamed633(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterDimensionValueList--;
 }
 
-buildUnnamed197() {
+buildUnnamed634() {
   var o = new core.List<api.DimensionFilter>();
   o.add(buildDimensionFilter());
   o.add(buildDimensionFilter());
   return o;
 }
 
-checkUnnamed197(core.List<api.DimensionFilter> o) {
+checkUnnamed634(core.List<api.DimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilter(o[0]);
   checkDimensionFilter(o[1]);
@@ -363,7 +363,7 @@
   if (buildCounterDimensionValueRequest < 3) {
     o.dimensionName = "foo";
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.filters = buildUnnamed197();
+    o.filters = buildUnnamed634();
     o.kind = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -376,7 +376,7 @@
   if (buildCounterDimensionValueRequest < 3) {
     unittest.expect(o.dimensionName, unittest.equals('foo'));
     unittest.expect(o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed197(o.filters);
+    checkUnnamed634(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
   }
@@ -441,14 +441,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed198() {
+buildUnnamed635() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed198(core.List<api.File> o) {
+checkUnnamed635(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -460,7 +460,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed198();
+    o.items = buildUnnamed635();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -472,47 +472,47 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed198(o.items);
+    checkUnnamed635(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterFileList--;
 }
 
-buildUnnamed199() {
+buildUnnamed636() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed199(core.List<api.Dimension> o) {
+checkUnnamed636(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed200() {
+buildUnnamed637() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed200(core.List<api.Dimension> o) {
+checkUnnamed637(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed201() {
+buildUnnamed638() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed201(core.List<api.Metric> o) {
+checkUnnamed638(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -523,10 +523,10 @@
   var o = new api.FloodlightReportCompatibleFields();
   buildCounterFloodlightReportCompatibleFields++;
   if (buildCounterFloodlightReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed199();
-    o.dimensions = buildUnnamed200();
+    o.dimensionFilters = buildUnnamed636();
+    o.dimensions = buildUnnamed637();
     o.kind = "foo";
-    o.metrics = buildUnnamed201();
+    o.metrics = buildUnnamed638();
   }
   buildCounterFloodlightReportCompatibleFields--;
   return o;
@@ -535,10 +535,10 @@
 checkFloodlightReportCompatibleFields(api.FloodlightReportCompatibleFields o) {
   buildCounterFloodlightReportCompatibleFields++;
   if (buildCounterFloodlightReportCompatibleFields < 3) {
-    checkUnnamed199(o.dimensionFilters);
-    checkUnnamed200(o.dimensions);
+    checkUnnamed636(o.dimensionFilters);
+    checkUnnamed637(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed201(o.metrics);
+    checkUnnamed638(o.metrics);
   }
   buildCounterFloodlightReportCompatibleFields--;
 }
@@ -564,53 +564,53 @@
   buildCounterMetric--;
 }
 
-buildUnnamed202() {
+buildUnnamed639() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed202(core.List<api.Dimension> o) {
+checkUnnamed639(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed203() {
+buildUnnamed640() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed203(core.List<api.Dimension> o) {
+checkUnnamed640(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed204() {
+buildUnnamed641() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed204(core.List<api.Metric> o) {
+checkUnnamed641(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed205() {
+buildUnnamed642() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed205(core.List<api.Dimension> o) {
+checkUnnamed642(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
@@ -621,11 +621,11 @@
   var o = new api.PathToConversionReportCompatibleFields();
   buildCounterPathToConversionReportCompatibleFields++;
   if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    o.conversionDimensions = buildUnnamed202();
-    o.customFloodlightVariables = buildUnnamed203();
+    o.conversionDimensions = buildUnnamed639();
+    o.customFloodlightVariables = buildUnnamed640();
     o.kind = "foo";
-    o.metrics = buildUnnamed204();
-    o.perInteractionDimensions = buildUnnamed205();
+    o.metrics = buildUnnamed641();
+    o.perInteractionDimensions = buildUnnamed642();
   }
   buildCounterPathToConversionReportCompatibleFields--;
   return o;
@@ -634,75 +634,75 @@
 checkPathToConversionReportCompatibleFields(api.PathToConversionReportCompatibleFields o) {
   buildCounterPathToConversionReportCompatibleFields++;
   if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    checkUnnamed202(o.conversionDimensions);
-    checkUnnamed203(o.customFloodlightVariables);
+    checkUnnamed639(o.conversionDimensions);
+    checkUnnamed640(o.customFloodlightVariables);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed204(o.metrics);
-    checkUnnamed205(o.perInteractionDimensions);
+    checkUnnamed641(o.metrics);
+    checkUnnamed642(o.perInteractionDimensions);
   }
   buildCounterPathToConversionReportCompatibleFields--;
 }
 
-buildUnnamed206() {
+buildUnnamed643() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed206(core.List<api.Dimension> o) {
+checkUnnamed643(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed207() {
+buildUnnamed644() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed207(core.List<api.Dimension> o) {
+checkUnnamed644(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed208() {
+buildUnnamed645() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed208(core.List<api.Metric> o) {
+checkUnnamed645(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed209() {
+buildUnnamed646() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed209(core.List<api.Metric> o) {
+checkUnnamed646(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed210() {
+buildUnnamed647() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed210(core.List<api.Metric> o) {
+checkUnnamed647(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -713,12 +713,12 @@
   var o = new api.ReachReportCompatibleFields();
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed206();
-    o.dimensions = buildUnnamed207();
+    o.dimensionFilters = buildUnnamed643();
+    o.dimensions = buildUnnamed644();
     o.kind = "foo";
-    o.metrics = buildUnnamed208();
-    o.pivotedActivityMetrics = buildUnnamed209();
-    o.reachByFrequencyMetrics = buildUnnamed210();
+    o.metrics = buildUnnamed645();
+    o.pivotedActivityMetrics = buildUnnamed646();
+    o.reachByFrequencyMetrics = buildUnnamed647();
   }
   buildCounterReachReportCompatibleFields--;
   return o;
@@ -727,12 +727,12 @@
 checkReachReportCompatibleFields(api.ReachReportCompatibleFields o) {
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    checkUnnamed206(o.dimensionFilters);
-    checkUnnamed207(o.dimensions);
+    checkUnnamed643(o.dimensionFilters);
+    checkUnnamed644(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed208(o.metrics);
-    checkUnnamed209(o.pivotedActivityMetrics);
-    checkUnnamed210(o.reachByFrequencyMetrics);
+    checkUnnamed645(o.metrics);
+    checkUnnamed646(o.pivotedActivityMetrics);
+    checkUnnamed647(o.reachByFrequencyMetrics);
   }
   buildCounterReachReportCompatibleFields--;
 }
@@ -760,40 +760,40 @@
   buildCounterRecipient--;
 }
 
-buildUnnamed211() {
+buildUnnamed648() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed211(core.List<api.DimensionValue> o) {
+checkUnnamed648(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed212() {
+buildUnnamed649() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed212(core.List<api.SortedDimension> o) {
+checkUnnamed649(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed213() {
+buildUnnamed650() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed213(core.List<core.String> o) {
+checkUnnamed650(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -805,9 +805,9 @@
   buildCounterReportActiveGrpCriteria++;
   if (buildCounterReportActiveGrpCriteria < 3) {
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed211();
-    o.dimensions = buildUnnamed212();
-    o.metricNames = buildUnnamed213();
+    o.dimensionFilters = buildUnnamed648();
+    o.dimensions = buildUnnamed649();
+    o.metricNames = buildUnnamed650();
   }
   buildCounterReportActiveGrpCriteria--;
   return o;
@@ -817,47 +817,47 @@
   buildCounterReportActiveGrpCriteria++;
   if (buildCounterReportActiveGrpCriteria < 3) {
     checkDateRange(o.dateRange);
-    checkUnnamed211(o.dimensionFilters);
-    checkUnnamed212(o.dimensions);
-    checkUnnamed213(o.metricNames);
+    checkUnnamed648(o.dimensionFilters);
+    checkUnnamed649(o.dimensions);
+    checkUnnamed650(o.metricNames);
   }
   buildCounterReportActiveGrpCriteria--;
 }
 
-buildUnnamed214() {
+buildUnnamed651() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed214(core.List<api.DimensionValue> o) {
+checkUnnamed651(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed215() {
+buildUnnamed652() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed215(core.List<api.SortedDimension> o) {
+checkUnnamed652(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed216() {
+buildUnnamed653() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed216(core.List<core.String> o) {
+checkUnnamed653(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -871,9 +871,9 @@
     o.activities = buildActivities();
     o.customRichMediaEvents = buildCustomRichMediaEvents();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed214();
-    o.dimensions = buildUnnamed215();
-    o.metricNames = buildUnnamed216();
+    o.dimensionFilters = buildUnnamed651();
+    o.dimensions = buildUnnamed652();
+    o.metricNames = buildUnnamed653();
   }
   buildCounterReportCriteria--;
   return o;
@@ -885,60 +885,60 @@
     checkActivities(o.activities);
     checkCustomRichMediaEvents(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed214(o.dimensionFilters);
-    checkUnnamed215(o.dimensions);
-    checkUnnamed216(o.metricNames);
+    checkUnnamed651(o.dimensionFilters);
+    checkUnnamed652(o.dimensions);
+    checkUnnamed653(o.metricNames);
   }
   buildCounterReportCriteria--;
 }
 
-buildUnnamed217() {
+buildUnnamed654() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed217(core.List<api.SortedDimension> o) {
+checkUnnamed654(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed218() {
+buildUnnamed655() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed218(core.List<api.DimensionValue> o) {
+checkUnnamed655(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed219() {
+buildUnnamed656() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed219(core.List<core.String> o) {
+checkUnnamed656(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed220() {
+buildUnnamed657() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed220(core.List<core.String> o) {
+checkUnnamed657(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -949,12 +949,12 @@
   var o = new api.ReportCrossDimensionReachCriteria();
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    o.breakdown = buildUnnamed217();
+    o.breakdown = buildUnnamed654();
     o.dateRange = buildDateRange();
     o.dimension = "foo";
-    o.dimensionFilters = buildUnnamed218();
-    o.metricNames = buildUnnamed219();
-    o.overlapMetricNames = buildUnnamed220();
+    o.dimensionFilters = buildUnnamed655();
+    o.metricNames = buildUnnamed656();
+    o.overlapMetricNames = buildUnnamed657();
     o.pivoted = true;
   }
   buildCounterReportCrossDimensionReachCriteria--;
@@ -964,25 +964,25 @@
 checkReportCrossDimensionReachCriteria(api.ReportCrossDimensionReachCriteria o) {
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    checkUnnamed217(o.breakdown);
+    checkUnnamed654(o.breakdown);
     checkDateRange(o.dateRange);
     unittest.expect(o.dimension, unittest.equals('foo'));
-    checkUnnamed218(o.dimensionFilters);
-    checkUnnamed219(o.metricNames);
-    checkUnnamed220(o.overlapMetricNames);
+    checkUnnamed655(o.dimensionFilters);
+    checkUnnamed656(o.metricNames);
+    checkUnnamed657(o.overlapMetricNames);
     unittest.expect(o.pivoted, unittest.isTrue);
   }
   buildCounterReportCrossDimensionReachCriteria--;
 }
 
-buildUnnamed221() {
+buildUnnamed658() {
   var o = new core.List<api.Recipient>();
   o.add(buildRecipient());
   o.add(buildRecipient());
   return o;
 }
 
-checkUnnamed221(core.List<api.Recipient> o) {
+checkUnnamed658(core.List<api.Recipient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRecipient(o[0]);
   checkRecipient(o[1]);
@@ -996,7 +996,7 @@
     o.emailOwner = true;
     o.emailOwnerDeliveryType = "foo";
     o.message = "foo";
-    o.recipients = buildUnnamed221();
+    o.recipients = buildUnnamed658();
   }
   buildCounterReportDelivery--;
   return o;
@@ -1008,58 +1008,58 @@
     unittest.expect(o.emailOwner, unittest.isTrue);
     unittest.expect(o.emailOwnerDeliveryType, unittest.equals('foo'));
     unittest.expect(o.message, unittest.equals('foo'));
-    checkUnnamed221(o.recipients);
+    checkUnnamed658(o.recipients);
   }
   buildCounterReportDelivery--;
 }
 
-buildUnnamed222() {
+buildUnnamed659() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed222(core.List<api.DimensionValue> o) {
+checkUnnamed659(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed223() {
+buildUnnamed660() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed223(core.List<api.DimensionValue> o) {
+checkUnnamed660(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed224() {
+buildUnnamed661() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed224(core.List<api.SortedDimension> o) {
+checkUnnamed661(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed225() {
+buildUnnamed662() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed225(core.List<core.String> o) {
+checkUnnamed662(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1093,12 +1093,12 @@
   var o = new api.ReportFloodlightCriteria();
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    o.customRichMediaEvents = buildUnnamed222();
+    o.customRichMediaEvents = buildUnnamed659();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed223();
-    o.dimensions = buildUnnamed224();
+    o.dimensionFilters = buildUnnamed660();
+    o.dimensions = buildUnnamed661();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed225();
+    o.metricNames = buildUnnamed662();
     o.reportProperties = buildReportFloodlightCriteriaReportProperties();
   }
   buildCounterReportFloodlightCriteria--;
@@ -1108,90 +1108,90 @@
 checkReportFloodlightCriteria(api.ReportFloodlightCriteria o) {
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    checkUnnamed222(o.customRichMediaEvents);
+    checkUnnamed659(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed223(o.dimensionFilters);
-    checkUnnamed224(o.dimensions);
+    checkUnnamed660(o.dimensionFilters);
+    checkUnnamed661(o.dimensions);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed225(o.metricNames);
+    checkUnnamed662(o.metricNames);
     checkReportFloodlightCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportFloodlightCriteria--;
 }
 
-buildUnnamed226() {
+buildUnnamed663() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed226(core.List<api.DimensionValue> o) {
+checkUnnamed663(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed227() {
+buildUnnamed664() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed227(core.List<api.SortedDimension> o) {
+checkUnnamed664(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed228() {
+buildUnnamed665() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed228(core.List<api.SortedDimension> o) {
+checkUnnamed665(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed229() {
+buildUnnamed666() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed229(core.List<api.DimensionValue> o) {
+checkUnnamed666(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed230() {
+buildUnnamed667() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed230(core.List<core.String> o) {
+checkUnnamed667(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed231() {
+buildUnnamed668() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed231(core.List<api.SortedDimension> o) {
+checkUnnamed668(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
@@ -1237,14 +1237,14 @@
   var o = new api.ReportPathToConversionCriteria();
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    o.activityFilters = buildUnnamed226();
-    o.conversionDimensions = buildUnnamed227();
-    o.customFloodlightVariables = buildUnnamed228();
-    o.customRichMediaEvents = buildUnnamed229();
+    o.activityFilters = buildUnnamed663();
+    o.conversionDimensions = buildUnnamed664();
+    o.customFloodlightVariables = buildUnnamed665();
+    o.customRichMediaEvents = buildUnnamed666();
     o.dateRange = buildDateRange();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed230();
-    o.perInteractionDimensions = buildUnnamed231();
+    o.metricNames = buildUnnamed667();
+    o.perInteractionDimensions = buildUnnamed668();
     o.reportProperties = buildReportPathToConversionCriteriaReportProperties();
   }
   buildCounterReportPathToConversionCriteria--;
@@ -1254,66 +1254,66 @@
 checkReportPathToConversionCriteria(api.ReportPathToConversionCriteria o) {
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    checkUnnamed226(o.activityFilters);
-    checkUnnamed227(o.conversionDimensions);
-    checkUnnamed228(o.customFloodlightVariables);
-    checkUnnamed229(o.customRichMediaEvents);
+    checkUnnamed663(o.activityFilters);
+    checkUnnamed664(o.conversionDimensions);
+    checkUnnamed665(o.customFloodlightVariables);
+    checkUnnamed666(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed230(o.metricNames);
-    checkUnnamed231(o.perInteractionDimensions);
+    checkUnnamed667(o.metricNames);
+    checkUnnamed668(o.perInteractionDimensions);
     checkReportPathToConversionCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportPathToConversionCriteria--;
 }
 
-buildUnnamed232() {
+buildUnnamed669() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed232(core.List<api.DimensionValue> o) {
+checkUnnamed669(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed233() {
+buildUnnamed670() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed233(core.List<api.SortedDimension> o) {
+checkUnnamed670(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed234() {
+buildUnnamed671() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed234(core.List<core.String> o) {
+checkUnnamed671(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed235() {
+buildUnnamed672() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed235(core.List<core.String> o) {
+checkUnnamed672(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1327,10 +1327,10 @@
     o.activities = buildActivities();
     o.customRichMediaEvents = buildCustomRichMediaEvents();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed232();
-    o.dimensions = buildUnnamed233();
-    o.metricNames = buildUnnamed234();
-    o.reachByFrequencyMetricNames = buildUnnamed235();
+    o.dimensionFilters = buildUnnamed669();
+    o.dimensions = buildUnnamed670();
+    o.metricNames = buildUnnamed671();
+    o.reachByFrequencyMetricNames = buildUnnamed672();
   }
   buildCounterReportReachCriteria--;
   return o;
@@ -1342,22 +1342,22 @@
     checkActivities(o.activities);
     checkCustomRichMediaEvents(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed232(o.dimensionFilters);
-    checkUnnamed233(o.dimensions);
-    checkUnnamed234(o.metricNames);
-    checkUnnamed235(o.reachByFrequencyMetricNames);
+    checkUnnamed669(o.dimensionFilters);
+    checkUnnamed670(o.dimensions);
+    checkUnnamed671(o.metricNames);
+    checkUnnamed672(o.reachByFrequencyMetricNames);
   }
   buildCounterReportReachCriteria--;
 }
 
-buildUnnamed236() {
+buildUnnamed673() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed236(core.List<core.String> o) {
+checkUnnamed673(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1372,7 +1372,7 @@
     o.every = 42;
     o.expirationDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.repeats = "foo";
-    o.repeatsOnWeekDays = buildUnnamed236();
+    o.repeatsOnWeekDays = buildUnnamed673();
     o.runsOnDayOfMonth = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -1387,7 +1387,7 @@
     unittest.expect(o.every, unittest.equals(42));
     unittest.expect(o.expirationDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.repeats, unittest.equals('foo'));
-    checkUnnamed236(o.repeatsOnWeekDays);
+    checkUnnamed673(o.repeatsOnWeekDays);
     unittest.expect(o.runsOnDayOfMonth, unittest.equals('foo'));
     unittest.expect(o.startDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
   }
@@ -1449,53 +1449,53 @@
   buildCounterReport--;
 }
 
-buildUnnamed237() {
+buildUnnamed674() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed237(core.List<api.Dimension> o) {
+checkUnnamed674(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed238() {
+buildUnnamed675() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed238(core.List<api.Dimension> o) {
+checkUnnamed675(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed239() {
+buildUnnamed676() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed239(core.List<api.Metric> o) {
+checkUnnamed676(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed240() {
+buildUnnamed677() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed240(core.List<api.Metric> o) {
+checkUnnamed677(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -1506,11 +1506,11 @@
   var o = new api.ReportCompatibleFields();
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed237();
-    o.dimensions = buildUnnamed238();
+    o.dimensionFilters = buildUnnamed674();
+    o.dimensions = buildUnnamed675();
     o.kind = "foo";
-    o.metrics = buildUnnamed239();
-    o.pivotedActivityMetrics = buildUnnamed240();
+    o.metrics = buildUnnamed676();
+    o.pivotedActivityMetrics = buildUnnamed677();
   }
   buildCounterReportCompatibleFields--;
   return o;
@@ -1519,23 +1519,23 @@
 checkReportCompatibleFields(api.ReportCompatibleFields o) {
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    checkUnnamed237(o.dimensionFilters);
-    checkUnnamed238(o.dimensions);
+    checkUnnamed674(o.dimensionFilters);
+    checkUnnamed675(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed239(o.metrics);
-    checkUnnamed240(o.pivotedActivityMetrics);
+    checkUnnamed676(o.metrics);
+    checkUnnamed677(o.pivotedActivityMetrics);
   }
   buildCounterReportCompatibleFields--;
 }
 
-buildUnnamed241() {
+buildUnnamed678() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed241(core.List<api.Report> o) {
+checkUnnamed678(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -1547,7 +1547,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed241();
+    o.items = buildUnnamed678();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1559,7 +1559,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed241(o.items);
+    checkUnnamed678(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1622,14 +1622,14 @@
   buildCounterUserProfile--;
 }
 
-buildUnnamed242() {
+buildUnnamed679() {
   var o = new core.List<api.UserProfile>();
   o.add(buildUserProfile());
   o.add(buildUserProfile());
   return o;
 }
 
-checkUnnamed242(core.List<api.UserProfile> o) {
+checkUnnamed679(core.List<api.UserProfile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserProfile(o[0]);
   checkUserProfile(o[1]);
@@ -1641,7 +1641,7 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed242();
+    o.items = buildUnnamed679();
     o.kind = "foo";
   }
   buildCounterUserProfileList--;
@@ -1652,7 +1652,7 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed242(o.items);
+    checkUnnamed679(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUserProfileList--;
diff --git a/generated/googleapis/test/discovery/v1_test.dart b/generated/googleapis/test/discovery/v1_test.dart
index 41d7b1f..b29a948 100644
--- a/generated/googleapis/test/discovery/v1_test.dart
+++ b/generated/googleapis/test/discovery/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterDirectoryListItemsIcons--;
 }
 
-buildUnnamed277() {
+buildUnnamed680() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed277(core.List<core.String> o) {
+checkUnnamed680(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -62,7 +62,7 @@
     o.icons = buildDirectoryListItemsIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed277();
+    o.labels = buildUnnamed680();
     o.name = "foo";
     o.preferred = true;
     o.title = "foo";
@@ -82,7 +82,7 @@
     checkDirectoryListItemsIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed277(o.labels);
+    checkUnnamed680(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.preferred, unittest.isTrue);
     unittest.expect(o.title, unittest.equals('foo'));
@@ -91,14 +91,14 @@
   buildCounterDirectoryListItems--;
 }
 
-buildUnnamed278() {
+buildUnnamed681() {
   var o = new core.List<api.DirectoryListItems>();
   o.add(buildDirectoryListItems());
   o.add(buildDirectoryListItems());
   return o;
 }
 
-checkUnnamed278(core.List<api.DirectoryListItems> o) {
+checkUnnamed681(core.List<api.DirectoryListItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectoryListItems(o[0]);
   checkDirectoryListItems(o[1]);
@@ -110,7 +110,7 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     o.discoveryVersion = "foo";
-    o.items = buildUnnamed278();
+    o.items = buildUnnamed681();
     o.kind = "foo";
   }
   buildCounterDirectoryList--;
@@ -121,20 +121,20 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     unittest.expect(o.discoveryVersion, unittest.equals('foo'));
-    checkUnnamed278(o.items);
+    checkUnnamed681(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDirectoryList--;
 }
 
-buildUnnamed279() {
+buildUnnamed682() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed279(core.List<core.String> o) {
+checkUnnamed682(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -145,7 +145,7 @@
   var o = new api.JsonSchemaAnnotations();
   buildCounterJsonSchemaAnnotations++;
   if (buildCounterJsonSchemaAnnotations < 3) {
-    o.required = buildUnnamed279();
+    o.required = buildUnnamed682();
   }
   buildCounterJsonSchemaAnnotations--;
   return o;
@@ -154,45 +154,45 @@
 checkJsonSchemaAnnotations(api.JsonSchemaAnnotations o) {
   buildCounterJsonSchemaAnnotations++;
   if (buildCounterJsonSchemaAnnotations < 3) {
-    checkUnnamed279(o.required);
+    checkUnnamed682(o.required);
   }
   buildCounterJsonSchemaAnnotations--;
 }
 
-buildUnnamed280() {
+buildUnnamed683() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed280(core.List<core.String> o) {
+checkUnnamed683(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed281() {
+buildUnnamed684() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed281(core.List<core.String> o) {
+checkUnnamed684(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed282() {
+buildUnnamed685() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed282(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed685(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -219,14 +219,14 @@
   buildCounterJsonSchemaVariantMap--;
 }
 
-buildUnnamed283() {
+buildUnnamed686() {
   var o = new core.List<api.JsonSchemaVariantMap>();
   o.add(buildJsonSchemaVariantMap());
   o.add(buildJsonSchemaVariantMap());
   return o;
 }
 
-checkUnnamed283(core.List<api.JsonSchemaVariantMap> o) {
+checkUnnamed686(core.List<api.JsonSchemaVariantMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchemaVariantMap(o[0]);
   checkJsonSchemaVariantMap(o[1]);
@@ -238,7 +238,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     o.discriminant = "foo";
-    o.map = buildUnnamed283();
+    o.map = buildUnnamed686();
   }
   buildCounterJsonSchemaVariant--;
   return o;
@@ -248,7 +248,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     unittest.expect(o.discriminant, unittest.equals('foo'));
-    checkUnnamed283(o.map);
+    checkUnnamed686(o.map);
   }
   buildCounterJsonSchemaVariant--;
 }
@@ -263,8 +263,8 @@
     o.annotations = buildJsonSchemaAnnotations();
     o.default_ = "foo";
     o.description = "foo";
-    o.enum_ = buildUnnamed280();
-    o.enumDescriptions = buildUnnamed281();
+    o.enum_ = buildUnnamed683();
+    o.enumDescriptions = buildUnnamed684();
     o.format = "foo";
     o.id = "foo";
     o.items = buildJsonSchema();
@@ -272,7 +272,7 @@
     o.maximum = "foo";
     o.minimum = "foo";
     o.pattern = "foo";
-    o.properties = buildUnnamed282();
+    o.properties = buildUnnamed685();
     o.readOnly = true;
     o.repeated = true;
     o.required = true;
@@ -291,8 +291,8 @@
     checkJsonSchemaAnnotations(o.annotations);
     unittest.expect(o.default_, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed280(o.enum_);
-    checkUnnamed281(o.enumDescriptions);
+    checkUnnamed683(o.enum_);
+    checkUnnamed684(o.enumDescriptions);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkJsonSchema(o.items);
@@ -300,7 +300,7 @@
     unittest.expect(o.maximum, unittest.equals('foo'));
     unittest.expect(o.minimum, unittest.equals('foo'));
     unittest.expect(o.pattern, unittest.equals('foo'));
-    checkUnnamed282(o.properties);
+    checkUnnamed685(o.properties);
     unittest.expect(o.readOnly, unittest.isTrue);
     unittest.expect(o.repeated, unittest.isTrue);
     unittest.expect(o.required, unittest.isTrue);
@@ -329,14 +329,14 @@
   buildCounterRestDescriptionAuthOauth2ScopesValue--;
 }
 
-buildUnnamed284() {
+buildUnnamed687() {
   var o = new core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue>();
   o["x"] = buildRestDescriptionAuthOauth2ScopesValue();
   o["y"] = buildRestDescriptionAuthOauth2ScopesValue();
   return o;
 }
 
-checkUnnamed284(core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
+checkUnnamed687(core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestDescriptionAuthOauth2ScopesValue(o["x"]);
   checkRestDescriptionAuthOauth2ScopesValue(o["y"]);
@@ -347,7 +347,7 @@
   var o = new api.RestDescriptionAuthOauth2();
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    o.scopes = buildUnnamed284();
+    o.scopes = buildUnnamed687();
   }
   buildCounterRestDescriptionAuthOauth2--;
   return o;
@@ -356,7 +356,7 @@
 checkRestDescriptionAuthOauth2(api.RestDescriptionAuthOauth2 o) {
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    checkUnnamed284(o.scopes);
+    checkUnnamed687(o.scopes);
   }
   buildCounterRestDescriptionAuthOauth2--;
 }
@@ -380,14 +380,14 @@
   buildCounterRestDescriptionAuth--;
 }
 
-buildUnnamed285() {
+buildUnnamed688() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed285(core.List<core.String> o) {
+checkUnnamed688(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -414,66 +414,66 @@
   buildCounterRestDescriptionIcons--;
 }
 
-buildUnnamed286() {
+buildUnnamed689() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed286(core.List<core.String> o) {
+checkUnnamed689(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed287() {
+buildUnnamed690() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed287(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed690(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed288() {
+buildUnnamed691() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed288(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed691(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
 }
 
-buildUnnamed289() {
+buildUnnamed692() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed289(core.Map<core.String, api.RestResource> o) {
+checkUnnamed692(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
 }
 
-buildUnnamed290() {
+buildUnnamed693() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed290(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed693(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -493,22 +493,22 @@
     o.discoveryVersion = "foo";
     o.documentationLink = "foo";
     o.etag = "foo";
-    o.features = buildUnnamed285();
+    o.features = buildUnnamed688();
     o.icons = buildRestDescriptionIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed286();
-    o.methods = buildUnnamed287();
+    o.labels = buildUnnamed689();
+    o.methods = buildUnnamed690();
     o.name = "foo";
     o.ownerDomain = "foo";
     o.ownerName = "foo";
     o.packagePath = "foo";
-    o.parameters = buildUnnamed288();
+    o.parameters = buildUnnamed691();
     o.protocol = "foo";
-    o.resources = buildUnnamed289();
+    o.resources = buildUnnamed692();
     o.revision = "foo";
     o.rootUrl = "foo";
-    o.schemas = buildUnnamed290();
+    o.schemas = buildUnnamed693();
     o.servicePath = "foo";
     o.title = "foo";
     o.version = "foo";
@@ -529,22 +529,22 @@
     unittest.expect(o.discoveryVersion, unittest.equals('foo'));
     unittest.expect(o.documentationLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed285(o.features);
+    checkUnnamed688(o.features);
     checkRestDescriptionIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed286(o.labels);
-    checkUnnamed287(o.methods);
+    checkUnnamed689(o.labels);
+    checkUnnamed690(o.methods);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ownerDomain, unittest.equals('foo'));
     unittest.expect(o.ownerName, unittest.equals('foo'));
     unittest.expect(o.packagePath, unittest.equals('foo'));
-    checkUnnamed288(o.parameters);
+    checkUnnamed691(o.parameters);
     unittest.expect(o.protocol, unittest.equals('foo'));
-    checkUnnamed289(o.resources);
+    checkUnnamed692(o.resources);
     unittest.expect(o.revision, unittest.equals('foo'));
     unittest.expect(o.rootUrl, unittest.equals('foo'));
-    checkUnnamed290(o.schemas);
+    checkUnnamed693(o.schemas);
     unittest.expect(o.servicePath, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
@@ -552,14 +552,14 @@
   buildCounterRestDescription--;
 }
 
-buildUnnamed291() {
+buildUnnamed694() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed291(core.List<core.String> o) {
+checkUnnamed694(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -633,7 +633,7 @@
   var o = new api.RestMethodMediaUpload();
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    o.accept = buildUnnamed291();
+    o.accept = buildUnnamed694();
     o.maxSize = "foo";
     o.protocols = buildRestMethodMediaUploadProtocols();
   }
@@ -644,34 +644,34 @@
 checkRestMethodMediaUpload(api.RestMethodMediaUpload o) {
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    checkUnnamed291(o.accept);
+    checkUnnamed694(o.accept);
     unittest.expect(o.maxSize, unittest.equals('foo'));
     checkRestMethodMediaUploadProtocols(o.protocols);
   }
   buildCounterRestMethodMediaUpload--;
 }
 
-buildUnnamed292() {
+buildUnnamed695() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed292(core.List<core.String> o) {
+checkUnnamed695(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed293() {
+buildUnnamed696() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed293(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed696(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -717,14 +717,14 @@
   buildCounterRestMethodResponse--;
 }
 
-buildUnnamed294() {
+buildUnnamed697() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed294(core.List<core.String> o) {
+checkUnnamed697(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -740,12 +740,12 @@
     o.httpMethod = "foo";
     o.id = "foo";
     o.mediaUpload = buildRestMethodMediaUpload();
-    o.parameterOrder = buildUnnamed292();
-    o.parameters = buildUnnamed293();
+    o.parameterOrder = buildUnnamed695();
+    o.parameters = buildUnnamed696();
     o.path = "foo";
     o.request = buildRestMethodRequest();
     o.response = buildRestMethodResponse();
-    o.scopes = buildUnnamed294();
+    o.scopes = buildUnnamed697();
     o.supportsMediaDownload = true;
     o.supportsMediaUpload = true;
     o.supportsSubscription = true;
@@ -762,12 +762,12 @@
     unittest.expect(o.httpMethod, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkRestMethodMediaUpload(o.mediaUpload);
-    checkUnnamed292(o.parameterOrder);
-    checkUnnamed293(o.parameters);
+    checkUnnamed695(o.parameterOrder);
+    checkUnnamed696(o.parameters);
     unittest.expect(o.path, unittest.equals('foo'));
     checkRestMethodRequest(o.request);
     checkRestMethodResponse(o.response);
-    checkUnnamed294(o.scopes);
+    checkUnnamed697(o.scopes);
     unittest.expect(o.supportsMediaDownload, unittest.isTrue);
     unittest.expect(o.supportsMediaUpload, unittest.isTrue);
     unittest.expect(o.supportsSubscription, unittest.isTrue);
@@ -775,27 +775,27 @@
   buildCounterRestMethod--;
 }
 
-buildUnnamed295() {
+buildUnnamed698() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed295(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed698(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed296() {
+buildUnnamed699() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed296(core.Map<core.String, api.RestResource> o) {
+checkUnnamed699(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
@@ -806,8 +806,8 @@
   var o = new api.RestResource();
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    o.methods = buildUnnamed295();
-    o.resources = buildUnnamed296();
+    o.methods = buildUnnamed698();
+    o.resources = buildUnnamed699();
   }
   buildCounterRestResource--;
   return o;
@@ -816,8 +816,8 @@
 checkRestResource(api.RestResource o) {
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    checkUnnamed295(o.methods);
-    checkUnnamed296(o.resources);
+    checkUnnamed698(o.methods);
+    checkUnnamed699(o.resources);
   }
   buildCounterRestResource--;
 }
diff --git a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
index 332b4fe..2232a3f 100644
--- a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
+++ b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed709() {
+buildUnnamed700() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed709(core.List<core.String> o) {
+checkUnnamed700(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.DownloadLineItemsRequest();
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
-    o.filterIds = buildUnnamed709();
+    o.filterIds = buildUnnamed700();
     o.filterType = "foo";
     o.format = "foo";
   }
@@ -45,7 +45,7 @@
 checkDownloadLineItemsRequest(api.DownloadLineItemsRequest o) {
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
-    checkUnnamed709(o.filterIds);
+    checkUnnamed700(o.filterIds);
     unittest.expect(o.filterType, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
   }
@@ -92,14 +92,14 @@
   buildCounterFilterPair--;
 }
 
-buildUnnamed710() {
+buildUnnamed701() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed710(core.List<api.Query> o) {
+checkUnnamed701(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
@@ -111,7 +111,7 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     o.kind = "foo";
-    o.queries = buildUnnamed710();
+    o.queries = buildUnnamed701();
   }
   buildCounterListQueriesResponse--;
   return o;
@@ -121,19 +121,19 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed710(o.queries);
+    checkUnnamed701(o.queries);
   }
   buildCounterListQueriesResponse--;
 }
 
-buildUnnamed711() {
+buildUnnamed702() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed711(core.List<api.Report> o) {
+checkUnnamed702(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -145,7 +145,7 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     o.kind = "foo";
-    o.reports = buildUnnamed711();
+    o.reports = buildUnnamed702();
   }
   buildCounterListReportsResponse--;
   return o;
@@ -155,45 +155,45 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed711(o.reports);
+    checkUnnamed702(o.reports);
   }
   buildCounterListReportsResponse--;
 }
 
-buildUnnamed712() {
+buildUnnamed703() {
   var o = new core.List<api.FilterPair>();
   o.add(buildFilterPair());
   o.add(buildFilterPair());
   return o;
 }
 
-checkUnnamed712(core.List<api.FilterPair> o) {
+checkUnnamed703(core.List<api.FilterPair> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilterPair(o[0]);
   checkFilterPair(o[1]);
 }
 
-buildUnnamed713() {
+buildUnnamed704() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed713(core.List<core.String> o) {
+checkUnnamed704(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed714() {
+buildUnnamed705() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed714(core.List<core.String> o) {
+checkUnnamed705(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -204,10 +204,10 @@
   var o = new api.Parameters();
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    o.filters = buildUnnamed712();
-    o.groupBys = buildUnnamed713();
+    o.filters = buildUnnamed703();
+    o.groupBys = buildUnnamed704();
     o.includeInviteData = true;
-    o.metrics = buildUnnamed714();
+    o.metrics = buildUnnamed705();
     o.type = "foo";
   }
   buildCounterParameters--;
@@ -217,10 +217,10 @@
 checkParameters(api.Parameters o) {
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    checkUnnamed712(o.filters);
-    checkUnnamed713(o.groupBys);
+    checkUnnamed703(o.filters);
+    checkUnnamed704(o.groupBys);
     unittest.expect(o.includeInviteData, unittest.isTrue);
-    checkUnnamed714(o.metrics);
+    checkUnnamed705(o.metrics);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterParameters--;
@@ -259,14 +259,14 @@
   buildCounterQuery--;
 }
 
-buildUnnamed715() {
+buildUnnamed706() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed715(core.List<core.String> o) {
+checkUnnamed706(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -285,7 +285,7 @@
     o.reportCount = 42;
     o.running = true;
     o.sendNotification = true;
-    o.shareEmailAddress = buildUnnamed715();
+    o.shareEmailAddress = buildUnnamed706();
     o.title = "foo";
   }
   buildCounterQueryMetadata--;
@@ -303,7 +303,7 @@
     unittest.expect(o.reportCount, unittest.equals(42));
     unittest.expect(o.running, unittest.isTrue);
     unittest.expect(o.sendNotification, unittest.isTrue);
-    checkUnnamed715(o.shareEmailAddress);
+    checkUnnamed706(o.shareEmailAddress);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterQueryMetadata--;
@@ -447,14 +447,14 @@
   buildCounterReportStatus--;
 }
 
-buildUnnamed716() {
+buildUnnamed707() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed716(core.List<core.String> o) {
+checkUnnamed707(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -468,7 +468,7 @@
     o.changed = true;
     o.entityId = "foo";
     o.entityName = "foo";
-    o.errors = buildUnnamed716();
+    o.errors = buildUnnamed707();
     o.persisted = true;
     o.rowNumber = 42;
   }
@@ -482,7 +482,7 @@
     unittest.expect(o.changed, unittest.isTrue);
     unittest.expect(o.entityId, unittest.equals('foo'));
     unittest.expect(o.entityName, unittest.equals('foo'));
-    checkUnnamed716(o.errors);
+    checkUnnamed707(o.errors);
     unittest.expect(o.persisted, unittest.isTrue);
     unittest.expect(o.rowNumber, unittest.equals(42));
   }
@@ -556,27 +556,27 @@
   buildCounterUploadLineItemsResponse--;
 }
 
-buildUnnamed717() {
+buildUnnamed708() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed717(core.List<core.String> o) {
+checkUnnamed708(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed718() {
+buildUnnamed709() {
   var o = new core.List<api.RowStatus>();
   o.add(buildRowStatus());
   o.add(buildRowStatus());
   return o;
 }
 
-checkUnnamed718(core.List<api.RowStatus> o) {
+checkUnnamed709(core.List<api.RowStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRowStatus(o[0]);
   checkRowStatus(o[1]);
@@ -587,8 +587,8 @@
   var o = new api.UploadStatus();
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    o.errors = buildUnnamed717();
-    o.rowStatus = buildUnnamed718();
+    o.errors = buildUnnamed708();
+    o.rowStatus = buildUnnamed709();
   }
   buildCounterUploadStatus--;
   return o;
@@ -597,8 +597,8 @@
 checkUploadStatus(api.UploadStatus o) {
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    checkUnnamed717(o.errors);
-    checkUnnamed718(o.rowStatus);
+    checkUnnamed708(o.errors);
+    checkUnnamed709(o.rowStatus);
   }
   buildCounterUploadStatus--;
 }
diff --git a/generated/googleapis/test/doubleclicksearch/v2_test.dart b/generated/googleapis/test/doubleclicksearch/v2_test.dart
index 59159fe..25f032d 100644
--- a/generated/googleapis/test/doubleclicksearch/v2_test.dart
+++ b/generated/googleapis/test/doubleclicksearch/v2_test.dart
@@ -45,27 +45,27 @@
   buildCounterAvailability--;
 }
 
-buildUnnamed749() {
+buildUnnamed710() {
   var o = new core.List<api.CustomDimension>();
   o.add(buildCustomDimension());
   o.add(buildCustomDimension());
   return o;
 }
 
-checkUnnamed749(core.List<api.CustomDimension> o) {
+checkUnnamed710(core.List<api.CustomDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDimension(o[0]);
   checkCustomDimension(o[1]);
 }
 
-buildUnnamed750() {
+buildUnnamed711() {
   var o = new core.List<api.CustomMetric>();
   o.add(buildCustomMetric());
   o.add(buildCustomMetric());
   return o;
 }
 
-checkUnnamed750(core.List<api.CustomMetric> o) {
+checkUnnamed711(core.List<api.CustomMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomMetric(o[0]);
   checkCustomMetric(o[1]);
@@ -80,15 +80,17 @@
     o.adId = "foo";
     o.advertiserId = "foo";
     o.agencyId = "foo";
+    o.attributionModel = "foo";
     o.campaignId = "foo";
     o.clickId = "foo";
     o.conversionId = "foo";
     o.conversionModifiedTimestamp = "foo";
     o.conversionTimestamp = "foo";
+    o.countMillis = "foo";
     o.criterionId = "foo";
     o.currencyCode = "foo";
-    o.customDimension = buildUnnamed749();
-    o.customMetric = buildUnnamed750();
+    o.customDimension = buildUnnamed710();
+    o.customMetric = buildUnnamed711();
     o.dsConversionId = "foo";
     o.engineAccountId = "foo";
     o.floodlightOrderId = "foo";
@@ -111,15 +113,17 @@
     unittest.expect(o.adId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
     unittest.expect(o.agencyId, unittest.equals('foo'));
+    unittest.expect(o.attributionModel, unittest.equals('foo'));
     unittest.expect(o.campaignId, unittest.equals('foo'));
     unittest.expect(o.clickId, unittest.equals('foo'));
     unittest.expect(o.conversionId, unittest.equals('foo'));
     unittest.expect(o.conversionModifiedTimestamp, unittest.equals('foo'));
     unittest.expect(o.conversionTimestamp, unittest.equals('foo'));
+    unittest.expect(o.countMillis, unittest.equals('foo'));
     unittest.expect(o.criterionId, unittest.equals('foo'));
     unittest.expect(o.currencyCode, unittest.equals('foo'));
-    checkUnnamed749(o.customDimension);
-    checkUnnamed750(o.customMetric);
+    checkUnnamed710(o.customDimension);
+    checkUnnamed711(o.customMetric);
     unittest.expect(o.dsConversionId, unittest.equals('foo'));
     unittest.expect(o.engineAccountId, unittest.equals('foo'));
     unittest.expect(o.floodlightOrderId, unittest.equals('foo'));
@@ -134,14 +138,14 @@
   buildCounterConversion--;
 }
 
-buildUnnamed751() {
+buildUnnamed712() {
   var o = new core.List<api.Conversion>();
   o.add(buildConversion());
   o.add(buildConversion());
   return o;
 }
 
-checkUnnamed751(core.List<api.Conversion> o) {
+checkUnnamed712(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversion(o[0]);
   checkConversion(o[1]);
@@ -152,7 +156,7 @@
   var o = new api.ConversionList();
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    o.conversion = buildUnnamed751();
+    o.conversion = buildUnnamed712();
     o.kind = "foo";
   }
   buildCounterConversionList--;
@@ -162,7 +166,7 @@
 checkConversionList(api.ConversionList o) {
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    checkUnnamed751(o.conversion);
+    checkUnnamed712(o.conversion);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionList--;
@@ -231,27 +235,27 @@
   buildCounterReportFiles--;
 }
 
-buildUnnamed752() {
+buildUnnamed713() {
   var o = new core.List<api.ReportFiles>();
   o.add(buildReportFiles());
   o.add(buildReportFiles());
   return o;
 }
 
-checkUnnamed752(core.List<api.ReportFiles> o) {
+checkUnnamed713(core.List<api.ReportFiles> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportFiles(o[0]);
   checkReportFiles(o[1]);
 }
 
-buildUnnamed753() {
+buildUnnamed714() {
   var o = new core.List<api.ReportRow>();
   o.add(buildReportRow());
   o.add(buildReportRow());
   return o;
 }
 
-checkUnnamed753(core.List<api.ReportRow> o) {
+checkUnnamed714(core.List<api.ReportRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRow(o[0]);
   checkReportRow(o[1]);
@@ -262,13 +266,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.files = buildUnnamed752();
+    o.files = buildUnnamed713();
     o.id = "foo";
     o.isReportReady = true;
     o.kind = "foo";
     o.request = buildReportRequest();
     o.rowCount = 42;
-    o.rows = buildUnnamed753();
+    o.rows = buildUnnamed714();
     o.statisticsCurrencyCode = "foo";
     o.statisticsTimeZone = "foo";
   }
@@ -279,13 +283,13 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed752(o.files);
+    checkUnnamed713(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.isReportReady, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkReportRequest(o.request);
     unittest.expect(o.rowCount, unittest.equals(42));
-    checkUnnamed753(o.rows);
+    checkUnnamed714(o.rows);
     unittest.expect(o.statisticsCurrencyCode, unittest.equals('foo'));
     unittest.expect(o.statisticsTimeZone, unittest.equals('foo'));
   }
@@ -327,27 +331,27 @@
   buildCounterReportApiColumnSpec--;
 }
 
-buildUnnamed754() {
+buildUnnamed715() {
   var o = new core.List<api.ReportApiColumnSpec>();
   o.add(buildReportApiColumnSpec());
   o.add(buildReportApiColumnSpec());
   return o;
 }
 
-checkUnnamed754(core.List<api.ReportApiColumnSpec> o) {
+checkUnnamed715(core.List<api.ReportApiColumnSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportApiColumnSpec(o[0]);
   checkReportApiColumnSpec(o[1]);
 }
 
-buildUnnamed755() {
+buildUnnamed716() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed755(core.List<core.Object> o) {
+checkUnnamed716(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -360,7 +364,7 @@
   if (buildCounterReportRequestFilters < 3) {
     o.column = buildReportApiColumnSpec();
     o.operator = "foo";
-    o.values = buildUnnamed755();
+    o.values = buildUnnamed716();
   }
   buildCounterReportRequestFilters--;
   return o;
@@ -371,19 +375,19 @@
   if (buildCounterReportRequestFilters < 3) {
     checkReportApiColumnSpec(o.column);
     unittest.expect(o.operator, unittest.equals('foo'));
-    checkUnnamed755(o.values);
+    checkUnnamed716(o.values);
   }
   buildCounterReportRequestFilters--;
 }
 
-buildUnnamed756() {
+buildUnnamed717() {
   var o = new core.List<api.ReportRequestFilters>();
   o.add(buildReportRequestFilters());
   o.add(buildReportRequestFilters());
   return o;
 }
 
-checkUnnamed756(core.List<api.ReportRequestFilters> o) {
+checkUnnamed717(core.List<api.ReportRequestFilters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestFilters(o[0]);
   checkReportRequestFilters(o[1]);
@@ -410,14 +414,14 @@
   buildCounterReportRequestOrderBy--;
 }
 
-buildUnnamed757() {
+buildUnnamed718() {
   var o = new core.List<api.ReportRequestOrderBy>();
   o.add(buildReportRequestOrderBy());
   o.add(buildReportRequestOrderBy());
   return o;
 }
 
-checkUnnamed757(core.List<api.ReportRequestOrderBy> o) {
+checkUnnamed718(core.List<api.ReportRequestOrderBy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestOrderBy(o[0]);
   checkReportRequestOrderBy(o[1]);
@@ -484,13 +488,13 @@
   var o = new api.ReportRequest();
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    o.columns = buildUnnamed754();
+    o.columns = buildUnnamed715();
     o.downloadFormat = "foo";
-    o.filters = buildUnnamed756();
+    o.filters = buildUnnamed717();
     o.includeDeletedEntities = true;
     o.includeRemovedEntities = true;
     o.maxRowsPerFile = 42;
-    o.orderBy = buildUnnamed757();
+    o.orderBy = buildUnnamed718();
     o.reportScope = buildReportRequestReportScope();
     o.reportType = "foo";
     o.rowCount = 42;
@@ -506,13 +510,13 @@
 checkReportRequest(api.ReportRequest o) {
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    checkUnnamed754(o.columns);
+    checkUnnamed715(o.columns);
     unittest.expect(o.downloadFormat, unittest.equals('foo'));
-    checkUnnamed756(o.filters);
+    checkUnnamed717(o.filters);
     unittest.expect(o.includeDeletedEntities, unittest.isTrue);
     unittest.expect(o.includeRemovedEntities, unittest.isTrue);
     unittest.expect(o.maxRowsPerFile, unittest.equals(42));
-    checkUnnamed757(o.orderBy);
+    checkUnnamed718(o.orderBy);
     checkReportRequestReportScope(o.reportScope);
     unittest.expect(o.reportType, unittest.equals('foo'));
     unittest.expect(o.rowCount, unittest.equals(42));
@@ -560,14 +564,14 @@
   buildCounterSavedColumn--;
 }
 
-buildUnnamed758() {
+buildUnnamed719() {
   var o = new core.List<api.SavedColumn>();
   o.add(buildSavedColumn());
   o.add(buildSavedColumn());
   return o;
 }
 
-checkUnnamed758(core.List<api.SavedColumn> o) {
+checkUnnamed719(core.List<api.SavedColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedColumn(o[0]);
   checkSavedColumn(o[1]);
@@ -578,7 +582,7 @@
   var o = new api.SavedColumnList();
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    o.items = buildUnnamed758();
+    o.items = buildUnnamed719();
     o.kind = "foo";
   }
   buildCounterSavedColumnList--;
@@ -588,20 +592,20 @@
 checkSavedColumnList(api.SavedColumnList o) {
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    checkUnnamed758(o.items);
+    checkUnnamed719(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSavedColumnList--;
 }
 
-buildUnnamed759() {
+buildUnnamed720() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed759(core.List<api.Availability> o) {
+checkUnnamed720(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -612,7 +616,7 @@
   var o = new api.UpdateAvailabilityRequest();
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    o.availabilities = buildUnnamed759();
+    o.availabilities = buildUnnamed720();
   }
   buildCounterUpdateAvailabilityRequest--;
   return o;
@@ -621,19 +625,19 @@
 checkUpdateAvailabilityRequest(api.UpdateAvailabilityRequest o) {
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    checkUnnamed759(o.availabilities);
+    checkUnnamed720(o.availabilities);
   }
   buildCounterUpdateAvailabilityRequest--;
 }
 
-buildUnnamed760() {
+buildUnnamed721() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed760(core.List<api.Availability> o) {
+checkUnnamed721(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -644,7 +648,7 @@
   var o = new api.UpdateAvailabilityResponse();
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    o.availabilities = buildUnnamed760();
+    o.availabilities = buildUnnamed721();
   }
   buildCounterUpdateAvailabilityResponse--;
   return o;
@@ -653,7 +657,7 @@
 checkUpdateAvailabilityResponse(api.UpdateAvailabilityResponse o) {
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    checkUnnamed760(o.availabilities);
+    checkUnnamed721(o.availabilities);
   }
   buildCounterUpdateAvailabilityResponse--;
 }
diff --git a/generated/googleapis/test/drive/v2_test.dart b/generated/googleapis/test/drive/v2_test.dart
index 18a3cbe..fb5baea 100644
--- a/generated/googleapis/test/drive/v2_test.dart
+++ b/generated/googleapis/test/drive/v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed403() {
+buildUnnamed722() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed403(core.List<core.String> o) {
+checkUnnamed722(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.AboutAdditionalRoleInfoRoleSets();
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    o.additionalRoles = buildUnnamed403();
+    o.additionalRoles = buildUnnamed722();
     o.primaryRole = "foo";
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
@@ -44,20 +44,20 @@
 checkAboutAdditionalRoleInfoRoleSets(api.AboutAdditionalRoleInfoRoleSets o) {
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    checkUnnamed403(o.additionalRoles);
+    checkUnnamed722(o.additionalRoles);
     unittest.expect(o.primaryRole, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
 }
 
-buildUnnamed404() {
+buildUnnamed723() {
   var o = new core.List<api.AboutAdditionalRoleInfoRoleSets>();
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   return o;
 }
 
-checkUnnamed404(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
+checkUnnamed723(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfoRoleSets(o[0]);
   checkAboutAdditionalRoleInfoRoleSets(o[1]);
@@ -68,7 +68,7 @@
   var o = new api.AboutAdditionalRoleInfo();
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    o.roleSets = buildUnnamed404();
+    o.roleSets = buildUnnamed723();
     o.type = "foo";
   }
   buildCounterAboutAdditionalRoleInfo--;
@@ -78,33 +78,33 @@
 checkAboutAdditionalRoleInfo(api.AboutAdditionalRoleInfo o) {
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    checkUnnamed404(o.roleSets);
+    checkUnnamed723(o.roleSets);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfo--;
 }
 
-buildUnnamed405() {
+buildUnnamed724() {
   var o = new core.List<api.AboutAdditionalRoleInfo>();
   o.add(buildAboutAdditionalRoleInfo());
   o.add(buildAboutAdditionalRoleInfo());
   return o;
 }
 
-checkUnnamed405(core.List<api.AboutAdditionalRoleInfo> o) {
+checkUnnamed724(core.List<api.AboutAdditionalRoleInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfo(o[0]);
   checkAboutAdditionalRoleInfo(o[1]);
 }
 
-buildUnnamed406() {
+buildUnnamed725() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed406(core.List<core.String> o) {
+checkUnnamed725(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -116,7 +116,7 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed406();
+    o.targets = buildUnnamed725();
   }
   buildCounterAboutExportFormats--;
   return o;
@@ -126,19 +126,19 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed406(o.targets);
+    checkUnnamed725(o.targets);
   }
   buildCounterAboutExportFormats--;
 }
 
-buildUnnamed407() {
+buildUnnamed726() {
   var o = new core.List<api.AboutExportFormats>();
   o.add(buildAboutExportFormats());
   o.add(buildAboutExportFormats());
   return o;
 }
 
-checkUnnamed407(core.List<api.AboutExportFormats> o) {
+checkUnnamed726(core.List<api.AboutExportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutExportFormats(o[0]);
   checkAboutExportFormats(o[1]);
@@ -165,27 +165,27 @@
   buildCounterAboutFeatures--;
 }
 
-buildUnnamed408() {
+buildUnnamed727() {
   var o = new core.List<api.AboutFeatures>();
   o.add(buildAboutFeatures());
   o.add(buildAboutFeatures());
   return o;
 }
 
-checkUnnamed408(core.List<api.AboutFeatures> o) {
+checkUnnamed727(core.List<api.AboutFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutFeatures(o[0]);
   checkAboutFeatures(o[1]);
 }
 
-buildUnnamed409() {
+buildUnnamed728() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed409(core.List<core.String> o) {
+checkUnnamed728(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -197,7 +197,7 @@
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed409();
+    o.targets = buildUnnamed728();
   }
   buildCounterAboutImportFormats--;
   return o;
@@ -207,19 +207,19 @@
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed409(o.targets);
+    checkUnnamed728(o.targets);
   }
   buildCounterAboutImportFormats--;
 }
 
-buildUnnamed410() {
+buildUnnamed729() {
   var o = new core.List<api.AboutImportFormats>();
   o.add(buildAboutImportFormats());
   o.add(buildAboutImportFormats());
   return o;
 }
 
-checkUnnamed410(core.List<api.AboutImportFormats> o) {
+checkUnnamed729(core.List<api.AboutImportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutImportFormats(o[0]);
   checkAboutImportFormats(o[1]);
@@ -246,14 +246,14 @@
   buildCounterAboutMaxUploadSizes--;
 }
 
-buildUnnamed411() {
+buildUnnamed730() {
   var o = new core.List<api.AboutMaxUploadSizes>();
   o.add(buildAboutMaxUploadSizes());
   o.add(buildAboutMaxUploadSizes());
   return o;
 }
 
-checkUnnamed411(core.List<api.AboutMaxUploadSizes> o) {
+checkUnnamed730(core.List<api.AboutMaxUploadSizes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutMaxUploadSizes(o[0]);
   checkAboutMaxUploadSizes(o[1]);
@@ -280,14 +280,14 @@
   buildCounterAboutQuotaBytesByService--;
 }
 
-buildUnnamed412() {
+buildUnnamed731() {
   var o = new core.List<api.AboutQuotaBytesByService>();
   o.add(buildAboutQuotaBytesByService());
   o.add(buildAboutQuotaBytesByService());
   return o;
 }
 
-checkUnnamed412(core.List<api.AboutQuotaBytesByService> o) {
+checkUnnamed731(core.List<api.AboutQuotaBytesByService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutQuotaBytesByService(o[0]);
   checkAboutQuotaBytesByService(o[1]);
@@ -298,20 +298,20 @@
   var o = new api.About();
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    o.additionalRoleInfo = buildUnnamed405();
+    o.additionalRoleInfo = buildUnnamed724();
     o.domainSharingPolicy = "foo";
     o.etag = "foo";
-    o.exportFormats = buildUnnamed407();
-    o.features = buildUnnamed408();
-    o.importFormats = buildUnnamed410();
+    o.exportFormats = buildUnnamed726();
+    o.features = buildUnnamed727();
+    o.importFormats = buildUnnamed729();
     o.isCurrentAppInstalled = true;
     o.kind = "foo";
     o.languageCode = "foo";
     o.largestChangeId = "foo";
-    o.maxUploadSizes = buildUnnamed411();
+    o.maxUploadSizes = buildUnnamed730();
     o.name = "foo";
     o.permissionId = "foo";
-    o.quotaBytesByService = buildUnnamed412();
+    o.quotaBytesByService = buildUnnamed731();
     o.quotaBytesTotal = "foo";
     o.quotaBytesUsed = "foo";
     o.quotaBytesUsedAggregate = "foo";
@@ -329,20 +329,20 @@
 checkAbout(api.About o) {
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    checkUnnamed405(o.additionalRoleInfo);
+    checkUnnamed724(o.additionalRoleInfo);
     unittest.expect(o.domainSharingPolicy, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed407(o.exportFormats);
-    checkUnnamed408(o.features);
-    checkUnnamed410(o.importFormats);
+    checkUnnamed726(o.exportFormats);
+    checkUnnamed727(o.features);
+    checkUnnamed729(o.importFormats);
     unittest.expect(o.isCurrentAppInstalled, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.largestChangeId, unittest.equals('foo'));
-    checkUnnamed411(o.maxUploadSizes);
+    checkUnnamed730(o.maxUploadSizes);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.permissionId, unittest.equals('foo'));
-    checkUnnamed412(o.quotaBytesByService);
+    checkUnnamed731(o.quotaBytesByService);
     unittest.expect(o.quotaBytesTotal, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsedAggregate, unittest.equals('foo'));
@@ -379,66 +379,66 @@
   buildCounterAppIcons--;
 }
 
-buildUnnamed413() {
+buildUnnamed732() {
   var o = new core.List<api.AppIcons>();
   o.add(buildAppIcons());
   o.add(buildAppIcons());
   return o;
 }
 
-checkUnnamed413(core.List<api.AppIcons> o) {
+checkUnnamed732(core.List<api.AppIcons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppIcons(o[0]);
   checkAppIcons(o[1]);
 }
 
-buildUnnamed414() {
+buildUnnamed733() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed414(core.List<core.String> o) {
+checkUnnamed733(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed415() {
+buildUnnamed734() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed415(core.List<core.String> o) {
+checkUnnamed734(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed416() {
+buildUnnamed735() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed416(core.List<core.String> o) {
+checkUnnamed735(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed417() {
+buildUnnamed736() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed417(core.List<core.String> o) {
+checkUnnamed736(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -453,7 +453,7 @@
     o.createInFolderTemplate = "foo";
     o.createUrl = "foo";
     o.hasDriveWideScope = true;
-    o.icons = buildUnnamed413();
+    o.icons = buildUnnamed732();
     o.id = "foo";
     o.installed = true;
     o.kind = "foo";
@@ -461,12 +461,12 @@
     o.name = "foo";
     o.objectType = "foo";
     o.openUrlTemplate = "foo";
-    o.primaryFileExtensions = buildUnnamed414();
-    o.primaryMimeTypes = buildUnnamed415();
+    o.primaryFileExtensions = buildUnnamed733();
+    o.primaryMimeTypes = buildUnnamed734();
     o.productId = "foo";
     o.productUrl = "foo";
-    o.secondaryFileExtensions = buildUnnamed416();
-    o.secondaryMimeTypes = buildUnnamed417();
+    o.secondaryFileExtensions = buildUnnamed735();
+    o.secondaryMimeTypes = buildUnnamed736();
     o.shortDescription = "foo";
     o.supportsCreate = true;
     o.supportsImport = true;
@@ -485,7 +485,7 @@
     unittest.expect(o.createInFolderTemplate, unittest.equals('foo'));
     unittest.expect(o.createUrl, unittest.equals('foo'));
     unittest.expect(o.hasDriveWideScope, unittest.isTrue);
-    checkUnnamed413(o.icons);
+    checkUnnamed732(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.installed, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -493,12 +493,12 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.openUrlTemplate, unittest.equals('foo'));
-    checkUnnamed414(o.primaryFileExtensions);
-    checkUnnamed415(o.primaryMimeTypes);
+    checkUnnamed733(o.primaryFileExtensions);
+    checkUnnamed734(o.primaryMimeTypes);
     unittest.expect(o.productId, unittest.equals('foo'));
     unittest.expect(o.productUrl, unittest.equals('foo'));
-    checkUnnamed416(o.secondaryFileExtensions);
-    checkUnnamed417(o.secondaryMimeTypes);
+    checkUnnamed735(o.secondaryFileExtensions);
+    checkUnnamed736(o.secondaryMimeTypes);
     unittest.expect(o.shortDescription, unittest.equals('foo'));
     unittest.expect(o.supportsCreate, unittest.isTrue);
     unittest.expect(o.supportsImport, unittest.isTrue);
@@ -509,27 +509,27 @@
   buildCounterApp--;
 }
 
-buildUnnamed418() {
+buildUnnamed737() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed418(core.List<core.String> o) {
+checkUnnamed737(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed419() {
+buildUnnamed738() {
   var o = new core.List<api.App>();
   o.add(buildApp());
   o.add(buildApp());
   return o;
 }
 
-checkUnnamed419(core.List<api.App> o) {
+checkUnnamed738(core.List<api.App> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApp(o[0]);
   checkApp(o[1]);
@@ -540,9 +540,9 @@
   var o = new api.AppList();
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    o.defaultAppIds = buildUnnamed418();
+    o.defaultAppIds = buildUnnamed737();
     o.etag = "foo";
-    o.items = buildUnnamed419();
+    o.items = buildUnnamed738();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -553,9 +553,9 @@
 checkAppList(api.AppList o) {
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    checkUnnamed418(o.defaultAppIds);
+    checkUnnamed737(o.defaultAppIds);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed419(o.items);
+    checkUnnamed738(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -593,14 +593,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed420() {
+buildUnnamed739() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed420(core.List<api.Change> o) {
+checkUnnamed739(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -612,7 +612,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed420();
+    o.items = buildUnnamed739();
     o.kind = "foo";
     o.largestChangeId = "foo";
     o.nextLink = "foo";
@@ -627,7 +627,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed420(o.items);
+    checkUnnamed739(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.largestChangeId, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -637,14 +637,14 @@
   buildCounterChangeList--;
 }
 
-buildUnnamed421() {
+buildUnnamed740() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed421(core.Map<core.String, core.String> o) {
+checkUnnamed740(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -659,7 +659,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed421();
+    o.params = buildUnnamed740();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -677,7 +677,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed421(o.params);
+    checkUnnamed740(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -687,14 +687,14 @@
   buildCounterChannel--;
 }
 
-buildUnnamed422() {
+buildUnnamed741() {
   var o = new core.List<api.ChildReference>();
   o.add(buildChildReference());
   o.add(buildChildReference());
   return o;
 }
 
-checkUnnamed422(core.List<api.ChildReference> o) {
+checkUnnamed741(core.List<api.ChildReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChildReference(o[0]);
   checkChildReference(o[1]);
@@ -706,7 +706,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed422();
+    o.items = buildUnnamed741();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -720,7 +720,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed422(o.items);
+    checkUnnamed741(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -775,14 +775,14 @@
   buildCounterCommentContext--;
 }
 
-buildUnnamed423() {
+buildUnnamed742() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed423(core.List<api.CommentReply> o) {
+checkUnnamed742(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -805,7 +805,7 @@
     o.htmlContent = "foo";
     o.kind = "foo";
     o.modifiedDate = core.DateTime.parse("2002-02-27T14:01:02");
-    o.replies = buildUnnamed423();
+    o.replies = buildUnnamed742();
     o.selfLink = "foo";
     o.status = "foo";
   }
@@ -828,21 +828,21 @@
     unittest.expect(o.htmlContent, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.modifiedDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed423(o.replies);
+    checkUnnamed742(o.replies);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterComment--;
 }
 
-buildUnnamed424() {
+buildUnnamed743() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed424(core.List<api.Comment> o) {
+checkUnnamed743(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -853,7 +853,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.items = buildUnnamed424();
+    o.items = buildUnnamed743();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -866,7 +866,7 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed424(o.items);
+    checkUnnamed743(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -910,14 +910,14 @@
   buildCounterCommentReply--;
 }
 
-buildUnnamed425() {
+buildUnnamed744() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed425(core.List<api.CommentReply> o) {
+checkUnnamed744(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -928,7 +928,7 @@
   var o = new api.CommentReplyList();
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    o.items = buildUnnamed425();
+    o.items = buildUnnamed744();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -941,7 +941,7 @@
 checkCommentReplyList(api.CommentReplyList o) {
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    checkUnnamed425(o.items);
+    checkUnnamed744(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -950,14 +950,14 @@
   buildCounterCommentReplyList--;
 }
 
-buildUnnamed426() {
+buildUnnamed745() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed426(core.Map<core.String, core.String> o) {
+checkUnnamed745(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1091,79 +1091,79 @@
   buildCounterFileLabels--;
 }
 
-buildUnnamed427() {
+buildUnnamed746() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed427(core.Map<core.String, core.String> o) {
+checkUnnamed746(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed428() {
+buildUnnamed747() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed428(core.List<core.String> o) {
+checkUnnamed747(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed429() {
+buildUnnamed748() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed429(core.List<api.User> o) {
+checkUnnamed748(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
 }
 
-buildUnnamed430() {
+buildUnnamed749() {
   var o = new core.List<api.ParentReference>();
   o.add(buildParentReference());
   o.add(buildParentReference());
   return o;
 }
 
-checkUnnamed430(core.List<api.ParentReference> o) {
+checkUnnamed749(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParentReference(o[0]);
   checkParentReference(o[1]);
 }
 
-buildUnnamed431() {
+buildUnnamed750() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed431(core.List<api.Permission> o) {
+checkUnnamed750(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed432() {
+buildUnnamed751() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed432(core.List<api.Property> o) {
+checkUnnamed751(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
@@ -1229,7 +1229,7 @@
     o.embedLink = "foo";
     o.etag = "foo";
     o.explicitlyTrashed = true;
-    o.exportLinks = buildUnnamed426();
+    o.exportLinks = buildUnnamed745();
     o.fileExtension = "foo";
     o.fileSize = "foo";
     o.headRevisionId = "foo";
@@ -1247,13 +1247,13 @@
     o.mimeType = "foo";
     o.modifiedByMeDate = core.DateTime.parse("2002-02-27T14:01:02");
     o.modifiedDate = core.DateTime.parse("2002-02-27T14:01:02");
-    o.openWithLinks = buildUnnamed427();
+    o.openWithLinks = buildUnnamed746();
     o.originalFilename = "foo";
-    o.ownerNames = buildUnnamed428();
-    o.owners = buildUnnamed429();
-    o.parents = buildUnnamed430();
-    o.permissions = buildUnnamed431();
-    o.properties = buildUnnamed432();
+    o.ownerNames = buildUnnamed747();
+    o.owners = buildUnnamed748();
+    o.parents = buildUnnamed749();
+    o.permissions = buildUnnamed750();
+    o.properties = buildUnnamed751();
     o.quotaBytesUsed = "foo";
     o.selfLink = "foo";
     o.shared = true;
@@ -1287,7 +1287,7 @@
     unittest.expect(o.embedLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.explicitlyTrashed, unittest.isTrue);
-    checkUnnamed426(o.exportLinks);
+    checkUnnamed745(o.exportLinks);
     unittest.expect(o.fileExtension, unittest.equals('foo'));
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.headRevisionId, unittest.equals('foo'));
@@ -1305,13 +1305,13 @@
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.modifiedByMeDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.modifiedDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed427(o.openWithLinks);
+    checkUnnamed746(o.openWithLinks);
     unittest.expect(o.originalFilename, unittest.equals('foo'));
-    checkUnnamed428(o.ownerNames);
-    checkUnnamed429(o.owners);
-    checkUnnamed430(o.parents);
-    checkUnnamed431(o.permissions);
-    checkUnnamed432(o.properties);
+    checkUnnamed747(o.ownerNames);
+    checkUnnamed748(o.owners);
+    checkUnnamed749(o.parents);
+    checkUnnamed750(o.permissions);
+    checkUnnamed751(o.properties);
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.shared, unittest.isTrue);
@@ -1330,14 +1330,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed433() {
+buildUnnamed752() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed433(core.List<api.File> o) {
+checkUnnamed752(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -1349,7 +1349,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed433();
+    o.items = buildUnnamed752();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1363,7 +1363,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed433(o.items);
+    checkUnnamed752(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1372,14 +1372,14 @@
   buildCounterFileList--;
 }
 
-buildUnnamed434() {
+buildUnnamed753() {
   var o = new core.List<api.ParentReference>();
   o.add(buildParentReference());
   o.add(buildParentReference());
   return o;
 }
 
-checkUnnamed434(core.List<api.ParentReference> o) {
+checkUnnamed753(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParentReference(o[0]);
   checkParentReference(o[1]);
@@ -1391,7 +1391,7 @@
   buildCounterParentList++;
   if (buildCounterParentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed434();
+    o.items = buildUnnamed753();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1403,7 +1403,7 @@
   buildCounterParentList++;
   if (buildCounterParentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed434(o.items);
+    checkUnnamed753(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -1437,14 +1437,14 @@
   buildCounterParentReference--;
 }
 
-buildUnnamed435() {
+buildUnnamed754() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed435(core.List<core.String> o) {
+checkUnnamed754(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1455,7 +1455,7 @@
   var o = new api.Permission();
   buildCounterPermission++;
   if (buildCounterPermission < 3) {
-    o.additionalRoles = buildUnnamed435();
+    o.additionalRoles = buildUnnamed754();
     o.authKey = "foo";
     o.domain = "foo";
     o.emailAddress = "foo";
@@ -1477,7 +1477,7 @@
 checkPermission(api.Permission o) {
   buildCounterPermission++;
   if (buildCounterPermission < 3) {
-    checkUnnamed435(o.additionalRoles);
+    checkUnnamed754(o.additionalRoles);
     unittest.expect(o.authKey, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
     unittest.expect(o.emailAddress, unittest.equals('foo'));
@@ -1516,14 +1516,14 @@
   buildCounterPermissionId--;
 }
 
-buildUnnamed436() {
+buildUnnamed755() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed436(core.List<api.Permission> o) {
+checkUnnamed755(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1535,7 +1535,7 @@
   buildCounterPermissionList++;
   if (buildCounterPermissionList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed436();
+    o.items = buildUnnamed755();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1547,7 +1547,7 @@
   buildCounterPermissionList++;
   if (buildCounterPermissionList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed436(o.items);
+    checkUnnamed755(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -1583,14 +1583,14 @@
   buildCounterProperty--;
 }
 
-buildUnnamed437() {
+buildUnnamed756() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed437(core.List<api.Property> o) {
+checkUnnamed756(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
@@ -1602,7 +1602,7 @@
   buildCounterPropertyList++;
   if (buildCounterPropertyList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed437();
+    o.items = buildUnnamed756();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1614,21 +1614,21 @@
   buildCounterPropertyList++;
   if (buildCounterPropertyList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed437(o.items);
+    checkUnnamed756(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterPropertyList--;
 }
 
-buildUnnamed438() {
+buildUnnamed757() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed438(core.Map<core.String, core.String> o) {
+checkUnnamed757(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1641,7 +1641,7 @@
   if (buildCounterRevision < 3) {
     o.downloadUrl = "foo";
     o.etag = "foo";
-    o.exportLinks = buildUnnamed438();
+    o.exportLinks = buildUnnamed757();
     o.fileSize = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -1667,7 +1667,7 @@
   if (buildCounterRevision < 3) {
     unittest.expect(o.downloadUrl, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed438(o.exportLinks);
+    checkUnnamed757(o.exportLinks);
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1687,14 +1687,14 @@
   buildCounterRevision--;
 }
 
-buildUnnamed439() {
+buildUnnamed758() {
   var o = new core.List<api.Revision>();
   o.add(buildRevision());
   o.add(buildRevision());
   return o;
 }
 
-checkUnnamed439(core.List<api.Revision> o) {
+checkUnnamed758(core.List<api.Revision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRevision(o[0]);
   checkRevision(o[1]);
@@ -1706,7 +1706,7 @@
   buildCounterRevisionList++;
   if (buildCounterRevisionList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed439();
+    o.items = buildUnnamed758();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1718,7 +1718,7 @@
   buildCounterRevisionList++;
   if (buildCounterRevisionList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed439(o.items);
+    checkUnnamed758(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/fitness/v1_test.dart b/generated/googleapis/test/fitness/v1_test.dart
index f46f4bc..d7447ed 100644
--- a/generated/googleapis/test/fitness/v1_test.dart
+++ b/generated/googleapis/test/fitness/v1_test.dart
@@ -41,14 +41,14 @@
   buildCounterApplication--;
 }
 
-buildUnnamed918() {
+buildUnnamed759() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed918(core.List<api.Value> o) {
+checkUnnamed759(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -66,7 +66,7 @@
     o.originDataSourceId = "foo";
     o.rawTimestampNanos = "foo";
     o.startTimeNanos = "foo";
-    o.value = buildUnnamed918();
+    o.value = buildUnnamed759();
   }
   buildCounterDataPoint--;
   return o;
@@ -82,7 +82,7 @@
     unittest.expect(o.originDataSourceId, unittest.equals('foo'));
     unittest.expect(o.rawTimestampNanos, unittest.equals('foo'));
     unittest.expect(o.startTimeNanos, unittest.equals('foo'));
-    checkUnnamed918(o.value);
+    checkUnnamed759(o.value);
   }
   buildCounterDataPoint--;
 }
@@ -118,14 +118,14 @@
   buildCounterDataSource--;
 }
 
-buildUnnamed919() {
+buildUnnamed760() {
   var o = new core.List<api.DataTypeField>();
   o.add(buildDataTypeField());
   o.add(buildDataTypeField());
   return o;
 }
 
-checkUnnamed919(core.List<api.DataTypeField> o) {
+checkUnnamed760(core.List<api.DataTypeField> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataTypeField(o[0]);
   checkDataTypeField(o[1]);
@@ -136,7 +136,7 @@
   var o = new api.DataType();
   buildCounterDataType++;
   if (buildCounterDataType < 3) {
-    o.field = buildUnnamed919();
+    o.field = buildUnnamed760();
     o.name = "foo";
   }
   buildCounterDataType--;
@@ -146,7 +146,7 @@
 checkDataType(api.DataType o) {
   buildCounterDataType++;
   if (buildCounterDataType < 3) {
-    checkUnnamed919(o.field);
+    checkUnnamed760(o.field);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterDataType--;
@@ -173,14 +173,14 @@
   buildCounterDataTypeField--;
 }
 
-buildUnnamed920() {
+buildUnnamed761() {
   var o = new core.List<api.DataPoint>();
   o.add(buildDataPoint());
   o.add(buildDataPoint());
   return o;
 }
 
-checkUnnamed920(core.List<api.DataPoint> o) {
+checkUnnamed761(core.List<api.DataPoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataPoint(o[0]);
   checkDataPoint(o[1]);
@@ -195,7 +195,7 @@
     o.maxEndTimeNs = "foo";
     o.minStartTimeNs = "foo";
     o.nextPageToken = "foo";
-    o.point = buildUnnamed920();
+    o.point = buildUnnamed761();
   }
   buildCounterDataset--;
   return o;
@@ -208,7 +208,7 @@
     unittest.expect(o.maxEndTimeNs, unittest.equals('foo'));
     unittest.expect(o.minStartTimeNs, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed920(o.point);
+    checkUnnamed761(o.point);
   }
   buildCounterDataset--;
 }
@@ -240,14 +240,14 @@
   buildCounterDevice--;
 }
 
-buildUnnamed921() {
+buildUnnamed762() {
   var o = new core.List<api.DataSource>();
   o.add(buildDataSource());
   o.add(buildDataSource());
   return o;
 }
 
-checkUnnamed921(core.List<api.DataSource> o) {
+checkUnnamed762(core.List<api.DataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataSource(o[0]);
   checkDataSource(o[1]);
@@ -258,7 +258,7 @@
   var o = new api.ListDataSourcesResponse();
   buildCounterListDataSourcesResponse++;
   if (buildCounterListDataSourcesResponse < 3) {
-    o.dataSource = buildUnnamed921();
+    o.dataSource = buildUnnamed762();
   }
   buildCounterListDataSourcesResponse--;
   return o;
@@ -267,32 +267,32 @@
 checkListDataSourcesResponse(api.ListDataSourcesResponse o) {
   buildCounterListDataSourcesResponse++;
   if (buildCounterListDataSourcesResponse < 3) {
-    checkUnnamed921(o.dataSource);
+    checkUnnamed762(o.dataSource);
   }
   buildCounterListDataSourcesResponse--;
 }
 
-buildUnnamed922() {
+buildUnnamed763() {
   var o = new core.List<api.Session>();
   o.add(buildSession());
   o.add(buildSession());
   return o;
 }
 
-checkUnnamed922(core.List<api.Session> o) {
+checkUnnamed763(core.List<api.Session> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSession(o[0]);
   checkSession(o[1]);
 }
 
-buildUnnamed923() {
+buildUnnamed764() {
   var o = new core.List<api.Session>();
   o.add(buildSession());
   o.add(buildSession());
   return o;
 }
 
-checkUnnamed923(core.List<api.Session> o) {
+checkUnnamed764(core.List<api.Session> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSession(o[0]);
   checkSession(o[1]);
@@ -303,9 +303,9 @@
   var o = new api.ListSessionsResponse();
   buildCounterListSessionsResponse++;
   if (buildCounterListSessionsResponse < 3) {
-    o.deletedSession = buildUnnamed922();
+    o.deletedSession = buildUnnamed763();
     o.nextPageToken = "foo";
-    o.session = buildUnnamed923();
+    o.session = buildUnnamed764();
   }
   buildCounterListSessionsResponse--;
   return o;
@@ -314,9 +314,9 @@
 checkListSessionsResponse(api.ListSessionsResponse o) {
   buildCounterListSessionsResponse++;
   if (buildCounterListSessionsResponse < 3) {
-    checkUnnamed922(o.deletedSession);
+    checkUnnamed763(o.deletedSession);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed923(o.session);
+    checkUnnamed764(o.session);
   }
   buildCounterListSessionsResponse--;
 }
@@ -375,14 +375,14 @@
   buildCounterValue--;
 }
 
-buildUnnamed924() {
+buildUnnamed765() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed924(core.List<core.String> o) {
+checkUnnamed765(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -584,7 +584,7 @@
       var mock = new common_test.HttpServerMock();
       api.UsersDataSourcesResourceApi res = new api.FitnessApi(mock).users.dataSources;
       var arg_userId = "foo";
-      var arg_dataTypeName = buildUnnamed924();
+      var arg_dataTypeName = buildUnnamed765();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -774,6 +774,7 @@
       var arg_userId = "foo";
       var arg_dataSourceId = "foo";
       var arg_datasetId = "foo";
+      var arg_limit = 42;
       var arg_pageToken = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -799,6 +800,7 @@
             addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(core.int.parse(queryMap["limit"].first), unittest.equals(arg_limit));
         unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
 
 
@@ -808,7 +810,7 @@
         var resp = convert.JSON.encode(buildDataset());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.get(arg_userId, arg_dataSourceId, arg_datasetId, pageToken: arg_pageToken).then(unittest.expectAsync(((api.Dataset response) {
+      res.get(arg_userId, arg_dataSourceId, arg_datasetId, limit: arg_limit, pageToken: arg_pageToken).then(unittest.expectAsync(((api.Dataset response) {
         checkDataset(response);
       })));
     });
diff --git a/generated/googleapis/test/freebase/v1_test.dart b/generated/googleapis/test/freebase/v1_test.dart
index df17797..6fd9076 100644
--- a/generated/googleapis/test/freebase/v1_test.dart
+++ b/generated/googleapis/test/freebase/v1_test.dart
@@ -64,14 +64,14 @@
   buildCounterReconcileCandidate--;
 }
 
-buildUnnamed737() {
+buildUnnamed766() {
   var o = new core.List<api.ReconcileCandidate>();
   o.add(buildReconcileCandidate());
   o.add(buildReconcileCandidate());
   return o;
 }
 
-checkUnnamed737(core.List<api.ReconcileCandidate> o) {
+checkUnnamed766(core.List<api.ReconcileCandidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReconcileCandidate(o[0]);
   checkReconcileCandidate(o[1]);
@@ -121,14 +121,14 @@
   buildCounterReconcileGetWarning--;
 }
 
-buildUnnamed738() {
+buildUnnamed767() {
   var o = new core.List<api.ReconcileGetWarning>();
   o.add(buildReconcileGetWarning());
   o.add(buildReconcileGetWarning());
   return o;
 }
 
-checkUnnamed738(core.List<api.ReconcileGetWarning> o) {
+checkUnnamed767(core.List<api.ReconcileGetWarning> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReconcileGetWarning(o[0]);
   checkReconcileGetWarning(o[1]);
@@ -139,10 +139,10 @@
   var o = new api.ReconcileGet();
   buildCounterReconcileGet++;
   if (buildCounterReconcileGet < 3) {
-    o.candidate = buildUnnamed737();
+    o.candidate = buildUnnamed766();
     o.costs = buildReconcileGetCosts();
     o.match = buildReconcileCandidate();
-    o.warning = buildUnnamed738();
+    o.warning = buildUnnamed767();
   }
   buildCounterReconcileGet--;
   return o;
@@ -151,139 +151,139 @@
 checkReconcileGet(api.ReconcileGet o) {
   buildCounterReconcileGet++;
   if (buildCounterReconcileGet < 3) {
-    checkUnnamed737(o.candidate);
+    checkUnnamed766(o.candidate);
     checkReconcileGetCosts(o.costs);
     checkReconcileCandidate(o.match);
-    checkUnnamed738(o.warning);
+    checkUnnamed767(o.warning);
   }
   buildCounterReconcileGet--;
 }
 
-buildUnnamed739() {
+buildUnnamed768() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed739(core.List<core.String> o) {
+checkUnnamed768(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed740() {
+buildUnnamed769() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed740(core.List<core.String> o) {
+checkUnnamed769(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed741() {
+buildUnnamed770() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed741(core.List<core.String> o) {
+checkUnnamed770(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed742() {
+buildUnnamed771() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed742(core.List<core.String> o) {
+checkUnnamed771(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed743() {
+buildUnnamed772() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed743(core.List<core.String> o) {
+checkUnnamed772(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed744() {
+buildUnnamed773() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed744(core.List<core.String> o) {
+checkUnnamed773(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed745() {
+buildUnnamed774() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed745(core.List<core.String> o) {
+checkUnnamed774(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed746() {
+buildUnnamed775() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed746(core.List<core.String> o) {
+checkUnnamed775(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed747() {
+buildUnnamed776() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed747(core.List<core.String> o) {
+checkUnnamed776(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed748() {
+buildUnnamed777() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed748(core.List<core.String> o) {
+checkUnnamed777(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -342,11 +342,11 @@
       var mock = new common_test.HttpServerMock();
       api.FreebaseApi res = new api.FreebaseApi(mock);
       var arg_confidence = 42.0;
-      var arg_kind = buildUnnamed739();
-      var arg_lang = buildUnnamed740();
+      var arg_kind = buildUnnamed768();
+      var arg_lang = buildUnnamed769();
       var arg_limit = 42;
       var arg_name = "foo";
-      var arg_prop = buildUnnamed741();
+      var arg_prop = buildUnnamed770();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -403,16 +403,16 @@
       var arg_asOfTime = "foo";
       var arg_callback = "foo";
       var arg_cursor = 42;
-      var arg_domain = buildUnnamed742();
+      var arg_domain = buildUnnamed771();
       var arg_encode = "foo";
       var arg_exact = true;
-      var arg_filter = buildUnnamed743();
+      var arg_filter = buildUnnamed772();
       var arg_format = "foo";
       var arg_help = "foo";
       var arg_indent = true;
-      var arg_lang = buildUnnamed744();
+      var arg_lang = buildUnnamed773();
       var arg_limit = 42;
-      var arg_mid = buildUnnamed745();
+      var arg_mid = buildUnnamed774();
       var arg_mqlOutput = "foo";
       var arg_output = "foo";
       var arg_prefixed = true;
@@ -420,9 +420,9 @@
       var arg_scoring = "foo";
       var arg_spell = "foo";
       var arg_stemmed = true;
-      var arg_type = buildUnnamed746();
-      var arg_with_ = buildUnnamed747();
-      var arg_without = buildUnnamed748();
+      var arg_type = buildUnnamed775();
+      var arg_with_ = buildUnnamed776();
+      var arg_without = buildUnnamed777();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/fusiontables/v1_test.dart b/generated/googleapis/test/fusiontables/v1_test.dart
index 8f36331..af86f4b 100644
--- a/generated/googleapis/test/fusiontables/v1_test.dart
+++ b/generated/googleapis/test/fusiontables/v1_test.dart
@@ -97,14 +97,14 @@
   buildCounterColumn--;
 }
 
-buildUnnamed1120() {
+buildUnnamed778() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed1120(core.List<api.Column> o) {
+checkUnnamed778(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -115,7 +115,7 @@
   var o = new api.ColumnList();
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    o.items = buildUnnamed1120();
+    o.items = buildUnnamed778();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -127,7 +127,7 @@
 checkColumnList(api.ColumnList o) {
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    checkUnnamed1120(o.items);
+    checkUnnamed778(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -135,14 +135,14 @@
   buildCounterColumnList--;
 }
 
-buildUnnamed1121() {
+buildUnnamed779() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed1121(core.List<core.Object> o) {
+checkUnnamed779(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -153,7 +153,7 @@
   var o = new api.Geometry();
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    o.geometries = buildUnnamed1121();
+    o.geometries = buildUnnamed779();
     o.geometry = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.type = "foo";
   }
@@ -164,7 +164,7 @@
 checkGeometry(api.Geometry o) {
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    checkUnnamed1121(o.geometries);
+    checkUnnamed779(o.geometries);
     var casted3 = (o.geometry) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -192,30 +192,30 @@
   buildCounterImport--;
 }
 
-buildUnnamed1122() {
+buildUnnamed780() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1122(core.List<core.double> o) {
+checkUnnamed780(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed1123() {
+buildUnnamed781() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed1122());
-  o.add(buildUnnamed1122());
+  o.add(buildUnnamed780());
+  o.add(buildUnnamed780());
   return o;
 }
 
-checkUnnamed1123(core.List<core.List<core.double>> o) {
+checkUnnamed781(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1122(o[0]);
-  checkUnnamed1122(o[1]);
+  checkUnnamed780(o[0]);
+  checkUnnamed780(o[1]);
 }
 
 core.int buildCounterLine = 0;
@@ -223,7 +223,7 @@
   var o = new api.Line();
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    o.coordinates = buildUnnamed1123();
+    o.coordinates = buildUnnamed781();
     o.type = "foo";
   }
   buildCounterLine--;
@@ -233,7 +233,7 @@
 checkLine(api.Line o) {
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    checkUnnamed1123(o.coordinates);
+    checkUnnamed781(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterLine--;
@@ -266,14 +266,14 @@
   buildCounterLineStyle--;
 }
 
-buildUnnamed1124() {
+buildUnnamed782() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1124(core.List<core.double> o) {
+checkUnnamed782(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -284,7 +284,7 @@
   var o = new api.Point();
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    o.coordinates = buildUnnamed1124();
+    o.coordinates = buildUnnamed782();
     o.type = "foo";
   }
   buildCounterPoint--;
@@ -294,7 +294,7 @@
 checkPoint(api.Point o) {
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    checkUnnamed1124(o.coordinates);
+    checkUnnamed782(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPoint--;
@@ -321,43 +321,43 @@
   buildCounterPointStyle--;
 }
 
-buildUnnamed1125() {
+buildUnnamed783() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1125(core.List<core.double> o) {
+checkUnnamed783(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed1126() {
+buildUnnamed784() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed1125());
-  o.add(buildUnnamed1125());
+  o.add(buildUnnamed783());
+  o.add(buildUnnamed783());
   return o;
 }
 
-checkUnnamed1126(core.List<core.List<core.double>> o) {
+checkUnnamed784(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1125(o[0]);
-  checkUnnamed1125(o[1]);
+  checkUnnamed783(o[0]);
+  checkUnnamed783(o[1]);
 }
 
-buildUnnamed1127() {
+buildUnnamed785() {
   var o = new core.List<core.List<core.List<core.double>>>();
-  o.add(buildUnnamed1126());
-  o.add(buildUnnamed1126());
+  o.add(buildUnnamed784());
+  o.add(buildUnnamed784());
   return o;
 }
 
-checkUnnamed1127(core.List<core.List<core.List<core.double>>> o) {
+checkUnnamed785(core.List<core.List<core.List<core.double>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1126(o[0]);
-  checkUnnamed1126(o[1]);
+  checkUnnamed784(o[0]);
+  checkUnnamed784(o[1]);
 }
 
 core.int buildCounterPolygon = 0;
@@ -365,7 +365,7 @@
   var o = new api.Polygon();
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    o.coordinates = buildUnnamed1127();
+    o.coordinates = buildUnnamed785();
     o.type = "foo";
   }
   buildCounterPolygon--;
@@ -375,7 +375,7 @@
 checkPolygon(api.Polygon o) {
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    checkUnnamed1127(o.coordinates);
+    checkUnnamed785(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPolygon--;
@@ -414,43 +414,43 @@
   buildCounterPolygonStyle--;
 }
 
-buildUnnamed1128() {
+buildUnnamed786() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1128(core.List<core.String> o) {
+checkUnnamed786(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1129() {
+buildUnnamed787() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed1129(core.List<core.Object> o) {
+checkUnnamed787(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted4 = (o[0]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
   var casted5 = (o[1]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed1130() {
+buildUnnamed788() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed1129());
-  o.add(buildUnnamed1129());
+  o.add(buildUnnamed787());
+  o.add(buildUnnamed787());
   return o;
 }
 
-checkUnnamed1130(core.List<core.List<core.Object>> o) {
+checkUnnamed788(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1129(o[0]);
-  checkUnnamed1129(o[1]);
+  checkUnnamed787(o[0]);
+  checkUnnamed787(o[1]);
 }
 
 core.int buildCounterSqlresponse = 0;
@@ -458,9 +458,9 @@
   var o = new api.Sqlresponse();
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    o.columns = buildUnnamed1128();
+    o.columns = buildUnnamed786();
     o.kind = "foo";
-    o.rows = buildUnnamed1130();
+    o.rows = buildUnnamed788();
   }
   buildCounterSqlresponse--;
   return o;
@@ -469,21 +469,21 @@
 checkSqlresponse(api.Sqlresponse o) {
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    checkUnnamed1128(o.columns);
+    checkUnnamed786(o.columns);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1130(o.rows);
+    checkUnnamed788(o.rows);
   }
   buildCounterSqlresponse--;
 }
 
-buildUnnamed1131() {
+buildUnnamed789() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed1131(core.List<api.Bucket> o) {
+checkUnnamed789(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -510,14 +510,14 @@
   buildCounterStyleFunctionGradientColors--;
 }
 
-buildUnnamed1132() {
+buildUnnamed790() {
   var o = new core.List<api.StyleFunctionGradientColors>();
   o.add(buildStyleFunctionGradientColors());
   o.add(buildStyleFunctionGradientColors());
   return o;
 }
 
-checkUnnamed1132(core.List<api.StyleFunctionGradientColors> o) {
+checkUnnamed790(core.List<api.StyleFunctionGradientColors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleFunctionGradientColors(o[0]);
   checkStyleFunctionGradientColors(o[1]);
@@ -528,7 +528,7 @@
   var o = new api.StyleFunctionGradient();
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    o.colors = buildUnnamed1132();
+    o.colors = buildUnnamed790();
     o.max = 42.0;
     o.min = 42.0;
   }
@@ -539,7 +539,7 @@
 checkStyleFunctionGradient(api.StyleFunctionGradient o) {
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    checkUnnamed1132(o.colors);
+    checkUnnamed790(o.colors);
     unittest.expect(o.max, unittest.equals(42.0));
     unittest.expect(o.min, unittest.equals(42.0));
   }
@@ -551,7 +551,7 @@
   var o = new api.StyleFunction();
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    o.buckets = buildUnnamed1131();
+    o.buckets = buildUnnamed789();
     o.columnName = "foo";
     o.gradient = buildStyleFunctionGradient();
     o.kind = "foo";
@@ -563,7 +563,7 @@
 checkStyleFunction(api.StyleFunction o) {
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    checkUnnamed1131(o.buckets);
+    checkUnnamed789(o.buckets);
     unittest.expect(o.columnName, unittest.equals('foo'));
     checkStyleFunctionGradient(o.gradient);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -602,14 +602,14 @@
   buildCounterStyleSetting--;
 }
 
-buildUnnamed1133() {
+buildUnnamed791() {
   var o = new core.List<api.StyleSetting>();
   o.add(buildStyleSetting());
   o.add(buildStyleSetting());
   return o;
 }
 
-checkUnnamed1133(core.List<api.StyleSetting> o) {
+checkUnnamed791(core.List<api.StyleSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleSetting(o[0]);
   checkStyleSetting(o[1]);
@@ -620,7 +620,7 @@
   var o = new api.StyleSettingList();
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    o.items = buildUnnamed1133();
+    o.items = buildUnnamed791();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -632,7 +632,7 @@
 checkStyleSettingList(api.StyleSettingList o) {
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    checkUnnamed1133(o.items);
+    checkUnnamed791(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -640,27 +640,27 @@
   buildCounterStyleSettingList--;
 }
 
-buildUnnamed1134() {
+buildUnnamed792() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1134(core.List<core.String> o) {
+checkUnnamed792(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1135() {
+buildUnnamed793() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed1135(core.List<api.Column> o) {
+checkUnnamed793(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -673,8 +673,8 @@
   if (buildCounterTable < 3) {
     o.attribution = "foo";
     o.attributionLink = "foo";
-    o.baseTableIds = buildUnnamed1134();
-    o.columns = buildUnnamed1135();
+    o.baseTableIds = buildUnnamed792();
+    o.columns = buildUnnamed793();
     o.description = "foo";
     o.isExportable = true;
     o.kind = "foo";
@@ -691,8 +691,8 @@
   if (buildCounterTable < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
     unittest.expect(o.attributionLink, unittest.equals('foo'));
-    checkUnnamed1134(o.baseTableIds);
-    checkUnnamed1135(o.columns);
+    checkUnnamed792(o.baseTableIds);
+    checkUnnamed793(o.columns);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.isExportable, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -703,14 +703,14 @@
   buildCounterTable--;
 }
 
-buildUnnamed1136() {
+buildUnnamed794() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed1136(core.List<api.Table> o) {
+checkUnnamed794(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -721,7 +721,7 @@
   var o = new api.TableList();
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    o.items = buildUnnamed1136();
+    o.items = buildUnnamed794();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -732,7 +732,7 @@
 checkTableList(api.TableList o) {
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    checkUnnamed1136(o.items);
+    checkUnnamed794(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -766,14 +766,14 @@
   buildCounterTask--;
 }
 
-buildUnnamed1137() {
+buildUnnamed795() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1137(core.List<api.Task> o) {
+checkUnnamed795(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -784,7 +784,7 @@
   var o = new api.TaskList();
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    o.items = buildUnnamed1137();
+    o.items = buildUnnamed795();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -796,7 +796,7 @@
 checkTaskList(api.TaskList o) {
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    checkUnnamed1137(o.items);
+    checkUnnamed795(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -804,14 +804,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed1138() {
+buildUnnamed796() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1138(core.List<core.String> o) {
+checkUnnamed796(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -822,7 +822,7 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.automaticColumnNames = buildUnnamed1138();
+    o.automaticColumnNames = buildUnnamed796();
     o.body = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -836,7 +836,7 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed1138(o.automaticColumnNames);
+    checkUnnamed796(o.automaticColumnNames);
     unittest.expect(o.body, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -846,14 +846,14 @@
   buildCounterTemplate--;
 }
 
-buildUnnamed1139() {
+buildUnnamed797() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed1139(core.List<api.Template> o) {
+checkUnnamed797(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -864,7 +864,7 @@
   var o = new api.TemplateList();
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    o.items = buildUnnamed1139();
+    o.items = buildUnnamed797();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -876,7 +876,7 @@
 checkTemplateList(api.TemplateList o) {
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    checkUnnamed1139(o.items);
+    checkUnnamed797(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
diff --git a/generated/googleapis/test/games/v1_test.dart b/generated/googleapis/test/games/v1_test.dart
index 7a03cdd..3acfeec 100644
--- a/generated/googleapis/test/games/v1_test.dart
+++ b/generated/googleapis/test/games/v1_test.dart
@@ -59,14 +59,14 @@
   buildCounterAchievementDefinition--;
 }
 
-buildUnnamed20() {
+buildUnnamed819() {
   var o = new core.List<api.AchievementDefinition>();
   o.add(buildAchievementDefinition());
   o.add(buildAchievementDefinition());
   return o;
 }
 
-checkUnnamed20(core.List<api.AchievementDefinition> o) {
+checkUnnamed819(core.List<api.AchievementDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementDefinition(o[0]);
   checkAchievementDefinition(o[1]);
@@ -77,7 +77,7 @@
   var o = new api.AchievementDefinitionsListResponse();
   buildCounterAchievementDefinitionsListResponse++;
   if (buildCounterAchievementDefinitionsListResponse < 3) {
-    o.items = buildUnnamed20();
+    o.items = buildUnnamed819();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -88,7 +88,7 @@
 checkAchievementDefinitionsListResponse(api.AchievementDefinitionsListResponse o) {
   buildCounterAchievementDefinitionsListResponse++;
   if (buildCounterAchievementDefinitionsListResponse < 3) {
-    checkUnnamed20(o.items);
+    checkUnnamed819(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -183,14 +183,14 @@
   buildCounterAchievementUnlockResponse--;
 }
 
-buildUnnamed21() {
+buildUnnamed820() {
   var o = new core.List<api.AchievementUpdateRequest>();
   o.add(buildAchievementUpdateRequest());
   o.add(buildAchievementUpdateRequest());
   return o;
 }
 
-checkUnnamed21(core.List<api.AchievementUpdateRequest> o) {
+checkUnnamed820(core.List<api.AchievementUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementUpdateRequest(o[0]);
   checkAchievementUpdateRequest(o[1]);
@@ -202,7 +202,7 @@
   buildCounterAchievementUpdateMultipleRequest++;
   if (buildCounterAchievementUpdateMultipleRequest < 3) {
     o.kind = "foo";
-    o.updates = buildUnnamed21();
+    o.updates = buildUnnamed820();
   }
   buildCounterAchievementUpdateMultipleRequest--;
   return o;
@@ -212,19 +212,19 @@
   buildCounterAchievementUpdateMultipleRequest++;
   if (buildCounterAchievementUpdateMultipleRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed21(o.updates);
+    checkUnnamed820(o.updates);
   }
   buildCounterAchievementUpdateMultipleRequest--;
 }
 
-buildUnnamed22() {
+buildUnnamed821() {
   var o = new core.List<api.AchievementUpdateResponse>();
   o.add(buildAchievementUpdateResponse());
   o.add(buildAchievementUpdateResponse());
   return o;
 }
 
-checkUnnamed22(core.List<api.AchievementUpdateResponse> o) {
+checkUnnamed821(core.List<api.AchievementUpdateResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementUpdateResponse(o[0]);
   checkAchievementUpdateResponse(o[1]);
@@ -236,7 +236,7 @@
   buildCounterAchievementUpdateMultipleResponse++;
   if (buildCounterAchievementUpdateMultipleResponse < 3) {
     o.kind = "foo";
-    o.updatedAchievements = buildUnnamed22();
+    o.updatedAchievements = buildUnnamed821();
   }
   buildCounterAchievementUpdateMultipleResponse--;
   return o;
@@ -246,7 +246,7 @@
   buildCounterAchievementUpdateMultipleResponse++;
   if (buildCounterAchievementUpdateMultipleResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed22(o.updatedAchievements);
+    checkUnnamed821(o.updatedAchievements);
   }
   buildCounterAchievementUpdateMultipleResponse--;
 }
@@ -357,40 +357,40 @@
   buildCounterAnonymousPlayer--;
 }
 
-buildUnnamed23() {
+buildUnnamed822() {
   var o = new core.List<api.ImageAsset>();
   o.add(buildImageAsset());
   o.add(buildImageAsset());
   return o;
 }
 
-checkUnnamed23(core.List<api.ImageAsset> o) {
+checkUnnamed822(core.List<api.ImageAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImageAsset(o[0]);
   checkImageAsset(o[1]);
 }
 
-buildUnnamed24() {
+buildUnnamed823() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed24(core.List<core.String> o) {
+checkUnnamed823(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed25() {
+buildUnnamed824() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed25(core.List<api.Instance> o) {
+checkUnnamed824(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -402,13 +402,13 @@
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
     o.achievementCount = 42;
-    o.assets = buildUnnamed23();
+    o.assets = buildUnnamed822();
     o.author = "foo";
     o.category = buildApplicationCategory();
     o.description = "foo";
-    o.enabledFeatures = buildUnnamed24();
+    o.enabledFeatures = buildUnnamed823();
     o.id = "foo";
-    o.instances = buildUnnamed25();
+    o.instances = buildUnnamed824();
     o.kind = "foo";
     o.lastUpdatedTimestamp = "foo";
     o.leaderboardCount = 42;
@@ -423,13 +423,13 @@
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
     unittest.expect(o.achievementCount, unittest.equals(42));
-    checkUnnamed23(o.assets);
+    checkUnnamed822(o.assets);
     unittest.expect(o.author, unittest.equals('foo'));
     checkApplicationCategory(o.category);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed24(o.enabledFeatures);
+    checkUnnamed823(o.enabledFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed25(o.instances);
+    checkUnnamed824(o.instances);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdatedTimestamp, unittest.equals('foo'));
     unittest.expect(o.leaderboardCount, unittest.equals(42));
@@ -485,14 +485,14 @@
   buildCounterCategory--;
 }
 
-buildUnnamed26() {
+buildUnnamed825() {
   var o = new core.List<api.Category>();
   o.add(buildCategory());
   o.add(buildCategory());
   return o;
 }
 
-checkUnnamed26(core.List<api.Category> o) {
+checkUnnamed825(core.List<api.Category> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCategory(o[0]);
   checkCategory(o[1]);
@@ -503,7 +503,7 @@
   var o = new api.CategoryListResponse();
   buildCounterCategoryListResponse++;
   if (buildCounterCategoryListResponse < 3) {
-    o.items = buildUnnamed26();
+    o.items = buildUnnamed825();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -514,7 +514,7 @@
 checkCategoryListResponse(api.CategoryListResponse o) {
   buildCounterCategoryListResponse++;
   if (buildCounterCategoryListResponse < 3) {
-    checkUnnamed26(o.items);
+    checkUnnamed825(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -565,14 +565,14 @@
   buildCounterEventChild--;
 }
 
-buildUnnamed27() {
+buildUnnamed826() {
   var o = new core.List<api.EventChild>();
   o.add(buildEventChild());
   o.add(buildEventChild());
   return o;
 }
 
-checkUnnamed27(core.List<api.EventChild> o) {
+checkUnnamed826(core.List<api.EventChild> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventChild(o[0]);
   checkEventChild(o[1]);
@@ -583,7 +583,7 @@
   var o = new api.EventDefinition();
   buildCounterEventDefinition++;
   if (buildCounterEventDefinition < 3) {
-    o.childEvents = buildUnnamed27();
+    o.childEvents = buildUnnamed826();
     o.description = "foo";
     o.displayName = "foo";
     o.id = "foo";
@@ -599,7 +599,7 @@
 checkEventDefinition(api.EventDefinition o) {
   buildCounterEventDefinition++;
   if (buildCounterEventDefinition < 3) {
-    checkUnnamed27(o.childEvents);
+    checkUnnamed826(o.childEvents);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -611,14 +611,14 @@
   buildCounterEventDefinition--;
 }
 
-buildUnnamed28() {
+buildUnnamed827() {
   var o = new core.List<api.EventDefinition>();
   o.add(buildEventDefinition());
   o.add(buildEventDefinition());
   return o;
 }
 
-checkUnnamed28(core.List<api.EventDefinition> o) {
+checkUnnamed827(core.List<api.EventDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventDefinition(o[0]);
   checkEventDefinition(o[1]);
@@ -629,7 +629,7 @@
   var o = new api.EventDefinitionListResponse();
   buildCounterEventDefinitionListResponse++;
   if (buildCounterEventDefinitionListResponse < 3) {
-    o.items = buildUnnamed28();
+    o.items = buildUnnamed827();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -640,7 +640,7 @@
 checkEventDefinitionListResponse(api.EventDefinitionListResponse o) {
   buildCounterEventDefinitionListResponse++;
   if (buildCounterEventDefinitionListResponse < 3) {
-    checkUnnamed28(o.items);
+    checkUnnamed827(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -670,14 +670,14 @@
   buildCounterEventPeriodRange--;
 }
 
-buildUnnamed29() {
+buildUnnamed828() {
   var o = new core.List<api.EventUpdateRequest>();
   o.add(buildEventUpdateRequest());
   o.add(buildEventUpdateRequest());
   return o;
 }
 
-checkUnnamed29(core.List<api.EventUpdateRequest> o) {
+checkUnnamed828(core.List<api.EventUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventUpdateRequest(o[0]);
   checkEventUpdateRequest(o[1]);
@@ -690,7 +690,7 @@
   if (buildCounterEventPeriodUpdate < 3) {
     o.kind = "foo";
     o.timePeriod = buildEventPeriodRange();
-    o.updates = buildUnnamed29();
+    o.updates = buildUnnamed828();
   }
   buildCounterEventPeriodUpdate--;
   return o;
@@ -701,7 +701,7 @@
   if (buildCounterEventPeriodUpdate < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     checkEventPeriodRange(o.timePeriod);
-    checkUnnamed29(o.updates);
+    checkUnnamed828(o.updates);
   }
   buildCounterEventPeriodUpdate--;
 }
@@ -729,14 +729,14 @@
   buildCounterEventRecordFailure--;
 }
 
-buildUnnamed30() {
+buildUnnamed829() {
   var o = new core.List<api.EventPeriodUpdate>();
   o.add(buildEventPeriodUpdate());
   o.add(buildEventPeriodUpdate());
   return o;
 }
 
-checkUnnamed30(core.List<api.EventPeriodUpdate> o) {
+checkUnnamed829(core.List<api.EventPeriodUpdate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventPeriodUpdate(o[0]);
   checkEventPeriodUpdate(o[1]);
@@ -750,7 +750,7 @@
     o.currentTimeMillis = "foo";
     o.kind = "foo";
     o.requestId = "foo";
-    o.timePeriods = buildUnnamed30();
+    o.timePeriods = buildUnnamed829();
   }
   buildCounterEventRecordRequest--;
   return o;
@@ -762,7 +762,7 @@
     unittest.expect(o.currentTimeMillis, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed30(o.timePeriods);
+    checkUnnamed829(o.timePeriods);
   }
   buildCounterEventRecordRequest--;
 }
@@ -790,40 +790,40 @@
   buildCounterEventUpdateRequest--;
 }
 
-buildUnnamed31() {
+buildUnnamed830() {
   var o = new core.List<api.EventBatchRecordFailure>();
   o.add(buildEventBatchRecordFailure());
   o.add(buildEventBatchRecordFailure());
   return o;
 }
 
-checkUnnamed31(core.List<api.EventBatchRecordFailure> o) {
+checkUnnamed830(core.List<api.EventBatchRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventBatchRecordFailure(o[0]);
   checkEventBatchRecordFailure(o[1]);
 }
 
-buildUnnamed32() {
+buildUnnamed831() {
   var o = new core.List<api.EventRecordFailure>();
   o.add(buildEventRecordFailure());
   o.add(buildEventRecordFailure());
   return o;
 }
 
-checkUnnamed32(core.List<api.EventRecordFailure> o) {
+checkUnnamed831(core.List<api.EventRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventRecordFailure(o[0]);
   checkEventRecordFailure(o[1]);
 }
 
-buildUnnamed33() {
+buildUnnamed832() {
   var o = new core.List<api.PlayerEvent>();
   o.add(buildPlayerEvent());
   o.add(buildPlayerEvent());
   return o;
 }
 
-checkUnnamed33(core.List<api.PlayerEvent> o) {
+checkUnnamed832(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerEvent(o[0]);
   checkPlayerEvent(o[1]);
@@ -834,10 +834,10 @@
   var o = new api.EventUpdateResponse();
   buildCounterEventUpdateResponse++;
   if (buildCounterEventUpdateResponse < 3) {
-    o.batchFailures = buildUnnamed31();
-    o.eventFailures = buildUnnamed32();
+    o.batchFailures = buildUnnamed830();
+    o.eventFailures = buildUnnamed831();
     o.kind = "foo";
-    o.playerEvents = buildUnnamed33();
+    o.playerEvents = buildUnnamed832();
   }
   buildCounterEventUpdateResponse--;
   return o;
@@ -846,10 +846,10 @@
 checkEventUpdateResponse(api.EventUpdateResponse o) {
   buildCounterEventUpdateResponse++;
   if (buildCounterEventUpdateResponse < 3) {
-    checkUnnamed31(o.batchFailures);
-    checkUnnamed32(o.eventFailures);
+    checkUnnamed830(o.batchFailures);
+    checkUnnamed831(o.eventFailures);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed33(o.playerEvents);
+    checkUnnamed832(o.playerEvents);
   }
   buildCounterEventUpdateResponse--;
 }
@@ -1103,14 +1103,14 @@
   buildCounterLeaderboardEntry--;
 }
 
-buildUnnamed34() {
+buildUnnamed833() {
   var o = new core.List<api.Leaderboard>();
   o.add(buildLeaderboard());
   o.add(buildLeaderboard());
   return o;
 }
 
-checkUnnamed34(core.List<api.Leaderboard> o) {
+checkUnnamed833(core.List<api.Leaderboard> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLeaderboard(o[0]);
   checkLeaderboard(o[1]);
@@ -1121,7 +1121,7 @@
   var o = new api.LeaderboardListResponse();
   buildCounterLeaderboardListResponse++;
   if (buildCounterLeaderboardListResponse < 3) {
-    o.items = buildUnnamed34();
+    o.items = buildUnnamed833();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1132,7 +1132,7 @@
 checkLeaderboardListResponse(api.LeaderboardListResponse o) {
   buildCounterLeaderboardListResponse++;
   if (buildCounterLeaderboardListResponse < 3) {
-    checkUnnamed34(o.items);
+    checkUnnamed833(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1166,14 +1166,14 @@
   buildCounterLeaderboardScoreRank--;
 }
 
-buildUnnamed35() {
+buildUnnamed834() {
   var o = new core.List<api.LeaderboardEntry>();
   o.add(buildLeaderboardEntry());
   o.add(buildLeaderboardEntry());
   return o;
 }
 
-checkUnnamed35(core.List<api.LeaderboardEntry> o) {
+checkUnnamed834(core.List<api.LeaderboardEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLeaderboardEntry(o[0]);
   checkLeaderboardEntry(o[1]);
@@ -1184,7 +1184,7 @@
   var o = new api.LeaderboardScores();
   buildCounterLeaderboardScores++;
   if (buildCounterLeaderboardScores < 3) {
-    o.items = buildUnnamed35();
+    o.items = buildUnnamed834();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.numScores = "foo";
@@ -1198,7 +1198,7 @@
 checkLeaderboardScores(api.LeaderboardScores o) {
   buildCounterLeaderboardScores++;
   if (buildCounterLeaderboardScores < 3) {
-    checkUnnamed35(o.items);
+    checkUnnamed834(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.numScores, unittest.equals('foo'));
@@ -1208,14 +1208,14 @@
   buildCounterLeaderboardScores--;
 }
 
-buildUnnamed36() {
+buildUnnamed835() {
   var o = new core.List<api.PlayerLevel>();
   o.add(buildPlayerLevel());
   o.add(buildPlayerLevel());
   return o;
 }
 
-checkUnnamed36(core.List<api.PlayerLevel> o) {
+checkUnnamed835(core.List<api.PlayerLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerLevel(o[0]);
   checkPlayerLevel(o[1]);
@@ -1228,7 +1228,7 @@
   if (buildCounterMetagameConfig < 3) {
     o.currentVersion = 42;
     o.kind = "foo";
-    o.playerLevels = buildUnnamed36();
+    o.playerLevels = buildUnnamed835();
   }
   buildCounterMetagameConfig--;
   return o;
@@ -1239,7 +1239,7 @@
   if (buildCounterMetagameConfig < 3) {
     unittest.expect(o.currentVersion, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed36(o.playerLevels);
+    checkUnnamed835(o.playerLevels);
   }
   buildCounterMetagameConfig--;
 }
@@ -1468,14 +1468,14 @@
   buildCounterPlayerAchievement--;
 }
 
-buildUnnamed37() {
+buildUnnamed836() {
   var o = new core.List<api.PlayerAchievement>();
   o.add(buildPlayerAchievement());
   o.add(buildPlayerAchievement());
   return o;
 }
 
-checkUnnamed37(core.List<api.PlayerAchievement> o) {
+checkUnnamed836(core.List<api.PlayerAchievement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerAchievement(o[0]);
   checkPlayerAchievement(o[1]);
@@ -1486,7 +1486,7 @@
   var o = new api.PlayerAchievementListResponse();
   buildCounterPlayerAchievementListResponse++;
   if (buildCounterPlayerAchievementListResponse < 3) {
-    o.items = buildUnnamed37();
+    o.items = buildUnnamed836();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1497,7 +1497,7 @@
 checkPlayerAchievementListResponse(api.PlayerAchievementListResponse o) {
   buildCounterPlayerAchievementListResponse++;
   if (buildCounterPlayerAchievementListResponse < 3) {
-    checkUnnamed37(o.items);
+    checkUnnamed836(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1531,14 +1531,14 @@
   buildCounterPlayerEvent--;
 }
 
-buildUnnamed38() {
+buildUnnamed837() {
   var o = new core.List<api.PlayerEvent>();
   o.add(buildPlayerEvent());
   o.add(buildPlayerEvent());
   return o;
 }
 
-checkUnnamed38(core.List<api.PlayerEvent> o) {
+checkUnnamed837(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerEvent(o[0]);
   checkPlayerEvent(o[1]);
@@ -1549,7 +1549,7 @@
   var o = new api.PlayerEventListResponse();
   buildCounterPlayerEventListResponse++;
   if (buildCounterPlayerEventListResponse < 3) {
-    o.items = buildUnnamed38();
+    o.items = buildUnnamed837();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1560,7 +1560,7 @@
 checkPlayerEventListResponse(api.PlayerEventListResponse o) {
   buildCounterPlayerEventListResponse++;
   if (buildCounterPlayerEventListResponse < 3) {
-    checkUnnamed38(o.items);
+    checkUnnamed837(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1629,14 +1629,14 @@
   buildCounterPlayerLeaderboardScore--;
 }
 
-buildUnnamed39() {
+buildUnnamed838() {
   var o = new core.List<api.PlayerLeaderboardScore>();
   o.add(buildPlayerLeaderboardScore());
   o.add(buildPlayerLeaderboardScore());
   return o;
 }
 
-checkUnnamed39(core.List<api.PlayerLeaderboardScore> o) {
+checkUnnamed838(core.List<api.PlayerLeaderboardScore> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerLeaderboardScore(o[0]);
   checkPlayerLeaderboardScore(o[1]);
@@ -1647,7 +1647,7 @@
   var o = new api.PlayerLeaderboardScoreListResponse();
   buildCounterPlayerLeaderboardScoreListResponse++;
   if (buildCounterPlayerLeaderboardScoreListResponse < 3) {
-    o.items = buildUnnamed39();
+    o.items = buildUnnamed838();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.player = buildPlayer();
@@ -1659,7 +1659,7 @@
 checkPlayerLeaderboardScoreListResponse(api.PlayerLeaderboardScoreListResponse o) {
   buildCounterPlayerLeaderboardScoreListResponse++;
   if (buildCounterPlayerLeaderboardScoreListResponse < 3) {
-    checkUnnamed39(o.items);
+    checkUnnamed838(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPlayer(o.player);
@@ -1692,14 +1692,14 @@
   buildCounterPlayerLevel--;
 }
 
-buildUnnamed40() {
+buildUnnamed839() {
   var o = new core.List<api.Player>();
   o.add(buildPlayer());
   o.add(buildPlayer());
   return o;
 }
 
-checkUnnamed40(core.List<api.Player> o) {
+checkUnnamed839(core.List<api.Player> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayer(o[0]);
   checkPlayer(o[1]);
@@ -1710,7 +1710,7 @@
   var o = new api.PlayerListResponse();
   buildCounterPlayerListResponse++;
   if (buildCounterPlayerListResponse < 3) {
-    o.items = buildUnnamed40();
+    o.items = buildUnnamed839();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1721,7 +1721,7 @@
 checkPlayerListResponse(api.PlayerListResponse o) {
   buildCounterPlayerListResponse++;
   if (buildCounterPlayerListResponse < 3) {
-    checkUnnamed40(o.items);
+    checkUnnamed839(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1755,14 +1755,14 @@
   buildCounterPlayerScore--;
 }
 
-buildUnnamed41() {
+buildUnnamed840() {
   var o = new core.List<api.PlayerScoreResponse>();
   o.add(buildPlayerScoreResponse());
   o.add(buildPlayerScoreResponse());
   return o;
 }
 
-checkUnnamed41(core.List<api.PlayerScoreResponse> o) {
+checkUnnamed840(core.List<api.PlayerScoreResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScoreResponse(o[0]);
   checkPlayerScoreResponse(o[1]);
@@ -1774,7 +1774,7 @@
   buildCounterPlayerScoreListResponse++;
   if (buildCounterPlayerScoreListResponse < 3) {
     o.kind = "foo";
-    o.submittedScores = buildUnnamed41();
+    o.submittedScores = buildUnnamed840();
   }
   buildCounterPlayerScoreListResponse--;
   return o;
@@ -1784,32 +1784,32 @@
   buildCounterPlayerScoreListResponse++;
   if (buildCounterPlayerScoreListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed41(o.submittedScores);
+    checkUnnamed840(o.submittedScores);
   }
   buildCounterPlayerScoreListResponse--;
 }
 
-buildUnnamed42() {
+buildUnnamed841() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed42(core.List<core.String> o) {
+checkUnnamed841(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed43() {
+buildUnnamed842() {
   var o = new core.List<api.PlayerScore>();
   o.add(buildPlayerScore());
   o.add(buildPlayerScore());
   return o;
 }
 
-checkUnnamed43(core.List<api.PlayerScore> o) {
+checkUnnamed842(core.List<api.PlayerScore> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScore(o[0]);
   checkPlayerScore(o[1]);
@@ -1820,12 +1820,12 @@
   var o = new api.PlayerScoreResponse();
   buildCounterPlayerScoreResponse++;
   if (buildCounterPlayerScoreResponse < 3) {
-    o.beatenScoreTimeSpans = buildUnnamed42();
+    o.beatenScoreTimeSpans = buildUnnamed841();
     o.formattedScore = "foo";
     o.kind = "foo";
     o.leaderboardId = "foo";
     o.scoreTag = "foo";
-    o.unbeatenScores = buildUnnamed43();
+    o.unbeatenScores = buildUnnamed842();
   }
   buildCounterPlayerScoreResponse--;
   return o;
@@ -1834,24 +1834,24 @@
 checkPlayerScoreResponse(api.PlayerScoreResponse o) {
   buildCounterPlayerScoreResponse++;
   if (buildCounterPlayerScoreResponse < 3) {
-    checkUnnamed42(o.beatenScoreTimeSpans);
+    checkUnnamed841(o.beatenScoreTimeSpans);
     unittest.expect(o.formattedScore, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.leaderboardId, unittest.equals('foo'));
     unittest.expect(o.scoreTag, unittest.equals('foo'));
-    checkUnnamed43(o.unbeatenScores);
+    checkUnnamed842(o.unbeatenScores);
   }
   buildCounterPlayerScoreResponse--;
 }
 
-buildUnnamed44() {
+buildUnnamed843() {
   var o = new core.List<api.ScoreSubmission>();
   o.add(buildScoreSubmission());
   o.add(buildScoreSubmission());
   return o;
 }
 
-checkUnnamed44(core.List<api.ScoreSubmission> o) {
+checkUnnamed843(core.List<api.ScoreSubmission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkScoreSubmission(o[0]);
   checkScoreSubmission(o[1]);
@@ -1863,7 +1863,7 @@
   buildCounterPlayerScoreSubmissionList++;
   if (buildCounterPlayerScoreSubmissionList < 3) {
     o.kind = "foo";
-    o.scores = buildUnnamed44();
+    o.scores = buildUnnamed843();
   }
   buildCounterPlayerScoreSubmissionList--;
   return o;
@@ -1873,7 +1873,7 @@
   buildCounterPlayerScoreSubmissionList++;
   if (buildCounterPlayerScoreSubmissionList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed44(o.scores);
+    checkUnnamed843(o.scores);
   }
   buildCounterPlayerScoreSubmissionList--;
 }
@@ -1945,14 +1945,14 @@
   buildCounterPushTokenId--;
 }
 
-buildUnnamed45() {
+buildUnnamed844() {
   var o = new core.List<api.QuestMilestone>();
   o.add(buildQuestMilestone());
   o.add(buildQuestMilestone());
   return o;
 }
 
-checkUnnamed45(core.List<api.QuestMilestone> o) {
+checkUnnamed844(core.List<api.QuestMilestone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuestMilestone(o[0]);
   checkQuestMilestone(o[1]);
@@ -1974,7 +1974,7 @@
     o.isDefaultIconUrl = true;
     o.kind = "foo";
     o.lastUpdatedTimestampMillis = "foo";
-    o.milestones = buildUnnamed45();
+    o.milestones = buildUnnamed844();
     o.name = "foo";
     o.notifyTimestampMillis = "foo";
     o.startTimestampMillis = "foo";
@@ -1998,7 +1998,7 @@
     unittest.expect(o.isDefaultIconUrl, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdatedTimestampMillis, unittest.equals('foo'));
-    checkUnnamed45(o.milestones);
+    checkUnnamed844(o.milestones);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notifyTimestampMillis, unittest.equals('foo'));
     unittest.expect(o.startTimestampMillis, unittest.equals('foo'));
@@ -2057,14 +2057,14 @@
   buildCounterQuestCriterion--;
 }
 
-buildUnnamed46() {
+buildUnnamed845() {
   var o = new core.List<api.Quest>();
   o.add(buildQuest());
   o.add(buildQuest());
   return o;
 }
 
-checkUnnamed46(core.List<api.Quest> o) {
+checkUnnamed845(core.List<api.Quest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuest(o[0]);
   checkQuest(o[1]);
@@ -2075,7 +2075,7 @@
   var o = new api.QuestListResponse();
   buildCounterQuestListResponse++;
   if (buildCounterQuestListResponse < 3) {
-    o.items = buildUnnamed46();
+    o.items = buildUnnamed845();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2086,21 +2086,21 @@
 checkQuestListResponse(api.QuestListResponse o) {
   buildCounterQuestListResponse++;
   if (buildCounterQuestListResponse < 3) {
-    checkUnnamed46(o.items);
+    checkUnnamed845(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterQuestListResponse--;
 }
 
-buildUnnamed47() {
+buildUnnamed846() {
   var o = new core.List<api.QuestCriterion>();
   o.add(buildQuestCriterion());
   o.add(buildQuestCriterion());
   return o;
 }
 
-checkUnnamed47(core.List<api.QuestCriterion> o) {
+checkUnnamed846(core.List<api.QuestCriterion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuestCriterion(o[0]);
   checkQuestCriterion(o[1]);
@@ -2112,7 +2112,7 @@
   buildCounterQuestMilestone++;
   if (buildCounterQuestMilestone < 3) {
     o.completionRewardData = "foo";
-    o.criteria = buildUnnamed47();
+    o.criteria = buildUnnamed846();
     o.id = "foo";
     o.kind = "foo";
     o.state = "foo";
@@ -2125,7 +2125,7 @@
   buildCounterQuestMilestone++;
   if (buildCounterQuestMilestone < 3) {
     unittest.expect(o.completionRewardData, unittest.equals('foo'));
-    checkUnnamed47(o.criteria);
+    checkUnnamed846(o.criteria);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -2156,14 +2156,14 @@
   buildCounterRevisionCheckResponse--;
 }
 
-buildUnnamed48() {
+buildUnnamed847() {
   var o = new core.List<api.RoomParticipant>();
   o.add(buildRoomParticipant());
   o.add(buildRoomParticipant());
   return o;
 }
 
-checkUnnamed48(core.List<api.RoomParticipant> o) {
+checkUnnamed847(core.List<api.RoomParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomParticipant(o[0]);
   checkRoomParticipant(o[1]);
@@ -2182,7 +2182,7 @@
     o.inviterId = "foo";
     o.kind = "foo";
     o.lastUpdateDetails = buildRoomModification();
-    o.participants = buildUnnamed48();
+    o.participants = buildUnnamed847();
     o.roomId = "foo";
     o.roomStatusVersion = 42;
     o.status = "foo";
@@ -2203,7 +2203,7 @@
     unittest.expect(o.inviterId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkRoomModification(o.lastUpdateDetails);
-    checkUnnamed48(o.participants);
+    checkUnnamed847(o.participants);
     unittest.expect(o.roomId, unittest.equals('foo'));
     unittest.expect(o.roomStatusVersion, unittest.equals(42));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -2279,27 +2279,27 @@
   buildCounterRoomClientAddress--;
 }
 
-buildUnnamed49() {
+buildUnnamed848() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed49(core.List<core.String> o) {
+checkUnnamed848(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed50() {
+buildUnnamed849() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed50(core.List<core.String> o) {
+checkUnnamed849(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2311,9 +2311,9 @@
   buildCounterRoomCreateRequest++;
   if (buildCounterRoomCreateRequest < 3) {
     o.autoMatchingCriteria = buildRoomAutoMatchingCriteria();
-    o.capabilities = buildUnnamed49();
+    o.capabilities = buildUnnamed848();
     o.clientAddress = buildRoomClientAddress();
-    o.invitedPlayerIds = buildUnnamed50();
+    o.invitedPlayerIds = buildUnnamed849();
     o.kind = "foo";
     o.networkDiagnostics = buildNetworkDiagnostics();
     o.requestId = "foo";
@@ -2327,9 +2327,9 @@
   buildCounterRoomCreateRequest++;
   if (buildCounterRoomCreateRequest < 3) {
     checkRoomAutoMatchingCriteria(o.autoMatchingCriteria);
-    checkUnnamed49(o.capabilities);
+    checkUnnamed848(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
-    checkUnnamed50(o.invitedPlayerIds);
+    checkUnnamed849(o.invitedPlayerIds);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNetworkDiagnostics(o.networkDiagnostics);
     unittest.expect(o.requestId, unittest.equals('foo'));
@@ -2338,14 +2338,14 @@
   buildCounterRoomCreateRequest--;
 }
 
-buildUnnamed51() {
+buildUnnamed850() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed51(core.List<core.String> o) {
+checkUnnamed850(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2356,7 +2356,7 @@
   var o = new api.RoomJoinRequest();
   buildCounterRoomJoinRequest++;
   if (buildCounterRoomJoinRequest < 3) {
-    o.capabilities = buildUnnamed51();
+    o.capabilities = buildUnnamed850();
     o.clientAddress = buildRoomClientAddress();
     o.kind = "foo";
     o.networkDiagnostics = buildNetworkDiagnostics();
@@ -2368,7 +2368,7 @@
 checkRoomJoinRequest(api.RoomJoinRequest o) {
   buildCounterRoomJoinRequest++;
   if (buildCounterRoomJoinRequest < 3) {
-    checkUnnamed51(o.capabilities);
+    checkUnnamed850(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNetworkDiagnostics(o.networkDiagnostics);
@@ -2376,14 +2376,14 @@
   buildCounterRoomJoinRequest--;
 }
 
-buildUnnamed52() {
+buildUnnamed851() {
   var o = new core.List<api.PeerSessionDiagnostics>();
   o.add(buildPeerSessionDiagnostics());
   o.add(buildPeerSessionDiagnostics());
   return o;
 }
 
-checkUnnamed52(core.List<api.PeerSessionDiagnostics> o) {
+checkUnnamed851(core.List<api.PeerSessionDiagnostics> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPeerSessionDiagnostics(o[0]);
   checkPeerSessionDiagnostics(o[1]);
@@ -2400,7 +2400,7 @@
     o.kind = "foo";
     o.networkOperatorCode = "foo";
     o.networkOperatorName = "foo";
-    o.peerSession = buildUnnamed52();
+    o.peerSession = buildUnnamed851();
     o.socketsUsed = true;
   }
   buildCounterRoomLeaveDiagnostics--;
@@ -2416,7 +2416,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.networkOperatorCode, unittest.equals('foo'));
     unittest.expect(o.networkOperatorName, unittest.equals('foo'));
-    checkUnnamed52(o.peerSession);
+    checkUnnamed851(o.peerSession);
     unittest.expect(o.socketsUsed, unittest.isTrue);
   }
   buildCounterRoomLeaveDiagnostics--;
@@ -2445,14 +2445,14 @@
   buildCounterRoomLeaveRequest--;
 }
 
-buildUnnamed53() {
+buildUnnamed852() {
   var o = new core.List<api.Room>();
   o.add(buildRoom());
   o.add(buildRoom());
   return o;
 }
 
-checkUnnamed53(core.List<api.Room> o) {
+checkUnnamed852(core.List<api.Room> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoom(o[0]);
   checkRoom(o[1]);
@@ -2463,7 +2463,7 @@
   var o = new api.RoomList();
   buildCounterRoomList++;
   if (buildCounterRoomList < 3) {
-    o.items = buildUnnamed53();
+    o.items = buildUnnamed852();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2474,7 +2474,7 @@
 checkRoomList(api.RoomList o) {
   buildCounterRoomList++;
   if (buildCounterRoomList < 3) {
-    checkUnnamed53(o.items);
+    checkUnnamed852(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2535,14 +2535,14 @@
   buildCounterRoomP2PStatus--;
 }
 
-buildUnnamed54() {
+buildUnnamed853() {
   var o = new core.List<api.RoomP2PStatus>();
   o.add(buildRoomP2PStatus());
   o.add(buildRoomP2PStatus());
   return o;
 }
 
-checkUnnamed54(core.List<api.RoomP2PStatus> o) {
+checkUnnamed853(core.List<api.RoomP2PStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomP2PStatus(o[0]);
   checkRoomP2PStatus(o[1]);
@@ -2554,7 +2554,7 @@
   buildCounterRoomP2PStatuses++;
   if (buildCounterRoomP2PStatuses < 3) {
     o.kind = "foo";
-    o.updates = buildUnnamed54();
+    o.updates = buildUnnamed853();
   }
   buildCounterRoomP2PStatuses--;
   return o;
@@ -2564,19 +2564,19 @@
   buildCounterRoomP2PStatuses++;
   if (buildCounterRoomP2PStatuses < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed54(o.updates);
+    checkUnnamed853(o.updates);
   }
   buildCounterRoomP2PStatuses--;
 }
 
-buildUnnamed55() {
+buildUnnamed854() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed55(core.List<core.String> o) {
+checkUnnamed854(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2589,7 +2589,7 @@
   if (buildCounterRoomParticipant < 3) {
     o.autoMatched = true;
     o.autoMatchedPlayer = buildAnonymousPlayer();
-    o.capabilities = buildUnnamed55();
+    o.capabilities = buildUnnamed854();
     o.clientAddress = buildRoomClientAddress();
     o.connected = true;
     o.id = "foo";
@@ -2607,7 +2607,7 @@
   if (buildCounterRoomParticipant < 3) {
     unittest.expect(o.autoMatched, unittest.isTrue);
     checkAnonymousPlayer(o.autoMatchedPlayer);
-    checkUnnamed55(o.capabilities);
+    checkUnnamed854(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
     unittest.expect(o.connected, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -2619,14 +2619,14 @@
   buildCounterRoomParticipant--;
 }
 
-buildUnnamed56() {
+buildUnnamed855() {
   var o = new core.List<api.RoomParticipant>();
   o.add(buildRoomParticipant());
   o.add(buildRoomParticipant());
   return o;
 }
 
-checkUnnamed56(core.List<api.RoomParticipant> o) {
+checkUnnamed855(core.List<api.RoomParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomParticipant(o[0]);
   checkRoomParticipant(o[1]);
@@ -2639,7 +2639,7 @@
   if (buildCounterRoomStatus < 3) {
     o.autoMatchingStatus = buildRoomAutoMatchStatus();
     o.kind = "foo";
-    o.participants = buildUnnamed56();
+    o.participants = buildUnnamed855();
     o.roomId = "foo";
     o.status = "foo";
     o.statusVersion = 42;
@@ -2653,7 +2653,7 @@
   if (buildCounterRoomStatus < 3) {
     checkRoomAutoMatchStatus(o.autoMatchingStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed56(o.participants);
+    checkUnnamed855(o.participants);
     unittest.expect(o.roomId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusVersion, unittest.equals(42));
@@ -2754,14 +2754,14 @@
   buildCounterSnapshotImage--;
 }
 
-buildUnnamed57() {
+buildUnnamed856() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed57(core.List<api.Snapshot> o) {
+checkUnnamed856(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -2772,7 +2772,7 @@
   var o = new api.SnapshotListResponse();
   buildCounterSnapshotListResponse++;
   if (buildCounterSnapshotListResponse < 3) {
-    o.items = buildUnnamed57();
+    o.items = buildUnnamed856();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2783,7 +2783,7 @@
 checkSnapshotListResponse(api.SnapshotListResponse o) {
   buildCounterSnapshotListResponse++;
   if (buildCounterSnapshotListResponse < 3) {
-    checkUnnamed57(o.items);
+    checkUnnamed856(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2815,27 +2815,27 @@
   buildCounterTurnBasedAutoMatchingCriteria--;
 }
 
-buildUnnamed58() {
+buildUnnamed857() {
   var o = new core.List<api.TurnBasedMatchParticipant>();
   o.add(buildTurnBasedMatchParticipant());
   o.add(buildTurnBasedMatchParticipant());
   return o;
 }
 
-checkUnnamed58(core.List<api.TurnBasedMatchParticipant> o) {
+checkUnnamed857(core.List<api.TurnBasedMatchParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatchParticipant(o[0]);
   checkTurnBasedMatchParticipant(o[1]);
 }
 
-buildUnnamed59() {
+buildUnnamed858() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed59(core.List<api.ParticipantResult> o) {
+checkUnnamed858(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -2857,11 +2857,11 @@
     o.matchId = "foo";
     o.matchNumber = 42;
     o.matchVersion = 42;
-    o.participants = buildUnnamed58();
+    o.participants = buildUnnamed857();
     o.pendingParticipantId = "foo";
     o.previousMatchData = buildTurnBasedMatchData();
     o.rematchId = "foo";
-    o.results = buildUnnamed59();
+    o.results = buildUnnamed858();
     o.status = "foo";
     o.userMatchStatus = "foo";
     o.variant = 42;
@@ -2885,11 +2885,11 @@
     unittest.expect(o.matchId, unittest.equals('foo'));
     unittest.expect(o.matchNumber, unittest.equals(42));
     unittest.expect(o.matchVersion, unittest.equals(42));
-    checkUnnamed58(o.participants);
+    checkUnnamed857(o.participants);
     unittest.expect(o.pendingParticipantId, unittest.equals('foo'));
     checkTurnBasedMatchData(o.previousMatchData);
     unittest.expect(o.rematchId, unittest.equals('foo'));
-    checkUnnamed59(o.results);
+    checkUnnamed858(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.userMatchStatus, unittest.equals('foo'));
     unittest.expect(o.variant, unittest.equals(42));
@@ -2898,14 +2898,14 @@
   buildCounterTurnBasedMatch--;
 }
 
-buildUnnamed60() {
+buildUnnamed859() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed60(core.List<core.String> o) {
+checkUnnamed859(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2917,7 +2917,7 @@
   buildCounterTurnBasedMatchCreateRequest++;
   if (buildCounterTurnBasedMatchCreateRequest < 3) {
     o.autoMatchingCriteria = buildTurnBasedAutoMatchingCriteria();
-    o.invitedPlayerIds = buildUnnamed60();
+    o.invitedPlayerIds = buildUnnamed859();
     o.kind = "foo";
     o.requestId = "foo";
     o.variant = 42;
@@ -2930,7 +2930,7 @@
   buildCounterTurnBasedMatchCreateRequest++;
   if (buildCounterTurnBasedMatchCreateRequest < 3) {
     checkTurnBasedAutoMatchingCriteria(o.autoMatchingCriteria);
-    checkUnnamed60(o.invitedPlayerIds);
+    checkUnnamed859(o.invitedPlayerIds);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
     unittest.expect(o.variant, unittest.equals(42));
@@ -2982,14 +2982,14 @@
   buildCounterTurnBasedMatchDataRequest--;
 }
 
-buildUnnamed61() {
+buildUnnamed860() {
   var o = new core.List<api.TurnBasedMatch>();
   o.add(buildTurnBasedMatch());
   o.add(buildTurnBasedMatch());
   return o;
 }
 
-checkUnnamed61(core.List<api.TurnBasedMatch> o) {
+checkUnnamed860(core.List<api.TurnBasedMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatch(o[0]);
   checkTurnBasedMatch(o[1]);
@@ -3000,7 +3000,7 @@
   var o = new api.TurnBasedMatchList();
   buildCounterTurnBasedMatchList++;
   if (buildCounterTurnBasedMatchList < 3) {
-    o.items = buildUnnamed61();
+    o.items = buildUnnamed860();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3011,7 +3011,7 @@
 checkTurnBasedMatchList(api.TurnBasedMatchList o) {
   buildCounterTurnBasedMatchList++;
   if (buildCounterTurnBasedMatchList < 3) {
-    checkUnnamed61(o.items);
+    checkUnnamed860(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -3093,14 +3093,14 @@
   buildCounterTurnBasedMatchRematch--;
 }
 
-buildUnnamed62() {
+buildUnnamed861() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed62(core.List<api.ParticipantResult> o) {
+checkUnnamed861(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -3114,7 +3114,7 @@
     o.data = buildTurnBasedMatchDataRequest();
     o.kind = "foo";
     o.matchVersion = 42;
-    o.results = buildUnnamed62();
+    o.results = buildUnnamed861();
   }
   buildCounterTurnBasedMatchResults--;
   return o;
@@ -3126,19 +3126,19 @@
     checkTurnBasedMatchDataRequest(o.data);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.matchVersion, unittest.equals(42));
-    checkUnnamed62(o.results);
+    checkUnnamed861(o.results);
   }
   buildCounterTurnBasedMatchResults--;
 }
 
-buildUnnamed63() {
+buildUnnamed862() {
   var o = new core.List<api.TurnBasedMatch>();
   o.add(buildTurnBasedMatch());
   o.add(buildTurnBasedMatch());
   return o;
 }
 
-checkUnnamed63(core.List<api.TurnBasedMatch> o) {
+checkUnnamed862(core.List<api.TurnBasedMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatch(o[0]);
   checkTurnBasedMatch(o[1]);
@@ -3149,7 +3149,7 @@
   var o = new api.TurnBasedMatchSync();
   buildCounterTurnBasedMatchSync++;
   if (buildCounterTurnBasedMatchSync < 3) {
-    o.items = buildUnnamed63();
+    o.items = buildUnnamed862();
     o.kind = "foo";
     o.moreAvailable = true;
     o.nextPageToken = "foo";
@@ -3161,7 +3161,7 @@
 checkTurnBasedMatchSync(api.TurnBasedMatchSync o) {
   buildCounterTurnBasedMatchSync++;
   if (buildCounterTurnBasedMatchSync < 3) {
-    checkUnnamed63(o.items);
+    checkUnnamed862(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.moreAvailable, unittest.isTrue);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -3169,14 +3169,14 @@
   buildCounterTurnBasedMatchSync--;
 }
 
-buildUnnamed64() {
+buildUnnamed863() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed64(core.List<api.ParticipantResult> o) {
+checkUnnamed863(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -3191,7 +3191,7 @@
     o.kind = "foo";
     o.matchVersion = 42;
     o.pendingParticipantId = "foo";
-    o.results = buildUnnamed64();
+    o.results = buildUnnamed863();
   }
   buildCounterTurnBasedMatchTurn--;
   return o;
@@ -3204,7 +3204,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.matchVersion, unittest.equals(42));
     unittest.expect(o.pendingParticipantId, unittest.equals('foo'));
-    checkUnnamed64(o.results);
+    checkUnnamed863(o.results);
   }
   buildCounterTurnBasedMatchTurn--;
 }
diff --git a/generated/googleapis/test/gamesmanagement/v1management_test.dart b/generated/googleapis/test/gamesmanagement/v1management_test.dart
index 2d915c8..20449ed 100644
--- a/generated/googleapis/test/gamesmanagement/v1management_test.dart
+++ b/generated/googleapis/test/gamesmanagement/v1management_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed440() {
+buildUnnamed864() {
   var o = new core.List<api.AchievementResetResponse>();
   o.add(buildAchievementResetResponse());
   o.add(buildAchievementResetResponse());
   return o;
 }
 
-checkUnnamed440(core.List<api.AchievementResetResponse> o) {
+checkUnnamed864(core.List<api.AchievementResetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementResetResponse(o[0]);
   checkAchievementResetResponse(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAchievementResetAllResponse++;
   if (buildCounterAchievementResetAllResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed440();
+    o.results = buildUnnamed864();
   }
   buildCounterAchievementResetAllResponse--;
   return o;
@@ -45,19 +45,19 @@
   buildCounterAchievementResetAllResponse++;
   if (buildCounterAchievementResetAllResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed440(o.results);
+    checkUnnamed864(o.results);
   }
   buildCounterAchievementResetAllResponse--;
 }
 
-buildUnnamed441() {
+buildUnnamed865() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed441(core.List<core.String> o) {
+checkUnnamed865(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -68,7 +68,7 @@
   var o = new api.AchievementResetMultipleForAllRequest();
   buildCounterAchievementResetMultipleForAllRequest++;
   if (buildCounterAchievementResetMultipleForAllRequest < 3) {
-    o.achievementIds = buildUnnamed441();
+    o.achievementIds = buildUnnamed865();
     o.kind = "foo";
   }
   buildCounterAchievementResetMultipleForAllRequest--;
@@ -78,7 +78,7 @@
 checkAchievementResetMultipleForAllRequest(api.AchievementResetMultipleForAllRequest o) {
   buildCounterAchievementResetMultipleForAllRequest++;
   if (buildCounterAchievementResetMultipleForAllRequest < 3) {
-    checkUnnamed441(o.achievementIds);
+    checkUnnamed865(o.achievementIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAchievementResetMultipleForAllRequest--;
@@ -109,14 +109,14 @@
   buildCounterAchievementResetResponse--;
 }
 
-buildUnnamed442() {
+buildUnnamed866() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed442(core.List<core.String> o) {
+checkUnnamed866(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -127,7 +127,7 @@
   var o = new api.EventsResetMultipleForAllRequest();
   buildCounterEventsResetMultipleForAllRequest++;
   if (buildCounterEventsResetMultipleForAllRequest < 3) {
-    o.eventIds = buildUnnamed442();
+    o.eventIds = buildUnnamed866();
     o.kind = "foo";
   }
   buildCounterEventsResetMultipleForAllRequest--;
@@ -137,7 +137,7 @@
 checkEventsResetMultipleForAllRequest(api.EventsResetMultipleForAllRequest o) {
   buildCounterEventsResetMultipleForAllRequest++;
   if (buildCounterEventsResetMultipleForAllRequest < 3) {
-    checkUnnamed442(o.eventIds);
+    checkUnnamed866(o.eventIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterEventsResetMultipleForAllRequest--;
@@ -235,14 +235,14 @@
   buildCounterHiddenPlayer--;
 }
 
-buildUnnamed443() {
+buildUnnamed867() {
   var o = new core.List<api.HiddenPlayer>();
   o.add(buildHiddenPlayer());
   o.add(buildHiddenPlayer());
   return o;
 }
 
-checkUnnamed443(core.List<api.HiddenPlayer> o) {
+checkUnnamed867(core.List<api.HiddenPlayer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHiddenPlayer(o[0]);
   checkHiddenPlayer(o[1]);
@@ -253,7 +253,7 @@
   var o = new api.HiddenPlayerList();
   buildCounterHiddenPlayerList++;
   if (buildCounterHiddenPlayerList < 3) {
-    o.items = buildUnnamed443();
+    o.items = buildUnnamed867();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -264,7 +264,7 @@
 checkHiddenPlayerList(api.HiddenPlayerList o) {
   buildCounterHiddenPlayerList++;
   if (buildCounterHiddenPlayerList < 3) {
-    checkUnnamed443(o.items);
+    checkUnnamed867(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -325,14 +325,14 @@
   buildCounterPlayer--;
 }
 
-buildUnnamed444() {
+buildUnnamed868() {
   var o = new core.List<api.PlayerScoreResetResponse>();
   o.add(buildPlayerScoreResetResponse());
   o.add(buildPlayerScoreResetResponse());
   return o;
 }
 
-checkUnnamed444(core.List<api.PlayerScoreResetResponse> o) {
+checkUnnamed868(core.List<api.PlayerScoreResetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScoreResetResponse(o[0]);
   checkPlayerScoreResetResponse(o[1]);
@@ -344,7 +344,7 @@
   buildCounterPlayerScoreResetAllResponse++;
   if (buildCounterPlayerScoreResetAllResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed444();
+    o.results = buildUnnamed868();
   }
   buildCounterPlayerScoreResetAllResponse--;
   return o;
@@ -354,19 +354,19 @@
   buildCounterPlayerScoreResetAllResponse++;
   if (buildCounterPlayerScoreResetAllResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed444(o.results);
+    checkUnnamed868(o.results);
   }
   buildCounterPlayerScoreResetAllResponse--;
 }
 
-buildUnnamed445() {
+buildUnnamed869() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed445(core.List<core.String> o) {
+checkUnnamed869(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -379,7 +379,7 @@
   if (buildCounterPlayerScoreResetResponse < 3) {
     o.definitionId = "foo";
     o.kind = "foo";
-    o.resetScoreTimeSpans = buildUnnamed445();
+    o.resetScoreTimeSpans = buildUnnamed869();
   }
   buildCounterPlayerScoreResetResponse--;
   return o;
@@ -390,19 +390,19 @@
   if (buildCounterPlayerScoreResetResponse < 3) {
     unittest.expect(o.definitionId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed445(o.resetScoreTimeSpans);
+    checkUnnamed869(o.resetScoreTimeSpans);
   }
   buildCounterPlayerScoreResetResponse--;
 }
 
-buildUnnamed446() {
+buildUnnamed870() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed446(core.List<core.String> o) {
+checkUnnamed870(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -414,7 +414,7 @@
   buildCounterQuestsResetMultipleForAllRequest++;
   if (buildCounterQuestsResetMultipleForAllRequest < 3) {
     o.kind = "foo";
-    o.questIds = buildUnnamed446();
+    o.questIds = buildUnnamed870();
   }
   buildCounterQuestsResetMultipleForAllRequest--;
   return o;
@@ -424,19 +424,19 @@
   buildCounterQuestsResetMultipleForAllRequest++;
   if (buildCounterQuestsResetMultipleForAllRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed446(o.questIds);
+    checkUnnamed870(o.questIds);
   }
   buildCounterQuestsResetMultipleForAllRequest--;
 }
 
-buildUnnamed447() {
+buildUnnamed871() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed447(core.List<core.String> o) {
+checkUnnamed871(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -448,7 +448,7 @@
   buildCounterScoresResetMultipleForAllRequest++;
   if (buildCounterScoresResetMultipleForAllRequest < 3) {
     o.kind = "foo";
-    o.leaderboardIds = buildUnnamed447();
+    o.leaderboardIds = buildUnnamed871();
   }
   buildCounterScoresResetMultipleForAllRequest--;
   return o;
@@ -458,7 +458,7 @@
   buildCounterScoresResetMultipleForAllRequest++;
   if (buildCounterScoresResetMultipleForAllRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed447(o.leaderboardIds);
+    checkUnnamed871(o.leaderboardIds);
   }
   buildCounterScoresResetMultipleForAllRequest--;
 }
diff --git a/generated/googleapis/test/gmail/v1_test.dart b/generated/googleapis/test/gmail/v1_test.dart
index 5bda8fd..2500f32 100644
--- a/generated/googleapis/test/gmail/v1_test.dart
+++ b/generated/googleapis/test/gmail/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterDraft--;
 }
 
-buildUnnamed164() {
+buildUnnamed872() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed164(core.List<api.Message> o) {
+checkUnnamed872(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -56,7 +56,7 @@
   buildCounterHistory++;
   if (buildCounterHistory < 3) {
     o.id = "foo";
-    o.messages = buildUnnamed164();
+    o.messages = buildUnnamed872();
   }
   buildCounterHistory--;
   return o;
@@ -66,7 +66,7 @@
   buildCounterHistory++;
   if (buildCounterHistory < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed164(o.messages);
+    checkUnnamed872(o.messages);
   }
   buildCounterHistory--;
 }
@@ -106,14 +106,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed165() {
+buildUnnamed873() {
   var o = new core.List<api.Draft>();
   o.add(buildDraft());
   o.add(buildDraft());
   return o;
 }
 
-checkUnnamed165(core.List<api.Draft> o) {
+checkUnnamed873(core.List<api.Draft> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDraft(o[0]);
   checkDraft(o[1]);
@@ -124,7 +124,7 @@
   var o = new api.ListDraftsResponse();
   buildCounterListDraftsResponse++;
   if (buildCounterListDraftsResponse < 3) {
-    o.drafts = buildUnnamed165();
+    o.drafts = buildUnnamed873();
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
   }
@@ -135,21 +135,21 @@
 checkListDraftsResponse(api.ListDraftsResponse o) {
   buildCounterListDraftsResponse++;
   if (buildCounterListDraftsResponse < 3) {
-    checkUnnamed165(o.drafts);
+    checkUnnamed873(o.drafts);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
   }
   buildCounterListDraftsResponse--;
 }
 
-buildUnnamed166() {
+buildUnnamed874() {
   var o = new core.List<api.History>();
   o.add(buildHistory());
   o.add(buildHistory());
   return o;
 }
 
-checkUnnamed166(core.List<api.History> o) {
+checkUnnamed874(core.List<api.History> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHistory(o[0]);
   checkHistory(o[1]);
@@ -160,7 +160,7 @@
   var o = new api.ListHistoryResponse();
   buildCounterListHistoryResponse++;
   if (buildCounterListHistoryResponse < 3) {
-    o.history = buildUnnamed166();
+    o.history = buildUnnamed874();
     o.historyId = "foo";
     o.nextPageToken = "foo";
   }
@@ -171,21 +171,21 @@
 checkListHistoryResponse(api.ListHistoryResponse o) {
   buildCounterListHistoryResponse++;
   if (buildCounterListHistoryResponse < 3) {
-    checkUnnamed166(o.history);
+    checkUnnamed874(o.history);
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListHistoryResponse--;
 }
 
-buildUnnamed167() {
+buildUnnamed875() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed167(core.List<api.Label> o) {
+checkUnnamed875(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
@@ -196,7 +196,7 @@
   var o = new api.ListLabelsResponse();
   buildCounterListLabelsResponse++;
   if (buildCounterListLabelsResponse < 3) {
-    o.labels = buildUnnamed167();
+    o.labels = buildUnnamed875();
   }
   buildCounterListLabelsResponse--;
   return o;
@@ -205,19 +205,19 @@
 checkListLabelsResponse(api.ListLabelsResponse o) {
   buildCounterListLabelsResponse++;
   if (buildCounterListLabelsResponse < 3) {
-    checkUnnamed167(o.labels);
+    checkUnnamed875(o.labels);
   }
   buildCounterListLabelsResponse--;
 }
 
-buildUnnamed168() {
+buildUnnamed876() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed168(core.List<api.Message> o) {
+checkUnnamed876(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -228,7 +228,7 @@
   var o = new api.ListMessagesResponse();
   buildCounterListMessagesResponse++;
   if (buildCounterListMessagesResponse < 3) {
-    o.messages = buildUnnamed168();
+    o.messages = buildUnnamed876();
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
   }
@@ -239,21 +239,21 @@
 checkListMessagesResponse(api.ListMessagesResponse o) {
   buildCounterListMessagesResponse++;
   if (buildCounterListMessagesResponse < 3) {
-    checkUnnamed168(o.messages);
+    checkUnnamed876(o.messages);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
   }
   buildCounterListMessagesResponse--;
 }
 
-buildUnnamed169() {
+buildUnnamed877() {
   var o = new core.List<api.Thread>();
   o.add(buildThread());
   o.add(buildThread());
   return o;
 }
 
-checkUnnamed169(core.List<api.Thread> o) {
+checkUnnamed877(core.List<api.Thread> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThread(o[0]);
   checkThread(o[1]);
@@ -266,7 +266,7 @@
   if (buildCounterListThreadsResponse < 3) {
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
-    o.threads = buildUnnamed169();
+    o.threads = buildUnnamed877();
   }
   buildCounterListThreadsResponse--;
   return o;
@@ -277,19 +277,19 @@
   if (buildCounterListThreadsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
-    checkUnnamed169(o.threads);
+    checkUnnamed877(o.threads);
   }
   buildCounterListThreadsResponse--;
 }
 
-buildUnnamed170() {
+buildUnnamed878() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed170(core.List<core.String> o) {
+checkUnnamed878(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -302,7 +302,7 @@
   if (buildCounterMessage < 3) {
     o.historyId = "foo";
     o.id = "foo";
-    o.labelIds = buildUnnamed170();
+    o.labelIds = buildUnnamed878();
     o.payload = buildMessagePart();
     o.raw = "foo";
     o.sizeEstimate = 42;
@@ -318,7 +318,7 @@
   if (buildCounterMessage < 3) {
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed170(o.labelIds);
+    checkUnnamed878(o.labelIds);
     checkMessagePart(o.payload);
     unittest.expect(o.raw, unittest.equals('foo'));
     unittest.expect(o.sizeEstimate, unittest.equals(42));
@@ -328,27 +328,27 @@
   buildCounterMessage--;
 }
 
-buildUnnamed171() {
+buildUnnamed879() {
   var o = new core.List<api.MessagePartHeader>();
   o.add(buildMessagePartHeader());
   o.add(buildMessagePartHeader());
   return o;
 }
 
-checkUnnamed171(core.List<api.MessagePartHeader> o) {
+checkUnnamed879(core.List<api.MessagePartHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessagePartHeader(o[0]);
   checkMessagePartHeader(o[1]);
 }
 
-buildUnnamed172() {
+buildUnnamed880() {
   var o = new core.List<api.MessagePart>();
   o.add(buildMessagePart());
   o.add(buildMessagePart());
   return o;
 }
 
-checkUnnamed172(core.List<api.MessagePart> o) {
+checkUnnamed880(core.List<api.MessagePart> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessagePart(o[0]);
   checkMessagePart(o[1]);
@@ -361,10 +361,10 @@
   if (buildCounterMessagePart < 3) {
     o.body = buildMessagePartBody();
     o.filename = "foo";
-    o.headers = buildUnnamed171();
+    o.headers = buildUnnamed879();
     o.mimeType = "foo";
     o.partId = "foo";
-    o.parts = buildUnnamed172();
+    o.parts = buildUnnamed880();
   }
   buildCounterMessagePart--;
   return o;
@@ -375,10 +375,10 @@
   if (buildCounterMessagePart < 3) {
     checkMessagePartBody(o.body);
     unittest.expect(o.filename, unittest.equals('foo'));
-    checkUnnamed171(o.headers);
+    checkUnnamed879(o.headers);
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.partId, unittest.equals('foo'));
-    checkUnnamed172(o.parts);
+    checkUnnamed880(o.parts);
   }
   buildCounterMessagePart--;
 }
@@ -427,27 +427,27 @@
   buildCounterMessagePartHeader--;
 }
 
-buildUnnamed173() {
+buildUnnamed881() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed173(core.List<core.String> o) {
+checkUnnamed881(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed174() {
+buildUnnamed882() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed174(core.List<core.String> o) {
+checkUnnamed882(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -458,8 +458,8 @@
   var o = new api.ModifyMessageRequest();
   buildCounterModifyMessageRequest++;
   if (buildCounterModifyMessageRequest < 3) {
-    o.addLabelIds = buildUnnamed173();
-    o.removeLabelIds = buildUnnamed174();
+    o.addLabelIds = buildUnnamed881();
+    o.removeLabelIds = buildUnnamed882();
   }
   buildCounterModifyMessageRequest--;
   return o;
@@ -468,33 +468,33 @@
 checkModifyMessageRequest(api.ModifyMessageRequest o) {
   buildCounterModifyMessageRequest++;
   if (buildCounterModifyMessageRequest < 3) {
-    checkUnnamed173(o.addLabelIds);
-    checkUnnamed174(o.removeLabelIds);
+    checkUnnamed881(o.addLabelIds);
+    checkUnnamed882(o.removeLabelIds);
   }
   buildCounterModifyMessageRequest--;
 }
 
-buildUnnamed175() {
+buildUnnamed883() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed175(core.List<core.String> o) {
+checkUnnamed883(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed176() {
+buildUnnamed884() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed176(core.List<core.String> o) {
+checkUnnamed884(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -505,8 +505,8 @@
   var o = new api.ModifyThreadRequest();
   buildCounterModifyThreadRequest++;
   if (buildCounterModifyThreadRequest < 3) {
-    o.addLabelIds = buildUnnamed175();
-    o.removeLabelIds = buildUnnamed176();
+    o.addLabelIds = buildUnnamed883();
+    o.removeLabelIds = buildUnnamed884();
   }
   buildCounterModifyThreadRequest--;
   return o;
@@ -515,8 +515,8 @@
 checkModifyThreadRequest(api.ModifyThreadRequest o) {
   buildCounterModifyThreadRequest++;
   if (buildCounterModifyThreadRequest < 3) {
-    checkUnnamed175(o.addLabelIds);
-    checkUnnamed176(o.removeLabelIds);
+    checkUnnamed883(o.addLabelIds);
+    checkUnnamed884(o.removeLabelIds);
   }
   buildCounterModifyThreadRequest--;
 }
@@ -546,14 +546,14 @@
   buildCounterProfile--;
 }
 
-buildUnnamed177() {
+buildUnnamed885() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed177(core.List<api.Message> o) {
+checkUnnamed885(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -566,7 +566,7 @@
   if (buildCounterThread < 3) {
     o.historyId = "foo";
     o.id = "foo";
-    o.messages = buildUnnamed177();
+    o.messages = buildUnnamed885();
     o.snippet = "foo";
   }
   buildCounterThread--;
@@ -578,59 +578,59 @@
   if (buildCounterThread < 3) {
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed177(o.messages);
+    checkUnnamed885(o.messages);
     unittest.expect(o.snippet, unittest.equals('foo'));
   }
   buildCounterThread--;
 }
 
-buildUnnamed178() {
+buildUnnamed886() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed178(core.List<core.String> o) {
+checkUnnamed886(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed179() {
+buildUnnamed887() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed179(core.List<core.String> o) {
+checkUnnamed887(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed180() {
+buildUnnamed888() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed180(core.List<core.String> o) {
+checkUnnamed888(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed181() {
+buildUnnamed889() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed181(core.List<core.String> o) {
+checkUnnamed889(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1482,7 +1482,7 @@
       var arg_userId = "foo";
       var arg_id = "foo";
       var arg_format = "foo";
-      var arg_metadataHeaders = buildUnnamed178();
+      var arg_metadataHeaders = buildUnnamed886();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1628,7 +1628,7 @@
       api.UsersMessagesResourceApi res = new api.GmailApi(mock).users.messages;
       var arg_userId = "foo";
       var arg_includeSpamTrash = true;
-      var arg_labelIds = buildUnnamed179();
+      var arg_labelIds = buildUnnamed887();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_q = "foo";
@@ -1955,7 +1955,7 @@
       var arg_userId = "foo";
       var arg_id = "foo";
       var arg_format = "foo";
-      var arg_metadataHeaders = buildUnnamed180();
+      var arg_metadataHeaders = buildUnnamed888();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2001,7 +2001,7 @@
       api.UsersThreadsResourceApi res = new api.GmailApi(mock).users.threads;
       var arg_userId = "foo";
       var arg_includeSpamTrash = true;
-      var arg_labelIds = buildUnnamed181();
+      var arg_labelIds = buildUnnamed889();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_q = "foo";
diff --git a/generated/googleapis/test/identitytoolkit/v3_test.dart b/generated/googleapis/test/identitytoolkit/v3_test.dart
index 1a7d6c0..e6270cb 100644
--- a/generated/googleapis/test/identitytoolkit/v3_test.dart
+++ b/generated/googleapis/test/identitytoolkit/v3_test.dart
@@ -64,14 +64,14 @@
   buildCounterDeleteAccountResponse--;
 }
 
-buildUnnamed1024() {
+buildUnnamed890() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed1024(core.List<api.UserInfo> o) {
+checkUnnamed890(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -84,7 +84,7 @@
   if (buildCounterDownloadAccountResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.users = buildUnnamed1024();
+    o.users = buildUnnamed890();
   }
   buildCounterDownloadAccountResponse--;
   return o;
@@ -95,19 +95,19 @@
   if (buildCounterDownloadAccountResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1024(o.users);
+    checkUnnamed890(o.users);
   }
   buildCounterDownloadAccountResponse--;
 }
 
-buildUnnamed1025() {
+buildUnnamed891() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed1025(core.List<api.UserInfo> o) {
+checkUnnamed891(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -119,7 +119,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     o.kind = "foo";
-    o.users = buildUnnamed1025();
+    o.users = buildUnnamed891();
   }
   buildCounterGetAccountInfoResponse--;
   return o;
@@ -129,7 +129,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1025(o.users);
+    checkUnnamed891(o.users);
   }
   buildCounterGetAccountInfoResponse--;
 }
@@ -228,27 +228,27 @@
   buildCounterIdentitytoolkitRelyingpartyDownloadAccountRequest--;
 }
 
-buildUnnamed1026() {
+buildUnnamed892() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1026(core.List<core.String> o) {
+checkUnnamed892(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1027() {
+buildUnnamed893() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1027(core.List<core.String> o) {
+checkUnnamed893(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -259,9 +259,9 @@
   var o = new api.IdentitytoolkitRelyingpartyGetAccountInfoRequest();
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
-    o.email = buildUnnamed1026();
+    o.email = buildUnnamed892();
     o.idToken = "foo";
-    o.localId = buildUnnamed1027();
+    o.localId = buildUnnamed893();
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
   return o;
@@ -270,9 +270,9 @@
 checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(api.IdentitytoolkitRelyingpartyGetAccountInfoRequest o) {
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
-    checkUnnamed1026(o.email);
+    checkUnnamed892(o.email);
     unittest.expect(o.idToken, unittest.equals('foo'));
-    checkUnnamed1027(o.localId);
+    checkUnnamed893(o.localId);
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
 }
@@ -315,14 +315,14 @@
   buildCounterIdentitytoolkitRelyingpartyResetPasswordRequest--;
 }
 
-buildUnnamed1028() {
+buildUnnamed894() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1028(core.List<core.String> o) {
+checkUnnamed894(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -342,7 +342,7 @@
     o.localId = "foo";
     o.oobCode = "foo";
     o.password = "foo";
-    o.provider = buildUnnamed1028();
+    o.provider = buildUnnamed894();
     o.upgradeToFederatedLogin = true;
   }
   buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest--;
@@ -361,20 +361,20 @@
     unittest.expect(o.localId, unittest.equals('foo'));
     unittest.expect(o.oobCode, unittest.equals('foo'));
     unittest.expect(o.password, unittest.equals('foo'));
-    checkUnnamed1028(o.provider);
+    checkUnnamed894(o.provider);
     unittest.expect(o.upgradeToFederatedLogin, unittest.isTrue);
   }
   buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest--;
 }
 
-buildUnnamed1029() {
+buildUnnamed895() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed1029(core.List<api.UserInfo> o) {
+checkUnnamed895(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -390,7 +390,7 @@
     o.rounds = 42;
     o.saltSeparator = "foo";
     o.signerKey = "foo";
-    o.users = buildUnnamed1029();
+    o.users = buildUnnamed895();
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
   return o;
@@ -404,7 +404,7 @@
     unittest.expect(o.rounds, unittest.equals(42));
     unittest.expect(o.saltSeparator, unittest.equals('foo'));
     unittest.expect(o.signerKey, unittest.equals('foo'));
-    checkUnnamed1029(o.users);
+    checkUnnamed895(o.users);
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
 }
@@ -536,14 +536,14 @@
   buildCounterSetAccountInfoResponseProviderUserInfo--;
 }
 
-buildUnnamed1030() {
+buildUnnamed896() {
   var o = new core.List<api.SetAccountInfoResponseProviderUserInfo>();
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   return o;
 }
 
-checkUnnamed1030(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
+checkUnnamed896(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetAccountInfoResponseProviderUserInfo(o[0]);
   checkSetAccountInfoResponseProviderUserInfo(o[1]);
@@ -558,7 +558,7 @@
     o.email = "foo";
     o.idToken = "foo";
     o.kind = "foo";
-    o.providerUserInfo = buildUnnamed1030();
+    o.providerUserInfo = buildUnnamed896();
   }
   buildCounterSetAccountInfoResponse--;
   return o;
@@ -571,7 +571,7 @@
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.idToken, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1030(o.providerUserInfo);
+    checkUnnamed896(o.providerUserInfo);
   }
   buildCounterSetAccountInfoResponse--;
 }
@@ -597,14 +597,14 @@
   buildCounterUploadAccountResponseError--;
 }
 
-buildUnnamed1031() {
+buildUnnamed897() {
   var o = new core.List<api.UploadAccountResponseError>();
   o.add(buildUploadAccountResponseError());
   o.add(buildUploadAccountResponseError());
   return o;
 }
 
-checkUnnamed1031(core.List<api.UploadAccountResponseError> o) {
+checkUnnamed897(core.List<api.UploadAccountResponseError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUploadAccountResponseError(o[0]);
   checkUploadAccountResponseError(o[1]);
@@ -615,7 +615,7 @@
   var o = new api.UploadAccountResponse();
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    o.error = buildUnnamed1031();
+    o.error = buildUnnamed897();
     o.kind = "foo";
   }
   buildCounterUploadAccountResponse--;
@@ -625,7 +625,7 @@
 checkUploadAccountResponse(api.UploadAccountResponse o) {
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    checkUnnamed1031(o.error);
+    checkUnnamed897(o.error);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUploadAccountResponse--;
@@ -656,14 +656,14 @@
   buildCounterUserInfoProviderUserInfo--;
 }
 
-buildUnnamed1032() {
+buildUnnamed898() {
   var o = new core.List<api.UserInfoProviderUserInfo>();
   o.add(buildUserInfoProviderUserInfo());
   o.add(buildUserInfoProviderUserInfo());
   return o;
 }
 
-checkUnnamed1032(core.List<api.UserInfoProviderUserInfo> o) {
+checkUnnamed898(core.List<api.UserInfoProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfoProviderUserInfo(o[0]);
   checkUserInfoProviderUserInfo(o[1]);
@@ -681,7 +681,7 @@
     o.passwordHash = "foo";
     o.passwordUpdatedAt = 42.0;
     o.photoUrl = "foo";
-    o.providerUserInfo = buildUnnamed1032();
+    o.providerUserInfo = buildUnnamed898();
     o.salt = "foo";
     o.version = 42;
   }
@@ -699,21 +699,21 @@
     unittest.expect(o.passwordHash, unittest.equals('foo'));
     unittest.expect(o.passwordUpdatedAt, unittest.equals(42.0));
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed1032(o.providerUserInfo);
+    checkUnnamed898(o.providerUserInfo);
     unittest.expect(o.salt, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterUserInfo--;
 }
 
-buildUnnamed1033() {
+buildUnnamed899() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1033(core.List<core.String> o) {
+checkUnnamed899(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -750,7 +750,7 @@
     o.photoUrl = "foo";
     o.providerId = "foo";
     o.timeZone = "foo";
-    o.verifiedProvider = buildUnnamed1033();
+    o.verifiedProvider = buildUnnamed899();
   }
   buildCounterVerifyAssertionResponse--;
   return o;
@@ -785,7 +785,7 @@
     unittest.expect(o.photoUrl, unittest.equals('foo'));
     unittest.expect(o.providerId, unittest.equals('foo'));
     unittest.expect(o.timeZone, unittest.equals('foo'));
-    checkUnnamed1033(o.verifiedProvider);
+    checkUnnamed899(o.verifiedProvider);
   }
   buildCounterVerifyAssertionResponse--;
 }
diff --git a/generated/googleapis/test/licensing/v1_test.dart b/generated/googleapis/test/licensing/v1_test.dart
index eeeeaf6..b868579 100644
--- a/generated/googleapis/test/licensing/v1_test.dart
+++ b/generated/googleapis/test/licensing/v1_test.dart
@@ -64,14 +64,14 @@
   buildCounterLicenseAssignmentInsert--;
 }
 
-buildUnnamed925() {
+buildUnnamed900() {
   var o = new core.List<api.LicenseAssignment>();
   o.add(buildLicenseAssignment());
   o.add(buildLicenseAssignment());
   return o;
 }
 
-checkUnnamed925(core.List<api.LicenseAssignment> o) {
+checkUnnamed900(core.List<api.LicenseAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLicenseAssignment(o[0]);
   checkLicenseAssignment(o[1]);
@@ -83,7 +83,7 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed925();
+    o.items = buildUnnamed900();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -95,7 +95,7 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed925(o.items);
+    checkUnnamed900(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/mapsengine/v1_test.dart b/generated/googleapis/test/mapsengine/v1_test.dart
index 1e7825f..ab4f0d9 100644
--- a/generated/googleapis/test/mapsengine/v1_test.dart
+++ b/generated/googleapis/test/mapsengine/v1_test.dart
@@ -39,27 +39,27 @@
   buildCounterAcquisitionTime--;
 }
 
-buildUnnamed92() {
+buildUnnamed901() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed92(core.List<core.double> o) {
+checkUnnamed901(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed93() {
+buildUnnamed902() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed93(core.List<core.String> o) {
+checkUnnamed902(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -70,7 +70,7 @@
   var o = new api.Asset();
   buildCounterAsset++;
   if (buildCounterAsset < 3) {
-    o.bbox = buildUnnamed92();
+    o.bbox = buildUnnamed901();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
@@ -81,7 +81,7 @@
     o.name = "foo";
     o.projectId = "foo";
     o.resource = "foo";
-    o.tags = buildUnnamed93();
+    o.tags = buildUnnamed902();
     o.type = "foo";
     o.writersCanEditPermissions = true;
   }
@@ -92,7 +92,7 @@
 checkAsset(api.Asset o) {
   buildCounterAsset++;
   if (buildCounterAsset < 3) {
-    checkUnnamed92(o.bbox);
+    checkUnnamed901(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -103,21 +103,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.resource, unittest.equals('foo'));
-    checkUnnamed93(o.tags);
+    checkUnnamed902(o.tags);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterAsset--;
 }
 
-buildUnnamed94() {
+buildUnnamed903() {
   var o = new core.List<api.Asset>();
   o.add(buildAsset());
   o.add(buildAsset());
   return o;
 }
 
-checkUnnamed94(core.List<api.Asset> o) {
+checkUnnamed903(core.List<api.Asset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAsset(o[0]);
   checkAsset(o[1]);
@@ -128,7 +128,7 @@
   var o = new api.AssetsListResponse();
   buildCounterAssetsListResponse++;
   if (buildCounterAssetsListResponse < 3) {
-    o.assets = buildUnnamed94();
+    o.assets = buildUnnamed903();
     o.nextPageToken = "foo";
   }
   buildCounterAssetsListResponse--;
@@ -138,7 +138,7 @@
 checkAssetsListResponse(api.AssetsListResponse o) {
   buildCounterAssetsListResponse++;
   if (buildCounterAssetsListResponse < 3) {
-    checkUnnamed94(o.assets);
+    checkUnnamed903(o.assets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAssetsListResponse--;
@@ -220,14 +220,14 @@
   checkDatasource(o[1]);
 }
 
-buildUnnamed95() {
+buildUnnamed904() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed95(core.List<api.Filter> o) {
+checkUnnamed904(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -238,7 +238,7 @@
   var o = new api.DisplayRule();
   buildCounterDisplayRule++;
   if (buildCounterDisplayRule < 3) {
-    o.filters = buildUnnamed95();
+    o.filters = buildUnnamed904();
     o.lineOptions = buildLineStyle();
     o.name = "foo";
     o.pointOptions = buildPointStyle();
@@ -252,7 +252,7 @@
 checkDisplayRule(api.DisplayRule o) {
   buildCounterDisplayRule++;
   if (buildCounterDisplayRule < 3) {
-    checkUnnamed95(o.filters);
+    checkUnnamed904(o.filters);
     checkLineStyle(o.lineOptions);
     unittest.expect(o.name, unittest.equals('foo'));
     checkPointStyle(o.pointOptions);
@@ -304,27 +304,27 @@
   buildCounterFeatureInfo--;
 }
 
-buildUnnamed96() {
+buildUnnamed905() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed96(core.List<core.String> o) {
+checkUnnamed905(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed97() {
+buildUnnamed906() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed97(core.List<core.String> o) {
+checkUnnamed906(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -335,8 +335,8 @@
   var o = new api.FeaturesBatchDeleteRequest();
   buildCounterFeaturesBatchDeleteRequest++;
   if (buildCounterFeaturesBatchDeleteRequest < 3) {
-    o.gxIds = buildUnnamed96();
-    o.primaryKeys = buildUnnamed97();
+    o.gxIds = buildUnnamed905();
+    o.primaryKeys = buildUnnamed906();
   }
   buildCounterFeaturesBatchDeleteRequest--;
   return o;
@@ -345,20 +345,20 @@
 checkFeaturesBatchDeleteRequest(api.FeaturesBatchDeleteRequest o) {
   buildCounterFeaturesBatchDeleteRequest++;
   if (buildCounterFeaturesBatchDeleteRequest < 3) {
-    checkUnnamed96(o.gxIds);
-    checkUnnamed97(o.primaryKeys);
+    checkUnnamed905(o.gxIds);
+    checkUnnamed906(o.primaryKeys);
   }
   buildCounterFeaturesBatchDeleteRequest--;
 }
 
-buildUnnamed98() {
+buildUnnamed907() {
   var o = new core.List<api.Feature>();
   o.add(buildFeature());
   o.add(buildFeature());
   return o;
 }
 
-checkUnnamed98(core.List<api.Feature> o) {
+checkUnnamed907(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeature(o[0]);
   checkFeature(o[1]);
@@ -369,7 +369,7 @@
   var o = new api.FeaturesBatchInsertRequest();
   buildCounterFeaturesBatchInsertRequest++;
   if (buildCounterFeaturesBatchInsertRequest < 3) {
-    o.features = buildUnnamed98();
+    o.features = buildUnnamed907();
     o.normalizeGeometries = true;
   }
   buildCounterFeaturesBatchInsertRequest--;
@@ -379,20 +379,20 @@
 checkFeaturesBatchInsertRequest(api.FeaturesBatchInsertRequest o) {
   buildCounterFeaturesBatchInsertRequest++;
   if (buildCounterFeaturesBatchInsertRequest < 3) {
-    checkUnnamed98(o.features);
+    checkUnnamed907(o.features);
     unittest.expect(o.normalizeGeometries, unittest.isTrue);
   }
   buildCounterFeaturesBatchInsertRequest--;
 }
 
-buildUnnamed99() {
+buildUnnamed908() {
   var o = new core.List<api.Feature>();
   o.add(buildFeature());
   o.add(buildFeature());
   return o;
 }
 
-checkUnnamed99(core.List<api.Feature> o) {
+checkUnnamed908(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeature(o[0]);
   checkFeature(o[1]);
@@ -403,7 +403,7 @@
   var o = new api.FeaturesBatchPatchRequest();
   buildCounterFeaturesBatchPatchRequest++;
   if (buildCounterFeaturesBatchPatchRequest < 3) {
-    o.features = buildUnnamed99();
+    o.features = buildUnnamed908();
     o.normalizeGeometries = true;
   }
   buildCounterFeaturesBatchPatchRequest--;
@@ -413,20 +413,20 @@
 checkFeaturesBatchPatchRequest(api.FeaturesBatchPatchRequest o) {
   buildCounterFeaturesBatchPatchRequest++;
   if (buildCounterFeaturesBatchPatchRequest < 3) {
-    checkUnnamed99(o.features);
+    checkUnnamed908(o.features);
     unittest.expect(o.normalizeGeometries, unittest.isTrue);
   }
   buildCounterFeaturesBatchPatchRequest--;
 }
 
-buildUnnamed100() {
+buildUnnamed909() {
   var o = new core.List<api.Feature>();
   o.add(buildFeature());
   o.add(buildFeature());
   return o;
 }
 
-checkUnnamed100(core.List<api.Feature> o) {
+checkUnnamed909(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeature(o[0]);
   checkFeature(o[1]);
@@ -438,7 +438,7 @@
   buildCounterFeaturesListResponse++;
   if (buildCounterFeaturesListResponse < 3) {
     o.allowedQueriesPerSecond = 42.0;
-    o.features = buildUnnamed100();
+    o.features = buildUnnamed909();
     o.nextPageToken = "foo";
     o.schema = buildSchema();
     o.type = "foo";
@@ -451,7 +451,7 @@
   buildCounterFeaturesListResponse++;
   if (buildCounterFeaturesListResponse < 3) {
     unittest.expect(o.allowedQueriesPerSecond, unittest.equals(42.0));
-    checkUnnamed100(o.features);
+    checkUnnamed909(o.features);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkSchema(o.schema);
     unittest.expect(o.type, unittest.equals('foo'));
@@ -513,7 +513,7 @@
   checkGeoJsonGeometryCollection(api.GeoJsonGeometryCollection o) {
   buildCounterGeoJsonGeometryCollection++;
   if (buildCounterGeoJsonGeometryCollection < 3) {
-    checkUnnamed101(o.geometries);
+    checkUnnamed910(o.geometries);
   }
   buildCounterGeoJsonGeometryCollection--;
 }
@@ -521,14 +521,14 @@
 (o);
 }
 
-buildUnnamed101() {
+buildUnnamed910() {
   var o = new core.List<api.GeoJsonGeometry>();
   o.add(buildGeoJsonGeometry());
   o.add(buildGeoJsonGeometry());
   return o;
 }
 
-checkUnnamed101(core.List<api.GeoJsonGeometry> o) {
+checkUnnamed910(core.List<api.GeoJsonGeometry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonGeometry(o[0]);
   checkGeoJsonGeometry(o[1]);
@@ -539,7 +539,7 @@
   var o = new api.GeoJsonGeometryCollection();
   buildCounterGeoJsonGeometryCollection++;
   if (buildCounterGeoJsonGeometryCollection < 3) {
-    o.geometries = buildUnnamed101();
+    o.geometries = buildUnnamed910();
   }
   buildCounterGeoJsonGeometryCollection--;
   return o;
@@ -548,19 +548,19 @@
 checkGeoJsonGeometryCollection(api.GeoJsonGeometryCollection o) {
   buildCounterGeoJsonGeometryCollection++;
   if (buildCounterGeoJsonGeometryCollection < 3) {
-    checkUnnamed101(o.geometries);
+    checkUnnamed910(o.geometries);
   }
   buildCounterGeoJsonGeometryCollection--;
 }
 
-buildUnnamed102() {
+buildUnnamed911() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed102(core.List<api.GeoJsonPosition> o) {
+checkUnnamed911(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
@@ -571,7 +571,7 @@
   var o = new api.GeoJsonLineString();
   buildCounterGeoJsonLineString++;
   if (buildCounterGeoJsonLineString < 3) {
-    o.coordinates = buildUnnamed102();
+    o.coordinates = buildUnnamed911();
   }
   buildCounterGeoJsonLineString--;
   return o;
@@ -580,35 +580,35 @@
 checkGeoJsonLineString(api.GeoJsonLineString o) {
   buildCounterGeoJsonLineString++;
   if (buildCounterGeoJsonLineString < 3) {
-    checkUnnamed102(o.coordinates);
+    checkUnnamed911(o.coordinates);
   }
   buildCounterGeoJsonLineString--;
 }
 
-buildUnnamed103() {
+buildUnnamed912() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed103(core.List<api.GeoJsonPosition> o) {
+checkUnnamed912(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
 }
 
-buildUnnamed104() {
+buildUnnamed913() {
   var o = new core.List<core.List<api.GeoJsonPosition>>();
-  o.add(buildUnnamed103());
-  o.add(buildUnnamed103());
+  o.add(buildUnnamed912());
+  o.add(buildUnnamed912());
   return o;
 }
 
-checkUnnamed104(core.List<core.List<api.GeoJsonPosition>> o) {
+checkUnnamed913(core.List<core.List<api.GeoJsonPosition>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed103(o[0]);
-  checkUnnamed103(o[1]);
+  checkUnnamed912(o[0]);
+  checkUnnamed912(o[1]);
 }
 
 core.int buildCounterGeoJsonMultiLineString = 0;
@@ -616,7 +616,7 @@
   var o = new api.GeoJsonMultiLineString();
   buildCounterGeoJsonMultiLineString++;
   if (buildCounterGeoJsonMultiLineString < 3) {
-    o.coordinates = buildUnnamed104();
+    o.coordinates = buildUnnamed913();
   }
   buildCounterGeoJsonMultiLineString--;
   return o;
@@ -625,19 +625,19 @@
 checkGeoJsonMultiLineString(api.GeoJsonMultiLineString o) {
   buildCounterGeoJsonMultiLineString++;
   if (buildCounterGeoJsonMultiLineString < 3) {
-    checkUnnamed104(o.coordinates);
+    checkUnnamed913(o.coordinates);
   }
   buildCounterGeoJsonMultiLineString--;
 }
 
-buildUnnamed105() {
+buildUnnamed914() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed105(core.List<api.GeoJsonPosition> o) {
+checkUnnamed914(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
@@ -648,7 +648,7 @@
   var o = new api.GeoJsonMultiPoint();
   buildCounterGeoJsonMultiPoint++;
   if (buildCounterGeoJsonMultiPoint < 3) {
-    o.coordinates = buildUnnamed105();
+    o.coordinates = buildUnnamed914();
   }
   buildCounterGeoJsonMultiPoint--;
   return o;
@@ -657,48 +657,48 @@
 checkGeoJsonMultiPoint(api.GeoJsonMultiPoint o) {
   buildCounterGeoJsonMultiPoint++;
   if (buildCounterGeoJsonMultiPoint < 3) {
-    checkUnnamed105(o.coordinates);
+    checkUnnamed914(o.coordinates);
   }
   buildCounterGeoJsonMultiPoint--;
 }
 
-buildUnnamed106() {
+buildUnnamed915() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed106(core.List<api.GeoJsonPosition> o) {
+checkUnnamed915(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
 }
 
-buildUnnamed107() {
+buildUnnamed916() {
   var o = new core.List<core.List<api.GeoJsonPosition>>();
-  o.add(buildUnnamed106());
-  o.add(buildUnnamed106());
+  o.add(buildUnnamed915());
+  o.add(buildUnnamed915());
   return o;
 }
 
-checkUnnamed107(core.List<core.List<api.GeoJsonPosition>> o) {
+checkUnnamed916(core.List<core.List<api.GeoJsonPosition>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed106(o[0]);
-  checkUnnamed106(o[1]);
+  checkUnnamed915(o[0]);
+  checkUnnamed915(o[1]);
 }
 
-buildUnnamed108() {
+buildUnnamed917() {
   var o = new core.List<core.List<core.List<api.GeoJsonPosition>>>();
-  o.add(buildUnnamed107());
-  o.add(buildUnnamed107());
+  o.add(buildUnnamed916());
+  o.add(buildUnnamed916());
   return o;
 }
 
-checkUnnamed108(core.List<core.List<core.List<api.GeoJsonPosition>>> o) {
+checkUnnamed917(core.List<core.List<core.List<api.GeoJsonPosition>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed107(o[0]);
-  checkUnnamed107(o[1]);
+  checkUnnamed916(o[0]);
+  checkUnnamed916(o[1]);
 }
 
 core.int buildCounterGeoJsonMultiPolygon = 0;
@@ -706,7 +706,7 @@
   var o = new api.GeoJsonMultiPolygon();
   buildCounterGeoJsonMultiPolygon++;
   if (buildCounterGeoJsonMultiPolygon < 3) {
-    o.coordinates = buildUnnamed108();
+    o.coordinates = buildUnnamed917();
   }
   buildCounterGeoJsonMultiPolygon--;
   return o;
@@ -715,7 +715,7 @@
 checkGeoJsonMultiPolygon(api.GeoJsonMultiPolygon o) {
   buildCounterGeoJsonMultiPolygon++;
   if (buildCounterGeoJsonMultiPolygon < 3) {
-    checkUnnamed108(o.coordinates);
+    checkUnnamed917(o.coordinates);
   }
   buildCounterGeoJsonMultiPolygon--;
 }
@@ -739,30 +739,30 @@
   buildCounterGeoJsonPoint--;
 }
 
-buildUnnamed109() {
+buildUnnamed918() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed109(core.List<api.GeoJsonPosition> o) {
+checkUnnamed918(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
 }
 
-buildUnnamed110() {
+buildUnnamed919() {
   var o = new core.List<core.List<api.GeoJsonPosition>>();
-  o.add(buildUnnamed109());
-  o.add(buildUnnamed109());
+  o.add(buildUnnamed918());
+  o.add(buildUnnamed918());
   return o;
 }
 
-checkUnnamed110(core.List<core.List<api.GeoJsonPosition>> o) {
+checkUnnamed919(core.List<core.List<api.GeoJsonPosition>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed109(o[0]);
-  checkUnnamed109(o[1]);
+  checkUnnamed918(o[0]);
+  checkUnnamed918(o[1]);
 }
 
 core.int buildCounterGeoJsonPolygon = 0;
@@ -770,7 +770,7 @@
   var o = new api.GeoJsonPolygon();
   buildCounterGeoJsonPolygon++;
   if (buildCounterGeoJsonPolygon < 3) {
-    o.coordinates = buildUnnamed110();
+    o.coordinates = buildUnnamed919();
   }
   buildCounterGeoJsonPolygon--;
   return o;
@@ -779,7 +779,7 @@
 checkGeoJsonPolygon(api.GeoJsonPolygon o) {
   buildCounterGeoJsonPolygon++;
   if (buildCounterGeoJsonPolygon < 3) {
-    checkUnnamed110(o.coordinates);
+    checkUnnamed919(o.coordinates);
   }
   buildCounterGeoJsonPolygon--;
 }
@@ -858,14 +858,14 @@
   buildCounterIconStyle--;
 }
 
-buildUnnamed111() {
+buildUnnamed920() {
   var o = new core.List<api.Icon>();
   o.add(buildIcon());
   o.add(buildIcon());
   return o;
 }
 
-checkUnnamed111(core.List<api.Icon> o) {
+checkUnnamed920(core.List<api.Icon> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIcon(o[0]);
   checkIcon(o[1]);
@@ -876,7 +876,7 @@
   var o = new api.IconsListResponse();
   buildCounterIconsListResponse++;
   if (buildCounterIconsListResponse < 3) {
-    o.icons = buildUnnamed111();
+    o.icons = buildUnnamed920();
     o.nextPageToken = "foo";
   }
   buildCounterIconsListResponse--;
@@ -886,7 +886,7 @@
 checkIconsListResponse(api.IconsListResponse o) {
   buildCounterIconsListResponse++;
   if (buildCounterIconsListResponse < 3) {
-    checkUnnamed111(o.icons);
+    checkUnnamed920(o.icons);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterIconsListResponse--;
@@ -936,14 +936,14 @@
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed112() {
+buildUnnamed921() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed112(core.List<core.double> o) {
+checkUnnamed921(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -954,7 +954,7 @@
   var o = new api.Layer();
   buildCounterLayer++;
   if (buildCounterLayer < 3) {
-    o.bbox = buildUnnamed112();
+    o.bbox = buildUnnamed921();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.datasourceType = "foo";
@@ -982,7 +982,7 @@
 checkLayer(api.Layer o) {
   buildCounterLayer++;
   if (buildCounterLayer < 3) {
-    checkUnnamed112(o.bbox);
+    checkUnnamed921(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.datasourceType, unittest.equals('foo'));
@@ -1006,14 +1006,14 @@
   buildCounterLayer--;
 }
 
-buildUnnamed113() {
+buildUnnamed922() {
   var o = new core.List<api.Layer>();
   o.add(buildLayer());
   o.add(buildLayer());
   return o;
 }
 
-checkUnnamed113(core.List<api.Layer> o) {
+checkUnnamed922(core.List<api.Layer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLayer(o[0]);
   checkLayer(o[1]);
@@ -1024,7 +1024,7 @@
   var o = new api.LayersListResponse();
   buildCounterLayersListResponse++;
   if (buildCounterLayersListResponse < 3) {
-    o.layers = buildUnnamed113();
+    o.layers = buildUnnamed922();
     o.nextPageToken = "foo";
   }
   buildCounterLayersListResponse--;
@@ -1034,20 +1034,20 @@
 checkLayersListResponse(api.LayersListResponse o) {
   buildCounterLayersListResponse++;
   if (buildCounterLayersListResponse < 3) {
-    checkUnnamed113(o.layers);
+    checkUnnamed922(o.layers);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterLayersListResponse--;
 }
 
-buildUnnamed114() {
+buildUnnamed923() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed114(core.List<core.double> o) {
+checkUnnamed923(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1082,7 +1082,7 @@
   buildCounterLineStyle++;
   if (buildCounterLineStyle < 3) {
     o.border = buildBorder();
-    o.dash = buildUnnamed114();
+    o.dash = buildUnnamed923();
     o.label = buildLabelStyle();
     o.stroke = buildLineStyleStroke();
   }
@@ -1094,34 +1094,34 @@
   buildCounterLineStyle++;
   if (buildCounterLineStyle < 3) {
     checkBorder(o.border);
-    checkUnnamed114(o.dash);
+    checkUnnamed923(o.dash);
     checkLabelStyle(o.label);
     checkLineStyleStroke(o.stroke);
   }
   buildCounterLineStyle--;
 }
 
-buildUnnamed115() {
+buildUnnamed924() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed115(core.List<core.double> o) {
+checkUnnamed924(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed116() {
+buildUnnamed925() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed116(core.List<core.String> o) {
+checkUnnamed925(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1132,7 +1132,7 @@
   var o = new api.Map();
   buildCounterMap++;
   if (buildCounterMap < 3) {
-    o.bbox = buildUnnamed115();
+    o.bbox = buildUnnamed924();
     o.contents = buildMapContents();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
@@ -1149,7 +1149,7 @@
     o.publishedAccessList = "foo";
     o.publishingStatus = "foo";
     o.tags = buildTags();
-    o.versions = buildUnnamed116();
+    o.versions = buildUnnamed925();
     o.writersCanEditPermissions = true;
   }
   buildCounterMap--;
@@ -1159,7 +1159,7 @@
 checkMap(api.Map o) {
   buildCounterMap++;
   if (buildCounterMap < 3) {
-    checkUnnamed115(o.bbox);
+    checkUnnamed924(o.bbox);
     checkMapContents(o.contents);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
@@ -1176,7 +1176,7 @@
     unittest.expect(o.publishedAccessList, unittest.equals('foo'));
     unittest.expect(o.publishingStatus, unittest.equals('foo'));
     checkTags(o.tags);
-    checkUnnamed116(o.versions);
+    checkUnnamed925(o.versions);
     unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterMap--;
@@ -1195,27 +1195,27 @@
   checkMapItem(o[1]);
 }
 
-buildUnnamed117() {
+buildUnnamed926() {
   var o = new core.List<api.MapItem>();
   o.add(buildMapItem());
   o.add(buildMapItem());
   return o;
 }
 
-checkUnnamed117(core.List<api.MapItem> o) {
+checkUnnamed926(core.List<api.MapItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMapItem(o[0]);
   checkMapItem(o[1]);
 }
 
-buildUnnamed118() {
+buildUnnamed927() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed118(core.List<core.double> o) {
+checkUnnamed927(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1226,8 +1226,8 @@
   var o = new api.MapFolder();
   buildCounterMapFolder++;
   if (buildCounterMapFolder < 3) {
-    o.contents = buildUnnamed117();
-    o.defaultViewport = buildUnnamed118();
+    o.contents = buildUnnamed926();
+    o.defaultViewport = buildUnnamed927();
     o.expandable = true;
     o.key = "foo";
     o.name = "foo";
@@ -1240,8 +1240,8 @@
 checkMapFolder(api.MapFolder o) {
   buildCounterMapFolder++;
   if (buildCounterMapFolder < 3) {
-    checkUnnamed117(o.contents);
-    checkUnnamed118(o.defaultViewport);
+    checkUnnamed926(o.contents);
+    checkUnnamed927(o.defaultViewport);
     unittest.expect(o.expandable, unittest.isTrue);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1258,8 +1258,8 @@
   checkMapFolder(api.MapFolder o) {
   buildCounterMapFolder++;
   if (buildCounterMapFolder < 3) {
-    checkUnnamed117(o.contents);
-    checkUnnamed118(o.defaultViewport);
+    checkUnnamed926(o.contents);
+    checkUnnamed927(o.defaultViewport);
     unittest.expect(o.expandable, unittest.isTrue);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1271,14 +1271,14 @@
 (o);
 }
 
-buildUnnamed119() {
+buildUnnamed928() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed119(core.List<core.double> o) {
+checkUnnamed928(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1289,7 +1289,7 @@
   var o = new api.MapKmlLink();
   buildCounterMapKmlLink++;
   if (buildCounterMapKmlLink < 3) {
-    o.defaultViewport = buildUnnamed119();
+    o.defaultViewport = buildUnnamed928();
     o.kmlUrl = "foo";
     o.name = "foo";
     o.visibility = "foo";
@@ -1301,7 +1301,7 @@
 checkMapKmlLink(api.MapKmlLink o) {
   buildCounterMapKmlLink++;
   if (buildCounterMapKmlLink < 3) {
-    checkUnnamed119(o.defaultViewport);
+    checkUnnamed928(o.defaultViewport);
     unittest.expect(o.kmlUrl, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.visibility, unittest.equals('foo'));
@@ -1309,14 +1309,14 @@
   buildCounterMapKmlLink--;
 }
 
-buildUnnamed120() {
+buildUnnamed929() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed120(core.List<core.double> o) {
+checkUnnamed929(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1327,7 +1327,7 @@
   var o = new api.MapLayer();
   buildCounterMapLayer++;
   if (buildCounterMapLayer < 3) {
-    o.defaultViewport = buildUnnamed120();
+    o.defaultViewport = buildUnnamed929();
     o.id = "foo";
     o.key = "foo";
     o.name = "foo";
@@ -1340,7 +1340,7 @@
 checkMapLayer(api.MapLayer o) {
   buildCounterMapLayer++;
   if (buildCounterMapLayer < 3) {
-    checkUnnamed120(o.defaultViewport);
+    checkUnnamed929(o.defaultViewport);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1349,14 +1349,14 @@
   buildCounterMapLayer--;
 }
 
-buildUnnamed121() {
+buildUnnamed930() {
   var o = new core.List<api.Map>();
   o.add(buildMap());
   o.add(buildMap());
   return o;
 }
 
-checkUnnamed121(core.List<api.Map> o) {
+checkUnnamed930(core.List<api.Map> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMap(o[0]);
   checkMap(o[1]);
@@ -1367,7 +1367,7 @@
   var o = new api.MapsListResponse();
   buildCounterMapsListResponse++;
   if (buildCounterMapsListResponse < 3) {
-    o.maps = buildUnnamed121();
+    o.maps = buildUnnamed930();
     o.nextPageToken = "foo";
   }
   buildCounterMapsListResponse--;
@@ -1377,7 +1377,7 @@
 checkMapsListResponse(api.MapsListResponse o) {
   buildCounterMapsListResponse++;
   if (buildCounterMapsListResponse < 3) {
-    checkUnnamed121(o.maps);
+    checkUnnamed930(o.maps);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMapsListResponse--;
@@ -1402,14 +1402,14 @@
   buildCounterParent--;
 }
 
-buildUnnamed122() {
+buildUnnamed931() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed122(core.List<api.Parent> o) {
+checkUnnamed931(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
@@ -1421,7 +1421,7 @@
   buildCounterParentsListResponse++;
   if (buildCounterParentsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.parents = buildUnnamed122();
+    o.parents = buildUnnamed931();
   }
   buildCounterParentsListResponse--;
   return o;
@@ -1431,7 +1431,7 @@
   buildCounterParentsListResponse++;
   if (buildCounterParentsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed122(o.parents);
+    checkUnnamed931(o.parents);
   }
   buildCounterParentsListResponse--;
 }
@@ -1461,14 +1461,14 @@
   buildCounterPermission--;
 }
 
-buildUnnamed123() {
+buildUnnamed932() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed123(core.List<core.String> o) {
+checkUnnamed932(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1479,7 +1479,7 @@
   var o = new api.PermissionsBatchDeleteRequest();
   buildCounterPermissionsBatchDeleteRequest++;
   if (buildCounterPermissionsBatchDeleteRequest < 3) {
-    o.ids = buildUnnamed123();
+    o.ids = buildUnnamed932();
   }
   buildCounterPermissionsBatchDeleteRequest--;
   return o;
@@ -1488,7 +1488,7 @@
 checkPermissionsBatchDeleteRequest(api.PermissionsBatchDeleteRequest o) {
   buildCounterPermissionsBatchDeleteRequest++;
   if (buildCounterPermissionsBatchDeleteRequest < 3) {
-    checkUnnamed123(o.ids);
+    checkUnnamed932(o.ids);
   }
   buildCounterPermissionsBatchDeleteRequest--;
 }
@@ -1510,14 +1510,14 @@
   buildCounterPermissionsBatchDeleteResponse--;
 }
 
-buildUnnamed124() {
+buildUnnamed933() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed124(core.List<api.Permission> o) {
+checkUnnamed933(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1528,7 +1528,7 @@
   var o = new api.PermissionsBatchUpdateRequest();
   buildCounterPermissionsBatchUpdateRequest++;
   if (buildCounterPermissionsBatchUpdateRequest < 3) {
-    o.permissions = buildUnnamed124();
+    o.permissions = buildUnnamed933();
   }
   buildCounterPermissionsBatchUpdateRequest--;
   return o;
@@ -1537,7 +1537,7 @@
 checkPermissionsBatchUpdateRequest(api.PermissionsBatchUpdateRequest o) {
   buildCounterPermissionsBatchUpdateRequest++;
   if (buildCounterPermissionsBatchUpdateRequest < 3) {
-    checkUnnamed124(o.permissions);
+    checkUnnamed933(o.permissions);
   }
   buildCounterPermissionsBatchUpdateRequest--;
 }
@@ -1559,14 +1559,14 @@
   buildCounterPermissionsBatchUpdateResponse--;
 }
 
-buildUnnamed125() {
+buildUnnamed934() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed125(core.List<api.Permission> o) {
+checkUnnamed934(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1577,7 +1577,7 @@
   var o = new api.PermissionsListResponse();
   buildCounterPermissionsListResponse++;
   if (buildCounterPermissionsListResponse < 3) {
-    o.permissions = buildUnnamed125();
+    o.permissions = buildUnnamed934();
   }
   buildCounterPermissionsListResponse--;
   return o;
@@ -1586,7 +1586,7 @@
 checkPermissionsListResponse(api.PermissionsListResponse o) {
   buildCounterPermissionsListResponse++;
   if (buildCounterPermissionsListResponse < 3) {
-    checkUnnamed125(o.permissions);
+    checkUnnamed934(o.permissions);
   }
   buildCounterPermissionsListResponse--;
 }
@@ -1673,14 +1673,14 @@
   buildCounterProject--;
 }
 
-buildUnnamed126() {
+buildUnnamed935() {
   var o = new core.List<api.Project>();
   o.add(buildProject());
   o.add(buildProject());
   return o;
 }
 
-checkUnnamed126(core.List<api.Project> o) {
+checkUnnamed935(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProject(o[0]);
   checkProject(o[1]);
@@ -1691,7 +1691,7 @@
   var o = new api.ProjectsListResponse();
   buildCounterProjectsListResponse++;
   if (buildCounterProjectsListResponse < 3) {
-    o.projects = buildUnnamed126();
+    o.projects = buildUnnamed935();
   }
   buildCounterProjectsListResponse--;
   return o;
@@ -1700,7 +1700,7 @@
 checkProjectsListResponse(api.ProjectsListResponse o) {
   buildCounterProjectsListResponse++;
   if (buildCounterProjectsListResponse < 3) {
-    checkUnnamed126(o.projects);
+    checkUnnamed935(o.projects);
   }
   buildCounterProjectsListResponse--;
 }
@@ -1749,14 +1749,14 @@
   buildCounterPublishedLayer--;
 }
 
-buildUnnamed127() {
+buildUnnamed936() {
   var o = new core.List<api.PublishedLayer>();
   o.add(buildPublishedLayer());
   o.add(buildPublishedLayer());
   return o;
 }
 
-checkUnnamed127(core.List<api.PublishedLayer> o) {
+checkUnnamed936(core.List<api.PublishedLayer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedLayer(o[0]);
   checkPublishedLayer(o[1]);
@@ -1767,7 +1767,7 @@
   var o = new api.PublishedLayersListResponse();
   buildCounterPublishedLayersListResponse++;
   if (buildCounterPublishedLayersListResponse < 3) {
-    o.layers = buildUnnamed127();
+    o.layers = buildUnnamed936();
     o.nextPageToken = "foo";
   }
   buildCounterPublishedLayersListResponse--;
@@ -1777,7 +1777,7 @@
 checkPublishedLayersListResponse(api.PublishedLayersListResponse o) {
   buildCounterPublishedLayersListResponse++;
   if (buildCounterPublishedLayersListResponse < 3) {
-    checkUnnamed127(o.layers);
+    checkUnnamed936(o.layers);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterPublishedLayersListResponse--;
@@ -1812,14 +1812,14 @@
   buildCounterPublishedMap--;
 }
 
-buildUnnamed128() {
+buildUnnamed937() {
   var o = new core.List<api.PublishedMap>();
   o.add(buildPublishedMap());
   o.add(buildPublishedMap());
   return o;
 }
 
-checkUnnamed128(core.List<api.PublishedMap> o) {
+checkUnnamed937(core.List<api.PublishedMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedMap(o[0]);
   checkPublishedMap(o[1]);
@@ -1830,7 +1830,7 @@
   var o = new api.PublishedMapsListResponse();
   buildCounterPublishedMapsListResponse++;
   if (buildCounterPublishedMapsListResponse < 3) {
-    o.maps = buildUnnamed128();
+    o.maps = buildUnnamed937();
     o.nextPageToken = "foo";
   }
   buildCounterPublishedMapsListResponse--;
@@ -1840,33 +1840,33 @@
 checkPublishedMapsListResponse(api.PublishedMapsListResponse o) {
   buildCounterPublishedMapsListResponse++;
   if (buildCounterPublishedMapsListResponse < 3) {
-    checkUnnamed128(o.maps);
+    checkUnnamed937(o.maps);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterPublishedMapsListResponse--;
 }
 
-buildUnnamed129() {
+buildUnnamed938() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed129(core.List<core.double> o) {
+checkUnnamed938(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed130() {
+buildUnnamed939() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed130(core.List<api.File> o) {
+checkUnnamed939(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -1879,13 +1879,13 @@
   if (buildCounterRaster < 3) {
     o.acquisitionTime = buildAcquisitionTime();
     o.attribution = "foo";
-    o.bbox = buildUnnamed129();
+    o.bbox = buildUnnamed938();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
     o.draftAccessList = "foo";
     o.etag = "foo";
-    o.files = buildUnnamed130();
+    o.files = buildUnnamed939();
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.lastModifierEmail = "foo";
@@ -1906,13 +1906,13 @@
   if (buildCounterRaster < 3) {
     checkAcquisitionTime(o.acquisitionTime);
     unittest.expect(o.attribution, unittest.equals('foo'));
-    checkUnnamed129(o.bbox);
+    checkUnnamed938(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.draftAccessList, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed130(o.files);
+    checkUnnamed939(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
@@ -1927,14 +1927,14 @@
   buildCounterRaster--;
 }
 
-buildUnnamed131() {
+buildUnnamed940() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed131(core.List<core.double> o) {
+checkUnnamed940(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1946,7 +1946,7 @@
   buildCounterRasterCollection++;
   if (buildCounterRasterCollection < 3) {
     o.attribution = "foo";
-    o.bbox = buildUnnamed131();
+    o.bbox = buildUnnamed940();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
@@ -1971,7 +1971,7 @@
   buildCounterRasterCollection++;
   if (buildCounterRasterCollection < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
-    checkUnnamed131(o.bbox);
+    checkUnnamed940(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -1991,14 +1991,14 @@
   buildCounterRasterCollection--;
 }
 
-buildUnnamed132() {
+buildUnnamed941() {
   var o = new core.List<api.RasterCollection>();
   o.add(buildRasterCollection());
   o.add(buildRasterCollection());
   return o;
 }
 
-checkUnnamed132(core.List<api.RasterCollection> o) {
+checkUnnamed941(core.List<api.RasterCollection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRasterCollection(o[0]);
   checkRasterCollection(o[1]);
@@ -2010,7 +2010,7 @@
   buildCounterRasterCollectionsListResponse++;
   if (buildCounterRasterCollectionsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasterCollections = buildUnnamed132();
+    o.rasterCollections = buildUnnamed941();
   }
   buildCounterRasterCollectionsListResponse--;
   return o;
@@ -2020,32 +2020,32 @@
   buildCounterRasterCollectionsListResponse++;
   if (buildCounterRasterCollectionsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed132(o.rasterCollections);
+    checkUnnamed941(o.rasterCollections);
   }
   buildCounterRasterCollectionsListResponse--;
 }
 
-buildUnnamed133() {
+buildUnnamed942() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed133(core.List<core.double> o) {
+checkUnnamed942(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed134() {
+buildUnnamed943() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed134(core.List<core.String> o) {
+checkUnnamed943(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2056,7 +2056,7 @@
   var o = new api.RasterCollectionsRaster();
   buildCounterRasterCollectionsRaster++;
   if (buildCounterRasterCollectionsRaster < 3) {
-    o.bbox = buildUnnamed133();
+    o.bbox = buildUnnamed942();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.description = "foo";
     o.id = "foo";
@@ -2064,7 +2064,7 @@
     o.name = "foo";
     o.projectId = "foo";
     o.rasterType = "foo";
-    o.tags = buildUnnamed134();
+    o.tags = buildUnnamed943();
   }
   buildCounterRasterCollectionsRaster--;
   return o;
@@ -2073,7 +2073,7 @@
 checkRasterCollectionsRaster(api.RasterCollectionsRaster o) {
   buildCounterRasterCollectionsRaster++;
   if (buildCounterRasterCollectionsRaster < 3) {
-    checkUnnamed133(o.bbox);
+    checkUnnamed942(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -2081,19 +2081,19 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.rasterType, unittest.equals('foo'));
-    checkUnnamed134(o.tags);
+    checkUnnamed943(o.tags);
   }
   buildCounterRasterCollectionsRaster--;
 }
 
-buildUnnamed135() {
+buildUnnamed944() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed135(core.List<core.String> o) {
+checkUnnamed944(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2104,7 +2104,7 @@
   var o = new api.RasterCollectionsRasterBatchDeleteRequest();
   buildCounterRasterCollectionsRasterBatchDeleteRequest++;
   if (buildCounterRasterCollectionsRasterBatchDeleteRequest < 3) {
-    o.ids = buildUnnamed135();
+    o.ids = buildUnnamed944();
   }
   buildCounterRasterCollectionsRasterBatchDeleteRequest--;
   return o;
@@ -2113,7 +2113,7 @@
 checkRasterCollectionsRasterBatchDeleteRequest(api.RasterCollectionsRasterBatchDeleteRequest o) {
   buildCounterRasterCollectionsRasterBatchDeleteRequest++;
   if (buildCounterRasterCollectionsRasterBatchDeleteRequest < 3) {
-    checkUnnamed135(o.ids);
+    checkUnnamed944(o.ids);
   }
   buildCounterRasterCollectionsRasterBatchDeleteRequest--;
 }
@@ -2135,14 +2135,14 @@
   buildCounterRasterCollectionsRastersBatchDeleteResponse--;
 }
 
-buildUnnamed136() {
+buildUnnamed945() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed136(core.List<core.String> o) {
+checkUnnamed945(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2153,7 +2153,7 @@
   var o = new api.RasterCollectionsRastersBatchInsertRequest();
   buildCounterRasterCollectionsRastersBatchInsertRequest++;
   if (buildCounterRasterCollectionsRastersBatchInsertRequest < 3) {
-    o.ids = buildUnnamed136();
+    o.ids = buildUnnamed945();
   }
   buildCounterRasterCollectionsRastersBatchInsertRequest--;
   return o;
@@ -2162,7 +2162,7 @@
 checkRasterCollectionsRastersBatchInsertRequest(api.RasterCollectionsRastersBatchInsertRequest o) {
   buildCounterRasterCollectionsRastersBatchInsertRequest++;
   if (buildCounterRasterCollectionsRastersBatchInsertRequest < 3) {
-    checkUnnamed136(o.ids);
+    checkUnnamed945(o.ids);
   }
   buildCounterRasterCollectionsRastersBatchInsertRequest--;
 }
@@ -2184,14 +2184,14 @@
   buildCounterRasterCollectionsRastersBatchInsertResponse--;
 }
 
-buildUnnamed137() {
+buildUnnamed946() {
   var o = new core.List<api.RasterCollectionsRaster>();
   o.add(buildRasterCollectionsRaster());
   o.add(buildRasterCollectionsRaster());
   return o;
 }
 
-checkUnnamed137(core.List<api.RasterCollectionsRaster> o) {
+checkUnnamed946(core.List<api.RasterCollectionsRaster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRasterCollectionsRaster(o[0]);
   checkRasterCollectionsRaster(o[1]);
@@ -2203,7 +2203,7 @@
   buildCounterRasterCollectionsRastersListResponse++;
   if (buildCounterRasterCollectionsRastersListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasters = buildUnnamed137();
+    o.rasters = buildUnnamed946();
   }
   buildCounterRasterCollectionsRastersListResponse--;
   return o;
@@ -2213,19 +2213,19 @@
   buildCounterRasterCollectionsRastersListResponse++;
   if (buildCounterRasterCollectionsRastersListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed137(o.rasters);
+    checkUnnamed946(o.rasters);
   }
   buildCounterRasterCollectionsRastersListResponse--;
 }
 
-buildUnnamed138() {
+buildUnnamed947() {
   var o = new core.List<api.Raster>();
   o.add(buildRaster());
   o.add(buildRaster());
   return o;
 }
 
-checkUnnamed138(core.List<api.Raster> o) {
+checkUnnamed947(core.List<api.Raster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRaster(o[0]);
   checkRaster(o[1]);
@@ -2237,7 +2237,7 @@
   buildCounterRastersListResponse++;
   if (buildCounterRastersListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasters = buildUnnamed138();
+    o.rasters = buildUnnamed947();
   }
   buildCounterRastersListResponse--;
   return o;
@@ -2247,7 +2247,7 @@
   buildCounterRastersListResponse++;
   if (buildCounterRastersListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed138(o.rasters);
+    checkUnnamed947(o.rasters);
   }
   buildCounterRastersListResponse--;
 }
@@ -2300,14 +2300,14 @@
   buildCounterScalingFunction--;
 }
 
-buildUnnamed139() {
+buildUnnamed948() {
   var o = new core.List<api.TableColumn>();
   o.add(buildTableColumn());
   o.add(buildTableColumn());
   return o;
 }
 
-checkUnnamed139(core.List<api.TableColumn> o) {
+checkUnnamed948(core.List<api.TableColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableColumn(o[0]);
   checkTableColumn(o[1]);
@@ -2318,7 +2318,7 @@
   var o = new api.Schema();
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
-    o.columns = buildUnnamed139();
+    o.columns = buildUnnamed948();
     o.primaryGeometry = "foo";
     o.primaryKey = "foo";
   }
@@ -2329,7 +2329,7 @@
 checkSchema(api.Schema o) {
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
-    checkUnnamed139(o.columns);
+    checkUnnamed948(o.columns);
     unittest.expect(o.primaryGeometry, unittest.equals('foo'));
     unittest.expect(o.primaryKey, unittest.equals('foo'));
   }
@@ -2357,27 +2357,27 @@
   buildCounterSizeRange--;
 }
 
-buildUnnamed140() {
+buildUnnamed949() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed140(core.List<core.double> o) {
+checkUnnamed949(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed141() {
+buildUnnamed950() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed141(core.List<api.File> o) {
+checkUnnamed950(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -2388,13 +2388,13 @@
   var o = new api.Table();
   buildCounterTable++;
   if (buildCounterTable < 3) {
-    o.bbox = buildUnnamed140();
+    o.bbox = buildUnnamed949();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
     o.draftAccessList = "foo";
     o.etag = "foo";
-    o.files = buildUnnamed141();
+    o.files = buildUnnamed950();
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.lastModifierEmail = "foo";
@@ -2414,13 +2414,13 @@
 checkTable(api.Table o) {
   buildCounterTable++;
   if (buildCounterTable < 3) {
-    checkUnnamed140(o.bbox);
+    checkUnnamed949(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.draftAccessList, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed141(o.files);
+    checkUnnamed950(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
@@ -2457,14 +2457,14 @@
   buildCounterTableColumn--;
 }
 
-buildUnnamed142() {
+buildUnnamed951() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed142(core.List<api.Table> o) {
+checkUnnamed951(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -2476,7 +2476,7 @@
   buildCounterTablesListResponse++;
   if (buildCounterTablesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.tables = buildUnnamed142();
+    o.tables = buildUnnamed951();
   }
   buildCounterTablesListResponse--;
   return o;
@@ -2486,7 +2486,7 @@
   buildCounterTablesListResponse++;
   if (buildCounterTablesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed142(o.tables);
+    checkUnnamed951(o.tables);
   }
   buildCounterTablesListResponse--;
 }
@@ -2525,14 +2525,14 @@
   buildCounterValueRange--;
 }
 
-buildUnnamed143() {
+buildUnnamed952() {
   var o = new core.List<api.DisplayRule>();
   o.add(buildDisplayRule());
   o.add(buildDisplayRule());
   return o;
 }
 
-checkUnnamed143(core.List<api.DisplayRule> o) {
+checkUnnamed952(core.List<api.DisplayRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisplayRule(o[0]);
   checkDisplayRule(o[1]);
@@ -2543,7 +2543,7 @@
   var o = new api.VectorStyle();
   buildCounterVectorStyle++;
   if (buildCounterVectorStyle < 3) {
-    o.displayRules = buildUnnamed143();
+    o.displayRules = buildUnnamed952();
     o.featureInfo = buildFeatureInfo();
     o.type = "foo";
   }
@@ -2554,7 +2554,7 @@
 checkVectorStyle(api.VectorStyle o) {
   buildCounterVectorStyle++;
   if (buildCounterVectorStyle < 3) {
-    checkUnnamed143(o.displayRules);
+    checkUnnamed952(o.displayRules);
     checkFeatureInfo(o.featureInfo);
     unittest.expect(o.type, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/mirror/v1_test.dart b/generated/googleapis/test/mirror/v1_test.dart
index 0bcdac0..f6d8552 100644
--- a/generated/googleapis/test/mirror/v1_test.dart
+++ b/generated/googleapis/test/mirror/v1_test.dart
@@ -16,40 +16,40 @@
 
 
 
-buildUnnamed761() {
+buildUnnamed953() {
   var o = new core.List<api.AuthToken>();
   o.add(buildAuthToken());
   o.add(buildAuthToken());
   return o;
 }
 
-checkUnnamed761(core.List<api.AuthToken> o) {
+checkUnnamed953(core.List<api.AuthToken> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthToken(o[0]);
   checkAuthToken(o[1]);
 }
 
-buildUnnamed762() {
+buildUnnamed954() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed762(core.List<core.String> o) {
+checkUnnamed954(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed763() {
+buildUnnamed955() {
   var o = new core.List<api.UserData>();
   o.add(buildUserData());
   o.add(buildUserData());
   return o;
 }
 
-checkUnnamed763(core.List<api.UserData> o) {
+checkUnnamed955(core.List<api.UserData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserData(o[0]);
   checkUserData(o[1]);
@@ -60,10 +60,10 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.authTokens = buildUnnamed761();
-    o.features = buildUnnamed762();
+    o.authTokens = buildUnnamed953();
+    o.features = buildUnnamed954();
     o.password = "foo";
-    o.userData = buildUnnamed763();
+    o.userData = buildUnnamed955();
   }
   buildCounterAccount--;
   return o;
@@ -72,10 +72,10 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed761(o.authTokens);
-    checkUnnamed762(o.features);
+    checkUnnamed953(o.authTokens);
+    checkUnnamed954(o.features);
     unittest.expect(o.password, unittest.equals('foo'));
-    checkUnnamed763(o.userData);
+    checkUnnamed955(o.userData);
   }
   buildCounterAccount--;
 }
@@ -105,14 +105,14 @@
   buildCounterAttachment--;
 }
 
-buildUnnamed764() {
+buildUnnamed956() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed764(core.List<api.Attachment> o) {
+checkUnnamed956(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
@@ -123,7 +123,7 @@
   var o = new api.AttachmentsListResponse();
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    o.items = buildUnnamed764();
+    o.items = buildUnnamed956();
     o.kind = "foo";
   }
   buildCounterAttachmentsListResponse--;
@@ -133,7 +133,7 @@
 checkAttachmentsListResponse(api.AttachmentsListResponse o) {
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    checkUnnamed764(o.items);
+    checkUnnamed956(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAttachmentsListResponse--;
@@ -179,53 +179,53 @@
   buildCounterCommand--;
 }
 
-buildUnnamed765() {
+buildUnnamed957() {
   var o = new core.List<api.Command>();
   o.add(buildCommand());
   o.add(buildCommand());
   return o;
 }
 
-checkUnnamed765(core.List<api.Command> o) {
+checkUnnamed957(core.List<api.Command> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommand(o[0]);
   checkCommand(o[1]);
 }
 
-buildUnnamed766() {
+buildUnnamed958() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed766(core.List<core.String> o) {
+checkUnnamed958(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed767() {
+buildUnnamed959() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed767(core.List<core.String> o) {
+checkUnnamed959(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed768() {
+buildUnnamed960() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed768(core.List<core.String> o) {
+checkUnnamed960(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -236,15 +236,15 @@
   var o = new api.Contact();
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    o.acceptCommands = buildUnnamed765();
-    o.acceptTypes = buildUnnamed766();
+    o.acceptCommands = buildUnnamed957();
+    o.acceptTypes = buildUnnamed958();
     o.displayName = "foo";
     o.id = "foo";
-    o.imageUrls = buildUnnamed767();
+    o.imageUrls = buildUnnamed959();
     o.kind = "foo";
     o.phoneNumber = "foo";
     o.priority = 42;
-    o.sharingFeatures = buildUnnamed768();
+    o.sharingFeatures = buildUnnamed960();
     o.source = "foo";
     o.speakableName = "foo";
     o.type = "foo";
@@ -256,15 +256,15 @@
 checkContact(api.Contact o) {
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    checkUnnamed765(o.acceptCommands);
-    checkUnnamed766(o.acceptTypes);
+    checkUnnamed957(o.acceptCommands);
+    checkUnnamed958(o.acceptTypes);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed767(o.imageUrls);
+    checkUnnamed959(o.imageUrls);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
-    checkUnnamed768(o.sharingFeatures);
+    checkUnnamed960(o.sharingFeatures);
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.speakableName, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -272,14 +272,14 @@
   buildCounterContact--;
 }
 
-buildUnnamed769() {
+buildUnnamed961() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed769(core.List<api.Contact> o) {
+checkUnnamed961(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -290,7 +290,7 @@
   var o = new api.ContactsListResponse();
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    o.items = buildUnnamed769();
+    o.items = buildUnnamed961();
     o.kind = "foo";
   }
   buildCounterContactsListResponse--;
@@ -300,7 +300,7 @@
 checkContactsListResponse(api.ContactsListResponse o) {
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    checkUnnamed769(o.items);
+    checkUnnamed961(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterContactsListResponse--;
@@ -339,14 +339,14 @@
   buildCounterLocation--;
 }
 
-buildUnnamed770() {
+buildUnnamed962() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed770(core.List<api.Location> o) {
+checkUnnamed962(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -357,7 +357,7 @@
   var o = new api.LocationsListResponse();
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    o.items = buildUnnamed770();
+    o.items = buildUnnamed962();
     o.kind = "foo";
   }
   buildCounterLocationsListResponse--;
@@ -367,20 +367,20 @@
 checkLocationsListResponse(api.LocationsListResponse o) {
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    checkUnnamed770(o.items);
+    checkUnnamed962(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterLocationsListResponse--;
 }
 
-buildUnnamed771() {
+buildUnnamed963() {
   var o = new core.List<api.MenuValue>();
   o.add(buildMenuValue());
   o.add(buildMenuValue());
   return o;
 }
 
-checkUnnamed771(core.List<api.MenuValue> o) {
+checkUnnamed963(core.List<api.MenuValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuValue(o[0]);
   checkMenuValue(o[1]);
@@ -396,7 +396,7 @@
     o.id = "foo";
     o.payload = "foo";
     o.removeWhenSelected = true;
-    o.values = buildUnnamed771();
+    o.values = buildUnnamed963();
   }
   buildCounterMenuItem--;
   return o;
@@ -410,7 +410,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.payload, unittest.equals('foo'));
     unittest.expect(o.removeWhenSelected, unittest.isTrue);
-    checkUnnamed771(o.values);
+    checkUnnamed963(o.values);
   }
   buildCounterMenuItem--;
 }
@@ -438,14 +438,14 @@
   buildCounterMenuValue--;
 }
 
-buildUnnamed772() {
+buildUnnamed964() {
   var o = new core.List<api.UserAction>();
   o.add(buildUserAction());
   o.add(buildUserAction());
   return o;
 }
 
-checkUnnamed772(core.List<api.UserAction> o) {
+checkUnnamed964(core.List<api.UserAction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserAction(o[0]);
   checkUserAction(o[1]);
@@ -459,7 +459,7 @@
     o.collection = "foo";
     o.itemId = "foo";
     o.operation = "foo";
-    o.userActions = buildUnnamed772();
+    o.userActions = buildUnnamed964();
     o.userToken = "foo";
     o.verifyToken = "foo";
   }
@@ -473,7 +473,7 @@
     unittest.expect(o.collection, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
     unittest.expect(o.operation, unittest.equals('foo'));
-    checkUnnamed772(o.userActions);
+    checkUnnamed964(o.userActions);
     unittest.expect(o.userToken, unittest.equals('foo'));
     unittest.expect(o.verifyToken, unittest.equals('foo'));
   }
@@ -524,14 +524,14 @@
   buildCounterSetting--;
 }
 
-buildUnnamed773() {
+buildUnnamed965() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed773(core.List<core.String> o) {
+checkUnnamed965(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -547,7 +547,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.notification = buildNotification();
-    o.operation = buildUnnamed773();
+    o.operation = buildUnnamed965();
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.userToken = "foo";
     o.verifyToken = "foo";
@@ -564,7 +564,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNotification(o.notification);
-    checkUnnamed773(o.operation);
+    checkUnnamed965(o.operation);
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.userToken, unittest.equals('foo'));
     unittest.expect(o.verifyToken, unittest.equals('foo'));
@@ -572,14 +572,14 @@
   buildCounterSubscription--;
 }
 
-buildUnnamed774() {
+buildUnnamed966() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed774(core.List<api.Subscription> o) {
+checkUnnamed966(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -590,7 +590,7 @@
   var o = new api.SubscriptionsListResponse();
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    o.items = buildUnnamed774();
+    o.items = buildUnnamed966();
     o.kind = "foo";
   }
   buildCounterSubscriptionsListResponse--;
@@ -600,46 +600,46 @@
 checkSubscriptionsListResponse(api.SubscriptionsListResponse o) {
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    checkUnnamed774(o.items);
+    checkUnnamed966(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSubscriptionsListResponse--;
 }
 
-buildUnnamed775() {
+buildUnnamed967() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed775(core.List<api.Attachment> o) {
+checkUnnamed967(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
 }
 
-buildUnnamed776() {
+buildUnnamed968() {
   var o = new core.List<api.MenuItem>();
   o.add(buildMenuItem());
   o.add(buildMenuItem());
   return o;
 }
 
-checkUnnamed776(core.List<api.MenuItem> o) {
+checkUnnamed968(core.List<api.MenuItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuItem(o[0]);
   checkMenuItem(o[1]);
 }
 
-buildUnnamed777() {
+buildUnnamed969() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed777(core.List<api.Contact> o) {
+checkUnnamed969(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -650,7 +650,7 @@
   var o = new api.TimelineItem();
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    o.attachments = buildUnnamed775();
+    o.attachments = buildUnnamed967();
     o.bundleId = "foo";
     o.canonicalUrl = "foo";
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
@@ -665,10 +665,10 @@
     o.isPinned = true;
     o.kind = "foo";
     o.location = buildLocation();
-    o.menuItems = buildUnnamed776();
+    o.menuItems = buildUnnamed968();
     o.notification = buildNotificationConfig();
     o.pinScore = 42;
-    o.recipients = buildUnnamed777();
+    o.recipients = buildUnnamed969();
     o.selfLink = "foo";
     o.sourceItemId = "foo";
     o.speakableText = "foo";
@@ -684,7 +684,7 @@
 checkTimelineItem(api.TimelineItem o) {
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    checkUnnamed775(o.attachments);
+    checkUnnamed967(o.attachments);
     unittest.expect(o.bundleId, unittest.equals('foo'));
     unittest.expect(o.canonicalUrl, unittest.equals('foo'));
     unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -699,10 +699,10 @@
     unittest.expect(o.isPinned, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLocation(o.location);
-    checkUnnamed776(o.menuItems);
+    checkUnnamed968(o.menuItems);
     checkNotificationConfig(o.notification);
     unittest.expect(o.pinScore, unittest.equals(42));
-    checkUnnamed777(o.recipients);
+    checkUnnamed969(o.recipients);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sourceItemId, unittest.equals('foo'));
     unittest.expect(o.speakableText, unittest.equals('foo'));
@@ -714,14 +714,14 @@
   buildCounterTimelineItem--;
 }
 
-buildUnnamed778() {
+buildUnnamed970() {
   var o = new core.List<api.TimelineItem>();
   o.add(buildTimelineItem());
   o.add(buildTimelineItem());
   return o;
 }
 
-checkUnnamed778(core.List<api.TimelineItem> o) {
+checkUnnamed970(core.List<api.TimelineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimelineItem(o[0]);
   checkTimelineItem(o[1]);
@@ -732,7 +732,7 @@
   var o = new api.TimelineListResponse();
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    o.items = buildUnnamed778();
+    o.items = buildUnnamed970();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -743,7 +743,7 @@
 checkTimelineListResponse(api.TimelineListResponse o) {
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    checkUnnamed778(o.items);
+    checkUnnamed970(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/pagespeedonline/v1_test.dart b/generated/googleapis/test/pagespeedonline/v1_test.dart
index 5e20c13..04ad980 100644
--- a/generated/googleapis/test/pagespeedonline/v1_test.dart
+++ b/generated/googleapis/test/pagespeedonline/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs--;
 }
 
-buildUnnamed1074() {
+buildUnnamed971() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs());
   return o;
 }
 
-checkUnnamed1074(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs> o) {
+checkUnnamed971(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs(o[1]);
@@ -55,7 +55,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksHeader();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader < 3) {
-    o.args = buildUnnamed1074();
+    o.args = buildUnnamed971();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader--;
@@ -65,7 +65,7 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksHeader(api.ResultFormattedResultsRuleResultsValueUrlBlocksHeader o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader < 3) {
-    checkUnnamed1074(o.args);
+    checkUnnamed971(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader--;
@@ -92,14 +92,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs--;
 }
 
-buildUnnamed1075() {
+buildUnnamed972() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs());
   return o;
 }
 
-checkUnnamed1075(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs> o) {
+checkUnnamed972(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs(o[1]);
@@ -110,7 +110,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails < 3) {
-    o.args = buildUnnamed1075();
+    o.args = buildUnnamed972();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails--;
@@ -120,20 +120,20 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails < 3) {
-    checkUnnamed1075(o.args);
+    checkUnnamed972(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails--;
 }
 
-buildUnnamed1076() {
+buildUnnamed973() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails());
   return o;
 }
 
-checkUnnamed1076(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails> o) {
+checkUnnamed973(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(o[1]);
@@ -160,14 +160,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs--;
 }
 
-buildUnnamed1077() {
+buildUnnamed974() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs());
   return o;
 }
 
-checkUnnamed1077(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs> o) {
+checkUnnamed974(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs(o[1]);
@@ -178,7 +178,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult < 3) {
-    o.args = buildUnnamed1077();
+    o.args = buildUnnamed974();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult--;
@@ -188,7 +188,7 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult < 3) {
-    checkUnnamed1077(o.args);
+    checkUnnamed974(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult--;
@@ -199,7 +199,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    o.details = buildUnnamed1076();
+    o.details = buildUnnamed973();
     o.result = buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
@@ -209,20 +209,20 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    checkUnnamed1076(o.details);
+    checkUnnamed973(o.details);
     checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult(o.result);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
 }
 
-buildUnnamed1078() {
+buildUnnamed975() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrls());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrls());
   return o;
 }
 
-checkUnnamed1078(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls> o) {
+checkUnnamed975(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(o[1]);
@@ -234,7 +234,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     o.header = buildResultFormattedResultsRuleResultsValueUrlBlocksHeader();
-    o.urls = buildUnnamed1078();
+    o.urls = buildUnnamed975();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
   return o;
@@ -244,19 +244,19 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     checkResultFormattedResultsRuleResultsValueUrlBlocksHeader(o.header);
-    checkUnnamed1078(o.urls);
+    checkUnnamed975(o.urls);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
 }
 
-buildUnnamed1079() {
+buildUnnamed976() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   return o;
 }
 
-checkUnnamed1079(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks> o) {
+checkUnnamed976(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocks(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocks(o[1]);
@@ -269,7 +269,7 @@
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
     o.localizedRuleName = "foo";
     o.ruleImpact = 42.0;
-    o.urlBlocks = buildUnnamed1079();
+    o.urlBlocks = buildUnnamed976();
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
   return o;
@@ -280,19 +280,19 @@
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
     unittest.expect(o.localizedRuleName, unittest.equals('foo'));
     unittest.expect(o.ruleImpact, unittest.equals(42.0));
-    checkUnnamed1079(o.urlBlocks);
+    checkUnnamed976(o.urlBlocks);
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
 }
 
-buildUnnamed1080() {
+buildUnnamed977() {
   var o = new core.Map<core.String, api.ResultFormattedResultsRuleResultsValue>();
   o["x"] = buildResultFormattedResultsRuleResultsValue();
   o["y"] = buildResultFormattedResultsRuleResultsValue();
   return o;
 }
 
-checkUnnamed1080(core.Map<core.String, api.ResultFormattedResultsRuleResultsValue> o) {
+checkUnnamed977(core.Map<core.String, api.ResultFormattedResultsRuleResultsValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValue(o["x"]);
   checkResultFormattedResultsRuleResultsValue(o["y"]);
@@ -304,7 +304,7 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     o.locale = "foo";
-    o.ruleResults = buildUnnamed1080();
+    o.ruleResults = buildUnnamed977();
   }
   buildCounterResultFormattedResults--;
   return o;
@@ -314,19 +314,19 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     unittest.expect(o.locale, unittest.equals('foo'));
-    checkUnnamed1080(o.ruleResults);
+    checkUnnamed977(o.ruleResults);
   }
   buildCounterResultFormattedResults--;
 }
 
-buildUnnamed1081() {
+buildUnnamed978() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1081(core.List<core.String> o) {
+checkUnnamed978(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -428,7 +428,7 @@
   if (buildCounterResult < 3) {
     o.formattedResults = buildResultFormattedResults();
     o.id = "foo";
-    o.invalidRules = buildUnnamed1081();
+    o.invalidRules = buildUnnamed978();
     o.kind = "foo";
     o.pageStats = buildResultPageStats();
     o.responseCode = 42;
@@ -446,7 +446,7 @@
   if (buildCounterResult < 3) {
     checkResultFormattedResults(o.formattedResults);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1081(o.invalidRules);
+    checkUnnamed978(o.invalidRules);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkResultPageStats(o.pageStats);
     unittest.expect(o.responseCode, unittest.equals(42));
@@ -458,14 +458,14 @@
   buildCounterResult--;
 }
 
-buildUnnamed1082() {
+buildUnnamed979() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1082(core.List<core.String> o) {
+checkUnnamed979(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -607,7 +607,7 @@
       var arg_url = "foo";
       var arg_filterThirdPartyResources = true;
       var arg_locale = "foo";
-      var arg_rule = buildUnnamed1082();
+      var arg_rule = buildUnnamed979();
       var arg_screenshot = true;
       var arg_strategy = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/plus/v1_test.dart b/generated/googleapis/test/plus/v1_test.dart
index 3b3f246..559d65b 100644
--- a/generated/googleapis/test/plus/v1_test.dart
+++ b/generated/googleapis/test/plus/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed144() {
+buildUnnamed980() {
   var o = new core.List<api.PlusAclentryResource>();
   o.add(buildPlusAclentryResource());
   o.add(buildPlusAclentryResource());
   return o;
 }
 
-checkUnnamed144(core.List<api.PlusAclentryResource> o) {
+checkUnnamed980(core.List<api.PlusAclentryResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlusAclentryResource(o[0]);
   checkPlusAclentryResource(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.description = "foo";
-    o.items = buildUnnamed144();
+    o.items = buildUnnamed980();
     o.kind = "foo";
   }
   buildCounterAcl--;
@@ -46,7 +46,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed144(o.items);
+    checkUnnamed980(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAcl--;
@@ -282,14 +282,14 @@
   buildCounterActivityObjectAttachmentsThumbnails--;
 }
 
-buildUnnamed145() {
+buildUnnamed981() {
   var o = new core.List<api.ActivityObjectAttachmentsThumbnails>();
   o.add(buildActivityObjectAttachmentsThumbnails());
   o.add(buildActivityObjectAttachmentsThumbnails());
   return o;
 }
 
-checkUnnamed145(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
+checkUnnamed981(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsThumbnails(o[0]);
   checkActivityObjectAttachmentsThumbnails(o[1]);
@@ -307,7 +307,7 @@
     o.id = "foo";
     o.image = buildActivityObjectAttachmentsImage();
     o.objectType = "foo";
-    o.thumbnails = buildUnnamed145();
+    o.thumbnails = buildUnnamed981();
     o.url = "foo";
   }
   buildCounterActivityObjectAttachments--;
@@ -324,20 +324,20 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkActivityObjectAttachmentsImage(o.image);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed145(o.thumbnails);
+    checkUnnamed981(o.thumbnails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterActivityObjectAttachments--;
 }
 
-buildUnnamed146() {
+buildUnnamed982() {
   var o = new core.List<api.ActivityObjectAttachments>();
   o.add(buildActivityObjectAttachments());
   o.add(buildActivityObjectAttachments());
   return o;
 }
 
-checkUnnamed146(core.List<api.ActivityObjectAttachments> o) {
+checkUnnamed982(core.List<api.ActivityObjectAttachments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachments(o[0]);
   checkActivityObjectAttachments(o[1]);
@@ -412,7 +412,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.actor = buildActivityObjectActor();
-    o.attachments = buildUnnamed146();
+    o.attachments = buildUnnamed982();
     o.content = "foo";
     o.id = "foo";
     o.objectType = "foo";
@@ -430,7 +430,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     checkActivityObjectActor(o.actor);
-    checkUnnamed146(o.attachments);
+    checkUnnamed982(o.attachments);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
@@ -519,14 +519,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed147() {
+buildUnnamed983() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed147(core.List<api.Activity> o) {
+checkUnnamed983(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -539,7 +539,7 @@
   if (buildCounterActivityFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed147();
+    o.items = buildUnnamed983();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -556,7 +556,7 @@
   if (buildCounterActivityFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed147(o.items);
+    checkUnnamed983(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -632,14 +632,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed148() {
+buildUnnamed984() {
   var o = new core.List<api.CommentInReplyTo>();
   o.add(buildCommentInReplyTo());
   o.add(buildCommentInReplyTo());
   return o;
 }
 
-checkUnnamed148(core.List<api.CommentInReplyTo> o) {
+checkUnnamed984(core.List<api.CommentInReplyTo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentInReplyTo(o[0]);
   checkCommentInReplyTo(o[1]);
@@ -695,7 +695,7 @@
     o.actor = buildCommentActor();
     o.etag = "foo";
     o.id = "foo";
-    o.inReplyTo = buildUnnamed148();
+    o.inReplyTo = buildUnnamed984();
     o.kind = "foo";
     o.object = buildCommentObject();
     o.plusoners = buildCommentPlusoners();
@@ -714,7 +714,7 @@
     checkCommentActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed148(o.inReplyTo);
+    checkUnnamed984(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCommentObject(o.object);
     checkCommentPlusoners(o.plusoners);
@@ -726,14 +726,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed149() {
+buildUnnamed985() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed149(core.List<api.Comment> o) {
+checkUnnamed985(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -746,7 +746,7 @@
   if (buildCounterCommentFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed149();
+    o.items = buildUnnamed985();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -762,7 +762,7 @@
   if (buildCounterCommentFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed149(o.items);
+    checkUnnamed985(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -772,79 +772,79 @@
   buildCounterCommentFeed--;
 }
 
-buildUnnamed150() {
+buildUnnamed986() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed150(core.List<core.String> o) {
+checkUnnamed986(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed151() {
+buildUnnamed987() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed151(core.List<api.ItemScope> o) {
+checkUnnamed987(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed152() {
+buildUnnamed988() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed152(core.List<api.ItemScope> o) {
+checkUnnamed988(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed153() {
+buildUnnamed989() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed153(core.List<api.ItemScope> o) {
+checkUnnamed989(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed154() {
+buildUnnamed990() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed154(core.List<api.ItemScope> o) {
+checkUnnamed990(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed155() {
+buildUnnamed991() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed155(core.List<api.ItemScope> o) {
+checkUnnamed991(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
@@ -856,23 +856,23 @@
   buildCounterItemScope++;
   if (buildCounterItemScope < 3) {
     o.about = buildItemScope();
-    o.additionalName = buildUnnamed150();
+    o.additionalName = buildUnnamed986();
     o.address = buildItemScope();
     o.addressCountry = "foo";
     o.addressLocality = "foo";
     o.addressRegion = "foo";
-    o.associatedMedia = buildUnnamed151();
+    o.associatedMedia = buildUnnamed987();
     o.attendeeCount = 42;
-    o.attendees = buildUnnamed152();
+    o.attendees = buildUnnamed988();
     o.audio = buildItemScope();
-    o.author = buildUnnamed153();
+    o.author = buildUnnamed989();
     o.bestRating = "foo";
     o.birthDate = "foo";
     o.byArtist = buildItemScope();
     o.caption = "foo";
     o.contentSize = "foo";
     o.contentUrl = "foo";
-    o.contributor = buildUnnamed154();
+    o.contributor = buildUnnamed990();
     o.dateCreated = "foo";
     o.dateModified = "foo";
     o.datePublished = "foo";
@@ -894,7 +894,7 @@
     o.longitude = 42.0;
     o.name = "foo";
     o.partOfTVSeries = buildItemScope();
-    o.performers = buildUnnamed155();
+    o.performers = buildUnnamed991();
     o.playerType = "foo";
     o.postOfficeBoxNumber = "foo";
     o.postalCode = "foo";
@@ -919,23 +919,23 @@
   buildCounterItemScope++;
   if (buildCounterItemScope < 3) {
     checkItemScope(o.about);
-    checkUnnamed150(o.additionalName);
+    checkUnnamed986(o.additionalName);
     checkItemScope(o.address);
     unittest.expect(o.addressCountry, unittest.equals('foo'));
     unittest.expect(o.addressLocality, unittest.equals('foo'));
     unittest.expect(o.addressRegion, unittest.equals('foo'));
-    checkUnnamed151(o.associatedMedia);
+    checkUnnamed987(o.associatedMedia);
     unittest.expect(o.attendeeCount, unittest.equals(42));
-    checkUnnamed152(o.attendees);
+    checkUnnamed988(o.attendees);
     checkItemScope(o.audio);
-    checkUnnamed153(o.author);
+    checkUnnamed989(o.author);
     unittest.expect(o.bestRating, unittest.equals('foo'));
     unittest.expect(o.birthDate, unittest.equals('foo'));
     checkItemScope(o.byArtist);
     unittest.expect(o.caption, unittest.equals('foo'));
     unittest.expect(o.contentSize, unittest.equals('foo'));
     unittest.expect(o.contentUrl, unittest.equals('foo'));
-    checkUnnamed154(o.contributor);
+    checkUnnamed990(o.contributor);
     unittest.expect(o.dateCreated, unittest.equals('foo'));
     unittest.expect(o.dateModified, unittest.equals('foo'));
     unittest.expect(o.datePublished, unittest.equals('foo'));
@@ -957,7 +957,7 @@
     unittest.expect(o.longitude, unittest.equals(42.0));
     unittest.expect(o.name, unittest.equals('foo'));
     checkItemScope(o.partOfTVSeries);
-    checkUnnamed155(o.performers);
+    checkUnnamed991(o.performers);
     unittest.expect(o.playerType, unittest.equals('foo'));
     unittest.expect(o.postOfficeBoxNumber, unittest.equals('foo'));
     unittest.expect(o.postalCode, unittest.equals('foo'));
@@ -1008,14 +1008,14 @@
   buildCounterMoment--;
 }
 
-buildUnnamed156() {
+buildUnnamed992() {
   var o = new core.List<api.Moment>();
   o.add(buildMoment());
   o.add(buildMoment());
   return o;
 }
 
-checkUnnamed156(core.List<api.Moment> o) {
+checkUnnamed992(core.List<api.Moment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMoment(o[0]);
   checkMoment(o[1]);
@@ -1027,7 +1027,7 @@
   buildCounterMomentsFeed++;
   if (buildCounterMomentsFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed156();
+    o.items = buildUnnamed992();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1043,7 +1043,7 @@
   buildCounterMomentsFeed++;
   if (buildCounterMomentsFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed156(o.items);
+    checkUnnamed992(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1054,14 +1054,14 @@
   buildCounterMomentsFeed--;
 }
 
-buildUnnamed157() {
+buildUnnamed993() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed157(core.List<api.Person> o) {
+checkUnnamed993(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -1073,7 +1073,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed157();
+    o.items = buildUnnamed993();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1088,7 +1088,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed157(o.items);
+    checkUnnamed993(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1207,14 +1207,14 @@
   buildCounterPersonEmails--;
 }
 
-buildUnnamed158() {
+buildUnnamed994() {
   var o = new core.List<api.PersonEmails>();
   o.add(buildPersonEmails());
   o.add(buildPersonEmails());
   return o;
 }
 
-checkUnnamed158(core.List<api.PersonEmails> o) {
+checkUnnamed994(core.List<api.PersonEmails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonEmails(o[0]);
   checkPersonEmails(o[1]);
@@ -1305,14 +1305,14 @@
   buildCounterPersonOrganizations--;
 }
 
-buildUnnamed159() {
+buildUnnamed995() {
   var o = new core.List<api.PersonOrganizations>();
   o.add(buildPersonOrganizations());
   o.add(buildPersonOrganizations());
   return o;
 }
 
-checkUnnamed159(core.List<api.PersonOrganizations> o) {
+checkUnnamed995(core.List<api.PersonOrganizations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonOrganizations(o[0]);
   checkPersonOrganizations(o[1]);
@@ -1339,14 +1339,14 @@
   buildCounterPersonPlacesLived--;
 }
 
-buildUnnamed160() {
+buildUnnamed996() {
   var o = new core.List<api.PersonPlacesLived>();
   o.add(buildPersonPlacesLived());
   o.add(buildPersonPlacesLived());
   return o;
 }
 
-checkUnnamed160(core.List<api.PersonPlacesLived> o) {
+checkUnnamed996(core.List<api.PersonPlacesLived> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonPlacesLived(o[0]);
   checkPersonPlacesLived(o[1]);
@@ -1375,14 +1375,14 @@
   buildCounterPersonUrls--;
 }
 
-buildUnnamed161() {
+buildUnnamed997() {
   var o = new core.List<api.PersonUrls>();
   o.add(buildPersonUrls());
   o.add(buildPersonUrls());
   return o;
 }
 
-checkUnnamed161(core.List<api.PersonUrls> o) {
+checkUnnamed997(core.List<api.PersonUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonUrls(o[0]);
   checkPersonUrls(o[1]);
@@ -1402,7 +1402,7 @@
     o.currentLocation = "foo";
     o.displayName = "foo";
     o.domain = "foo";
-    o.emails = buildUnnamed158();
+    o.emails = buildUnnamed994();
     o.etag = "foo";
     o.gender = "foo";
     o.id = "foo";
@@ -1414,14 +1414,14 @@
     o.nickname = "foo";
     o.objectType = "foo";
     o.occupation = "foo";
-    o.organizations = buildUnnamed159();
-    o.placesLived = buildUnnamed160();
+    o.organizations = buildUnnamed995();
+    o.placesLived = buildUnnamed996();
     o.plusOneCount = 42;
     o.relationshipStatus = "foo";
     o.skills = "foo";
     o.tagline = "foo";
     o.url = "foo";
-    o.urls = buildUnnamed161();
+    o.urls = buildUnnamed997();
     o.verified = true;
   }
   buildCounterPerson--;
@@ -1440,7 +1440,7 @@
     unittest.expect(o.currentLocation, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkUnnamed158(o.emails);
+    checkUnnamed994(o.emails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1452,14 +1452,14 @@
     unittest.expect(o.nickname, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.occupation, unittest.equals('foo'));
-    checkUnnamed159(o.organizations);
-    checkUnnamed160(o.placesLived);
+    checkUnnamed995(o.organizations);
+    checkUnnamed996(o.placesLived);
     unittest.expect(o.plusOneCount, unittest.equals(42));
     unittest.expect(o.relationshipStatus, unittest.equals('foo'));
     unittest.expect(o.skills, unittest.equals('foo'));
     unittest.expect(o.tagline, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
-    checkUnnamed161(o.urls);
+    checkUnnamed997(o.urls);
     unittest.expect(o.verified, unittest.isTrue);
   }
   buildCounterPerson--;
diff --git a/generated/googleapis/test/plusdomains/v1_test.dart b/generated/googleapis/test/plusdomains/v1_test.dart
index a798048..ab73c91 100644
--- a/generated/googleapis/test/plusdomains/v1_test.dart
+++ b/generated/googleapis/test/plusdomains/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed655() {
+buildUnnamed998() {
   var o = new core.List<api.PlusDomainsAclentryResource>();
   o.add(buildPlusDomainsAclentryResource());
   o.add(buildPlusDomainsAclentryResource());
   return o;
 }
 
-checkUnnamed655(core.List<api.PlusDomainsAclentryResource> o) {
+checkUnnamed998(core.List<api.PlusDomainsAclentryResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlusDomainsAclentryResource(o[0]);
   checkPlusDomainsAclentryResource(o[1]);
@@ -36,7 +36,7 @@
   if (buildCounterAcl < 3) {
     o.description = "foo";
     o.domainRestricted = true;
-    o.items = buildUnnamed655();
+    o.items = buildUnnamed998();
     o.kind = "foo";
   }
   buildCounterAcl--;
@@ -48,7 +48,7 @@
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.domainRestricted, unittest.isTrue);
-    checkUnnamed655(o.items);
+    checkUnnamed998(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAcl--;
@@ -255,14 +255,14 @@
   buildCounterActivityObjectAttachmentsPreviewThumbnails--;
 }
 
-buildUnnamed656() {
+buildUnnamed999() {
   var o = new core.List<api.ActivityObjectAttachmentsPreviewThumbnails>();
   o.add(buildActivityObjectAttachmentsPreviewThumbnails());
   o.add(buildActivityObjectAttachmentsPreviewThumbnails());
   return o;
 }
 
-checkUnnamed656(core.List<api.ActivityObjectAttachmentsPreviewThumbnails> o) {
+checkUnnamed999(core.List<api.ActivityObjectAttachmentsPreviewThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsPreviewThumbnails(o[0]);
   checkActivityObjectAttachmentsPreviewThumbnails(o[1]);
@@ -316,14 +316,14 @@
   buildCounterActivityObjectAttachmentsThumbnails--;
 }
 
-buildUnnamed657() {
+buildUnnamed1000() {
   var o = new core.List<api.ActivityObjectAttachmentsThumbnails>();
   o.add(buildActivityObjectAttachmentsThumbnails());
   o.add(buildActivityObjectAttachmentsThumbnails());
   return o;
 }
 
-checkUnnamed657(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
+checkUnnamed1000(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsThumbnails(o[0]);
   checkActivityObjectAttachmentsThumbnails(o[1]);
@@ -341,8 +341,8 @@
     o.id = "foo";
     o.image = buildActivityObjectAttachmentsImage();
     o.objectType = "foo";
-    o.previewThumbnails = buildUnnamed656();
-    o.thumbnails = buildUnnamed657();
+    o.previewThumbnails = buildUnnamed999();
+    o.thumbnails = buildUnnamed1000();
     o.url = "foo";
   }
   buildCounterActivityObjectAttachments--;
@@ -359,21 +359,21 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkActivityObjectAttachmentsImage(o.image);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed656(o.previewThumbnails);
-    checkUnnamed657(o.thumbnails);
+    checkUnnamed999(o.previewThumbnails);
+    checkUnnamed1000(o.thumbnails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterActivityObjectAttachments--;
 }
 
-buildUnnamed658() {
+buildUnnamed1001() {
   var o = new core.List<api.ActivityObjectAttachments>();
   o.add(buildActivityObjectAttachments());
   o.add(buildActivityObjectAttachments());
   return o;
 }
 
-checkUnnamed658(core.List<api.ActivityObjectAttachments> o) {
+checkUnnamed1001(core.List<api.ActivityObjectAttachments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachments(o[0]);
   checkActivityObjectAttachments(o[1]);
@@ -475,7 +475,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.actor = buildActivityObjectActor();
-    o.attachments = buildUnnamed658();
+    o.attachments = buildUnnamed1001();
     o.content = "foo";
     o.id = "foo";
     o.objectType = "foo";
@@ -494,7 +494,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     checkActivityObjectActor(o.actor);
-    checkUnnamed658(o.attachments);
+    checkUnnamed1001(o.attachments);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
@@ -584,14 +584,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed659() {
+buildUnnamed1002() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed659(core.List<api.Activity> o) {
+checkUnnamed1002(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -604,7 +604,7 @@
   if (buildCounterActivityFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed659();
+    o.items = buildUnnamed1002();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -621,7 +621,7 @@
   if (buildCounterActivityFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed659(o.items);
+    checkUnnamed1002(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -659,14 +659,14 @@
   buildCounterAudience--;
 }
 
-buildUnnamed660() {
+buildUnnamed1003() {
   var o = new core.List<api.Audience>();
   o.add(buildAudience());
   o.add(buildAudience());
   return o;
 }
 
-checkUnnamed660(core.List<api.Audience> o) {
+checkUnnamed1003(core.List<api.Audience> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAudience(o[0]);
   checkAudience(o[1]);
@@ -678,7 +678,7 @@
   buildCounterAudiencesFeed++;
   if (buildCounterAudiencesFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed660();
+    o.items = buildUnnamed1003();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -691,7 +691,7 @@
   buildCounterAudiencesFeed++;
   if (buildCounterAudiencesFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed660(o.items);
+    checkUnnamed1003(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -749,14 +749,14 @@
   buildCounterCircle--;
 }
 
-buildUnnamed661() {
+buildUnnamed1004() {
   var o = new core.List<api.Circle>();
   o.add(buildCircle());
   o.add(buildCircle());
   return o;
 }
 
-checkUnnamed661(core.List<api.Circle> o) {
+checkUnnamed1004(core.List<api.Circle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCircle(o[0]);
   checkCircle(o[1]);
@@ -768,7 +768,7 @@
   buildCounterCircleFeed++;
   if (buildCounterCircleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed661();
+    o.items = buildUnnamed1004();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -784,7 +784,7 @@
   buildCounterCircleFeed++;
   if (buildCounterCircleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed661(o.items);
+    checkUnnamed1004(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -860,14 +860,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed662() {
+buildUnnamed1005() {
   var o = new core.List<api.CommentInReplyTo>();
   o.add(buildCommentInReplyTo());
   o.add(buildCommentInReplyTo());
   return o;
 }
 
-checkUnnamed662(core.List<api.CommentInReplyTo> o) {
+checkUnnamed1005(core.List<api.CommentInReplyTo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentInReplyTo(o[0]);
   checkCommentInReplyTo(o[1]);
@@ -923,7 +923,7 @@
     o.actor = buildCommentActor();
     o.etag = "foo";
     o.id = "foo";
-    o.inReplyTo = buildUnnamed662();
+    o.inReplyTo = buildUnnamed1005();
     o.kind = "foo";
     o.object = buildCommentObject();
     o.plusoners = buildCommentPlusoners();
@@ -942,7 +942,7 @@
     checkCommentActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed662(o.inReplyTo);
+    checkUnnamed1005(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCommentObject(o.object);
     checkCommentPlusoners(o.plusoners);
@@ -954,14 +954,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed663() {
+buildUnnamed1006() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed663(core.List<api.Comment> o) {
+checkUnnamed1006(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -974,7 +974,7 @@
   if (buildCounterCommentFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed663();
+    o.items = buildUnnamed1006();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -990,7 +990,7 @@
   if (buildCounterCommentFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed663(o.items);
+    checkUnnamed1006(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1063,14 +1063,14 @@
   buildCounterMediaExif--;
 }
 
-buildUnnamed664() {
+buildUnnamed1007() {
   var o = new core.List<api.Videostream>();
   o.add(buildVideostream());
   o.add(buildVideostream());
   return o;
 }
 
-checkUnnamed664(core.List<api.Videostream> o) {
+checkUnnamed1007(core.List<api.Videostream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideostream(o[0]);
   checkVideostream(o[1]);
@@ -1092,7 +1092,7 @@
     o.mediaUrl = "foo";
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
     o.sizeBytes = "foo";
-    o.streams = buildUnnamed664();
+    o.streams = buildUnnamed1007();
     o.summary = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.url = "foo";
@@ -1118,7 +1118,7 @@
     unittest.expect(o.mediaUrl, unittest.equals('foo'));
     unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.sizeBytes, unittest.equals('foo'));
-    checkUnnamed664(o.streams);
+    checkUnnamed1007(o.streams);
     unittest.expect(o.summary, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.url, unittest.equals('foo'));
@@ -1129,14 +1129,14 @@
   buildCounterMedia--;
 }
 
-buildUnnamed665() {
+buildUnnamed1008() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed665(core.List<api.Person> o) {
+checkUnnamed1008(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -1148,7 +1148,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed665();
+    o.items = buildUnnamed1008();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1163,7 +1163,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed665(o.items);
+    checkUnnamed1008(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1261,14 +1261,14 @@
   buildCounterPersonEmails--;
 }
 
-buildUnnamed666() {
+buildUnnamed1009() {
   var o = new core.List<api.PersonEmails>();
   o.add(buildPersonEmails());
   o.add(buildPersonEmails());
   return o;
 }
 
-checkUnnamed666(core.List<api.PersonEmails> o) {
+checkUnnamed1009(core.List<api.PersonEmails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonEmails(o[0]);
   checkPersonEmails(o[1]);
@@ -1359,14 +1359,14 @@
   buildCounterPersonOrganizations--;
 }
 
-buildUnnamed667() {
+buildUnnamed1010() {
   var o = new core.List<api.PersonOrganizations>();
   o.add(buildPersonOrganizations());
   o.add(buildPersonOrganizations());
   return o;
 }
 
-checkUnnamed667(core.List<api.PersonOrganizations> o) {
+checkUnnamed1010(core.List<api.PersonOrganizations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonOrganizations(o[0]);
   checkPersonOrganizations(o[1]);
@@ -1393,14 +1393,14 @@
   buildCounterPersonPlacesLived--;
 }
 
-buildUnnamed668() {
+buildUnnamed1011() {
   var o = new core.List<api.PersonPlacesLived>();
   o.add(buildPersonPlacesLived());
   o.add(buildPersonPlacesLived());
   return o;
 }
 
-checkUnnamed668(core.List<api.PersonPlacesLived> o) {
+checkUnnamed1011(core.List<api.PersonPlacesLived> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonPlacesLived(o[0]);
   checkPersonPlacesLived(o[1]);
@@ -1429,14 +1429,14 @@
   buildCounterPersonUrls--;
 }
 
-buildUnnamed669() {
+buildUnnamed1012() {
   var o = new core.List<api.PersonUrls>();
   o.add(buildPersonUrls());
   o.add(buildPersonUrls());
   return o;
 }
 
-checkUnnamed669(core.List<api.PersonUrls> o) {
+checkUnnamed1012(core.List<api.PersonUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonUrls(o[0]);
   checkPersonUrls(o[1]);
@@ -1455,7 +1455,7 @@
     o.currentLocation = "foo";
     o.displayName = "foo";
     o.domain = "foo";
-    o.emails = buildUnnamed666();
+    o.emails = buildUnnamed1009();
     o.etag = "foo";
     o.gender = "foo";
     o.id = "foo";
@@ -1466,14 +1466,14 @@
     o.nickname = "foo";
     o.objectType = "foo";
     o.occupation = "foo";
-    o.organizations = buildUnnamed667();
-    o.placesLived = buildUnnamed668();
+    o.organizations = buildUnnamed1010();
+    o.placesLived = buildUnnamed1011();
     o.plusOneCount = 42;
     o.relationshipStatus = "foo";
     o.skills = "foo";
     o.tagline = "foo";
     o.url = "foo";
-    o.urls = buildUnnamed669();
+    o.urls = buildUnnamed1012();
     o.verified = true;
   }
   buildCounterPerson--;
@@ -1491,7 +1491,7 @@
     unittest.expect(o.currentLocation, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkUnnamed666(o.emails);
+    checkUnnamed1009(o.emails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1502,14 +1502,14 @@
     unittest.expect(o.nickname, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.occupation, unittest.equals('foo'));
-    checkUnnamed667(o.organizations);
-    checkUnnamed668(o.placesLived);
+    checkUnnamed1010(o.organizations);
+    checkUnnamed1011(o.placesLived);
     unittest.expect(o.plusOneCount, unittest.equals(42));
     unittest.expect(o.relationshipStatus, unittest.equals('foo'));
     unittest.expect(o.skills, unittest.equals('foo'));
     unittest.expect(o.tagline, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
-    checkUnnamed669(o.urls);
+    checkUnnamed1012(o.urls);
     unittest.expect(o.verified, unittest.isTrue);
   }
   buildCounterPerson--;
@@ -1630,53 +1630,53 @@
   buildCounterVideostream--;
 }
 
-buildUnnamed670() {
+buildUnnamed1013() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed670(core.List<core.String> o) {
+checkUnnamed1013(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed671() {
+buildUnnamed1014() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed671(core.List<core.String> o) {
+checkUnnamed1014(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed672() {
+buildUnnamed1015() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed672(core.List<core.String> o) {
+checkUnnamed1015(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed673() {
+buildUnnamed1016() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed673(core.List<core.String> o) {
+checkUnnamed1016(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2401,8 +2401,8 @@
       var mock = new common_test.HttpServerMock();
       api.CirclesResourceApi res = new api.PlusDomainsApi(mock).circles;
       var arg_circleId = "foo";
-      var arg_email = buildUnnamed670();
-      var arg_userId = buildUnnamed671();
+      var arg_email = buildUnnamed1013();
+      var arg_userId = buildUnnamed1014();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2721,8 +2721,8 @@
       var mock = new common_test.HttpServerMock();
       api.CirclesResourceApi res = new api.PlusDomainsApi(mock).circles;
       var arg_circleId = "foo";
-      var arg_email = buildUnnamed672();
-      var arg_userId = buildUnnamed673();
+      var arg_email = buildUnnamed1015();
+      var arg_userId = buildUnnamed1016();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/prediction/v1_6_test.dart b/generated/googleapis/test/prediction/v1_6_test.dart
index 93b0e74..adc8a29 100644
--- a/generated/googleapis/test/prediction/v1_6_test.dart
+++ b/generated/googleapis/test/prediction/v1_6_test.dart
@@ -37,14 +37,14 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategoricalValues--;
 }
 
-buildUnnamed844() {
+buildUnnamed1017() {
   var o = new core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues>();
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   return o;
 }
 
-checkUnnamed844(core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues> o) {
+checkUnnamed1017(core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeaturesCategoricalValues(o[0]);
   checkAnalyzeDataDescriptionFeaturesCategoricalValues(o[1]);
@@ -56,7 +56,7 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     o.count = "foo";
-    o.values = buildUnnamed844();
+    o.values = buildUnnamed1017();
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
   return o;
@@ -66,7 +66,7 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
-    checkUnnamed844(o.values);
+    checkUnnamed1017(o.values);
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
 }
@@ -138,14 +138,14 @@
   buildCounterAnalyzeDataDescriptionFeatures--;
 }
 
-buildUnnamed845() {
+buildUnnamed1018() {
   var o = new core.List<api.AnalyzeDataDescriptionFeatures>();
   o.add(buildAnalyzeDataDescriptionFeatures());
   o.add(buildAnalyzeDataDescriptionFeatures());
   return o;
 }
 
-checkUnnamed845(core.List<api.AnalyzeDataDescriptionFeatures> o) {
+checkUnnamed1018(core.List<api.AnalyzeDataDescriptionFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeatures(o[0]);
   checkAnalyzeDataDescriptionFeatures(o[1]);
@@ -195,14 +195,14 @@
   buildCounterAnalyzeDataDescriptionOutputFeatureText--;
 }
 
-buildUnnamed846() {
+buildUnnamed1019() {
   var o = new core.List<api.AnalyzeDataDescriptionOutputFeatureText>();
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   return o;
 }
 
-checkUnnamed846(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
+checkUnnamed1019(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionOutputFeatureText(o[0]);
   checkAnalyzeDataDescriptionOutputFeatureText(o[1]);
@@ -214,7 +214,7 @@
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     o.numeric = buildAnalyzeDataDescriptionOutputFeatureNumeric();
-    o.text = buildUnnamed846();
+    o.text = buildUnnamed1019();
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
   return o;
@@ -224,7 +224,7 @@
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     checkAnalyzeDataDescriptionOutputFeatureNumeric(o.numeric);
-    checkUnnamed846(o.text);
+    checkUnnamed1019(o.text);
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
 }
@@ -234,7 +234,7 @@
   var o = new api.AnalyzeDataDescription();
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    o.features = buildUnnamed845();
+    o.features = buildUnnamed1018();
     o.outputFeature = buildAnalyzeDataDescriptionOutputFeature();
   }
   buildCounterAnalyzeDataDescription--;
@@ -244,72 +244,72 @@
 checkAnalyzeDataDescription(api.AnalyzeDataDescription o) {
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    checkUnnamed845(o.features);
+    checkUnnamed1018(o.features);
     checkAnalyzeDataDescriptionOutputFeature(o.outputFeature);
   }
   buildCounterAnalyzeDataDescription--;
 }
 
-buildUnnamed847() {
+buildUnnamed1020() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed847(core.Map<core.String, core.String> o) {
+checkUnnamed1020(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed848() {
+buildUnnamed1021() {
   var o = new core.List<core.Map<core.String, core.String>>();
-  o.add(buildUnnamed847());
-  o.add(buildUnnamed847());
+  o.add(buildUnnamed1020());
+  o.add(buildUnnamed1020());
   return o;
 }
 
-checkUnnamed848(core.List<core.Map<core.String, core.String>> o) {
+checkUnnamed1021(core.List<core.Map<core.String, core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed847(o[0]);
-  checkUnnamed847(o[1]);
+  checkUnnamed1020(o[0]);
+  checkUnnamed1020(o[1]);
 }
 
-buildUnnamed849() {
+buildUnnamed1022() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed849(core.Map<core.String, core.String> o) {
+checkUnnamed1022(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed850() {
+buildUnnamed1023() {
   var o = new core.Map<core.String, core.Map<core.String, core.String>>();
-  o["x"] = buildUnnamed849();
-  o["y"] = buildUnnamed849();
+  o["x"] = buildUnnamed1022();
+  o["y"] = buildUnnamed1022();
   return o;
 }
 
-checkUnnamed850(core.Map<core.String, core.Map<core.String, core.String>> o) {
+checkUnnamed1023(core.Map<core.String, core.Map<core.String, core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed849(o["x"]);
-  checkUnnamed849(o["y"]);
+  checkUnnamed1022(o["x"]);
+  checkUnnamed1022(o["y"]);
 }
 
-buildUnnamed851() {
+buildUnnamed1024() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed851(core.Map<core.String, core.String> o) {
+checkUnnamed1024(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -320,8 +320,8 @@
   var o = new api.AnalyzeModelDescription();
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    o.confusionMatrix = buildUnnamed850();
-    o.confusionMatrixRowTotals = buildUnnamed851();
+    o.confusionMatrix = buildUnnamed1023();
+    o.confusionMatrixRowTotals = buildUnnamed1024();
     o.modelinfo = buildInsert2();
   }
   buildCounterAnalyzeModelDescription--;
@@ -331,8 +331,8 @@
 checkAnalyzeModelDescription(api.AnalyzeModelDescription o) {
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    checkUnnamed850(o.confusionMatrix);
-    checkUnnamed851(o.confusionMatrixRowTotals);
+    checkUnnamed1023(o.confusionMatrix);
+    checkUnnamed1024(o.confusionMatrixRowTotals);
     checkInsert2(o.modelinfo);
   }
   buildCounterAnalyzeModelDescription--;
@@ -344,7 +344,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     o.dataDescription = buildAnalyzeDataDescription();
-    o.errors = buildUnnamed848();
+    o.errors = buildUnnamed1021();
     o.id = "foo";
     o.kind = "foo";
     o.modelDescription = buildAnalyzeModelDescription();
@@ -358,7 +358,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     checkAnalyzeDataDescription(o.dataDescription);
-    checkUnnamed848(o.errors);
+    checkUnnamed1021(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkAnalyzeModelDescription(o.modelDescription);
@@ -367,14 +367,14 @@
   buildCounterAnalyze--;
 }
 
-buildUnnamed852() {
+buildUnnamed1025() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed852(core.List<core.Object> o) {
+checkUnnamed1025(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -385,7 +385,7 @@
   var o = new api.InputInput();
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    o.csvInstance = buildUnnamed852();
+    o.csvInstance = buildUnnamed1025();
   }
   buildCounterInputInput--;
   return o;
@@ -394,7 +394,7 @@
 checkInputInput(api.InputInput o) {
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    checkUnnamed852(o.csvInstance);
+    checkUnnamed1025(o.csvInstance);
   }
   buildCounterInputInput--;
 }
@@ -418,14 +418,14 @@
   buildCounterInput--;
 }
 
-buildUnnamed853() {
+buildUnnamed1026() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed853(core.List<core.Object> o) {
+checkUnnamed1026(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
   var casted4 = (o[1]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
@@ -436,7 +436,7 @@
   var o = new api.InsertTrainingInstances();
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    o.csvInstance = buildUnnamed853();
+    o.csvInstance = buildUnnamed1026();
     o.output = "foo";
   }
   buildCounterInsertTrainingInstances--;
@@ -446,49 +446,49 @@
 checkInsertTrainingInstances(api.InsertTrainingInstances o) {
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    checkUnnamed853(o.csvInstance);
+    checkUnnamed1026(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterInsertTrainingInstances--;
 }
 
-buildUnnamed854() {
+buildUnnamed1027() {
   var o = new core.List<api.InsertTrainingInstances>();
   o.add(buildInsertTrainingInstances());
   o.add(buildInsertTrainingInstances());
   return o;
 }
 
-checkUnnamed854(core.List<api.InsertTrainingInstances> o) {
+checkUnnamed1027(core.List<api.InsertTrainingInstances> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsertTrainingInstances(o[0]);
   checkInsertTrainingInstances(o[1]);
 }
 
-buildUnnamed855() {
+buildUnnamed1028() {
   var o = new core.Map<core.String, core.double>();
   o["x"] = 42.0;
   o["y"] = 42.0;
   return o;
 }
 
-checkUnnamed855(core.Map<core.String, core.double> o) {
+checkUnnamed1028(core.Map<core.String, core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals(42.0));
   unittest.expect(o["y"], unittest.equals(42.0));
 }
 
-buildUnnamed856() {
+buildUnnamed1029() {
   var o = new core.List<core.Map<core.String, core.double>>();
-  o.add(buildUnnamed855());
-  o.add(buildUnnamed855());
+  o.add(buildUnnamed1028());
+  o.add(buildUnnamed1028());
   return o;
 }
 
-checkUnnamed856(core.List<core.Map<core.String, core.double>> o) {
+checkUnnamed1029(core.List<core.Map<core.String, core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed855(o[0]);
-  checkUnnamed855(o[1]);
+  checkUnnamed1028(o[0]);
+  checkUnnamed1028(o[1]);
 }
 
 core.int buildCounterInsert = 0;
@@ -502,8 +502,8 @@
     o.storageDataLocation = "foo";
     o.storagePMMLLocation = "foo";
     o.storagePMMLModelLocation = "foo";
-    o.trainingInstances = buildUnnamed854();
-    o.utility = buildUnnamed856();
+    o.trainingInstances = buildUnnamed1027();
+    o.utility = buildUnnamed1029();
   }
   buildCounterInsert--;
   return o;
@@ -518,8 +518,8 @@
     unittest.expect(o.storageDataLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLModelLocation, unittest.equals('foo'));
-    checkUnnamed854(o.trainingInstances);
-    checkUnnamed856(o.utility);
+    checkUnnamed1027(o.trainingInstances);
+    checkUnnamed1029(o.utility);
   }
   buildCounterInsert--;
 }
@@ -592,14 +592,14 @@
   buildCounterInsert2--;
 }
 
-buildUnnamed857() {
+buildUnnamed1030() {
   var o = new core.List<api.Insert2>();
   o.add(buildInsert2());
   o.add(buildInsert2());
   return o;
 }
 
-checkUnnamed857(core.List<api.Insert2> o) {
+checkUnnamed1030(core.List<api.Insert2> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsert2(o[0]);
   checkInsert2(o[1]);
@@ -610,7 +610,7 @@
   var o = new api.List();
   buildCounterList++;
   if (buildCounterList < 3) {
-    o.items = buildUnnamed857();
+    o.items = buildUnnamed1030();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -622,7 +622,7 @@
 checkList(api.List o) {
   buildCounterList++;
   if (buildCounterList < 3) {
-    checkUnnamed857(o.items);
+    checkUnnamed1030(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -651,14 +651,14 @@
   buildCounterOutputOutputMulti--;
 }
 
-buildUnnamed858() {
+buildUnnamed1031() {
   var o = new core.List<api.OutputOutputMulti>();
   o.add(buildOutputOutputMulti());
   o.add(buildOutputOutputMulti());
   return o;
 }
 
-checkUnnamed858(core.List<api.OutputOutputMulti> o) {
+checkUnnamed1031(core.List<api.OutputOutputMulti> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOutputOutputMulti(o[0]);
   checkOutputOutputMulti(o[1]);
@@ -672,7 +672,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.outputLabel = "foo";
-    o.outputMulti = buildUnnamed858();
+    o.outputMulti = buildUnnamed1031();
     o.outputValue = 42.0;
     o.selfLink = "foo";
   }
@@ -686,21 +686,21 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.outputLabel, unittest.equals('foo'));
-    checkUnnamed858(o.outputMulti);
+    checkUnnamed1031(o.outputMulti);
     unittest.expect(o.outputValue, unittest.equals(42.0));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterOutput--;
 }
 
-buildUnnamed859() {
+buildUnnamed1032() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed859(core.List<core.Object> o) {
+checkUnnamed1032(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o[0]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
   var casted6 = (o[1]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
@@ -711,7 +711,7 @@
   var o = new api.Update();
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    o.csvInstance = buildUnnamed859();
+    o.csvInstance = buildUnnamed1032();
     o.output = "foo";
   }
   buildCounterUpdate--;
@@ -721,7 +721,7 @@
 checkUpdate(api.Update o) {
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    checkUnnamed859(o.csvInstance);
+    checkUnnamed1032(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterUpdate--;
diff --git a/generated/googleapis/test/qpxexpress/v1_test.dart b/generated/googleapis/test/qpxexpress/v1_test.dart
index daea4bc..dcf3a13 100644
--- a/generated/googleapis/test/qpxexpress/v1_test.dart
+++ b/generated/googleapis/test/qpxexpress/v1_test.dart
@@ -64,14 +64,14 @@
   buildCounterAirportData--;
 }
 
-buildUnnamed1() {
+buildUnnamed1033() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1(core.List<core.String> o) {
+checkUnnamed1033(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -84,7 +84,7 @@
   if (buildCounterBagDescriptor < 3) {
     o.commercialName = "foo";
     o.count = 42;
-    o.description = buildUnnamed1();
+    o.description = buildUnnamed1033();
     o.kind = "foo";
     o.subcode = "foo";
   }
@@ -97,7 +97,7 @@
   if (buildCounterBagDescriptor < 3) {
     unittest.expect(o.commercialName, unittest.equals('foo'));
     unittest.expect(o.count, unittest.equals(42));
-    checkUnnamed1(o.description);
+    checkUnnamed1033(o.description);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.subcode, unittest.equals('foo'));
   }
@@ -152,66 +152,66 @@
   buildCounterCityData--;
 }
 
-buildUnnamed2() {
+buildUnnamed1034() {
   var o = new core.List<api.AircraftData>();
   o.add(buildAircraftData());
   o.add(buildAircraftData());
   return o;
 }
 
-checkUnnamed2(core.List<api.AircraftData> o) {
+checkUnnamed1034(core.List<api.AircraftData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAircraftData(o[0]);
   checkAircraftData(o[1]);
 }
 
-buildUnnamed3() {
+buildUnnamed1035() {
   var o = new core.List<api.AirportData>();
   o.add(buildAirportData());
   o.add(buildAirportData());
   return o;
 }
 
-checkUnnamed3(core.List<api.AirportData> o) {
+checkUnnamed1035(core.List<api.AirportData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAirportData(o[0]);
   checkAirportData(o[1]);
 }
 
-buildUnnamed4() {
+buildUnnamed1036() {
   var o = new core.List<api.CarrierData>();
   o.add(buildCarrierData());
   o.add(buildCarrierData());
   return o;
 }
 
-checkUnnamed4(core.List<api.CarrierData> o) {
+checkUnnamed1036(core.List<api.CarrierData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCarrierData(o[0]);
   checkCarrierData(o[1]);
 }
 
-buildUnnamed5() {
+buildUnnamed1037() {
   var o = new core.List<api.CityData>();
   o.add(buildCityData());
   o.add(buildCityData());
   return o;
 }
 
-checkUnnamed5(core.List<api.CityData> o) {
+checkUnnamed1037(core.List<api.CityData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCityData(o[0]);
   checkCityData(o[1]);
 }
 
-buildUnnamed6() {
+buildUnnamed1038() {
   var o = new core.List<api.TaxData>();
   o.add(buildTaxData());
   o.add(buildTaxData());
   return o;
 }
 
-checkUnnamed6(core.List<api.TaxData> o) {
+checkUnnamed1038(core.List<api.TaxData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaxData(o[0]);
   checkTaxData(o[1]);
@@ -222,12 +222,12 @@
   var o = new api.Data();
   buildCounterData++;
   if (buildCounterData < 3) {
-    o.aircraft = buildUnnamed2();
-    o.airport = buildUnnamed3();
-    o.carrier = buildUnnamed4();
-    o.city = buildUnnamed5();
+    o.aircraft = buildUnnamed1034();
+    o.airport = buildUnnamed1035();
+    o.carrier = buildUnnamed1036();
+    o.city = buildUnnamed1037();
     o.kind = "foo";
-    o.tax = buildUnnamed6();
+    o.tax = buildUnnamed1038();
   }
   buildCounterData--;
   return o;
@@ -236,12 +236,12 @@
 checkData(api.Data o) {
   buildCounterData++;
   if (buildCounterData < 3) {
-    checkUnnamed2(o.aircraft);
-    checkUnnamed3(o.airport);
-    checkUnnamed4(o.carrier);
-    checkUnnamed5(o.city);
+    checkUnnamed1034(o.aircraft);
+    checkUnnamed1035(o.airport);
+    checkUnnamed1036(o.carrier);
+    checkUnnamed1037(o.city);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed6(o.tax);
+    checkUnnamed1038(o.tax);
   }
   buildCounterData--;
 }
@@ -298,14 +298,14 @@
   buildCounterFlightInfo--;
 }
 
-buildUnnamed7() {
+buildUnnamed1039() {
   var o = new core.List<api.BagDescriptor>();
   o.add(buildBagDescriptor());
   o.add(buildBagDescriptor());
   return o;
 }
 
-checkUnnamed7(core.List<api.BagDescriptor> o) {
+checkUnnamed1039(core.List<api.BagDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBagDescriptor(o[0]);
   checkBagDescriptor(o[1]);
@@ -316,7 +316,7 @@
   var o = new api.FreeBaggageAllowance();
   buildCounterFreeBaggageAllowance++;
   if (buildCounterFreeBaggageAllowance < 3) {
-    o.bagDescriptor = buildUnnamed7();
+    o.bagDescriptor = buildUnnamed1039();
     o.kilos = 42;
     o.kilosPerPiece = 42;
     o.kind = "foo";
@@ -330,7 +330,7 @@
 checkFreeBaggageAllowance(api.FreeBaggageAllowance o) {
   buildCounterFreeBaggageAllowance++;
   if (buildCounterFreeBaggageAllowance < 3) {
-    checkUnnamed7(o.bagDescriptor);
+    checkUnnamed1039(o.bagDescriptor);
     unittest.expect(o.kilos, unittest.equals(42));
     unittest.expect(o.kilosPerPiece, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -420,40 +420,40 @@
   buildCounterPassengerCounts--;
 }
 
-buildUnnamed8() {
+buildUnnamed1040() {
   var o = new core.List<api.FareInfo>();
   o.add(buildFareInfo());
   o.add(buildFareInfo());
   return o;
 }
 
-checkUnnamed8(core.List<api.FareInfo> o) {
+checkUnnamed1040(core.List<api.FareInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFareInfo(o[0]);
   checkFareInfo(o[1]);
 }
 
-buildUnnamed9() {
+buildUnnamed1041() {
   var o = new core.List<api.SegmentPricing>();
   o.add(buildSegmentPricing());
   o.add(buildSegmentPricing());
   return o;
 }
 
-checkUnnamed9(core.List<api.SegmentPricing> o) {
+checkUnnamed1041(core.List<api.SegmentPricing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentPricing(o[0]);
   checkSegmentPricing(o[1]);
 }
 
-buildUnnamed10() {
+buildUnnamed1042() {
   var o = new core.List<api.TaxInfo>();
   o.add(buildTaxInfo());
   o.add(buildTaxInfo());
   return o;
 }
 
-checkUnnamed10(core.List<api.TaxInfo> o) {
+checkUnnamed1042(core.List<api.TaxInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaxInfo(o[0]);
   checkTaxInfo(o[1]);
@@ -465,7 +465,7 @@
   buildCounterPricingInfo++;
   if (buildCounterPricingInfo < 3) {
     o.baseFareTotal = "foo";
-    o.fare = buildUnnamed8();
+    o.fare = buildUnnamed1040();
     o.fareCalculation = "foo";
     o.kind = "foo";
     o.latestTicketingTime = "foo";
@@ -475,8 +475,8 @@
     o.saleFareTotal = "foo";
     o.saleTaxTotal = "foo";
     o.saleTotal = "foo";
-    o.segmentPricing = buildUnnamed9();
-    o.tax = buildUnnamed10();
+    o.segmentPricing = buildUnnamed1041();
+    o.tax = buildUnnamed1042();
   }
   buildCounterPricingInfo--;
   return o;
@@ -486,7 +486,7 @@
   buildCounterPricingInfo++;
   if (buildCounterPricingInfo < 3) {
     unittest.expect(o.baseFareTotal, unittest.equals('foo'));
-    checkUnnamed8(o.fare);
+    checkUnnamed1040(o.fare);
     unittest.expect(o.fareCalculation, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.latestTicketingTime, unittest.equals('foo'));
@@ -496,20 +496,20 @@
     unittest.expect(o.saleFareTotal, unittest.equals('foo'));
     unittest.expect(o.saleTaxTotal, unittest.equals('foo'));
     unittest.expect(o.saleTotal, unittest.equals('foo'));
-    checkUnnamed9(o.segmentPricing);
-    checkUnnamed10(o.tax);
+    checkUnnamed1041(o.segmentPricing);
+    checkUnnamed1042(o.tax);
   }
   buildCounterPricingInfo--;
 }
 
-buildUnnamed11() {
+buildUnnamed1043() {
   var o = new core.List<api.LegInfo>();
   o.add(buildLegInfo());
   o.add(buildLegInfo());
   return o;
 }
 
-checkUnnamed11(core.List<api.LegInfo> o) {
+checkUnnamed1043(core.List<api.LegInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLegInfo(o[0]);
   checkLegInfo(o[1]);
@@ -528,7 +528,7 @@
     o.flight = buildFlightInfo();
     o.id = "foo";
     o.kind = "foo";
-    o.leg = buildUnnamed11();
+    o.leg = buildUnnamed1043();
     o.marriedSegmentGroup = "foo";
     o.subjectToGovernmentApproval = true;
   }
@@ -547,21 +547,21 @@
     checkFlightInfo(o.flight);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed11(o.leg);
+    checkUnnamed1043(o.leg);
     unittest.expect(o.marriedSegmentGroup, unittest.equals('foo'));
     unittest.expect(o.subjectToGovernmentApproval, unittest.isTrue);
   }
   buildCounterSegmentInfo--;
 }
 
-buildUnnamed12() {
+buildUnnamed1044() {
   var o = new core.List<api.FreeBaggageAllowance>();
   o.add(buildFreeBaggageAllowance());
   o.add(buildFreeBaggageAllowance());
   return o;
 }
 
-checkUnnamed12(core.List<api.FreeBaggageAllowance> o) {
+checkUnnamed1044(core.List<api.FreeBaggageAllowance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBaggageAllowance(o[0]);
   checkFreeBaggageAllowance(o[1]);
@@ -573,7 +573,7 @@
   buildCounterSegmentPricing++;
   if (buildCounterSegmentPricing < 3) {
     o.fareId = "foo";
-    o.freeBaggageOption = buildUnnamed12();
+    o.freeBaggageOption = buildUnnamed1044();
     o.kind = "foo";
     o.segmentId = "foo";
   }
@@ -585,21 +585,21 @@
   buildCounterSegmentPricing++;
   if (buildCounterSegmentPricing < 3) {
     unittest.expect(o.fareId, unittest.equals('foo'));
-    checkUnnamed12(o.freeBaggageOption);
+    checkUnnamed1044(o.freeBaggageOption);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.segmentId, unittest.equals('foo'));
   }
   buildCounterSegmentPricing--;
 }
 
-buildUnnamed13() {
+buildUnnamed1045() {
   var o = new core.List<api.SegmentInfo>();
   o.add(buildSegmentInfo());
   o.add(buildSegmentInfo());
   return o;
 }
 
-checkUnnamed13(core.List<api.SegmentInfo> o) {
+checkUnnamed1045(core.List<api.SegmentInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentInfo(o[0]);
   checkSegmentInfo(o[1]);
@@ -612,7 +612,7 @@
   if (buildCounterSliceInfo < 3) {
     o.duration = 42;
     o.kind = "foo";
-    o.segment = buildUnnamed13();
+    o.segment = buildUnnamed1045();
   }
   buildCounterSliceInfo--;
   return o;
@@ -623,32 +623,32 @@
   if (buildCounterSliceInfo < 3) {
     unittest.expect(o.duration, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed13(o.segment);
+    checkUnnamed1045(o.segment);
   }
   buildCounterSliceInfo--;
 }
 
-buildUnnamed14() {
+buildUnnamed1046() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed14(core.List<core.String> o) {
+checkUnnamed1046(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed15() {
+buildUnnamed1047() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed15(core.List<core.String> o) {
+checkUnnamed1047(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -666,10 +666,10 @@
     o.maxConnectionDuration = 42;
     o.maxStops = 42;
     o.origin = "foo";
-    o.permittedCarrier = buildUnnamed14();
+    o.permittedCarrier = buildUnnamed1046();
     o.permittedDepartureTime = buildTimeOfDayRange();
     o.preferredCabin = "foo";
-    o.prohibitedCarrier = buildUnnamed15();
+    o.prohibitedCarrier = buildUnnamed1047();
   }
   buildCounterSliceInput--;
   return o;
@@ -685,10 +685,10 @@
     unittest.expect(o.maxConnectionDuration, unittest.equals(42));
     unittest.expect(o.maxStops, unittest.equals(42));
     unittest.expect(o.origin, unittest.equals('foo'));
-    checkUnnamed14(o.permittedCarrier);
+    checkUnnamed1046(o.permittedCarrier);
     checkTimeOfDayRange(o.permittedDepartureTime);
     unittest.expect(o.preferredCabin, unittest.equals('foo'));
-    checkUnnamed15(o.prohibitedCarrier);
+    checkUnnamed1047(o.prohibitedCarrier);
   }
   buildCounterSliceInput--;
 }
@@ -768,27 +768,27 @@
   buildCounterTimeOfDayRange--;
 }
 
-buildUnnamed16() {
+buildUnnamed1048() {
   var o = new core.List<api.PricingInfo>();
   o.add(buildPricingInfo());
   o.add(buildPricingInfo());
   return o;
 }
 
-checkUnnamed16(core.List<api.PricingInfo> o) {
+checkUnnamed1048(core.List<api.PricingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPricingInfo(o[0]);
   checkPricingInfo(o[1]);
 }
 
-buildUnnamed17() {
+buildUnnamed1049() {
   var o = new core.List<api.SliceInfo>();
   o.add(buildSliceInfo());
   o.add(buildSliceInfo());
   return o;
 }
 
-checkUnnamed17(core.List<api.SliceInfo> o) {
+checkUnnamed1049(core.List<api.SliceInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSliceInfo(o[0]);
   checkSliceInfo(o[1]);
@@ -801,9 +801,9 @@
   if (buildCounterTripOption < 3) {
     o.id = "foo";
     o.kind = "foo";
-    o.pricing = buildUnnamed16();
+    o.pricing = buildUnnamed1048();
     o.saleTotal = "foo";
-    o.slice = buildUnnamed17();
+    o.slice = buildUnnamed1049();
   }
   buildCounterTripOption--;
   return o;
@@ -814,21 +814,21 @@
   if (buildCounterTripOption < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed16(o.pricing);
+    checkUnnamed1048(o.pricing);
     unittest.expect(o.saleTotal, unittest.equals('foo'));
-    checkUnnamed17(o.slice);
+    checkUnnamed1049(o.slice);
   }
   buildCounterTripOption--;
 }
 
-buildUnnamed18() {
+buildUnnamed1050() {
   var o = new core.List<api.SliceInput>();
   o.add(buildSliceInput());
   o.add(buildSliceInput());
   return o;
 }
 
-checkUnnamed18(core.List<api.SliceInput> o) {
+checkUnnamed1050(core.List<api.SliceInput> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSliceInput(o[0]);
   checkSliceInput(o[1]);
@@ -843,7 +843,7 @@
     o.passengers = buildPassengerCounts();
     o.refundable = true;
     o.saleCountry = "foo";
-    o.slice = buildUnnamed18();
+    o.slice = buildUnnamed1050();
     o.solutions = 42;
   }
   buildCounterTripOptionsRequest--;
@@ -857,20 +857,20 @@
     checkPassengerCounts(o.passengers);
     unittest.expect(o.refundable, unittest.isTrue);
     unittest.expect(o.saleCountry, unittest.equals('foo'));
-    checkUnnamed18(o.slice);
+    checkUnnamed1050(o.slice);
     unittest.expect(o.solutions, unittest.equals(42));
   }
   buildCounterTripOptionsRequest--;
 }
 
-buildUnnamed19() {
+buildUnnamed1051() {
   var o = new core.List<api.TripOption>();
   o.add(buildTripOption());
   o.add(buildTripOption());
   return o;
 }
 
-checkUnnamed19(core.List<api.TripOption> o) {
+checkUnnamed1051(core.List<api.TripOption> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTripOption(o[0]);
   checkTripOption(o[1]);
@@ -884,7 +884,7 @@
     o.data = buildData();
     o.kind = "foo";
     o.requestId = "foo";
-    o.tripOption = buildUnnamed19();
+    o.tripOption = buildUnnamed1051();
   }
   buildCounterTripOptionsResponse--;
   return o;
@@ -896,7 +896,7 @@
     checkData(o.data);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed19(o.tripOption);
+    checkUnnamed1051(o.tripOption);
   }
   buildCounterTripOptionsResponse--;
 }
diff --git a/generated/googleapis/test/reseller/v1_test.dart b/generated/googleapis/test/reseller/v1_test.dart
index ada6b51..a8fb4e8 100644
--- a/generated/googleapis/test/reseller/v1_test.dart
+++ b/generated/googleapis/test/reseller/v1_test.dart
@@ -246,6 +246,7 @@
   var o = new api.Subscription();
   buildCounterSubscription++;
   if (buildCounterSubscription < 3) {
+    o.billingMethod = "foo";
     o.creationTime = "foo";
     o.customerId = "foo";
     o.kind = "foo";
@@ -267,6 +268,7 @@
 checkSubscription(api.Subscription o) {
   buildCounterSubscription++;
   if (buildCounterSubscription < 3) {
+    unittest.expect(o.billingMethod, unittest.equals('foo'));
     unittest.expect(o.creationTime, unittest.equals('foo'));
     unittest.expect(o.customerId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -284,14 +286,14 @@
   buildCounterSubscription--;
 }
 
-buildUnnamed1023() {
+buildUnnamed1052() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed1023(core.List<api.Subscription> o) {
+checkUnnamed1052(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -304,7 +306,7 @@
   if (buildCounterSubscriptions < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.subscriptions = buildUnnamed1023();
+    o.subscriptions = buildUnnamed1052();
   }
   buildCounterSubscriptions--;
   return o;
@@ -315,7 +317,7 @@
   if (buildCounterSubscriptions < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1023(o.subscriptions);
+    checkUnnamed1052(o.subscriptions);
   }
   buildCounterSubscriptions--;
 }
diff --git a/generated/googleapis/test/siteverification/v1_test.dart b/generated/googleapis/test/siteverification/v1_test.dart
index d8f7bb2..172080a 100644
--- a/generated/googleapis/test/siteverification/v1_test.dart
+++ b/generated/googleapis/test/siteverification/v1_test.dart
@@ -79,14 +79,14 @@
   buildCounterSiteVerificationWebResourceGettokenResponse--;
 }
 
-buildUnnamed162() {
+buildUnnamed1053() {
   var o = new core.List<api.SiteVerificationWebResourceResource>();
   o.add(buildSiteVerificationWebResourceResource());
   o.add(buildSiteVerificationWebResourceResource());
   return o;
 }
 
-checkUnnamed162(core.List<api.SiteVerificationWebResourceResource> o) {
+checkUnnamed1053(core.List<api.SiteVerificationWebResourceResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSiteVerificationWebResourceResource(o[0]);
   checkSiteVerificationWebResourceResource(o[1]);
@@ -97,7 +97,7 @@
   var o = new api.SiteVerificationWebResourceListResponse();
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    o.items = buildUnnamed162();
+    o.items = buildUnnamed1053();
   }
   buildCounterSiteVerificationWebResourceListResponse--;
   return o;
@@ -106,19 +106,19 @@
 checkSiteVerificationWebResourceListResponse(api.SiteVerificationWebResourceListResponse o) {
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    checkUnnamed162(o.items);
+    checkUnnamed1053(o.items);
   }
   buildCounterSiteVerificationWebResourceListResponse--;
 }
 
-buildUnnamed163() {
+buildUnnamed1054() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed163(core.List<core.String> o) {
+checkUnnamed1054(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -151,7 +151,7 @@
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     o.id = "foo";
-    o.owners = buildUnnamed163();
+    o.owners = buildUnnamed1054();
     o.site = buildSiteVerificationWebResourceResourceSite();
   }
   buildCounterSiteVerificationWebResourceResource--;
@@ -162,7 +162,7 @@
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed163(o.owners);
+    checkUnnamed1054(o.owners);
     checkSiteVerificationWebResourceResourceSite(o.site);
   }
   buildCounterSiteVerificationWebResourceResource--;
diff --git a/generated/googleapis/test/storage/v1_test.dart b/generated/googleapis/test/storage/v1_test.dart
index 3caf50f..6a5fe6b 100644
--- a/generated/googleapis/test/storage/v1_test.dart
+++ b/generated/googleapis/test/storage/v1_test.dart
@@ -16,53 +16,53 @@
 
 
 
-buildUnnamed500() {
+buildUnnamed1055() {
   var o = new core.List<api.BucketAccessControl>();
   o.add(buildBucketAccessControl());
   o.add(buildBucketAccessControl());
   return o;
 }
 
-checkUnnamed500(core.List<api.BucketAccessControl> o) {
+checkUnnamed1055(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketAccessControl(o[0]);
   checkBucketAccessControl(o[1]);
 }
 
-buildUnnamed501() {
+buildUnnamed1056() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed501(core.List<core.String> o) {
+checkUnnamed1056(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed502() {
+buildUnnamed1057() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed502(core.List<core.String> o) {
+checkUnnamed1057(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed503() {
+buildUnnamed1058() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed503(core.List<core.String> o) {
+checkUnnamed1058(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -74,9 +74,9 @@
   buildCounterBucketCors++;
   if (buildCounterBucketCors < 3) {
     o.maxAgeSeconds = 42;
-    o.method = buildUnnamed501();
-    o.origin = buildUnnamed502();
-    o.responseHeader = buildUnnamed503();
+    o.method = buildUnnamed1056();
+    o.origin = buildUnnamed1057();
+    o.responseHeader = buildUnnamed1058();
   }
   buildCounterBucketCors--;
   return o;
@@ -86,34 +86,34 @@
   buildCounterBucketCors++;
   if (buildCounterBucketCors < 3) {
     unittest.expect(o.maxAgeSeconds, unittest.equals(42));
-    checkUnnamed501(o.method);
-    checkUnnamed502(o.origin);
-    checkUnnamed503(o.responseHeader);
+    checkUnnamed1056(o.method);
+    checkUnnamed1057(o.origin);
+    checkUnnamed1058(o.responseHeader);
   }
   buildCounterBucketCors--;
 }
 
-buildUnnamed504() {
+buildUnnamed1059() {
   var o = new core.List<api.BucketCors>();
   o.add(buildBucketCors());
   o.add(buildBucketCors());
   return o;
 }
 
-checkUnnamed504(core.List<api.BucketCors> o) {
+checkUnnamed1059(core.List<api.BucketCors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketCors(o[0]);
   checkBucketCors(o[1]);
 }
 
-buildUnnamed505() {
+buildUnnamed1060() {
   var o = new core.List<api.ObjectAccessControl>();
   o.add(buildObjectAccessControl());
   o.add(buildObjectAccessControl());
   return o;
 }
 
-checkUnnamed505(core.List<api.ObjectAccessControl> o) {
+checkUnnamed1060(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObjectAccessControl(o[0]);
   checkObjectAccessControl(o[1]);
@@ -184,14 +184,14 @@
   buildCounterBucketLifecycleRule--;
 }
 
-buildUnnamed506() {
+buildUnnamed1061() {
   var o = new core.List<api.BucketLifecycleRule>();
   o.add(buildBucketLifecycleRule());
   o.add(buildBucketLifecycleRule());
   return o;
 }
 
-checkUnnamed506(core.List<api.BucketLifecycleRule> o) {
+checkUnnamed1061(core.List<api.BucketLifecycleRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketLifecycleRule(o[0]);
   checkBucketLifecycleRule(o[1]);
@@ -202,7 +202,7 @@
   var o = new api.BucketLifecycle();
   buildCounterBucketLifecycle++;
   if (buildCounterBucketLifecycle < 3) {
-    o.rule = buildUnnamed506();
+    o.rule = buildUnnamed1061();
   }
   buildCounterBucketLifecycle--;
   return o;
@@ -211,7 +211,7 @@
 checkBucketLifecycle(api.BucketLifecycle o) {
   buildCounterBucketLifecycle++;
   if (buildCounterBucketLifecycle < 3) {
-    checkUnnamed506(o.rule);
+    checkUnnamed1061(o.rule);
   }
   buildCounterBucketLifecycle--;
 }
@@ -303,9 +303,9 @@
   var o = new api.Bucket();
   buildCounterBucket++;
   if (buildCounterBucket < 3) {
-    o.acl = buildUnnamed500();
-    o.cors = buildUnnamed504();
-    o.defaultObjectAcl = buildUnnamed505();
+    o.acl = buildUnnamed1055();
+    o.cors = buildUnnamed1059();
+    o.defaultObjectAcl = buildUnnamed1060();
     o.etag = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -329,9 +329,9 @@
 checkBucket(api.Bucket o) {
   buildCounterBucket++;
   if (buildCounterBucket < 3) {
-    checkUnnamed500(o.acl);
-    checkUnnamed504(o.cors);
-    checkUnnamed505(o.defaultObjectAcl);
+    checkUnnamed1055(o.acl);
+    checkUnnamed1059(o.cors);
+    checkUnnamed1060(o.defaultObjectAcl);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -411,14 +411,14 @@
   buildCounterBucketAccessControl--;
 }
 
-buildUnnamed507() {
+buildUnnamed1062() {
   var o = new core.List<api.BucketAccessControl>();
   o.add(buildBucketAccessControl());
   o.add(buildBucketAccessControl());
   return o;
 }
 
-checkUnnamed507(core.List<api.BucketAccessControl> o) {
+checkUnnamed1062(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketAccessControl(o[0]);
   checkBucketAccessControl(o[1]);
@@ -429,7 +429,7 @@
   var o = new api.BucketAccessControls();
   buildCounterBucketAccessControls++;
   if (buildCounterBucketAccessControls < 3) {
-    o.items = buildUnnamed507();
+    o.items = buildUnnamed1062();
     o.kind = "foo";
   }
   buildCounterBucketAccessControls--;
@@ -439,20 +439,20 @@
 checkBucketAccessControls(api.BucketAccessControls o) {
   buildCounterBucketAccessControls++;
   if (buildCounterBucketAccessControls < 3) {
-    checkUnnamed507(o.items);
+    checkUnnamed1062(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBucketAccessControls--;
 }
 
-buildUnnamed508() {
+buildUnnamed1063() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed508(core.List<api.Bucket> o) {
+checkUnnamed1063(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -463,7 +463,7 @@
   var o = new api.Buckets();
   buildCounterBuckets++;
   if (buildCounterBuckets < 3) {
-    o.items = buildUnnamed508();
+    o.items = buildUnnamed1063();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -474,21 +474,21 @@
 checkBuckets(api.Buckets o) {
   buildCounterBuckets++;
   if (buildCounterBuckets < 3) {
-    checkUnnamed508(o.items);
+    checkUnnamed1063(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterBuckets--;
 }
 
-buildUnnamed509() {
+buildUnnamed1064() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed509(core.Map<core.String, core.String> o) {
+checkUnnamed1064(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -503,7 +503,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed509();
+    o.params = buildUnnamed1064();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -521,7 +521,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed509(o.params);
+    checkUnnamed1064(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -573,14 +573,14 @@
   buildCounterComposeRequestSourceObjects--;
 }
 
-buildUnnamed510() {
+buildUnnamed1065() {
   var o = new core.List<api.ComposeRequestSourceObjects>();
   o.add(buildComposeRequestSourceObjects());
   o.add(buildComposeRequestSourceObjects());
   return o;
 }
 
-checkUnnamed510(core.List<api.ComposeRequestSourceObjects> o) {
+checkUnnamed1065(core.List<api.ComposeRequestSourceObjects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComposeRequestSourceObjects(o[0]);
   checkComposeRequestSourceObjects(o[1]);
@@ -593,7 +593,7 @@
   if (buildCounterComposeRequest < 3) {
     o.destination = buildObject();
     o.kind = "foo";
-    o.sourceObjects = buildUnnamed510();
+    o.sourceObjects = buildUnnamed1065();
   }
   buildCounterComposeRequest--;
   return o;
@@ -604,32 +604,32 @@
   if (buildCounterComposeRequest < 3) {
     checkObject(o.destination);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed510(o.sourceObjects);
+    checkUnnamed1065(o.sourceObjects);
   }
   buildCounterComposeRequest--;
 }
 
-buildUnnamed511() {
+buildUnnamed1066() {
   var o = new core.List<api.ObjectAccessControl>();
   o.add(buildObjectAccessControl());
   o.add(buildObjectAccessControl());
   return o;
 }
 
-checkUnnamed511(core.List<api.ObjectAccessControl> o) {
+checkUnnamed1066(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObjectAccessControl(o[0]);
   checkObjectAccessControl(o[1]);
 }
 
-buildUnnamed512() {
+buildUnnamed1067() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed512(core.Map<core.String, core.String> o) {
+checkUnnamed1067(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -661,7 +661,7 @@
   var o = new api.Object();
   buildCounterObject++;
   if (buildCounterObject < 3) {
-    o.acl = buildUnnamed511();
+    o.acl = buildUnnamed1066();
     o.bucket = "foo";
     o.cacheControl = "foo";
     o.componentCount = 42;
@@ -676,7 +676,7 @@
     o.kind = "foo";
     o.md5Hash = "foo";
     o.mediaLink = "foo";
-    o.metadata = buildUnnamed512();
+    o.metadata = buildUnnamed1067();
     o.metageneration = "foo";
     o.name = "foo";
     o.owner = buildObjectOwner();
@@ -693,7 +693,7 @@
 checkObject(api.Object o) {
   buildCounterObject++;
   if (buildCounterObject < 3) {
-    checkUnnamed511(o.acl);
+    checkUnnamed1066(o.acl);
     unittest.expect(o.bucket, unittest.equals('foo'));
     unittest.expect(o.cacheControl, unittest.equals('foo'));
     unittest.expect(o.componentCount, unittest.equals(42));
@@ -708,7 +708,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.md5Hash, unittest.equals('foo'));
     unittest.expect(o.mediaLink, unittest.equals('foo'));
-    checkUnnamed512(o.metadata);
+    checkUnnamed1067(o.metadata);
     unittest.expect(o.metageneration, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkObjectOwner(o.owner);
@@ -785,14 +785,14 @@
   buildCounterObjectAccessControl--;
 }
 
-buildUnnamed513() {
+buildUnnamed1068() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed513(core.List<core.Object> o) {
+checkUnnamed1068(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -803,7 +803,7 @@
   var o = new api.ObjectAccessControls();
   buildCounterObjectAccessControls++;
   if (buildCounterObjectAccessControls < 3) {
-    o.items = buildUnnamed513();
+    o.items = buildUnnamed1068();
     o.kind = "foo";
   }
   buildCounterObjectAccessControls--;
@@ -813,33 +813,33 @@
 checkObjectAccessControls(api.ObjectAccessControls o) {
   buildCounterObjectAccessControls++;
   if (buildCounterObjectAccessControls < 3) {
-    checkUnnamed513(o.items);
+    checkUnnamed1068(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterObjectAccessControls--;
 }
 
-buildUnnamed514() {
+buildUnnamed1069() {
   var o = new core.List<api.Object>();
   o.add(buildObject());
   o.add(buildObject());
   return o;
 }
 
-checkUnnamed514(core.List<api.Object> o) {
+checkUnnamed1069(core.List<api.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObject(o[0]);
   checkObject(o[1]);
 }
 
-buildUnnamed515() {
+buildUnnamed1070() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed515(core.List<core.String> o) {
+checkUnnamed1070(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -850,10 +850,10 @@
   var o = new api.Objects();
   buildCounterObjects++;
   if (buildCounterObjects < 3) {
-    o.items = buildUnnamed514();
+    o.items = buildUnnamed1069();
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.prefixes = buildUnnamed515();
+    o.prefixes = buildUnnamed1070();
   }
   buildCounterObjects--;
   return o;
@@ -862,10 +862,10 @@
 checkObjects(api.Objects o) {
   buildCounterObjects++;
   if (buildCounterObjects < 3) {
-    checkUnnamed514(o.items);
+    checkUnnamed1069(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed515(o.prefixes);
+    checkUnnamed1070(o.prefixes);
   }
   buildCounterObjects--;
 }
diff --git a/generated/googleapis/test/tagmanager/v1_test.dart b/generated/googleapis/test/tagmanager/v1_test.dart
index 558abf2..4e5e815 100644
--- a/generated/googleapis/test/tagmanager/v1_test.dart
+++ b/generated/googleapis/test/tagmanager/v1_test.dart
@@ -41,14 +41,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed779() {
+buildUnnamed1071() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed779(core.List<core.String> o) {
+checkUnnamed1071(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -59,7 +59,7 @@
   var o = new api.AccountAccess();
   buildCounterAccountAccess++;
   if (buildCounterAccountAccess < 3) {
-    o.permission = buildUnnamed779();
+    o.permission = buildUnnamed1071();
   }
   buildCounterAccountAccess--;
   return o;
@@ -68,19 +68,19 @@
 checkAccountAccess(api.AccountAccess o) {
   buildCounterAccountAccess++;
   if (buildCounterAccountAccess < 3) {
-    checkUnnamed779(o.permission);
+    checkUnnamed1071(o.permission);
   }
   buildCounterAccountAccess--;
 }
 
-buildUnnamed780() {
+buildUnnamed1072() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed780(core.List<api.Parameter> o) {
+checkUnnamed1072(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -91,7 +91,7 @@
   var o = new api.Condition();
   buildCounterCondition++;
   if (buildCounterCondition < 3) {
-    o.parameter = buildUnnamed780();
+    o.parameter = buildUnnamed1072();
     o.type = "foo";
   }
   buildCounterCondition--;
@@ -101,33 +101,46 @@
 checkCondition(api.Condition o) {
   buildCounterCondition++;
   if (buildCounterCondition < 3) {
-    checkUnnamed780(o.parameter);
+    checkUnnamed1072(o.parameter);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCondition--;
 }
 
-buildUnnamed781() {
+buildUnnamed1073() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed781(core.List<core.String> o) {
+checkUnnamed1073(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed782() {
+buildUnnamed1074() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed782(core.List<core.String> o) {
+checkUnnamed1074(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1075() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1075(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -140,14 +153,15 @@
   if (buildCounterContainer < 3) {
     o.accountId = "foo";
     o.containerId = "foo";
-    o.domainName = buildUnnamed781();
+    o.domainName = buildUnnamed1073();
+    o.enabledBuiltInVariable = buildUnnamed1074();
     o.fingerprint = "foo";
     o.name = "foo";
     o.notes = "foo";
     o.publicId = "foo";
     o.timeZoneCountryId = "foo";
     o.timeZoneId = "foo";
-    o.usageContext = buildUnnamed782();
+    o.usageContext = buildUnnamed1075();
   }
   buildCounterContainer--;
   return o;
@@ -158,26 +172,27 @@
   if (buildCounterContainer < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkUnnamed781(o.domainName);
+    checkUnnamed1073(o.domainName);
+    checkUnnamed1074(o.enabledBuiltInVariable);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.publicId, unittest.equals('foo'));
     unittest.expect(o.timeZoneCountryId, unittest.equals('foo'));
     unittest.expect(o.timeZoneId, unittest.equals('foo'));
-    checkUnnamed782(o.usageContext);
+    checkUnnamed1075(o.usageContext);
   }
   buildCounterContainer--;
 }
 
-buildUnnamed783() {
+buildUnnamed1076() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed783(core.List<core.String> o) {
+checkUnnamed1076(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -189,7 +204,7 @@
   buildCounterContainerAccess++;
   if (buildCounterContainerAccess < 3) {
     o.containerId = "foo";
-    o.permission = buildUnnamed783();
+    o.permission = buildUnnamed1076();
   }
   buildCounterContainerAccess--;
   return o;
@@ -199,71 +214,71 @@
   buildCounterContainerAccess++;
   if (buildCounterContainerAccess < 3) {
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkUnnamed783(o.permission);
+    checkUnnamed1076(o.permission);
   }
   buildCounterContainerAccess--;
 }
 
-buildUnnamed784() {
+buildUnnamed1077() {
   var o = new core.List<api.Macro>();
   o.add(buildMacro());
   o.add(buildMacro());
   return o;
 }
 
-checkUnnamed784(core.List<api.Macro> o) {
+checkUnnamed1077(core.List<api.Macro> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMacro(o[0]);
   checkMacro(o[1]);
 }
 
-buildUnnamed785() {
+buildUnnamed1078() {
   var o = new core.List<api.Rule>();
   o.add(buildRule());
   o.add(buildRule());
   return o;
 }
 
-checkUnnamed785(core.List<api.Rule> o) {
+checkUnnamed1078(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRule(o[0]);
   checkRule(o[1]);
 }
 
-buildUnnamed786() {
+buildUnnamed1079() {
   var o = new core.List<api.Tag>();
   o.add(buildTag());
   o.add(buildTag());
   return o;
 }
 
-checkUnnamed786(core.List<api.Tag> o) {
+checkUnnamed1079(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTag(o[0]);
   checkTag(o[1]);
 }
 
-buildUnnamed787() {
+buildUnnamed1080() {
   var o = new core.List<api.Trigger>();
   o.add(buildTrigger());
   o.add(buildTrigger());
   return o;
 }
 
-checkUnnamed787(core.List<api.Trigger> o) {
+checkUnnamed1080(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrigger(o[0]);
   checkTrigger(o[1]);
 }
 
-buildUnnamed788() {
+buildUnnamed1081() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed788(core.List<api.Variable> o) {
+checkUnnamed1081(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -280,13 +295,13 @@
     o.containerVersionId = "foo";
     o.deleted = true;
     o.fingerprint = "foo";
-    o.macro = buildUnnamed784();
+    o.macro = buildUnnamed1077();
     o.name = "foo";
     o.notes = "foo";
-    o.rule = buildUnnamed785();
-    o.tag = buildUnnamed786();
-    o.trigger = buildUnnamed787();
-    o.variable = buildUnnamed788();
+    o.rule = buildUnnamed1078();
+    o.tag = buildUnnamed1079();
+    o.trigger = buildUnnamed1080();
+    o.variable = buildUnnamed1081();
   }
   buildCounterContainerVersion--;
   return o;
@@ -301,13 +316,13 @@
     unittest.expect(o.containerVersionId, unittest.equals('foo'));
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed784(o.macro);
+    checkUnnamed1077(o.macro);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed785(o.rule);
-    checkUnnamed786(o.tag);
-    checkUnnamed787(o.trigger);
-    checkUnnamed788(o.variable);
+    checkUnnamed1078(o.rule);
+    checkUnnamed1079(o.tag);
+    checkUnnamed1080(o.trigger);
+    checkUnnamed1081(o.variable);
   }
   buildCounterContainerVersion--;
 }
@@ -393,14 +408,14 @@
   buildCounterCreateContainerVersionResponse--;
 }
 
-buildUnnamed789() {
+buildUnnamed1082() {
   var o = new core.List<api.UserAccess>();
   o.add(buildUserAccess());
   o.add(buildUserAccess());
   return o;
 }
 
-checkUnnamed789(core.List<api.UserAccess> o) {
+checkUnnamed1082(core.List<api.UserAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserAccess(o[0]);
   checkUserAccess(o[1]);
@@ -411,7 +426,7 @@
   var o = new api.ListAccountUsersResponse();
   buildCounterListAccountUsersResponse++;
   if (buildCounterListAccountUsersResponse < 3) {
-    o.userAccess = buildUnnamed789();
+    o.userAccess = buildUnnamed1082();
   }
   buildCounterListAccountUsersResponse--;
   return o;
@@ -420,19 +435,19 @@
 checkListAccountUsersResponse(api.ListAccountUsersResponse o) {
   buildCounterListAccountUsersResponse++;
   if (buildCounterListAccountUsersResponse < 3) {
-    checkUnnamed789(o.userAccess);
+    checkUnnamed1082(o.userAccess);
   }
   buildCounterListAccountUsersResponse--;
 }
 
-buildUnnamed790() {
+buildUnnamed1083() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed790(core.List<api.Account> o) {
+checkUnnamed1083(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -443,7 +458,7 @@
   var o = new api.ListAccountsResponse();
   buildCounterListAccountsResponse++;
   if (buildCounterListAccountsResponse < 3) {
-    o.accounts = buildUnnamed790();
+    o.accounts = buildUnnamed1083();
   }
   buildCounterListAccountsResponse--;
   return o;
@@ -452,32 +467,32 @@
 checkListAccountsResponse(api.ListAccountsResponse o) {
   buildCounterListAccountsResponse++;
   if (buildCounterListAccountsResponse < 3) {
-    checkUnnamed790(o.accounts);
+    checkUnnamed1083(o.accounts);
   }
   buildCounterListAccountsResponse--;
 }
 
-buildUnnamed791() {
+buildUnnamed1084() {
   var o = new core.List<api.ContainerVersion>();
   o.add(buildContainerVersion());
   o.add(buildContainerVersion());
   return o;
 }
 
-checkUnnamed791(core.List<api.ContainerVersion> o) {
+checkUnnamed1084(core.List<api.ContainerVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContainerVersion(o[0]);
   checkContainerVersion(o[1]);
 }
 
-buildUnnamed792() {
+buildUnnamed1085() {
   var o = new core.List<api.ContainerVersionHeader>();
   o.add(buildContainerVersionHeader());
   o.add(buildContainerVersionHeader());
   return o;
 }
 
-checkUnnamed792(core.List<api.ContainerVersionHeader> o) {
+checkUnnamed1085(core.List<api.ContainerVersionHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContainerVersionHeader(o[0]);
   checkContainerVersionHeader(o[1]);
@@ -488,8 +503,8 @@
   var o = new api.ListContainerVersionsResponse();
   buildCounterListContainerVersionsResponse++;
   if (buildCounterListContainerVersionsResponse < 3) {
-    o.containerVersion = buildUnnamed791();
-    o.containerVersionHeader = buildUnnamed792();
+    o.containerVersion = buildUnnamed1084();
+    o.containerVersionHeader = buildUnnamed1085();
   }
   buildCounterListContainerVersionsResponse--;
   return o;
@@ -498,20 +513,20 @@
 checkListContainerVersionsResponse(api.ListContainerVersionsResponse o) {
   buildCounterListContainerVersionsResponse++;
   if (buildCounterListContainerVersionsResponse < 3) {
-    checkUnnamed791(o.containerVersion);
-    checkUnnamed792(o.containerVersionHeader);
+    checkUnnamed1084(o.containerVersion);
+    checkUnnamed1085(o.containerVersionHeader);
   }
   buildCounterListContainerVersionsResponse--;
 }
 
-buildUnnamed793() {
+buildUnnamed1086() {
   var o = new core.List<api.Container>();
   o.add(buildContainer());
   o.add(buildContainer());
   return o;
 }
 
-checkUnnamed793(core.List<api.Container> o) {
+checkUnnamed1086(core.List<api.Container> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContainer(o[0]);
   checkContainer(o[1]);
@@ -522,7 +537,7 @@
   var o = new api.ListContainersResponse();
   buildCounterListContainersResponse++;
   if (buildCounterListContainersResponse < 3) {
-    o.containers = buildUnnamed793();
+    o.containers = buildUnnamed1086();
   }
   buildCounterListContainersResponse--;
   return o;
@@ -531,19 +546,19 @@
 checkListContainersResponse(api.ListContainersResponse o) {
   buildCounterListContainersResponse++;
   if (buildCounterListContainersResponse < 3) {
-    checkUnnamed793(o.containers);
+    checkUnnamed1086(o.containers);
   }
   buildCounterListContainersResponse--;
 }
 
-buildUnnamed794() {
+buildUnnamed1087() {
   var o = new core.List<api.Macro>();
   o.add(buildMacro());
   o.add(buildMacro());
   return o;
 }
 
-checkUnnamed794(core.List<api.Macro> o) {
+checkUnnamed1087(core.List<api.Macro> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMacro(o[0]);
   checkMacro(o[1]);
@@ -554,7 +569,7 @@
   var o = new api.ListMacrosResponse();
   buildCounterListMacrosResponse++;
   if (buildCounterListMacrosResponse < 3) {
-    o.macros = buildUnnamed794();
+    o.macros = buildUnnamed1087();
   }
   buildCounterListMacrosResponse--;
   return o;
@@ -563,19 +578,19 @@
 checkListMacrosResponse(api.ListMacrosResponse o) {
   buildCounterListMacrosResponse++;
   if (buildCounterListMacrosResponse < 3) {
-    checkUnnamed794(o.macros);
+    checkUnnamed1087(o.macros);
   }
   buildCounterListMacrosResponse--;
 }
 
-buildUnnamed795() {
+buildUnnamed1088() {
   var o = new core.List<api.Rule>();
   o.add(buildRule());
   o.add(buildRule());
   return o;
 }
 
-checkUnnamed795(core.List<api.Rule> o) {
+checkUnnamed1088(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRule(o[0]);
   checkRule(o[1]);
@@ -586,7 +601,7 @@
   var o = new api.ListRulesResponse();
   buildCounterListRulesResponse++;
   if (buildCounterListRulesResponse < 3) {
-    o.rules = buildUnnamed795();
+    o.rules = buildUnnamed1088();
   }
   buildCounterListRulesResponse--;
   return o;
@@ -595,19 +610,19 @@
 checkListRulesResponse(api.ListRulesResponse o) {
   buildCounterListRulesResponse++;
   if (buildCounterListRulesResponse < 3) {
-    checkUnnamed795(o.rules);
+    checkUnnamed1088(o.rules);
   }
   buildCounterListRulesResponse--;
 }
 
-buildUnnamed796() {
+buildUnnamed1089() {
   var o = new core.List<api.Tag>();
   o.add(buildTag());
   o.add(buildTag());
   return o;
 }
 
-checkUnnamed796(core.List<api.Tag> o) {
+checkUnnamed1089(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTag(o[0]);
   checkTag(o[1]);
@@ -618,7 +633,7 @@
   var o = new api.ListTagsResponse();
   buildCounterListTagsResponse++;
   if (buildCounterListTagsResponse < 3) {
-    o.tags = buildUnnamed796();
+    o.tags = buildUnnamed1089();
   }
   buildCounterListTagsResponse--;
   return o;
@@ -627,19 +642,19 @@
 checkListTagsResponse(api.ListTagsResponse o) {
   buildCounterListTagsResponse++;
   if (buildCounterListTagsResponse < 3) {
-    checkUnnamed796(o.tags);
+    checkUnnamed1089(o.tags);
   }
   buildCounterListTagsResponse--;
 }
 
-buildUnnamed797() {
+buildUnnamed1090() {
   var o = new core.List<api.Trigger>();
   o.add(buildTrigger());
   o.add(buildTrigger());
   return o;
 }
 
-checkUnnamed797(core.List<api.Trigger> o) {
+checkUnnamed1090(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrigger(o[0]);
   checkTrigger(o[1]);
@@ -650,7 +665,7 @@
   var o = new api.ListTriggersResponse();
   buildCounterListTriggersResponse++;
   if (buildCounterListTriggersResponse < 3) {
-    o.triggers = buildUnnamed797();
+    o.triggers = buildUnnamed1090();
   }
   buildCounterListTriggersResponse--;
   return o;
@@ -659,19 +674,19 @@
 checkListTriggersResponse(api.ListTriggersResponse o) {
   buildCounterListTriggersResponse++;
   if (buildCounterListTriggersResponse < 3) {
-    checkUnnamed797(o.triggers);
+    checkUnnamed1090(o.triggers);
   }
   buildCounterListTriggersResponse--;
 }
 
-buildUnnamed798() {
+buildUnnamed1091() {
   var o = new core.List<api.Variable>();
   o.add(buildVariable());
   o.add(buildVariable());
   return o;
 }
 
-checkUnnamed798(core.List<api.Variable> o) {
+checkUnnamed1091(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariable(o[0]);
   checkVariable(o[1]);
@@ -682,7 +697,7 @@
   var o = new api.ListVariablesResponse();
   buildCounterListVariablesResponse++;
   if (buildCounterListVariablesResponse < 3) {
-    o.variables = buildUnnamed798();
+    o.variables = buildUnnamed1091();
   }
   buildCounterListVariablesResponse--;
   return o;
@@ -691,45 +706,45 @@
 checkListVariablesResponse(api.ListVariablesResponse o) {
   buildCounterListVariablesResponse++;
   if (buildCounterListVariablesResponse < 3) {
-    checkUnnamed798(o.variables);
+    checkUnnamed1091(o.variables);
   }
   buildCounterListVariablesResponse--;
 }
 
-buildUnnamed799() {
+buildUnnamed1092() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed799(core.List<core.String> o) {
+checkUnnamed1092(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed800() {
+buildUnnamed1093() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed800(core.List<core.String> o) {
+checkUnnamed1093(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed801() {
+buildUnnamed1094() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed801(core.List<api.Parameter> o) {
+checkUnnamed1094(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -742,13 +757,13 @@
   if (buildCounterMacro < 3) {
     o.accountId = "foo";
     o.containerId = "foo";
-    o.disablingRuleId = buildUnnamed799();
-    o.enablingRuleId = buildUnnamed800();
+    o.disablingRuleId = buildUnnamed1092();
+    o.enablingRuleId = buildUnnamed1093();
     o.fingerprint = "foo";
     o.macroId = "foo";
     o.name = "foo";
     o.notes = "foo";
-    o.parameter = buildUnnamed801();
+    o.parameter = buildUnnamed1094();
     o.scheduleEndMs = "foo";
     o.scheduleStartMs = "foo";
     o.type = "foo";
@@ -762,13 +777,13 @@
   if (buildCounterMacro < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkUnnamed799(o.disablingRuleId);
-    checkUnnamed800(o.enablingRuleId);
+    checkUnnamed1092(o.disablingRuleId);
+    checkUnnamed1093(o.enablingRuleId);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.macroId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed801(o.parameter);
+    checkUnnamed1094(o.parameter);
     unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
     unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -776,27 +791,27 @@
   buildCounterMacro--;
 }
 
-buildUnnamed802() {
+buildUnnamed1095() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed802(core.List<api.Parameter> o) {
+checkUnnamed1095(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
 }
 
-buildUnnamed803() {
+buildUnnamed1096() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed803(core.List<api.Parameter> o) {
+checkUnnamed1096(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -808,8 +823,8 @@
   buildCounterParameter++;
   if (buildCounterParameter < 3) {
     o.key = "foo";
-    o.list = buildUnnamed802();
-    o.map = buildUnnamed803();
+    o.list = buildUnnamed1095();
+    o.map = buildUnnamed1096();
     o.type = "foo";
     o.value = "foo";
   }
@@ -821,8 +836,8 @@
   buildCounterParameter++;
   if (buildCounterParameter < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkUnnamed802(o.list);
-    checkUnnamed803(o.map);
+    checkUnnamed1095(o.list);
+    checkUnnamed1096(o.map);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -850,14 +865,14 @@
   buildCounterPublishContainerVersionResponse--;
 }
 
-buildUnnamed804() {
+buildUnnamed1097() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed804(core.List<api.Condition> o) {
+checkUnnamed1097(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
@@ -869,7 +884,7 @@
   buildCounterRule++;
   if (buildCounterRule < 3) {
     o.accountId = "foo";
-    o.condition = buildUnnamed804();
+    o.condition = buildUnnamed1097();
     o.containerId = "foo";
     o.fingerprint = "foo";
     o.name = "foo";
@@ -884,7 +899,7 @@
   buildCounterRule++;
   if (buildCounterRule < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed804(o.condition);
+    checkUnnamed1097(o.condition);
     unittest.expect(o.containerId, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -894,66 +909,66 @@
   buildCounterRule--;
 }
 
-buildUnnamed805() {
+buildUnnamed1098() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed805(core.List<core.String> o) {
+checkUnnamed1098(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed806() {
+buildUnnamed1099() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed806(core.List<core.String> o) {
+checkUnnamed1099(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed807() {
+buildUnnamed1100() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed807(core.List<core.String> o) {
+checkUnnamed1100(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed808() {
+buildUnnamed1101() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed808(core.List<core.String> o) {
+checkUnnamed1101(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed809() {
+buildUnnamed1102() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed809(core.List<api.Parameter> o) {
+checkUnnamed1102(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -965,17 +980,16 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     o.accountId = "foo";
-    o.blockingRuleId = buildUnnamed805();
-    o.blockingTriggerId = buildUnnamed806();
+    o.blockingRuleId = buildUnnamed1098();
+    o.blockingTriggerId = buildUnnamed1099();
     o.containerId = "foo";
-    o.dependencies = buildParameter();
     o.fingerprint = "foo";
-    o.firingRuleId = buildUnnamed807();
-    o.firingTriggerId = buildUnnamed808();
+    o.firingRuleId = buildUnnamed1100();
+    o.firingTriggerId = buildUnnamed1101();
     o.liveOnly = true;
     o.name = "foo";
     o.notes = "foo";
-    o.parameter = buildUnnamed809();
+    o.parameter = buildUnnamed1102();
     o.priority = buildParameter();
     o.scheduleEndMs = "foo";
     o.scheduleStartMs = "foo";
@@ -990,17 +1004,16 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed805(o.blockingRuleId);
-    checkUnnamed806(o.blockingTriggerId);
+    checkUnnamed1098(o.blockingRuleId);
+    checkUnnamed1099(o.blockingTriggerId);
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkParameter(o.dependencies);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed807(o.firingRuleId);
-    checkUnnamed808(o.firingTriggerId);
+    checkUnnamed1100(o.firingRuleId);
+    checkUnnamed1101(o.firingTriggerId);
     unittest.expect(o.liveOnly, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed809(o.parameter);
+    checkUnnamed1102(o.parameter);
     checkParameter(o.priority);
     unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
     unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
@@ -1010,40 +1023,40 @@
   buildCounterTag--;
 }
 
-buildUnnamed810() {
+buildUnnamed1103() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed810(core.List<api.Condition> o) {
+checkUnnamed1103(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed811() {
+buildUnnamed1104() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed811(core.List<api.Condition> o) {
+checkUnnamed1104(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
 }
 
-buildUnnamed812() {
+buildUnnamed1105() {
   var o = new core.List<api.Condition>();
   o.add(buildCondition());
   o.add(buildCondition());
   return o;
 }
 
-checkUnnamed812(core.List<api.Condition> o) {
+checkUnnamed1105(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCondition(o[0]);
   checkCondition(o[1]);
@@ -1055,13 +1068,13 @@
   buildCounterTrigger++;
   if (buildCounterTrigger < 3) {
     o.accountId = "foo";
-    o.autoEventFilter = buildUnnamed810();
+    o.autoEventFilter = buildUnnamed1103();
     o.checkValidation = buildParameter();
     o.containerId = "foo";
-    o.customEventFilter = buildUnnamed811();
+    o.customEventFilter = buildUnnamed1104();
     o.enableAllVideos = buildParameter();
     o.eventName = buildParameter();
-    o.filter = buildUnnamed812();
+    o.filter = buildUnnamed1105();
     o.fingerprint = "foo";
     o.interval = buildParameter();
     o.limit = buildParameter();
@@ -1081,13 +1094,13 @@
   buildCounterTrigger++;
   if (buildCounterTrigger < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed810(o.autoEventFilter);
+    checkUnnamed1103(o.autoEventFilter);
     checkParameter(o.checkValidation);
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkUnnamed811(o.customEventFilter);
+    checkUnnamed1104(o.customEventFilter);
     checkParameter(o.enableAllVideos);
     checkParameter(o.eventName);
-    checkUnnamed812(o.filter);
+    checkUnnamed1105(o.filter);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     checkParameter(o.interval);
     checkParameter(o.limit);
@@ -1102,14 +1115,14 @@
   buildCounterTrigger--;
 }
 
-buildUnnamed813() {
+buildUnnamed1106() {
   var o = new core.List<api.ContainerAccess>();
   o.add(buildContainerAccess());
   o.add(buildContainerAccess());
   return o;
 }
 
-checkUnnamed813(core.List<api.ContainerAccess> o) {
+checkUnnamed1106(core.List<api.ContainerAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContainerAccess(o[0]);
   checkContainerAccess(o[1]);
@@ -1122,7 +1135,7 @@
   if (buildCounterUserAccess < 3) {
     o.accountAccess = buildAccountAccess();
     o.accountId = "foo";
-    o.containerAccess = buildUnnamed813();
+    o.containerAccess = buildUnnamed1106();
     o.emailAddress = "foo";
     o.permissionId = "foo";
   }
@@ -1135,47 +1148,47 @@
   if (buildCounterUserAccess < 3) {
     checkAccountAccess(o.accountAccess);
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed813(o.containerAccess);
+    checkUnnamed1106(o.containerAccess);
     unittest.expect(o.emailAddress, unittest.equals('foo'));
     unittest.expect(o.permissionId, unittest.equals('foo'));
   }
   buildCounterUserAccess--;
 }
 
-buildUnnamed814() {
+buildUnnamed1107() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed814(core.List<core.String> o) {
+checkUnnamed1107(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed815() {
+buildUnnamed1108() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed815(core.List<core.String> o) {
+checkUnnamed1108(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed816() {
+buildUnnamed1109() {
   var o = new core.List<api.Parameter>();
   o.add(buildParameter());
   o.add(buildParameter());
   return o;
 }
 
-checkUnnamed816(core.List<api.Parameter> o) {
+checkUnnamed1109(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParameter(o[0]);
   checkParameter(o[1]);
@@ -1188,12 +1201,12 @@
   if (buildCounterVariable < 3) {
     o.accountId = "foo";
     o.containerId = "foo";
-    o.disablingTriggerId = buildUnnamed814();
-    o.enablingTriggerId = buildUnnamed815();
+    o.disablingTriggerId = buildUnnamed1107();
+    o.enablingTriggerId = buildUnnamed1108();
     o.fingerprint = "foo";
     o.name = "foo";
     o.notes = "foo";
-    o.parameter = buildUnnamed816();
+    o.parameter = buildUnnamed1109();
     o.scheduleEndMs = "foo";
     o.scheduleStartMs = "foo";
     o.type = "foo";
@@ -1208,12 +1221,12 @@
   if (buildCounterVariable < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkUnnamed814(o.disablingTriggerId);
-    checkUnnamed815(o.enablingTriggerId);
+    checkUnnamed1107(o.disablingTriggerId);
+    checkUnnamed1108(o.enablingTriggerId);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkUnnamed816(o.parameter);
+    checkUnnamed1109(o.parameter);
     unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
     unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
diff --git a/generated/googleapis/test/tasks/v1_test.dart b/generated/googleapis/test/tasks/v1_test.dart
index 75651a5..7ee8d82 100644
--- a/generated/googleapis/test/tasks/v1_test.dart
+++ b/generated/googleapis/test/tasks/v1_test.dart
@@ -39,14 +39,14 @@
   buildCounterTaskLinks--;
 }
 
-buildUnnamed1140() {
+buildUnnamed1110() {
   var o = new core.List<api.TaskLinks>();
   o.add(buildTaskLinks());
   o.add(buildTaskLinks());
   return o;
 }
 
-checkUnnamed1140(core.List<api.TaskLinks> o) {
+checkUnnamed1110(core.List<api.TaskLinks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaskLinks(o[0]);
   checkTaskLinks(o[1]);
@@ -64,7 +64,7 @@
     o.hidden = true;
     o.id = "foo";
     o.kind = "foo";
-    o.links = buildUnnamed1140();
+    o.links = buildUnnamed1110();
     o.notes = "foo";
     o.parent = "foo";
     o.position = "foo";
@@ -87,7 +87,7 @@
     unittest.expect(o.hidden, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1140(o.links);
+    checkUnnamed1110(o.links);
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.position, unittest.equals('foo'));
@@ -128,14 +128,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed1141() {
+buildUnnamed1111() {
   var o = new core.List<api.TaskList>();
   o.add(buildTaskList());
   o.add(buildTaskList());
   return o;
 }
 
-checkUnnamed1141(core.List<api.TaskList> o) {
+checkUnnamed1111(core.List<api.TaskList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaskList(o[0]);
   checkTaskList(o[1]);
@@ -147,7 +147,7 @@
   buildCounterTaskLists++;
   if (buildCounterTaskLists < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1141();
+    o.items = buildUnnamed1111();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -159,21 +159,21 @@
   buildCounterTaskLists++;
   if (buildCounterTaskLists < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1141(o.items);
+    checkUnnamed1111(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterTaskLists--;
 }
 
-buildUnnamed1142() {
+buildUnnamed1112() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1142(core.List<api.Task> o) {
+checkUnnamed1112(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -185,7 +185,7 @@
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1142();
+    o.items = buildUnnamed1112();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -197,7 +197,7 @@
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1142(o.items);
+    checkUnnamed1112(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/translate/v2_test.dart b/generated/googleapis/test/translate/v2_test.dart
index 617325b..6ec0c1e 100644
--- a/generated/googleapis/test/translate/v2_test.dart
+++ b/generated/googleapis/test/translate/v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed448() {
+buildUnnamed1113() {
   var o = new core.List<api.DetectionsResource>();
   o.add(buildDetectionsResource());
   o.add(buildDetectionsResource());
   return o;
 }
 
-checkUnnamed448(core.List<api.DetectionsResource> o) {
+checkUnnamed1113(core.List<api.DetectionsResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDetectionsResource(o[0]);
   checkDetectionsResource(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.DetectionsListResponse();
   buildCounterDetectionsListResponse++;
   if (buildCounterDetectionsListResponse < 3) {
-    o.detections = buildUnnamed448();
+    o.detections = buildUnnamed1113();
   }
   buildCounterDetectionsListResponse--;
   return o;
@@ -43,7 +43,7 @@
 checkDetectionsListResponse(api.DetectionsListResponse o) {
   buildCounterDetectionsListResponse++;
   if (buildCounterDetectionsListResponse < 3) {
-    checkUnnamed448(o.detections);
+    checkUnnamed1113(o.detections);
   }
   buildCounterDetectionsListResponse--;
 }
@@ -84,14 +84,14 @@
   checkDetectionsResourceElement(o[1]);
 }
 
-buildUnnamed449() {
+buildUnnamed1114() {
   var o = new core.List<api.LanguagesResource>();
   o.add(buildLanguagesResource());
   o.add(buildLanguagesResource());
   return o;
 }
 
-checkUnnamed449(core.List<api.LanguagesResource> o) {
+checkUnnamed1114(core.List<api.LanguagesResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLanguagesResource(o[0]);
   checkLanguagesResource(o[1]);
@@ -102,7 +102,7 @@
   var o = new api.LanguagesListResponse();
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
-    o.languages = buildUnnamed449();
+    o.languages = buildUnnamed1114();
   }
   buildCounterLanguagesListResponse--;
   return o;
@@ -111,7 +111,7 @@
 checkLanguagesListResponse(api.LanguagesListResponse o) {
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
-    checkUnnamed449(o.languages);
+    checkUnnamed1114(o.languages);
   }
   buildCounterLanguagesListResponse--;
 }
@@ -137,14 +137,14 @@
   buildCounterLanguagesResource--;
 }
 
-buildUnnamed450() {
+buildUnnamed1115() {
   var o = new core.List<api.TranslationsResource>();
   o.add(buildTranslationsResource());
   o.add(buildTranslationsResource());
   return o;
 }
 
-checkUnnamed450(core.List<api.TranslationsResource> o) {
+checkUnnamed1115(core.List<api.TranslationsResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTranslationsResource(o[0]);
   checkTranslationsResource(o[1]);
@@ -155,7 +155,7 @@
   var o = new api.TranslationsListResponse();
   buildCounterTranslationsListResponse++;
   if (buildCounterTranslationsListResponse < 3) {
-    o.translations = buildUnnamed450();
+    o.translations = buildUnnamed1115();
   }
   buildCounterTranslationsListResponse--;
   return o;
@@ -164,7 +164,7 @@
 checkTranslationsListResponse(api.TranslationsListResponse o) {
   buildCounterTranslationsListResponse++;
   if (buildCounterTranslationsListResponse < 3) {
-    checkUnnamed450(o.translations);
+    checkUnnamed1115(o.translations);
   }
   buildCounterTranslationsListResponse--;
 }
@@ -190,40 +190,40 @@
   buildCounterTranslationsResource--;
 }
 
-buildUnnamed451() {
+buildUnnamed1116() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed451(core.List<core.String> o) {
+checkUnnamed1116(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed452() {
+buildUnnamed1117() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed452(core.List<core.String> o) {
+checkUnnamed1117(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed453() {
+buildUnnamed1118() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed453(core.List<core.String> o) {
+checkUnnamed1118(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -299,7 +299,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.DetectionsResourceApi res = new api.TranslateApi(mock).detections;
-      var arg_q = buildUnnamed451();
+      var arg_q = buildUnnamed1116();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -401,9 +401,9 @@
 
       var mock = new common_test.HttpServerMock();
       api.TranslationsResourceApi res = new api.TranslateApi(mock).translations;
-      var arg_q = buildUnnamed452();
+      var arg_q = buildUnnamed1117();
       var arg_target = "foo";
-      var arg_cid = buildUnnamed453();
+      var arg_cid = buildUnnamed1118();
       var arg_format = "foo";
       var arg_source = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/urlshortener/v1_test.dart b/generated/googleapis/test/urlshortener/v1_test.dart
index 0eaf485..0ed32f3 100644
--- a/generated/googleapis/test/urlshortener/v1_test.dart
+++ b/generated/googleapis/test/urlshortener/v1_test.dart
@@ -16,53 +16,53 @@
 
 
 
-buildUnnamed454() {
+buildUnnamed1119() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed454(core.List<api.StringCount> o) {
+checkUnnamed1119(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed455() {
+buildUnnamed1120() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed455(core.List<api.StringCount> o) {
+checkUnnamed1120(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed456() {
+buildUnnamed1121() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed456(core.List<api.StringCount> o) {
+checkUnnamed1121(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed457() {
+buildUnnamed1122() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed457(core.List<api.StringCount> o) {
+checkUnnamed1122(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
@@ -73,11 +73,11 @@
   var o = new api.AnalyticsSnapshot();
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    o.browsers = buildUnnamed454();
-    o.countries = buildUnnamed455();
+    o.browsers = buildUnnamed1119();
+    o.countries = buildUnnamed1120();
     o.longUrlClicks = "foo";
-    o.platforms = buildUnnamed456();
-    o.referrers = buildUnnamed457();
+    o.platforms = buildUnnamed1121();
+    o.referrers = buildUnnamed1122();
     o.shortUrlClicks = "foo";
   }
   buildCounterAnalyticsSnapshot--;
@@ -87,11 +87,11 @@
 checkAnalyticsSnapshot(api.AnalyticsSnapshot o) {
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    checkUnnamed454(o.browsers);
-    checkUnnamed455(o.countries);
+    checkUnnamed1119(o.browsers);
+    checkUnnamed1120(o.countries);
     unittest.expect(o.longUrlClicks, unittest.equals('foo'));
-    checkUnnamed456(o.platforms);
-    checkUnnamed457(o.referrers);
+    checkUnnamed1121(o.platforms);
+    checkUnnamed1122(o.referrers);
     unittest.expect(o.shortUrlClicks, unittest.equals('foo'));
   }
   buildCounterAnalyticsSnapshot--;
@@ -174,14 +174,14 @@
   buildCounterUrl--;
 }
 
-buildUnnamed458() {
+buildUnnamed1123() {
   var o = new core.List<api.Url>();
   o.add(buildUrl());
   o.add(buildUrl());
   return o;
 }
 
-checkUnnamed458(core.List<api.Url> o) {
+checkUnnamed1123(core.List<api.Url> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrl(o[0]);
   checkUrl(o[1]);
@@ -192,7 +192,7 @@
   var o = new api.UrlHistory();
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    o.items = buildUnnamed458();
+    o.items = buildUnnamed1123();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -205,7 +205,7 @@
 checkUrlHistory(api.UrlHistory o) {
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    checkUnnamed458(o.items);
+    checkUnnamed1123(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
diff --git a/generated/googleapis/test/webfonts/v1_test.dart b/generated/googleapis/test/webfonts/v1_test.dart
index 567ddc5..c048c35 100644
--- a/generated/googleapis/test/webfonts/v1_test.dart
+++ b/generated/googleapis/test/webfonts/v1_test.dart
@@ -16,40 +16,40 @@
 
 
 
-buildUnnamed817() {
+buildUnnamed1124() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed817(core.Map<core.String, core.String> o) {
+checkUnnamed1124(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed818() {
+buildUnnamed1125() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed818(core.List<core.String> o) {
+checkUnnamed1125(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed819() {
+buildUnnamed1126() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed819(core.List<core.String> o) {
+checkUnnamed1126(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -62,11 +62,11 @@
   if (buildCounterWebfont < 3) {
     o.category = "foo";
     o.family = "foo";
-    o.files = buildUnnamed817();
+    o.files = buildUnnamed1124();
     o.kind = "foo";
     o.lastModified = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.subsets = buildUnnamed818();
-    o.variants = buildUnnamed819();
+    o.subsets = buildUnnamed1125();
+    o.variants = buildUnnamed1126();
     o.version = "foo";
   }
   buildCounterWebfont--;
@@ -78,24 +78,24 @@
   if (buildCounterWebfont < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
     unittest.expect(o.family, unittest.equals('foo'));
-    checkUnnamed817(o.files);
+    checkUnnamed1124(o.files);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastModified, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed818(o.subsets);
-    checkUnnamed819(o.variants);
+    checkUnnamed1125(o.subsets);
+    checkUnnamed1126(o.variants);
     unittest.expect(o.version, unittest.equals('foo'));
   }
   buildCounterWebfont--;
 }
 
-buildUnnamed820() {
+buildUnnamed1127() {
   var o = new core.List<api.Webfont>();
   o.add(buildWebfont());
   o.add(buildWebfont());
   return o;
 }
 
-checkUnnamed820(core.List<api.Webfont> o) {
+checkUnnamed1127(core.List<api.Webfont> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebfont(o[0]);
   checkWebfont(o[1]);
@@ -106,7 +106,7 @@
   var o = new api.WebfontList();
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    o.items = buildUnnamed820();
+    o.items = buildUnnamed1127();
     o.kind = "foo";
   }
   buildCounterWebfontList--;
@@ -116,7 +116,7 @@
 checkWebfontList(api.WebfontList o) {
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    checkUnnamed820(o.items);
+    checkUnnamed1127(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterWebfontList--;
diff --git a/generated/googleapis/test/webmasters/v3_test.dart b/generated/googleapis/test/webmasters/v3_test.dart
index 3fe17c2..63d5a85 100644
--- a/generated/googleapis/test/webmasters/v3_test.dart
+++ b/generated/googleapis/test/webmasters/v3_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed383() {
+buildUnnamed1128() {
   var o = new core.List<api.WmxSitemap>();
   o.add(buildWmxSitemap());
   o.add(buildWmxSitemap());
   return o;
 }
 
-checkUnnamed383(core.List<api.WmxSitemap> o) {
+checkUnnamed1128(core.List<api.WmxSitemap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSitemap(o[0]);
   checkWmxSitemap(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.SitemapsListResponse();
   buildCounterSitemapsListResponse++;
   if (buildCounterSitemapsListResponse < 3) {
-    o.sitemap = buildUnnamed383();
+    o.sitemap = buildUnnamed1128();
   }
   buildCounterSitemapsListResponse--;
   return o;
@@ -43,19 +43,19 @@
 checkSitemapsListResponse(api.SitemapsListResponse o) {
   buildCounterSitemapsListResponse++;
   if (buildCounterSitemapsListResponse < 3) {
-    checkUnnamed383(o.sitemap);
+    checkUnnamed1128(o.sitemap);
   }
   buildCounterSitemapsListResponse--;
 }
 
-buildUnnamed384() {
+buildUnnamed1129() {
   var o = new core.List<api.WmxSite>();
   o.add(buildWmxSite());
   o.add(buildWmxSite());
   return o;
 }
 
-checkUnnamed384(core.List<api.WmxSite> o) {
+checkUnnamed1129(core.List<api.WmxSite> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSite(o[0]);
   checkWmxSite(o[1]);
@@ -66,7 +66,7 @@
   var o = new api.SitesListResponse();
   buildCounterSitesListResponse++;
   if (buildCounterSitesListResponse < 3) {
-    o.siteEntry = buildUnnamed384();
+    o.siteEntry = buildUnnamed1129();
   }
   buildCounterSitesListResponse--;
   return o;
@@ -75,7 +75,7 @@
 checkSitesListResponse(api.SitesListResponse o) {
   buildCounterSitesListResponse++;
   if (buildCounterSitesListResponse < 3) {
-    checkUnnamed384(o.siteEntry);
+    checkUnnamed1129(o.siteEntry);
   }
   buildCounterSitesListResponse--;
 }
@@ -101,14 +101,14 @@
   buildCounterUrlCrawlErrorCount--;
 }
 
-buildUnnamed385() {
+buildUnnamed1130() {
   var o = new core.List<api.UrlCrawlErrorCount>();
   o.add(buildUrlCrawlErrorCount());
   o.add(buildUrlCrawlErrorCount());
   return o;
 }
 
-checkUnnamed385(core.List<api.UrlCrawlErrorCount> o) {
+checkUnnamed1130(core.List<api.UrlCrawlErrorCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorCount(o[0]);
   checkUrlCrawlErrorCount(o[1]);
@@ -120,7 +120,7 @@
   buildCounterUrlCrawlErrorCountsPerType++;
   if (buildCounterUrlCrawlErrorCountsPerType < 3) {
     o.category = "foo";
-    o.entries = buildUnnamed385();
+    o.entries = buildUnnamed1130();
     o.platform = "foo";
   }
   buildCounterUrlCrawlErrorCountsPerType--;
@@ -131,20 +131,20 @@
   buildCounterUrlCrawlErrorCountsPerType++;
   if (buildCounterUrlCrawlErrorCountsPerType < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
-    checkUnnamed385(o.entries);
+    checkUnnamed1130(o.entries);
     unittest.expect(o.platform, unittest.equals('foo'));
   }
   buildCounterUrlCrawlErrorCountsPerType--;
 }
 
-buildUnnamed386() {
+buildUnnamed1131() {
   var o = new core.List<api.UrlCrawlErrorCountsPerType>();
   o.add(buildUrlCrawlErrorCountsPerType());
   o.add(buildUrlCrawlErrorCountsPerType());
   return o;
 }
 
-checkUnnamed386(core.List<api.UrlCrawlErrorCountsPerType> o) {
+checkUnnamed1131(core.List<api.UrlCrawlErrorCountsPerType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorCountsPerType(o[0]);
   checkUrlCrawlErrorCountsPerType(o[1]);
@@ -155,7 +155,7 @@
   var o = new api.UrlCrawlErrorsCountsQueryResponse();
   buildCounterUrlCrawlErrorsCountsQueryResponse++;
   if (buildCounterUrlCrawlErrorsCountsQueryResponse < 3) {
-    o.countPerTypes = buildUnnamed386();
+    o.countPerTypes = buildUnnamed1131();
   }
   buildCounterUrlCrawlErrorsCountsQueryResponse--;
   return o;
@@ -164,7 +164,7 @@
 checkUrlCrawlErrorsCountsQueryResponse(api.UrlCrawlErrorsCountsQueryResponse o) {
   buildCounterUrlCrawlErrorsCountsQueryResponse++;
   if (buildCounterUrlCrawlErrorsCountsQueryResponse < 3) {
-    checkUnnamed386(o.countPerTypes);
+    checkUnnamed1131(o.countPerTypes);
   }
   buildCounterUrlCrawlErrorsCountsQueryResponse--;
 }
@@ -196,14 +196,14 @@
   buildCounterUrlCrawlErrorsSample--;
 }
 
-buildUnnamed387() {
+buildUnnamed1132() {
   var o = new core.List<api.UrlCrawlErrorsSample>();
   o.add(buildUrlCrawlErrorsSample());
   o.add(buildUrlCrawlErrorsSample());
   return o;
 }
 
-checkUnnamed387(core.List<api.UrlCrawlErrorsSample> o) {
+checkUnnamed1132(core.List<api.UrlCrawlErrorsSample> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorsSample(o[0]);
   checkUrlCrawlErrorsSample(o[1]);
@@ -214,7 +214,7 @@
   var o = new api.UrlCrawlErrorsSamplesListResponse();
   buildCounterUrlCrawlErrorsSamplesListResponse++;
   if (buildCounterUrlCrawlErrorsSamplesListResponse < 3) {
-    o.urlCrawlErrorSample = buildUnnamed387();
+    o.urlCrawlErrorSample = buildUnnamed1132();
   }
   buildCounterUrlCrawlErrorsSamplesListResponse--;
   return o;
@@ -223,32 +223,32 @@
 checkUrlCrawlErrorsSamplesListResponse(api.UrlCrawlErrorsSamplesListResponse o) {
   buildCounterUrlCrawlErrorsSamplesListResponse++;
   if (buildCounterUrlCrawlErrorsSamplesListResponse < 3) {
-    checkUnnamed387(o.urlCrawlErrorSample);
+    checkUnnamed1132(o.urlCrawlErrorSample);
   }
   buildCounterUrlCrawlErrorsSamplesListResponse--;
 }
 
-buildUnnamed388() {
+buildUnnamed1133() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed388(core.List<core.String> o) {
+checkUnnamed1133(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed389() {
+buildUnnamed1134() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed389(core.List<core.String> o) {
+checkUnnamed1134(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -259,8 +259,8 @@
   var o = new api.UrlSampleDetails();
   buildCounterUrlSampleDetails++;
   if (buildCounterUrlSampleDetails < 3) {
-    o.containingSitemaps = buildUnnamed388();
-    o.linkedFromUrls = buildUnnamed389();
+    o.containingSitemaps = buildUnnamed1133();
+    o.linkedFromUrls = buildUnnamed1134();
   }
   buildCounterUrlSampleDetails--;
   return o;
@@ -269,8 +269,8 @@
 checkUrlSampleDetails(api.UrlSampleDetails o) {
   buildCounterUrlSampleDetails++;
   if (buildCounterUrlSampleDetails < 3) {
-    checkUnnamed388(o.containingSitemaps);
-    checkUnnamed389(o.linkedFromUrls);
+    checkUnnamed1133(o.containingSitemaps);
+    checkUnnamed1134(o.linkedFromUrls);
   }
   buildCounterUrlSampleDetails--;
 }
@@ -296,14 +296,14 @@
   buildCounterWmxSite--;
 }
 
-buildUnnamed390() {
+buildUnnamed1135() {
   var o = new core.List<api.WmxSitemapContent>();
   o.add(buildWmxSitemapContent());
   o.add(buildWmxSitemapContent());
   return o;
 }
 
-checkUnnamed390(core.List<api.WmxSitemapContent> o) {
+checkUnnamed1135(core.List<api.WmxSitemapContent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSitemapContent(o[0]);
   checkWmxSitemapContent(o[1]);
@@ -314,7 +314,7 @@
   var o = new api.WmxSitemap();
   buildCounterWmxSitemap++;
   if (buildCounterWmxSitemap < 3) {
-    o.contents = buildUnnamed390();
+    o.contents = buildUnnamed1135();
     o.errors = "foo";
     o.isPending = true;
     o.isSitemapsIndex = true;
@@ -331,7 +331,7 @@
 checkWmxSitemap(api.WmxSitemap o) {
   buildCounterWmxSitemap++;
   if (buildCounterWmxSitemap < 3) {
-    checkUnnamed390(o.contents);
+    checkUnnamed1135(o.contents);
     unittest.expect(o.errors, unittest.equals('foo'));
     unittest.expect(o.isPending, unittest.isTrue);
     unittest.expect(o.isSitemapsIndex, unittest.isTrue);
diff --git a/generated/googleapis/test/youtube/v3_test.dart b/generated/googleapis/test/youtube/v3_test.dart
index 7bab177..993affc 100644
--- a/generated/googleapis/test/youtube/v3_test.dart
+++ b/generated/googleapis/test/youtube/v3_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed339() {
+buildUnnamed1136() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed339(core.List<core.String> o) {
+checkUnnamed1136(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -35,7 +35,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     o.allowed = true;
-    o.exception = buildUnnamed339();
+    o.exception = buildUnnamed1136();
   }
   buildCounterAccessPolicy--;
   return o;
@@ -45,7 +45,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     unittest.expect(o.allowed, unittest.isTrue);
-    checkUnnamed339(o.exception);
+    checkUnnamed1136(o.exception);
   }
   buildCounterAccessPolicy--;
 }
@@ -234,27 +234,27 @@
   buildCounterActivityContentDetailsPlaylistItem--;
 }
 
-buildUnnamed340() {
+buildUnnamed1137() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed340(core.List<core.String> o) {
+checkUnnamed1137(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed341() {
+buildUnnamed1138() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed341(core.List<core.String> o) {
+checkUnnamed1138(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -272,8 +272,8 @@
     o.customCtaButtonText = "foo";
     o.descriptionText = "foo";
     o.destinationUrl = "foo";
-    o.forecastingUrl = buildUnnamed340();
-    o.impressionUrl = buildUnnamed341();
+    o.forecastingUrl = buildUnnamed1137();
+    o.impressionUrl = buildUnnamed1138();
     o.videoId = "foo";
   }
   buildCounterActivityContentDetailsPromotedItem--;
@@ -290,8 +290,8 @@
     unittest.expect(o.customCtaButtonText, unittest.equals('foo'));
     unittest.expect(o.descriptionText, unittest.equals('foo'));
     unittest.expect(o.destinationUrl, unittest.equals('foo'));
-    checkUnnamed340(o.forecastingUrl);
-    checkUnnamed341(o.impressionUrl);
+    checkUnnamed1137(o.forecastingUrl);
+    checkUnnamed1138(o.impressionUrl);
     unittest.expect(o.videoId, unittest.equals('foo'));
   }
   buildCounterActivityContentDetailsPromotedItem--;
@@ -385,14 +385,14 @@
   buildCounterActivityContentDetailsUpload--;
 }
 
-buildUnnamed342() {
+buildUnnamed1139() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed342(core.List<api.Activity> o) {
+checkUnnamed1139(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -405,7 +405,7 @@
   if (buildCounterActivityListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed342();
+    o.items = buildUnnamed1139();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -422,7 +422,7 @@
   if (buildCounterActivityListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed342(o.items);
+    checkUnnamed1139(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -580,14 +580,14 @@
   buildCounterChannelBannerResource--;
 }
 
-buildUnnamed343() {
+buildUnnamed1140() {
   var o = new core.List<api.PropertyValue>();
   o.add(buildPropertyValue());
   o.add(buildPropertyValue());
   return o;
 }
 
-checkUnnamed343(core.List<api.PropertyValue> o) {
+checkUnnamed1140(core.List<api.PropertyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyValue(o[0]);
   checkPropertyValue(o[1]);
@@ -599,7 +599,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     o.channel = buildChannelSettings();
-    o.hints = buildUnnamed343();
+    o.hints = buildUnnamed1140();
     o.image = buildImageSettings();
     o.watch = buildWatchSettings();
   }
@@ -611,7 +611,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     checkChannelSettings(o.channel);
-    checkUnnamed343(o.hints);
+    checkUnnamed1140(o.hints);
     checkImageSettings(o.image);
     checkWatchSettings(o.watch);
   }
@@ -708,14 +708,14 @@
   buildCounterChannelConversionPing--;
 }
 
-buildUnnamed344() {
+buildUnnamed1141() {
   var o = new core.List<api.ChannelConversionPing>();
   o.add(buildChannelConversionPing());
   o.add(buildChannelConversionPing());
   return o;
 }
 
-checkUnnamed344(core.List<api.ChannelConversionPing> o) {
+checkUnnamed1141(core.List<api.ChannelConversionPing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelConversionPing(o[0]);
   checkChannelConversionPing(o[1]);
@@ -726,7 +726,7 @@
   var o = new api.ChannelConversionPings();
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    o.pings = buildUnnamed344();
+    o.pings = buildUnnamed1141();
   }
   buildCounterChannelConversionPings--;
   return o;
@@ -735,19 +735,19 @@
 checkChannelConversionPings(api.ChannelConversionPings o) {
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    checkUnnamed344(o.pings);
+    checkUnnamed1141(o.pings);
   }
   buildCounterChannelConversionPings--;
 }
 
-buildUnnamed345() {
+buildUnnamed1142() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed345(core.List<api.Channel> o) {
+checkUnnamed1142(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -760,7 +760,7 @@
   if (buildCounterChannelListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed345();
+    o.items = buildUnnamed1142();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -777,7 +777,7 @@
   if (buildCounterChannelListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed345(o.items);
+    checkUnnamed1142(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -815,27 +815,27 @@
   buildCounterChannelSection--;
 }
 
-buildUnnamed346() {
+buildUnnamed1143() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed346(core.List<core.String> o) {
+checkUnnamed1143(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed347() {
+buildUnnamed1144() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed347(core.List<core.String> o) {
+checkUnnamed1144(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -846,8 +846,8 @@
   var o = new api.ChannelSectionContentDetails();
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    o.channels = buildUnnamed346();
-    o.playlists = buildUnnamed347();
+    o.channels = buildUnnamed1143();
+    o.playlists = buildUnnamed1144();
   }
   buildCounterChannelSectionContentDetails--;
   return o;
@@ -856,20 +856,20 @@
 checkChannelSectionContentDetails(api.ChannelSectionContentDetails o) {
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    checkUnnamed346(o.channels);
-    checkUnnamed347(o.playlists);
+    checkUnnamed1143(o.channels);
+    checkUnnamed1144(o.playlists);
   }
   buildCounterChannelSectionContentDetails--;
 }
 
-buildUnnamed348() {
+buildUnnamed1145() {
   var o = new core.List<api.ChannelSection>();
   o.add(buildChannelSection());
   o.add(buildChannelSection());
   return o;
 }
 
-checkUnnamed348(core.List<api.ChannelSection> o) {
+checkUnnamed1145(core.List<api.ChannelSection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelSection(o[0]);
   checkChannelSection(o[1]);
@@ -882,7 +882,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed348();
+    o.items = buildUnnamed1145();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -895,7 +895,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed348(o.items);
+    checkUnnamed1145(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -929,14 +929,14 @@
   buildCounterChannelSectionSnippet--;
 }
 
-buildUnnamed349() {
+buildUnnamed1146() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed349(core.List<core.String> o) {
+checkUnnamed1146(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -950,7 +950,7 @@
     o.defaultTab = "foo";
     o.description = "foo";
     o.featuredChannelsTitle = "foo";
-    o.featuredChannelsUrls = buildUnnamed349();
+    o.featuredChannelsUrls = buildUnnamed1146();
     o.keywords = "foo";
     o.moderateComments = true;
     o.profileColor = "foo";
@@ -970,7 +970,7 @@
     unittest.expect(o.defaultTab, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.featuredChannelsTitle, unittest.equals('foo'));
-    checkUnnamed349(o.featuredChannelsUrls);
+    checkUnnamed1146(o.featuredChannelsUrls);
     unittest.expect(o.keywords, unittest.equals('foo'));
     unittest.expect(o.moderateComments, unittest.isTrue);
     unittest.expect(o.profileColor, unittest.equals('foo'));
@@ -1058,14 +1058,14 @@
   buildCounterChannelStatus--;
 }
 
-buildUnnamed350() {
+buildUnnamed1147() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed350(core.List<core.String> o) {
+checkUnnamed1147(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1076,7 +1076,7 @@
   var o = new api.ChannelTopicDetails();
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    o.topicIds = buildUnnamed350();
+    o.topicIds = buildUnnamed1147();
   }
   buildCounterChannelTopicDetails--;
   return o;
@@ -1085,19 +1085,19 @@
 checkChannelTopicDetails(api.ChannelTopicDetails o) {
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    checkUnnamed350(o.topicIds);
+    checkUnnamed1147(o.topicIds);
   }
   buildCounterChannelTopicDetails--;
 }
 
-buildUnnamed351() {
+buildUnnamed1148() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed351(core.List<core.String> o) {
+checkUnnamed1148(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1127,7 +1127,7 @@
     o.cscfRating = "foo";
     o.czfilmRating = "foo";
     o.djctqRating = "foo";
-    o.djctqRatingReasons = buildUnnamed351();
+    o.djctqRatingReasons = buildUnnamed1148();
     o.eefilmRating = "foo";
     o.egfilmRating = "foo";
     o.eirinRating = "foo";
@@ -1199,7 +1199,7 @@
     unittest.expect(o.cscfRating, unittest.equals('foo'));
     unittest.expect(o.czfilmRating, unittest.equals('foo'));
     unittest.expect(o.djctqRating, unittest.equals('foo'));
-    checkUnnamed351(o.djctqRatingReasons);
+    checkUnnamed1148(o.djctqRatingReasons);
     unittest.expect(o.eefilmRating, unittest.equals('foo'));
     unittest.expect(o.egfilmRating, unittest.equals('foo'));
     unittest.expect(o.eirinRating, unittest.equals('foo'));
@@ -1296,14 +1296,14 @@
   buildCounterGuideCategory--;
 }
 
-buildUnnamed352() {
+buildUnnamed1149() {
   var o = new core.List<api.GuideCategory>();
   o.add(buildGuideCategory());
   o.add(buildGuideCategory());
   return o;
 }
 
-checkUnnamed352(core.List<api.GuideCategory> o) {
+checkUnnamed1149(core.List<api.GuideCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGuideCategory(o[0]);
   checkGuideCategory(o[1]);
@@ -1316,7 +1316,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed352();
+    o.items = buildUnnamed1149();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1333,7 +1333,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed352(o.items);
+    checkUnnamed1149(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1390,14 +1390,14 @@
   buildCounterI18nLanguage--;
 }
 
-buildUnnamed353() {
+buildUnnamed1150() {
   var o = new core.List<api.I18nLanguage>();
   o.add(buildI18nLanguage());
   o.add(buildI18nLanguage());
   return o;
 }
 
-checkUnnamed353(core.List<api.I18nLanguage> o) {
+checkUnnamed1150(core.List<api.I18nLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nLanguage(o[0]);
   checkI18nLanguage(o[1]);
@@ -1410,7 +1410,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed353();
+    o.items = buildUnnamed1150();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -1423,7 +1423,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed353(o.items);
+    checkUnnamed1150(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -1476,14 +1476,14 @@
   buildCounterI18nRegion--;
 }
 
-buildUnnamed354() {
+buildUnnamed1151() {
   var o = new core.List<api.I18nRegion>();
   o.add(buildI18nRegion());
   o.add(buildI18nRegion());
   return o;
 }
 
-checkUnnamed354(core.List<api.I18nRegion> o) {
+checkUnnamed1151(core.List<api.I18nRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nRegion(o[0]);
   checkI18nRegion(o[1]);
@@ -1496,7 +1496,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed354();
+    o.items = buildUnnamed1151();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -1509,7 +1509,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed354(o.items);
+    checkUnnamed1151(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -1669,14 +1669,14 @@
   buildCounterInvideoPosition--;
 }
 
-buildUnnamed355() {
+buildUnnamed1152() {
   var o = new core.List<api.PromotedItem>();
   o.add(buildPromotedItem());
   o.add(buildPromotedItem());
   return o;
 }
 
-checkUnnamed355(core.List<api.PromotedItem> o) {
+checkUnnamed1152(core.List<api.PromotedItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotedItem(o[0]);
   checkPromotedItem(o[1]);
@@ -1688,7 +1688,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     o.defaultTiming = buildInvideoTiming();
-    o.items = buildUnnamed355();
+    o.items = buildUnnamed1152();
     o.position = buildInvideoPosition();
     o.useSmartTiming = true;
   }
@@ -1700,7 +1700,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     checkInvideoTiming(o.defaultTiming);
-    checkUnnamed355(o.items);
+    checkUnnamed1152(o.items);
     checkInvideoPosition(o.position);
     unittest.expect(o.useSmartTiming, unittest.isTrue);
   }
@@ -1792,14 +1792,14 @@
   buildCounterLiveBroadcastContentDetails--;
 }
 
-buildUnnamed356() {
+buildUnnamed1153() {
   var o = new core.List<api.LiveBroadcast>();
   o.add(buildLiveBroadcast());
   o.add(buildLiveBroadcast());
   return o;
 }
 
-checkUnnamed356(core.List<api.LiveBroadcast> o) {
+checkUnnamed1153(core.List<api.LiveBroadcast> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveBroadcast(o[0]);
   checkLiveBroadcast(o[1]);
@@ -1812,7 +1812,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed356();
+    o.items = buildUnnamed1153();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1829,7 +1829,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed356(o.items);
+    checkUnnamed1153(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1952,14 +1952,14 @@
   buildCounterLiveStreamContentDetails--;
 }
 
-buildUnnamed357() {
+buildUnnamed1154() {
   var o = new core.List<api.LiveStream>();
   o.add(buildLiveStream());
   o.add(buildLiveStream());
   return o;
 }
 
-checkUnnamed357(core.List<api.LiveStream> o) {
+checkUnnamed1154(core.List<api.LiveStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveStream(o[0]);
   checkLiveStream(o[1]);
@@ -1972,7 +1972,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed357();
+    o.items = buildUnnamed1154();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1989,7 +1989,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed357(o.items);
+    checkUnnamed1154(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2044,14 +2044,14 @@
   buildCounterLiveStreamStatus--;
 }
 
-buildUnnamed358() {
+buildUnnamed1155() {
   var o = new core.List<api.LocalizedString>();
   o.add(buildLocalizedString());
   o.add(buildLocalizedString());
   return o;
 }
 
-checkUnnamed358(core.List<api.LocalizedString> o) {
+checkUnnamed1155(core.List<api.LocalizedString> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedString(o[0]);
   checkLocalizedString(o[1]);
@@ -2063,7 +2063,7 @@
   buildCounterLocalizedProperty++;
   if (buildCounterLocalizedProperty < 3) {
     o.default_ = "foo";
-    o.localized = buildUnnamed358();
+    o.localized = buildUnnamed1155();
   }
   buildCounterLocalizedProperty--;
   return o;
@@ -2073,7 +2073,7 @@
   buildCounterLocalizedProperty++;
   if (buildCounterLocalizedProperty < 3) {
     unittest.expect(o.default_, unittest.equals('foo'));
-    checkUnnamed358(o.localized);
+    checkUnnamed1155(o.localized);
   }
   buildCounterLocalizedProperty--;
 }
@@ -2247,14 +2247,14 @@
   buildCounterPlaylistItemContentDetails--;
 }
 
-buildUnnamed359() {
+buildUnnamed1156() {
   var o = new core.List<api.PlaylistItem>();
   o.add(buildPlaylistItem());
   o.add(buildPlaylistItem());
   return o;
 }
 
-checkUnnamed359(core.List<api.PlaylistItem> o) {
+checkUnnamed1156(core.List<api.PlaylistItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylistItem(o[0]);
   checkPlaylistItem(o[1]);
@@ -2267,7 +2267,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed359();
+    o.items = buildUnnamed1156();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2284,7 +2284,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed359(o.items);
+    checkUnnamed1156(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2349,14 +2349,14 @@
   buildCounterPlaylistItemStatus--;
 }
 
-buildUnnamed360() {
+buildUnnamed1157() {
   var o = new core.List<api.Playlist>();
   o.add(buildPlaylist());
   o.add(buildPlaylist());
   return o;
 }
 
-checkUnnamed360(core.List<api.Playlist> o) {
+checkUnnamed1157(core.List<api.Playlist> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylist(o[0]);
   checkPlaylist(o[1]);
@@ -2369,7 +2369,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed360();
+    o.items = buildUnnamed1157();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2386,7 +2386,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed360(o.items);
+    checkUnnamed1157(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2416,14 +2416,14 @@
   buildCounterPlaylistPlayer--;
 }
 
-buildUnnamed361() {
+buildUnnamed1158() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed361(core.List<core.String> o) {
+checkUnnamed1158(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2438,7 +2438,7 @@
     o.channelTitle = "foo";
     o.description = "foo";
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed361();
+    o.tags = buildUnnamed1158();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -2453,7 +2453,7 @@
     unittest.expect(o.channelTitle, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed361(o.tags);
+    checkUnnamed1158(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -2575,14 +2575,14 @@
   buildCounterResourceId--;
 }
 
-buildUnnamed362() {
+buildUnnamed1159() {
   var o = new core.List<api.SearchResult>();
   o.add(buildSearchResult());
   o.add(buildSearchResult());
   return o;
 }
 
-checkUnnamed362(core.List<api.SearchResult> o) {
+checkUnnamed1159(core.List<api.SearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSearchResult(o[0]);
   checkSearchResult(o[1]);
@@ -2595,7 +2595,7 @@
   if (buildCounterSearchListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed362();
+    o.items = buildUnnamed1159();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2612,7 +2612,7 @@
   if (buildCounterSearchListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed362(o.items);
+    checkUnnamed1159(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2731,14 +2731,14 @@
   buildCounterSubscriptionContentDetails--;
 }
 
-buildUnnamed363() {
+buildUnnamed1160() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed363(core.List<api.Subscription> o) {
+checkUnnamed1160(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -2751,7 +2751,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed363();
+    o.items = buildUnnamed1160();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2768,7 +2768,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed363(o.items);
+    checkUnnamed1160(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2885,14 +2885,14 @@
   buildCounterThumbnailDetails--;
 }
 
-buildUnnamed364() {
+buildUnnamed1161() {
   var o = new core.List<api.ThumbnailDetails>();
   o.add(buildThumbnailDetails());
   o.add(buildThumbnailDetails());
   return o;
 }
 
-checkUnnamed364(core.List<api.ThumbnailDetails> o) {
+checkUnnamed1161(core.List<api.ThumbnailDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThumbnailDetails(o[0]);
   checkThumbnailDetails(o[1]);
@@ -2905,7 +2905,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed364();
+    o.items = buildUnnamed1161();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -2918,7 +2918,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed364(o.items);
+    checkUnnamed1161(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -3043,14 +3043,14 @@
   buildCounterVideoCategory--;
 }
 
-buildUnnamed365() {
+buildUnnamed1162() {
   var o = new core.List<api.VideoCategory>();
   o.add(buildVideoCategory());
   o.add(buildVideoCategory());
   return o;
 }
 
-checkUnnamed365(core.List<api.VideoCategory> o) {
+checkUnnamed1162(core.List<api.VideoCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoCategory(o[0]);
   checkVideoCategory(o[1]);
@@ -3063,7 +3063,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed365();
+    o.items = buildUnnamed1162();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3080,7 +3080,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed365(o.items);
+    checkUnnamed1162(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3147,27 +3147,27 @@
   buildCounterVideoContentDetails--;
 }
 
-buildUnnamed366() {
+buildUnnamed1163() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed366(core.List<core.String> o) {
+checkUnnamed1163(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed367() {
+buildUnnamed1164() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed367(core.List<core.String> o) {
+checkUnnamed1164(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3178,8 +3178,8 @@
   var o = new api.VideoContentDetailsRegionRestriction();
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    o.allowed = buildUnnamed366();
-    o.blocked = buildUnnamed367();
+    o.allowed = buildUnnamed1163();
+    o.blocked = buildUnnamed1164();
   }
   buildCounterVideoContentDetailsRegionRestriction--;
   return o;
@@ -3188,8 +3188,8 @@
 checkVideoContentDetailsRegionRestriction(api.VideoContentDetailsRegionRestriction o) {
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    checkUnnamed366(o.allowed);
-    checkUnnamed367(o.blocked);
+    checkUnnamed1163(o.allowed);
+    checkUnnamed1164(o.blocked);
   }
   buildCounterVideoContentDetailsRegionRestriction--;
 }
@@ -3215,14 +3215,14 @@
   buildCounterVideoConversionPing--;
 }
 
-buildUnnamed368() {
+buildUnnamed1165() {
   var o = new core.List<api.VideoConversionPing>();
   o.add(buildVideoConversionPing());
   o.add(buildVideoConversionPing());
   return o;
 }
 
-checkUnnamed368(core.List<api.VideoConversionPing> o) {
+checkUnnamed1165(core.List<api.VideoConversionPing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoConversionPing(o[0]);
   checkVideoConversionPing(o[1]);
@@ -3233,7 +3233,7 @@
   var o = new api.VideoConversionPings();
   buildCounterVideoConversionPings++;
   if (buildCounterVideoConversionPings < 3) {
-    o.pings = buildUnnamed368();
+    o.pings = buildUnnamed1165();
   }
   buildCounterVideoConversionPings--;
   return o;
@@ -3242,32 +3242,32 @@
 checkVideoConversionPings(api.VideoConversionPings o) {
   buildCounterVideoConversionPings++;
   if (buildCounterVideoConversionPings < 3) {
-    checkUnnamed368(o.pings);
+    checkUnnamed1165(o.pings);
   }
   buildCounterVideoConversionPings--;
 }
 
-buildUnnamed369() {
+buildUnnamed1166() {
   var o = new core.List<api.VideoFileDetailsAudioStream>();
   o.add(buildVideoFileDetailsAudioStream());
   o.add(buildVideoFileDetailsAudioStream());
   return o;
 }
 
-checkUnnamed369(core.List<api.VideoFileDetailsAudioStream> o) {
+checkUnnamed1166(core.List<api.VideoFileDetailsAudioStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsAudioStream(o[0]);
   checkVideoFileDetailsAudioStream(o[1]);
 }
 
-buildUnnamed370() {
+buildUnnamed1167() {
   var o = new core.List<api.VideoFileDetailsVideoStream>();
   o.add(buildVideoFileDetailsVideoStream());
   o.add(buildVideoFileDetailsVideoStream());
   return o;
 }
 
-checkUnnamed370(core.List<api.VideoFileDetailsVideoStream> o) {
+checkUnnamed1167(core.List<api.VideoFileDetailsVideoStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsVideoStream(o[0]);
   checkVideoFileDetailsVideoStream(o[1]);
@@ -3278,7 +3278,7 @@
   var o = new api.VideoFileDetails();
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    o.audioStreams = buildUnnamed369();
+    o.audioStreams = buildUnnamed1166();
     o.bitrateBps = "foo";
     o.container = "foo";
     o.creationTime = "foo";
@@ -3287,7 +3287,7 @@
     o.fileSize = "foo";
     o.fileType = "foo";
     o.recordingLocation = buildGeoPoint();
-    o.videoStreams = buildUnnamed370();
+    o.videoStreams = buildUnnamed1167();
   }
   buildCounterVideoFileDetails--;
   return o;
@@ -3296,7 +3296,7 @@
 checkVideoFileDetails(api.VideoFileDetails o) {
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    checkUnnamed369(o.audioStreams);
+    checkUnnamed1166(o.audioStreams);
     unittest.expect(o.bitrateBps, unittest.equals('foo'));
     unittest.expect(o.container, unittest.equals('foo'));
     unittest.expect(o.creationTime, unittest.equals('foo'));
@@ -3305,7 +3305,7 @@
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.fileType, unittest.equals('foo'));
     checkGeoPoint(o.recordingLocation);
-    checkUnnamed370(o.videoStreams);
+    checkUnnamed1167(o.videoStreams);
   }
   buildCounterVideoFileDetails--;
 }
@@ -3368,14 +3368,14 @@
   buildCounterVideoFileDetailsVideoStream--;
 }
 
-buildUnnamed371() {
+buildUnnamed1168() {
   var o = new core.List<api.VideoRating>();
   o.add(buildVideoRating());
   o.add(buildVideoRating());
   return o;
 }
 
-checkUnnamed371(core.List<api.VideoRating> o) {
+checkUnnamed1168(core.List<api.VideoRating> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoRating(o[0]);
   checkVideoRating(o[1]);
@@ -3387,8 +3387,10 @@
   buildCounterVideoGetRatingResponse++;
   if (buildCounterVideoGetRatingResponse < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed371();
+    o.eventId = "foo";
+    o.items = buildUnnamed1168();
     o.kind = "foo";
+    o.visitorId = "foo";
   }
   buildCounterVideoGetRatingResponse--;
   return o;
@@ -3398,20 +3400,22 @@
   buildCounterVideoGetRatingResponse++;
   if (buildCounterVideoGetRatingResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed371(o.items);
+    unittest.expect(o.eventId, unittest.equals('foo'));
+    checkUnnamed1168(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterVideoGetRatingResponse--;
 }
 
-buildUnnamed372() {
+buildUnnamed1169() {
   var o = new core.List<api.Video>();
   o.add(buildVideo());
   o.add(buildVideo());
   return o;
 }
 
-checkUnnamed372(core.List<api.Video> o) {
+checkUnnamed1169(core.List<api.Video> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideo(o[0]);
   checkVideo(o[1]);
@@ -3424,7 +3428,7 @@
   if (buildCounterVideoListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed372();
+    o.items = buildUnnamed1169();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3441,7 +3445,7 @@
   if (buildCounterVideoListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed372(o.items);
+    checkUnnamed1169(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3573,14 +3577,14 @@
   buildCounterVideoProcessingDetailsProcessingProgress--;
 }
 
-buildUnnamed373() {
+buildUnnamed1170() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed373(core.List<core.String> o) {
+checkUnnamed1170(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3591,7 +3595,7 @@
   var o = new api.VideoProjectDetails();
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    o.tags = buildUnnamed373();
+    o.tags = buildUnnamed1170();
   }
   buildCounterVideoProjectDetails--;
   return o;
@@ -3600,7 +3604,7 @@
 checkVideoProjectDetails(api.VideoProjectDetails o) {
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    checkUnnamed373(o.tags);
+    checkUnnamed1170(o.tags);
   }
   buildCounterVideoProjectDetails--;
 }
@@ -3649,14 +3653,14 @@
   buildCounterVideoRecordingDetails--;
 }
 
-buildUnnamed374() {
+buildUnnamed1171() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed374(core.List<core.String> o) {
+checkUnnamed1171(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3673,7 +3677,7 @@
     o.description = "foo";
     o.liveBroadcastContent = "foo";
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed374();
+    o.tags = buildUnnamed1171();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -3690,7 +3694,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.liveBroadcastContent, unittest.equals('foo'));
     unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed374(o.tags);
+    checkUnnamed1171(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -3757,66 +3761,66 @@
   buildCounterVideoStatus--;
 }
 
-buildUnnamed375() {
+buildUnnamed1172() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed375(core.List<core.String> o) {
+checkUnnamed1172(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed376() {
+buildUnnamed1173() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed376(core.List<core.String> o) {
+checkUnnamed1173(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed377() {
+buildUnnamed1174() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed377(core.List<core.String> o) {
+checkUnnamed1174(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed378() {
+buildUnnamed1175() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed378(core.List<core.String> o) {
+checkUnnamed1175(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed379() {
+buildUnnamed1176() {
   var o = new core.List<api.VideoSuggestionsTagSuggestion>();
   o.add(buildVideoSuggestionsTagSuggestion());
   o.add(buildVideoSuggestionsTagSuggestion());
   return o;
 }
 
-checkUnnamed379(core.List<api.VideoSuggestionsTagSuggestion> o) {
+checkUnnamed1176(core.List<api.VideoSuggestionsTagSuggestion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoSuggestionsTagSuggestion(o[0]);
   checkVideoSuggestionsTagSuggestion(o[1]);
@@ -3827,11 +3831,11 @@
   var o = new api.VideoSuggestions();
   buildCounterVideoSuggestions++;
   if (buildCounterVideoSuggestions < 3) {
-    o.editorSuggestions = buildUnnamed375();
-    o.processingErrors = buildUnnamed376();
-    o.processingHints = buildUnnamed377();
-    o.processingWarnings = buildUnnamed378();
-    o.tagSuggestions = buildUnnamed379();
+    o.editorSuggestions = buildUnnamed1172();
+    o.processingErrors = buildUnnamed1173();
+    o.processingHints = buildUnnamed1174();
+    o.processingWarnings = buildUnnamed1175();
+    o.tagSuggestions = buildUnnamed1176();
   }
   buildCounterVideoSuggestions--;
   return o;
@@ -3840,23 +3844,23 @@
 checkVideoSuggestions(api.VideoSuggestions o) {
   buildCounterVideoSuggestions++;
   if (buildCounterVideoSuggestions < 3) {
-    checkUnnamed375(o.editorSuggestions);
-    checkUnnamed376(o.processingErrors);
-    checkUnnamed377(o.processingHints);
-    checkUnnamed378(o.processingWarnings);
-    checkUnnamed379(o.tagSuggestions);
+    checkUnnamed1172(o.editorSuggestions);
+    checkUnnamed1173(o.processingErrors);
+    checkUnnamed1174(o.processingHints);
+    checkUnnamed1175(o.processingWarnings);
+    checkUnnamed1176(o.tagSuggestions);
   }
   buildCounterVideoSuggestions--;
 }
 
-buildUnnamed380() {
+buildUnnamed1177() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed380(core.List<core.String> o) {
+checkUnnamed1177(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3867,7 +3871,7 @@
   var o = new api.VideoSuggestionsTagSuggestion();
   buildCounterVideoSuggestionsTagSuggestion++;
   if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    o.categoryRestricts = buildUnnamed380();
+    o.categoryRestricts = buildUnnamed1177();
     o.tag = "foo";
   }
   buildCounterVideoSuggestionsTagSuggestion--;
@@ -3877,33 +3881,33 @@
 checkVideoSuggestionsTagSuggestion(api.VideoSuggestionsTagSuggestion o) {
   buildCounterVideoSuggestionsTagSuggestion++;
   if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    checkUnnamed380(o.categoryRestricts);
+    checkUnnamed1177(o.categoryRestricts);
     unittest.expect(o.tag, unittest.equals('foo'));
   }
   buildCounterVideoSuggestionsTagSuggestion--;
 }
 
-buildUnnamed381() {
+buildUnnamed1178() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed381(core.List<core.String> o) {
+checkUnnamed1178(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed382() {
+buildUnnamed1179() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed382(core.List<core.String> o) {
+checkUnnamed1179(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3914,8 +3918,8 @@
   var o = new api.VideoTopicDetails();
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    o.relevantTopicIds = buildUnnamed381();
-    o.topicIds = buildUnnamed382();
+    o.relevantTopicIds = buildUnnamed1178();
+    o.topicIds = buildUnnamed1179();
   }
   buildCounterVideoTopicDetails--;
   return o;
@@ -3924,8 +3928,8 @@
 checkVideoTopicDetails(api.VideoTopicDetails o) {
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    checkUnnamed381(o.relevantTopicIds);
-    checkUnnamed382(o.topicIds);
+    checkUnnamed1178(o.relevantTopicIds);
+    checkUnnamed1179(o.topicIds);
   }
   buildCounterVideoTopicDetails--;
 }
diff --git a/generated/googleapis/test/youtubeanalytics/v1_test.dart b/generated/googleapis/test/youtubeanalytics/v1_test.dart
index 00381c4..2f288e6 100644
--- a/generated/googleapis/test/youtubeanalytics/v1_test.dart
+++ b/generated/googleapis/test/youtubeanalytics/v1_test.dart
@@ -16,17 +16,130 @@
 
 
 
-buildUnnamed182() {
-  var o = new core.List<api.BatchReportDefinitionTemplate>();
-  o.add(buildBatchReportDefinitionTemplate());
-  o.add(buildBatchReportDefinitionTemplate());
+core.int buildCounterBatchReportOutputs = 0;
+buildBatchReportOutputs() {
+  var o = new api.BatchReportOutputs();
+  buildCounterBatchReportOutputs++;
+  if (buildCounterBatchReportOutputs < 3) {
+    o.downloadUrl = "foo";
+    o.format = "foo";
+    o.type = "foo";
+  }
+  buildCounterBatchReportOutputs--;
   return o;
 }
 
-checkUnnamed182(core.List<api.BatchReportDefinitionTemplate> o) {
+checkBatchReportOutputs(api.BatchReportOutputs o) {
+  buildCounterBatchReportOutputs++;
+  if (buildCounterBatchReportOutputs < 3) {
+    unittest.expect(o.downloadUrl, unittest.equals('foo'));
+    unittest.expect(o.format, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterBatchReportOutputs--;
+}
+
+buildUnnamed1180() {
+  var o = new core.List<api.BatchReportOutputs>();
+  o.add(buildBatchReportOutputs());
+  o.add(buildBatchReportOutputs());
+  return o;
+}
+
+checkUnnamed1180(core.List<api.BatchReportOutputs> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBatchReportDefinitionTemplate(o[0]);
-  checkBatchReportDefinitionTemplate(o[1]);
+  checkBatchReportOutputs(o[0]);
+  checkBatchReportOutputs(o[1]);
+}
+
+core.int buildCounterBatchReportTimeSpan = 0;
+buildBatchReportTimeSpan() {
+  var o = new api.BatchReportTimeSpan();
+  buildCounterBatchReportTimeSpan++;
+  if (buildCounterBatchReportTimeSpan < 3) {
+    o.endTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.startTime = core.DateTime.parse("2002-02-27T14:01:02");
+  }
+  buildCounterBatchReportTimeSpan--;
+  return o;
+}
+
+checkBatchReportTimeSpan(api.BatchReportTimeSpan o) {
+  buildCounterBatchReportTimeSpan++;
+  if (buildCounterBatchReportTimeSpan < 3) {
+    unittest.expect(o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.startTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+  }
+  buildCounterBatchReportTimeSpan--;
+}
+
+core.int buildCounterBatchReport = 0;
+buildBatchReport() {
+  var o = new api.BatchReport();
+  buildCounterBatchReport++;
+  if (buildCounterBatchReport < 3) {
+    o.id = "foo";
+    o.kind = "foo";
+    o.outputs = buildUnnamed1180();
+    o.reportId = "foo";
+    o.timeSpan = buildBatchReportTimeSpan();
+    o.timeUpdated = core.DateTime.parse("2002-02-27T14:01:02");
+  }
+  buildCounterBatchReport--;
+  return o;
+}
+
+checkBatchReport(api.BatchReport o) {
+  buildCounterBatchReport++;
+  if (buildCounterBatchReport < 3) {
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+    checkUnnamed1180(o.outputs);
+    unittest.expect(o.reportId, unittest.equals('foo'));
+    checkBatchReportTimeSpan(o.timeSpan);
+    unittest.expect(o.timeUpdated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+  }
+  buildCounterBatchReport--;
+}
+
+core.int buildCounterBatchReportDefinition = 0;
+buildBatchReportDefinition() {
+  var o = new api.BatchReportDefinition();
+  buildCounterBatchReportDefinition++;
+  if (buildCounterBatchReportDefinition < 3) {
+    o.id = "foo";
+    o.kind = "foo";
+    o.name = "foo";
+    o.status = "foo";
+    o.type = "foo";
+  }
+  buildCounterBatchReportDefinition--;
+  return o;
+}
+
+checkBatchReportDefinition(api.BatchReportDefinition o) {
+  buildCounterBatchReportDefinition++;
+  if (buildCounterBatchReportDefinition < 3) {
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.status, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterBatchReportDefinition--;
+}
+
+buildUnnamed1181() {
+  var o = new core.List<api.BatchReportDefinition>();
+  o.add(buildBatchReportDefinition());
+  o.add(buildBatchReportDefinition());
+  return o;
+}
+
+checkUnnamed1181(core.List<api.BatchReportDefinition> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkBatchReportDefinition(o[0]);
+  checkBatchReportDefinition(o[1]);
 }
 
 core.int buildCounterBatchReportDefinitionList = 0;
@@ -34,7 +147,7 @@
   var o = new api.BatchReportDefinitionList();
   buildCounterBatchReportDefinitionList++;
   if (buildCounterBatchReportDefinitionList < 3) {
-    o.items = buildUnnamed182();
+    o.items = buildUnnamed1181();
     o.kind = "foo";
   }
   buildCounterBatchReportDefinitionList--;
@@ -44,84 +157,23 @@
 checkBatchReportDefinitionList(api.BatchReportDefinitionList o) {
   buildCounterBatchReportDefinitionList++;
   if (buildCounterBatchReportDefinitionList < 3) {
-    checkUnnamed182(o.items);
+    checkUnnamed1181(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBatchReportDefinitionList--;
 }
 
-core.int buildCounterBatchReportDefinitionTemplateDefaultOutput = 0;
-buildBatchReportDefinitionTemplateDefaultOutput() {
-  var o = new api.BatchReportDefinitionTemplateDefaultOutput();
-  buildCounterBatchReportDefinitionTemplateDefaultOutput++;
-  if (buildCounterBatchReportDefinitionTemplateDefaultOutput < 3) {
-    o.format = "foo";
-    o.type = "foo";
-  }
-  buildCounterBatchReportDefinitionTemplateDefaultOutput--;
+buildUnnamed1182() {
+  var o = new core.List<api.BatchReport>();
+  o.add(buildBatchReport());
+  o.add(buildBatchReport());
   return o;
 }
 
-checkBatchReportDefinitionTemplateDefaultOutput(api.BatchReportDefinitionTemplateDefaultOutput o) {
-  buildCounterBatchReportDefinitionTemplateDefaultOutput++;
-  if (buildCounterBatchReportDefinitionTemplateDefaultOutput < 3) {
-    unittest.expect(o.format, unittest.equals('foo'));
-    unittest.expect(o.type, unittest.equals('foo'));
-  }
-  buildCounterBatchReportDefinitionTemplateDefaultOutput--;
-}
-
-buildUnnamed183() {
-  var o = new core.List<api.BatchReportDefinitionTemplateDefaultOutput>();
-  o.add(buildBatchReportDefinitionTemplateDefaultOutput());
-  o.add(buildBatchReportDefinitionTemplateDefaultOutput());
-  return o;
-}
-
-checkUnnamed183(core.List<api.BatchReportDefinitionTemplateDefaultOutput> o) {
+checkUnnamed1182(core.List<api.BatchReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBatchReportDefinitionTemplateDefaultOutput(o[0]);
-  checkBatchReportDefinitionTemplateDefaultOutput(o[1]);
-}
-
-core.int buildCounterBatchReportDefinitionTemplate = 0;
-buildBatchReportDefinitionTemplate() {
-  var o = new api.BatchReportDefinitionTemplate();
-  buildCounterBatchReportDefinitionTemplate++;
-  if (buildCounterBatchReportDefinitionTemplate < 3) {
-    o.defaultOutput = buildUnnamed183();
-    o.id = "foo";
-    o.name = "foo";
-    o.status = "foo";
-    o.type = "foo";
-  }
-  buildCounterBatchReportDefinitionTemplate--;
-  return o;
-}
-
-checkBatchReportDefinitionTemplate(api.BatchReportDefinitionTemplate o) {
-  buildCounterBatchReportDefinitionTemplate++;
-  if (buildCounterBatchReportDefinitionTemplate < 3) {
-    checkUnnamed183(o.defaultOutput);
-    unittest.expect(o.id, unittest.equals('foo'));
-    unittest.expect(o.name, unittest.equals('foo'));
-    unittest.expect(o.status, unittest.equals('foo'));
-    unittest.expect(o.type, unittest.equals('foo'));
-  }
-  buildCounterBatchReportDefinitionTemplate--;
-}
-
-buildUnnamed184() {
-  var o = new core.List<api.BatchReportTemplate>();
-  o.add(buildBatchReportTemplate());
-  o.add(buildBatchReportTemplate());
-  return o;
-}
-
-checkUnnamed184(core.List<api.BatchReportTemplate> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkBatchReportTemplate(o[0]);
-  checkBatchReportTemplate(o[1]);
+  checkBatchReport(o[0]);
+  checkBatchReport(o[1]);
 }
 
 core.int buildCounterBatchReportList = 0;
@@ -129,7 +181,7 @@
   var o = new api.BatchReportList();
   buildCounterBatchReportList++;
   if (buildCounterBatchReportList < 3) {
-    o.items = buildUnnamed184();
+    o.items = buildUnnamed1182();
     o.kind = "foo";
   }
   buildCounterBatchReportList--;
@@ -139,96 +191,12 @@
 checkBatchReportList(api.BatchReportList o) {
   buildCounterBatchReportList++;
   if (buildCounterBatchReportList < 3) {
-    checkUnnamed184(o.items);
+    checkUnnamed1182(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBatchReportList--;
 }
 
-core.int buildCounterBatchReportTemplateOutputs = 0;
-buildBatchReportTemplateOutputs() {
-  var o = new api.BatchReportTemplateOutputs();
-  buildCounterBatchReportTemplateOutputs++;
-  if (buildCounterBatchReportTemplateOutputs < 3) {
-    o.downloadUrl = "foo";
-    o.format = "foo";
-    o.type = "foo";
-  }
-  buildCounterBatchReportTemplateOutputs--;
-  return o;
-}
-
-checkBatchReportTemplateOutputs(api.BatchReportTemplateOutputs o) {
-  buildCounterBatchReportTemplateOutputs++;
-  if (buildCounterBatchReportTemplateOutputs < 3) {
-    unittest.expect(o.downloadUrl, unittest.equals('foo'));
-    unittest.expect(o.format, unittest.equals('foo'));
-    unittest.expect(o.type, unittest.equals('foo'));
-  }
-  buildCounterBatchReportTemplateOutputs--;
-}
-
-buildUnnamed185() {
-  var o = new core.List<api.BatchReportTemplateOutputs>();
-  o.add(buildBatchReportTemplateOutputs());
-  o.add(buildBatchReportTemplateOutputs());
-  return o;
-}
-
-checkUnnamed185(core.List<api.BatchReportTemplateOutputs> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkBatchReportTemplateOutputs(o[0]);
-  checkBatchReportTemplateOutputs(o[1]);
-}
-
-core.int buildCounterBatchReportTemplateTimeSpan = 0;
-buildBatchReportTemplateTimeSpan() {
-  var o = new api.BatchReportTemplateTimeSpan();
-  buildCounterBatchReportTemplateTimeSpan++;
-  if (buildCounterBatchReportTemplateTimeSpan < 3) {
-    o.endTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.startTime = core.DateTime.parse("2002-02-27T14:01:02");
-  }
-  buildCounterBatchReportTemplateTimeSpan--;
-  return o;
-}
-
-checkBatchReportTemplateTimeSpan(api.BatchReportTemplateTimeSpan o) {
-  buildCounterBatchReportTemplateTimeSpan++;
-  if (buildCounterBatchReportTemplateTimeSpan < 3) {
-    unittest.expect(o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    unittest.expect(o.startTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-  }
-  buildCounterBatchReportTemplateTimeSpan--;
-}
-
-core.int buildCounterBatchReportTemplate = 0;
-buildBatchReportTemplate() {
-  var o = new api.BatchReportTemplate();
-  buildCounterBatchReportTemplate++;
-  if (buildCounterBatchReportTemplate < 3) {
-    o.id = "foo";
-    o.outputs = buildUnnamed185();
-    o.reportId = "foo";
-    o.timeSpan = buildBatchReportTemplateTimeSpan();
-    o.timeUpdated = core.DateTime.parse("2002-02-27T14:01:02");
-  }
-  buildCounterBatchReportTemplate--;
-  return o;
-}
-
-checkBatchReportTemplate(api.BatchReportTemplate o) {
-  buildCounterBatchReportTemplate++;
-  if (buildCounterBatchReportTemplate < 3) {
-    unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed185(o.outputs);
-    unittest.expect(o.reportId, unittest.equals('foo'));
-    checkBatchReportTemplateTimeSpan(o.timeSpan);
-    unittest.expect(o.timeUpdated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-  }
-  buildCounterBatchReportTemplate--;
-}
-
 core.int buildCounterResultTableColumnHeaders = 0;
 buildResultTableColumnHeaders() {
   var o = new api.ResultTableColumnHeaders();
@@ -252,43 +220,43 @@
   buildCounterResultTableColumnHeaders--;
 }
 
-buildUnnamed186() {
+buildUnnamed1183() {
   var o = new core.List<api.ResultTableColumnHeaders>();
   o.add(buildResultTableColumnHeaders());
   o.add(buildResultTableColumnHeaders());
   return o;
 }
 
-checkUnnamed186(core.List<api.ResultTableColumnHeaders> o) {
+checkUnnamed1183(core.List<api.ResultTableColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultTableColumnHeaders(o[0]);
   checkResultTableColumnHeaders(o[1]);
 }
 
-buildUnnamed187() {
+buildUnnamed1184() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed187(core.List<core.Object> o) {
+checkUnnamed1184(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed188() {
+buildUnnamed1185() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed187());
-  o.add(buildUnnamed187());
+  o.add(buildUnnamed1184());
+  o.add(buildUnnamed1184());
   return o;
 }
 
-checkUnnamed188(core.List<core.List<core.Object>> o) {
+checkUnnamed1185(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed187(o[0]);
-  checkUnnamed187(o[1]);
+  checkUnnamed1184(o[0]);
+  checkUnnamed1184(o[1]);
 }
 
 core.int buildCounterResultTable = 0;
@@ -296,9 +264,9 @@
   var o = new api.ResultTable();
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    o.columnHeaders = buildUnnamed186();
+    o.columnHeaders = buildUnnamed1183();
     o.kind = "foo";
-    o.rows = buildUnnamed188();
+    o.rows = buildUnnamed1185();
   }
   buildCounterResultTable--;
   return o;
@@ -307,15 +275,51 @@
 checkResultTable(api.ResultTable o) {
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    checkUnnamed186(o.columnHeaders);
+    checkUnnamed1183(o.columnHeaders);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed188(o.rows);
+    checkUnnamed1185(o.rows);
   }
   buildCounterResultTable--;
 }
 
 
 main() {
+  unittest.group("obj-schema-BatchReportOutputs", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildBatchReportOutputs();
+      var od = new api.BatchReportOutputs.fromJson(o.toJson());
+      checkBatchReportOutputs(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-BatchReportTimeSpan", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildBatchReportTimeSpan();
+      var od = new api.BatchReportTimeSpan.fromJson(o.toJson());
+      checkBatchReportTimeSpan(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-BatchReport", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildBatchReport();
+      var od = new api.BatchReport.fromJson(o.toJson());
+      checkBatchReport(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-BatchReportDefinition", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildBatchReportDefinition();
+      var od = new api.BatchReportDefinition.fromJson(o.toJson());
+      checkBatchReportDefinition(od);
+    });
+  });
+
+
   unittest.group("obj-schema-BatchReportDefinitionList", () {
     unittest.test("to-json--from-json", () {
       var o = buildBatchReportDefinitionList();
@@ -325,24 +329,6 @@
   });
 
 
-  unittest.group("obj-schema-BatchReportDefinitionTemplateDefaultOutput", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildBatchReportDefinitionTemplateDefaultOutput();
-      var od = new api.BatchReportDefinitionTemplateDefaultOutput.fromJson(o.toJson());
-      checkBatchReportDefinitionTemplateDefaultOutput(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-BatchReportDefinitionTemplate", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildBatchReportDefinitionTemplate();
-      var od = new api.BatchReportDefinitionTemplate.fromJson(o.toJson());
-      checkBatchReportDefinitionTemplate(od);
-    });
-  });
-
-
   unittest.group("obj-schema-BatchReportList", () {
     unittest.test("to-json--from-json", () {
       var o = buildBatchReportList();
@@ -352,33 +338,6 @@
   });
 
 
-  unittest.group("obj-schema-BatchReportTemplateOutputs", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildBatchReportTemplateOutputs();
-      var od = new api.BatchReportTemplateOutputs.fromJson(o.toJson());
-      checkBatchReportTemplateOutputs(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-BatchReportTemplateTimeSpan", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildBatchReportTemplateTimeSpan();
-      var od = new api.BatchReportTemplateTimeSpan.fromJson(o.toJson());
-      checkBatchReportTemplateTimeSpan(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-BatchReportTemplate", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildBatchReportTemplate();
-      var od = new api.BatchReportTemplate.fromJson(o.toJson());
-      checkBatchReportTemplate(od);
-    });
-  });
-
-
   unittest.group("obj-schema-ResultTableColumnHeaders", () {
     unittest.test("to-json--from-json", () {
       var o = buildResultTableColumnHeaders();
diff --git a/generated/googleapis_beta/CHANGELOG.md b/generated/googleapis_beta/CHANGELOG.md
index ff485f4..1c4cb6d 100644
--- a/generated/googleapis_beta/CHANGELOG.md
+++ b/generated/googleapis_beta/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.5.2
+
+* [apis] container:v1beta1: schema changes
+* [apis] replicapoolupdater:v1beta1: schema changes
+
 ## 0.5.1
 
 * [apis] pubsub:v1beta1: schema changes
diff --git a/generated/googleapis_beta/README.md b/generated/googleapis_beta/README.md
index e9e7b12..a36886c 100644
--- a/generated/googleapis_beta/README.md
+++ b/generated/googleapis_beta/README.md
@@ -84,6 +84,8 @@
 
 The Google Container Engine API is used for building and managing container based applications, powered by the open source Kubernetes technology.
 
+Official API documentation: https://cloud.google.com/container-engine/docs/v1beta1/
+
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Google Cloud Datastore API - datastore v1beta2
 
 API for accessing Google Cloud Datastore.
@@ -130,7 +132,7 @@
 
 The Google Compute Engine Instance Group Updater API provides services for updating groups of Compute Engine Instances.
 
-Official API documentation: https://developers.google.com/compute/docs/instance-groups/manager/v1beta2
+Official API documentation: https://cloud.google.com/compute/docs/instance-groups/manager/#applying_rolling_updates_using_the_updater_service
 
 #### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Resource Views API - resourceviews v1beta1
 
diff --git a/generated/googleapis_beta/lib/container/v1beta1.dart b/generated/googleapis_beta/lib/container/v1beta1.dart
index 7f4c9e5..49c42f4 100644
--- a/generated/googleapis_beta/lib/container/v1beta1.dart
+++ b/generated/googleapis_beta/lib/container/v1beta1.dart
@@ -538,6 +538,12 @@
   core.String name;
 
   /**
+   * The name of the Google Compute Engine network to which the cluster is
+   * connected.
+   */
+  core.String network;
+
+  /**
    * The machine type and image to use for all nodes in this cluster. See the
    * descriptions of the child properties of nodeConfig.
    */
@@ -611,6 +617,9 @@
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
+    if (_json.containsKey("network")) {
+      network = _json["network"];
+    }
     if (_json.containsKey("nodeConfig")) {
       nodeConfig = new NodeConfig.fromJson(_json["nodeConfig"]);
     }
@@ -657,6 +666,9 @@
     if (name != null) {
       _json["name"] = name;
     }
+    if (network != null) {
+      _json["network"] = network;
+    }
     if (nodeConfig != null) {
       _json["nodeConfig"] = (nodeConfig).toJson();
     }
@@ -900,6 +912,9 @@
    */
   core.String operationType;
 
+  /** Server-defined URL for the resource. */
+  core.String selfLink;
+
   /**
    * The current status of the operation.
    * Possible string values are:
@@ -934,6 +949,9 @@
     if (_json.containsKey("operationType")) {
       operationType = _json["operationType"];
     }
+    if (_json.containsKey("selfLink")) {
+      selfLink = _json["selfLink"];
+    }
     if (_json.containsKey("status")) {
       status = _json["status"];
     }
@@ -956,6 +974,9 @@
     if (operationType != null) {
       _json["operationType"] = operationType;
     }
+    if (selfLink != null) {
+      _json["selfLink"] = selfLink;
+    }
     if (status != null) {
       _json["status"] = status;
     }
diff --git a/generated/googleapis_beta/lib/genomics/v1beta2.dart b/generated/googleapis_beta/lib/genomics/v1beta2.dart
index b0e678f..7386460 100644
--- a/generated/googleapis_beta/lib/genomics/v1beta2.dart
+++ b/generated/googleapis_beta/lib/genomics/v1beta2.dart
@@ -3940,7 +3940,25 @@
  * reference sequence, in addition to metadata about the fragment (the molecule
  * of DNA sequenced) and the read (the bases which were read by the sequencer).
  * A read is equivalent to a line in a SAM file. A read belongs to exactly one
- * read group and exactly one read group set.
+ * read group and exactly one read group set. Generating a reference-aligned
+ * sequence string When interacting with mapped reads, it's often useful to
+ * produce a string representing the local alignment of the read to reference.
+ * The following pseudocode demonstrates one way of doing this:
+ * out = "" offset = 0 for c in read.alignment.cigar { switch c.operation { case
+ * "ALIGNMENT_MATCH", "SEQUENCE_MATCH", "SEQUENCE_MISMATCH": out +=
+ * read.alignedSequence[offset:offset+c.operationLength] offset +=
+ * c.operationLength break case "CLIP_SOFT", "INSERT": offset +=
+ * c.operationLength break case "PAD": out += repeat("*", c.operationLength)
+ * break case "DELETE": out += repeat("-", c.operationLength) break case "SKIP":
+ * out += repeat(" ", c.operationLength) break case "CLIP_HARD": break } }
+ * return out
+ * Converting to SAM's CIGAR string The following pseudocode generates a SAM
+ * CIGAR string from the cigar field. Note that this is a lossy conversion
+ * (cigar.referenceSequence is lost).
+ * cigarMap = { "ALIGNMENT_MATCH": "M", "INSERT": "I", "DELETE": "D", "SKIP":
+ * "N", "CLIP_SOFT": "S", "CLIP_HARD": "H", "PAD": "P", "SEQUENCE_MATCH": "=",
+ * "SEQUENCE_MISMATCH": "X", } cigarStr = "" for c in read.alignment.cigar {
+ * cigarStr += c.operationLength + cigarMap[c.operation] } return cigarStr
  */
 class Read {
   /**
@@ -3954,12 +3972,12 @@
   core.List<core.int> alignedQuality;
 
   /**
-   * The bases of the read sequence contained in this alignment record.
-   * alignedSequence and alignedQuality may be shorter than the full read
-   * sequence and quality. This will occur if the alignment is part of a
-   * chimeric alignment, or if the read was trimmed. When this occurs, the CIGAR
-   * for this read will begin/end with a hard clip operator that will indicate
-   * the length of the excised sequence.
+   * The bases of the read sequence contained in this alignment record, without
+   * CIGAR operations applied. alignedSequence and alignedQuality may be shorter
+   * than the full read sequence and quality. This will occur if the alignment
+   * is part of a chimeric alignment, or if the read was trimmed. When this
+   * occurs, the CIGAR for this read will begin/end with a hard clip operator
+   * that will indicate the length of the excised sequence.
    */
   core.String alignedSequence;
 
diff --git a/generated/googleapis_beta/lib/replicapoolupdater/v1beta1.dart b/generated/googleapis_beta/lib/replicapoolupdater/v1beta1.dart
index 8674700..46d0c6b 100644
--- a/generated/googleapis_beta/lib/replicapoolupdater/v1beta1.dart
+++ b/generated/googleapis_beta/lib/replicapoolupdater/v1beta1.dart
@@ -281,8 +281,8 @@
   }
 
   /**
-   * Called on the particular Update endpoint. Pauses the update in state from {
-   * ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state PAUSED.
+   * Called on the particular Update endpoint. Pauses the update in state
+   * ROLLING_FORWARD or ROLLING_BACK. No-op if invoked in state PAUSED.
    *
    * Request parameters:
    *
@@ -338,8 +338,8 @@
 
   /**
    * Called on the particular Update endpoint. Rolls back the update in state
-   * from { ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state
-   * ROLLED_BACK.
+   * ROLLING_FORWARD or PAUSED. No-op if invoked in state ROLLED_BACK or
+   * ROLLING_BACK.
    *
    * Request parameters:
    *
@@ -395,8 +395,8 @@
 
   /**
    * Called on the particular Update endpoint. Rolls forward the update in state
-   * from { ROLLING_FORWARD, ROLLING_BACK, PAUSED }. No-op if invoked in state
-   * ROLLED_OUT.
+   * ROLLING_BACK or PAUSED. No-op if invoked in state ROLLED_OUT or
+   * ROLLING_FORWARD.
    *
    * Request parameters:
    *
@@ -483,7 +483,19 @@
   /** Name of an instance. */
   core.String instanceName;
 
-  /** State of an instance update. */
+  /**
+   * State of an instance update. Possible values are:
+   * - "PENDING/code>": The instance update is pending execution.
+   * - "ROLLING_FORWARD": The instance update is going forward.
+   * - "ROLLING_BACK": The instance update being rolled back.
+   * - "PAUSED": The instance update is temporarily paused (inactive).
+   * - "ROLLED_OUT": The instance update is finished, the instance is running
+   * the new template.
+   * - "ROLLED_BACK": The instance update is finished, the instance has been
+   * reverted to the previous template.
+   * - "CANCELLED": The instance update is paused and no longer can be resumed,
+   * undefined in which template the instance is running.
+   */
   core.String state;
 
 
@@ -516,11 +528,14 @@
  * given template.
  */
 class Update {
-  /** [Output Only] Human-readable description of an update progress. */
+  /** [Output only] The time the update was created, in RFC3339 text format. */
+  core.String creationTimestamp;
+
+  /** [Output only] Human-readable description of an update progress. */
   core.String details;
 
   /**
-   * [Output Only] Unique (in the context of a group) handle assigned to this
+   * [Output only] Unique (in the context of a group) handle assigned to this
    * update.
    */
   core.String handle;
@@ -528,7 +543,7 @@
   /** Url of an instance template to be applied. */
   core.String instanceTemplate;
 
-  /** [Output Only] Collection of instance updates. */
+  /** [Output only] Collection of instance updates. */
   core.List<InstanceUpdate> instanceUpdates;
 
   /** [Output only] The resource type. Always replicapoolupdater#update. */
@@ -540,11 +555,22 @@
   /** [Output only] The fully qualified URL for this resource. */
   core.String selfLink;
 
-  /** [Output Only] Current state of an update. */
+  /**
+   * [Output only] Current state of an update. Possible values are:
+   * - "ROLLING_FORWARD": The update is going forward.
+   * - "ROLLING_BACK": The update is being rolled back.
+   * - "PAUSED": The update is temporarily paused (inactive).
+   * - "ROLLED_OUT": The update is finished, all instances have been updated
+   * successfully.
+   * - "ROLLED_BACK": The update is finished, all instances have been reverted
+   * to the previous template.
+   * - "CANCELLED": The update is paused and no longer can be resumed, undefined
+   * how many instances are running in which template.
+   */
   core.String state;
 
   /**
-   * [Output Only] Requested state of an update. This is the state that the
+   * [Output only] Requested state of an update. This is the state that the
    * updater is moving towards. Acceptable values are:
    * - "ROLLED_OUT": The user has requested the update to go forward.
    * - "ROLLED_BACK": The user has requested the update to be rolled back.
@@ -555,10 +581,18 @@
    */
   core.String targetState;
 
+  /**
+   * [Output only] User who requested the update, for example: user@example.com.
+   */
+  core.String user;
+
 
   Update();
 
   Update.fromJson(core.Map _json) {
+    if (_json.containsKey("creationTimestamp")) {
+      creationTimestamp = _json["creationTimestamp"];
+    }
     if (_json.containsKey("details")) {
       details = _json["details"];
     }
@@ -586,10 +620,16 @@
     if (_json.containsKey("targetState")) {
       targetState = _json["targetState"];
     }
+    if (_json.containsKey("user")) {
+      user = _json["user"];
+    }
   }
 
   core.Map toJson() {
     var _json = new core.Map();
+    if (creationTimestamp != null) {
+      _json["creationTimestamp"] = creationTimestamp;
+    }
     if (details != null) {
       _json["details"] = details;
     }
@@ -617,6 +657,9 @@
     if (targetState != null) {
       _json["targetState"] = targetState;
     }
+    if (user != null) {
+      _json["user"] = user;
+    }
     return _json;
   }
 }
diff --git a/generated/googleapis_beta/lib/src/common_internal.dart b/generated/googleapis_beta/lib/src/common_internal.dart
index 3a79034..113158e 100644
--- a/generated/googleapis_beta/lib/src/common_internal.dart
+++ b/generated/googleapis_beta/lib/src/common_internal.dart
@@ -9,7 +9,7 @@
 import "package:http/http.dart" as http;
 
 const String USER_AGENT_STRING =
-    'google-api-dart-client googleapis_beta/0.5.1';
+    'google-api-dart-client googleapis_beta/0.5.2';
 
 const CONTENT_TYPE_JSON_UTF8 = 'application/json; charset=utf-8';
 
diff --git a/generated/googleapis_beta/pubspec.yaml b/generated/googleapis_beta/pubspec.yaml
index 8d69f01..45c989d 100644
--- a/generated/googleapis_beta/pubspec.yaml
+++ b/generated/googleapis_beta/pubspec.yaml
@@ -1,5 +1,5 @@
 name: googleapis_beta
-version: 0.5.1
+version: 0.5.2
 author: Dart Team <misc@dartlang.org>
 description: "Auto-generated client libraries for accessing the following APIs:autoscaler:v1beta2, cloudmonitoring:v2beta1, container:v1beta1, datastore:v1beta2, dns:v1beta1, genomics:v1beta, genomics:v1beta2, manager:v1beta2, pubsub:v1beta1, replicapool:v1beta2, replicapoolupdater:v1beta1, resourceviews:v1beta1, resourceviews:v1beta2, sqladmin:v1beta3, taskqueue:v1beta2"
 homepage: http://www.dartlang.org/googleapis/
diff --git a/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart b/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
index de0458e..6a41fbc 100644
--- a/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
@@ -49,14 +49,14 @@
   buildCounterAutoscaler--;
 }
 
-buildUnnamed1319() {
+buildUnnamed1186() {
   var o = new core.List<api.Autoscaler>();
   o.add(buildAutoscaler());
   o.add(buildAutoscaler());
   return o;
 }
 
-checkUnnamed1319(core.List<api.Autoscaler> o) {
+checkUnnamed1186(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscaler(o[0]);
   checkAutoscaler(o[1]);
@@ -67,7 +67,7 @@
   var o = new api.AutoscalerListResponse();
   buildCounterAutoscalerListResponse++;
   if (buildCounterAutoscalerListResponse < 3) {
-    o.items = buildUnnamed1319();
+    o.items = buildUnnamed1186();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -78,21 +78,21 @@
 checkAutoscalerListResponse(api.AutoscalerListResponse o) {
   buildCounterAutoscalerListResponse++;
   if (buildCounterAutoscalerListResponse < 3) {
-    checkUnnamed1319(o.items);
+    checkUnnamed1186(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAutoscalerListResponse--;
 }
 
-buildUnnamed1320() {
+buildUnnamed1187() {
   var o = new core.List<api.AutoscalingPolicyCustomMetricUtilization>();
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   return o;
 }
 
-checkUnnamed1320(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
+checkUnnamed1187(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalingPolicyCustomMetricUtilization(o[0]);
   checkAutoscalingPolicyCustomMetricUtilization(o[1]);
@@ -105,7 +105,7 @@
   if (buildCounterAutoscalingPolicy < 3) {
     o.coolDownPeriodSec = 42;
     o.cpuUtilization = buildAutoscalingPolicyCpuUtilization();
-    o.customMetricUtilizations = buildUnnamed1320();
+    o.customMetricUtilizations = buildUnnamed1187();
     o.loadBalancingUtilization = buildAutoscalingPolicyLoadBalancingUtilization();
     o.maxNumReplicas = 42;
     o.minNumReplicas = 42;
@@ -119,7 +119,7 @@
   if (buildCounterAutoscalingPolicy < 3) {
     unittest.expect(o.coolDownPeriodSec, unittest.equals(42));
     checkAutoscalingPolicyCpuUtilization(o.cpuUtilization);
-    checkUnnamed1320(o.customMetricUtilizations);
+    checkUnnamed1187(o.customMetricUtilizations);
     checkAutoscalingPolicyLoadBalancingUtilization(o.loadBalancingUtilization);
     unittest.expect(o.maxNumReplicas, unittest.equals(42));
     unittest.expect(o.minNumReplicas, unittest.equals(42));
@@ -238,14 +238,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed1321() {
+buildUnnamed1188() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed1321(core.List<api.OperationErrorErrors> o) {
+checkUnnamed1188(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -256,7 +256,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed1321();
+    o.errors = buildUnnamed1188();
   }
   buildCounterOperationError--;
   return o;
@@ -265,7 +265,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed1321(o.errors);
+    checkUnnamed1188(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -291,14 +291,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed1322() {
+buildUnnamed1189() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed1322(core.List<api.OperationWarningsData> o) {
+checkUnnamed1189(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -310,7 +310,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed1322();
+    o.data = buildUnnamed1189();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -321,20 +321,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed1322(o.data);
+    checkUnnamed1189(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed1323() {
+buildUnnamed1190() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed1323(core.List<api.OperationWarnings> o) {
+checkUnnamed1190(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -365,7 +365,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed1323();
+    o.warnings = buildUnnamed1190();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -395,20 +395,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed1323(o.warnings);
+    checkUnnamed1190(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1324() {
+buildUnnamed1191() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1324(core.List<api.Operation> o) {
+checkUnnamed1191(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -420,7 +420,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1324();
+    o.items = buildUnnamed1191();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -433,7 +433,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1324(o.items);
+    checkUnnamed1191(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -466,14 +466,14 @@
   buildCounterZoneMaintenanceWindows--;
 }
 
-buildUnnamed1325() {
+buildUnnamed1192() {
   var o = new core.List<api.ZoneMaintenanceWindows>();
   o.add(buildZoneMaintenanceWindows());
   o.add(buildZoneMaintenanceWindows());
   return o;
 }
 
-checkUnnamed1325(core.List<api.ZoneMaintenanceWindows> o) {
+checkUnnamed1192(core.List<api.ZoneMaintenanceWindows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZoneMaintenanceWindows(o[0]);
   checkZoneMaintenanceWindows(o[1]);
@@ -489,7 +489,7 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.maintenanceWindows = buildUnnamed1325();
+    o.maintenanceWindows = buildUnnamed1192();
     o.name = "foo";
     o.region = "foo";
     o.selfLink = "foo";
@@ -507,7 +507,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1325(o.maintenanceWindows);
+    checkUnnamed1192(o.maintenanceWindows);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -516,14 +516,14 @@
   buildCounterZone--;
 }
 
-buildUnnamed1326() {
+buildUnnamed1193() {
   var o = new core.List<api.Zone>();
   o.add(buildZone());
   o.add(buildZone());
   return o;
 }
 
-checkUnnamed1326(core.List<api.Zone> o) {
+checkUnnamed1193(core.List<api.Zone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZone(o[0]);
   checkZone(o[1]);
@@ -535,7 +535,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1326();
+    o.items = buildUnnamed1193();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -548,7 +548,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1326(o.items);
+    checkUnnamed1193(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
diff --git a/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart b/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
index 165898e..15ff0f6 100644
--- a/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
+++ b/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
@@ -35,14 +35,14 @@
   buildCounterListMetricDescriptorsRequest--;
 }
 
-buildUnnamed1397() {
+buildUnnamed1194() {
   var o = new core.List<api.MetricDescriptor>();
   o.add(buildMetricDescriptor());
   o.add(buildMetricDescriptor());
   return o;
 }
 
-checkUnnamed1397(core.List<api.MetricDescriptor> o) {
+checkUnnamed1194(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptor(o[0]);
   checkMetricDescriptor(o[1]);
@@ -54,7 +54,7 @@
   buildCounterListMetricDescriptorsResponse++;
   if (buildCounterListMetricDescriptorsResponse < 3) {
     o.kind = "foo";
-    o.metrics = buildUnnamed1397();
+    o.metrics = buildUnnamed1194();
     o.nextPageToken = "foo";
   }
   buildCounterListMetricDescriptorsResponse--;
@@ -65,7 +65,7 @@
   buildCounterListMetricDescriptorsResponse++;
   if (buildCounterListMetricDescriptorsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1397(o.metrics);
+    checkUnnamed1194(o.metrics);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListMetricDescriptorsResponse--;
@@ -90,14 +90,14 @@
   buildCounterListTimeseriesDescriptorsRequest--;
 }
 
-buildUnnamed1398() {
+buildUnnamed1195() {
   var o = new core.List<api.TimeseriesDescriptor>();
   o.add(buildTimeseriesDescriptor());
   o.add(buildTimeseriesDescriptor());
   return o;
 }
 
-checkUnnamed1398(core.List<api.TimeseriesDescriptor> o) {
+checkUnnamed1195(core.List<api.TimeseriesDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeseriesDescriptor(o[0]);
   checkTimeseriesDescriptor(o[1]);
@@ -111,7 +111,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.oldest = core.DateTime.parse("2002-02-27T14:01:02");
-    o.timeseries = buildUnnamed1398();
+    o.timeseries = buildUnnamed1195();
     o.youngest = core.DateTime.parse("2002-02-27T14:01:02");
   }
   buildCounterListTimeseriesDescriptorsResponse--;
@@ -124,7 +124,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.oldest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1398(o.timeseries);
+    checkUnnamed1195(o.timeseries);
     unittest.expect(o.youngest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterListTimeseriesDescriptorsResponse--;
@@ -149,14 +149,14 @@
   buildCounterListTimeseriesRequest--;
 }
 
-buildUnnamed1399() {
+buildUnnamed1196() {
   var o = new core.List<api.Timeseries>();
   o.add(buildTimeseries());
   o.add(buildTimeseries());
   return o;
 }
 
-checkUnnamed1399(core.List<api.Timeseries> o) {
+checkUnnamed1196(core.List<api.Timeseries> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeseries(o[0]);
   checkTimeseries(o[1]);
@@ -170,7 +170,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.oldest = core.DateTime.parse("2002-02-27T14:01:02");
-    o.timeseries = buildUnnamed1399();
+    o.timeseries = buildUnnamed1196();
     o.youngest = core.DateTime.parse("2002-02-27T14:01:02");
   }
   buildCounterListTimeseriesResponse--;
@@ -183,20 +183,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.oldest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1399(o.timeseries);
+    checkUnnamed1196(o.timeseries);
     unittest.expect(o.youngest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterListTimeseriesResponse--;
 }
 
-buildUnnamed1400() {
+buildUnnamed1197() {
   var o = new core.List<api.MetricDescriptorLabelDescriptor>();
   o.add(buildMetricDescriptorLabelDescriptor());
   o.add(buildMetricDescriptorLabelDescriptor());
   return o;
 }
 
-checkUnnamed1400(core.List<api.MetricDescriptorLabelDescriptor> o) {
+checkUnnamed1197(core.List<api.MetricDescriptorLabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptorLabelDescriptor(o[0]);
   checkMetricDescriptorLabelDescriptor(o[1]);
@@ -208,7 +208,7 @@
   buildCounterMetricDescriptor++;
   if (buildCounterMetricDescriptor < 3) {
     o.description = "foo";
-    o.labels = buildUnnamed1400();
+    o.labels = buildUnnamed1197();
     o.name = "foo";
     o.project = "foo";
     o.typeDescriptor = buildMetricDescriptorTypeDescriptor();
@@ -221,7 +221,7 @@
   buildCounterMetricDescriptor++;
   if (buildCounterMetricDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1400(o.labels);
+    checkUnnamed1197(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
     checkMetricDescriptorTypeDescriptor(o.typeDescriptor);
@@ -302,14 +302,14 @@
   buildCounterPoint--;
 }
 
-buildUnnamed1401() {
+buildUnnamed1198() {
   var o = new core.List<api.PointDistributionBucket>();
   o.add(buildPointDistributionBucket());
   o.add(buildPointDistributionBucket());
   return o;
 }
 
-checkUnnamed1401(core.List<api.PointDistributionBucket> o) {
+checkUnnamed1198(core.List<api.PointDistributionBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPointDistributionBucket(o[0]);
   checkPointDistributionBucket(o[1]);
@@ -320,7 +320,7 @@
   var o = new api.PointDistribution();
   buildCounterPointDistribution++;
   if (buildCounterPointDistribution < 3) {
-    o.buckets = buildUnnamed1401();
+    o.buckets = buildUnnamed1198();
     o.overflowBucket = buildPointDistributionOverflowBucket();
     o.underflowBucket = buildPointDistributionUnderflowBucket();
   }
@@ -331,7 +331,7 @@
 checkPointDistribution(api.PointDistribution o) {
   buildCounterPointDistribution++;
   if (buildCounterPointDistribution < 3) {
-    checkUnnamed1401(o.buckets);
+    checkUnnamed1198(o.buckets);
     checkPointDistributionOverflowBucket(o.overflowBucket);
     checkPointDistributionUnderflowBucket(o.underflowBucket);
   }
@@ -403,14 +403,14 @@
   buildCounterPointDistributionUnderflowBucket--;
 }
 
-buildUnnamed1402() {
+buildUnnamed1199() {
   var o = new core.List<api.Point>();
   o.add(buildPoint());
   o.add(buildPoint());
   return o;
 }
 
-checkUnnamed1402(core.List<api.Point> o) {
+checkUnnamed1199(core.List<api.Point> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPoint(o[0]);
   checkPoint(o[1]);
@@ -421,7 +421,7 @@
   var o = new api.Timeseries();
   buildCounterTimeseries++;
   if (buildCounterTimeseries < 3) {
-    o.points = buildUnnamed1402();
+    o.points = buildUnnamed1199();
     o.timeseriesDesc = buildTimeseriesDescriptor();
   }
   buildCounterTimeseries--;
@@ -431,20 +431,20 @@
 checkTimeseries(api.Timeseries o) {
   buildCounterTimeseries++;
   if (buildCounterTimeseries < 3) {
-    checkUnnamed1402(o.points);
+    checkUnnamed1199(o.points);
     checkTimeseriesDescriptor(o.timeseriesDesc);
   }
   buildCounterTimeseries--;
 }
 
-buildUnnamed1403() {
+buildUnnamed1200() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1403(core.Map<core.String, core.String> o) {
+checkUnnamed1200(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -455,7 +455,7 @@
   var o = new api.TimeseriesDescriptor();
   buildCounterTimeseriesDescriptor++;
   if (buildCounterTimeseriesDescriptor < 3) {
-    o.labels = buildUnnamed1403();
+    o.labels = buildUnnamed1200();
     o.metric = "foo";
     o.project = "foo";
   }
@@ -466,7 +466,7 @@
 checkTimeseriesDescriptor(api.TimeseriesDescriptor o) {
   buildCounterTimeseriesDescriptor++;
   if (buildCounterTimeseriesDescriptor < 3) {
-    checkUnnamed1403(o.labels);
+    checkUnnamed1200(o.labels);
     unittest.expect(o.metric, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
   }
@@ -494,27 +494,27 @@
   buildCounterTimeseriesDescriptorLabel--;
 }
 
-buildUnnamed1404() {
+buildUnnamed1201() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1404(core.List<core.String> o) {
+checkUnnamed1201(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1405() {
+buildUnnamed1202() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1405(core.List<core.String> o) {
+checkUnnamed1202(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -741,7 +741,7 @@
       var arg_metric = "foo";
       var arg_youngest = "foo";
       var arg_count = 42;
-      var arg_labels = buildUnnamed1404();
+      var arg_labels = buildUnnamed1201();
       var arg_oldest = "foo";
       var arg_pageToken = "foo";
       var arg_timespan = "foo";
@@ -804,7 +804,7 @@
       var arg_metric = "foo";
       var arg_youngest = "foo";
       var arg_count = 42;
-      var arg_labels = buildUnnamed1405();
+      var arg_labels = buildUnnamed1202();
       var arg_oldest = "foo";
       var arg_pageToken = "foo";
       var arg_timespan = "foo";
diff --git a/generated/googleapis_beta/test/container/v1beta1_test.dart b/generated/googleapis_beta/test/container/v1beta1_test.dart
index 6acf9a2..b04157f 100644
--- a/generated/googleapis_beta/test/container/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/container/v1beta1_test.dart
@@ -28,6 +28,7 @@
     o.endpoint = "foo";
     o.masterAuth = buildMasterAuth();
     o.name = "foo";
+    o.network = "foo";
     o.nodeConfig = buildNodeConfig();
     o.nodeRoutingPrefixSize = 42;
     o.numNodes = 42;
@@ -50,6 +51,7 @@
     unittest.expect(o.endpoint, unittest.equals('foo'));
     checkMasterAuth(o.masterAuth);
     unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.network, unittest.equals('foo'));
     checkNodeConfig(o.nodeConfig);
     unittest.expect(o.nodeRoutingPrefixSize, unittest.equals(42));
     unittest.expect(o.numNodes, unittest.equals(42));
@@ -80,14 +82,14 @@
   buildCounterCreateClusterRequest--;
 }
 
-buildUnnamed1233() {
+buildUnnamed1203() {
   var o = new core.List<api.Cluster>();
   o.add(buildCluster());
   o.add(buildCluster());
   return o;
 }
 
-checkUnnamed1233(core.List<api.Cluster> o) {
+checkUnnamed1203(core.List<api.Cluster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCluster(o[0]);
   checkCluster(o[1]);
@@ -98,7 +100,7 @@
   var o = new api.ListAggregatedClustersResponse();
   buildCounterListAggregatedClustersResponse++;
   if (buildCounterListAggregatedClustersResponse < 3) {
-    o.clusters = buildUnnamed1233();
+    o.clusters = buildUnnamed1203();
   }
   buildCounterListAggregatedClustersResponse--;
   return o;
@@ -107,19 +109,19 @@
 checkListAggregatedClustersResponse(api.ListAggregatedClustersResponse o) {
   buildCounterListAggregatedClustersResponse++;
   if (buildCounterListAggregatedClustersResponse < 3) {
-    checkUnnamed1233(o.clusters);
+    checkUnnamed1203(o.clusters);
   }
   buildCounterListAggregatedClustersResponse--;
 }
 
-buildUnnamed1234() {
+buildUnnamed1204() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1234(core.List<api.Operation> o) {
+checkUnnamed1204(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -130,7 +132,7 @@
   var o = new api.ListAggregatedOperationsResponse();
   buildCounterListAggregatedOperationsResponse++;
   if (buildCounterListAggregatedOperationsResponse < 3) {
-    o.operations = buildUnnamed1234();
+    o.operations = buildUnnamed1204();
   }
   buildCounterListAggregatedOperationsResponse--;
   return o;
@@ -139,19 +141,19 @@
 checkListAggregatedOperationsResponse(api.ListAggregatedOperationsResponse o) {
   buildCounterListAggregatedOperationsResponse++;
   if (buildCounterListAggregatedOperationsResponse < 3) {
-    checkUnnamed1234(o.operations);
+    checkUnnamed1204(o.operations);
   }
   buildCounterListAggregatedOperationsResponse--;
 }
 
-buildUnnamed1235() {
+buildUnnamed1205() {
   var o = new core.List<api.Cluster>();
   o.add(buildCluster());
   o.add(buildCluster());
   return o;
 }
 
-checkUnnamed1235(core.List<api.Cluster> o) {
+checkUnnamed1205(core.List<api.Cluster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCluster(o[0]);
   checkCluster(o[1]);
@@ -162,7 +164,7 @@
   var o = new api.ListClustersResponse();
   buildCounterListClustersResponse++;
   if (buildCounterListClustersResponse < 3) {
-    o.clusters = buildUnnamed1235();
+    o.clusters = buildUnnamed1205();
   }
   buildCounterListClustersResponse--;
   return o;
@@ -171,19 +173,19 @@
 checkListClustersResponse(api.ListClustersResponse o) {
   buildCounterListClustersResponse++;
   if (buildCounterListClustersResponse < 3) {
-    checkUnnamed1235(o.clusters);
+    checkUnnamed1205(o.clusters);
   }
   buildCounterListClustersResponse--;
 }
 
-buildUnnamed1236() {
+buildUnnamed1206() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1236(core.List<api.Operation> o) {
+checkUnnamed1206(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -194,7 +196,7 @@
   var o = new api.ListOperationsResponse();
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
-    o.operations = buildUnnamed1236();
+    o.operations = buildUnnamed1206();
   }
   buildCounterListOperationsResponse--;
   return o;
@@ -203,7 +205,7 @@
 checkListOperationsResponse(api.ListOperationsResponse o) {
   buildCounterListOperationsResponse++;
   if (buildCounterListOperationsResponse < 3) {
-    checkUnnamed1236(o.operations);
+    checkUnnamed1206(o.operations);
   }
   buildCounterListOperationsResponse--;
 }
@@ -258,6 +260,7 @@
     o.errorMessage = "foo";
     o.name = "foo";
     o.operationType = "foo";
+    o.selfLink = "foo";
     o.status = "foo";
     o.target = "foo";
     o.zone = "foo";
@@ -272,6 +275,7 @@
     unittest.expect(o.errorMessage, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.operationType, unittest.equals('foo'));
+    unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
diff --git a/generated/googleapis_beta/test/datastore/v1beta2_test.dart b/generated/googleapis_beta/test/datastore/v1beta2_test.dart
index 5faff36..9445332 100644
--- a/generated/googleapis_beta/test/datastore/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/datastore/v1beta2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1406() {
+buildUnnamed1207() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1406(core.List<api.Key> o) {
+checkUnnamed1207(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.AllocateIdsRequest();
   buildCounterAllocateIdsRequest++;
   if (buildCounterAllocateIdsRequest < 3) {
-    o.keys = buildUnnamed1406();
+    o.keys = buildUnnamed1207();
   }
   buildCounterAllocateIdsRequest--;
   return o;
@@ -43,19 +43,19 @@
 checkAllocateIdsRequest(api.AllocateIdsRequest o) {
   buildCounterAllocateIdsRequest++;
   if (buildCounterAllocateIdsRequest < 3) {
-    checkUnnamed1406(o.keys);
+    checkUnnamed1207(o.keys);
   }
   buildCounterAllocateIdsRequest--;
 }
 
-buildUnnamed1407() {
+buildUnnamed1208() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1407(core.List<api.Key> o) {
+checkUnnamed1208(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -67,7 +67,7 @@
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
     o.header = buildResponseHeader();
-    o.keys = buildUnnamed1407();
+    o.keys = buildUnnamed1208();
   }
   buildCounterAllocateIdsResponse--;
   return o;
@@ -77,7 +77,7 @@
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
     checkResponseHeader(o.header);
-    checkUnnamed1407(o.keys);
+    checkUnnamed1208(o.keys);
   }
   buildCounterAllocateIdsResponse--;
 }
@@ -168,14 +168,14 @@
   buildCounterCommitResponse--;
 }
 
-buildUnnamed1408() {
+buildUnnamed1209() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed1408(core.List<api.Filter> o) {
+checkUnnamed1209(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -186,7 +186,7 @@
   var o = new api.CompositeFilter();
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    o.filters = buildUnnamed1408();
+    o.filters = buildUnnamed1209();
     o.operator = "foo";
   }
   buildCounterCompositeFilter--;
@@ -196,20 +196,20 @@
 checkCompositeFilter(api.CompositeFilter o) {
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    checkUnnamed1408(o.filters);
+    checkUnnamed1209(o.filters);
     unittest.expect(o.operator, unittest.equals('foo'));
   }
   buildCounterCompositeFilter--;
 }
 
-buildUnnamed1409() {
+buildUnnamed1210() {
   var o = new core.Map<core.String, api.Property>();
   o["x"] = buildProperty();
   o["y"] = buildProperty();
   return o;
 }
 
-checkUnnamed1409(core.Map<core.String, api.Property> o) {
+checkUnnamed1210(core.Map<core.String, api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o["x"]);
   checkProperty(o["y"]);
@@ -221,7 +221,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     o.key = buildKey();
-    o.properties = buildUnnamed1409();
+    o.properties = buildUnnamed1210();
   }
   buildCounterEntity--;
   return o;
@@ -231,7 +231,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     checkKey(o.key);
-    checkUnnamed1409(o.properties);
+    checkUnnamed1210(o.properties);
   }
   buildCounterEntity--;
 }
@@ -276,27 +276,27 @@
   buildCounterFilter--;
 }
 
-buildUnnamed1410() {
+buildUnnamed1211() {
   var o = new core.List<api.GqlQueryArg>();
   o.add(buildGqlQueryArg());
   o.add(buildGqlQueryArg());
   return o;
 }
 
-checkUnnamed1410(core.List<api.GqlQueryArg> o) {
+checkUnnamed1211(core.List<api.GqlQueryArg> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryArg(o[0]);
   checkGqlQueryArg(o[1]);
 }
 
-buildUnnamed1411() {
+buildUnnamed1212() {
   var o = new core.List<api.GqlQueryArg>();
   o.add(buildGqlQueryArg());
   o.add(buildGqlQueryArg());
   return o;
 }
 
-checkUnnamed1411(core.List<api.GqlQueryArg> o) {
+checkUnnamed1212(core.List<api.GqlQueryArg> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryArg(o[0]);
   checkGqlQueryArg(o[1]);
@@ -308,8 +308,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     o.allowLiteral = true;
-    o.nameArgs = buildUnnamed1410();
-    o.numberArgs = buildUnnamed1411();
+    o.nameArgs = buildUnnamed1211();
+    o.numberArgs = buildUnnamed1212();
     o.queryString = "foo";
   }
   buildCounterGqlQuery--;
@@ -320,8 +320,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     unittest.expect(o.allowLiteral, unittest.isTrue);
-    checkUnnamed1410(o.nameArgs);
-    checkUnnamed1411(o.numberArgs);
+    checkUnnamed1211(o.nameArgs);
+    checkUnnamed1212(o.numberArgs);
     unittest.expect(o.queryString, unittest.equals('foo'));
   }
   buildCounterGqlQuery--;
@@ -350,14 +350,14 @@
   buildCounterGqlQueryArg--;
 }
 
-buildUnnamed1412() {
+buildUnnamed1213() {
   var o = new core.List<api.KeyPathElement>();
   o.add(buildKeyPathElement());
   o.add(buildKeyPathElement());
   return o;
 }
 
-checkUnnamed1412(core.List<api.KeyPathElement> o) {
+checkUnnamed1213(core.List<api.KeyPathElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKeyPathElement(o[0]);
   checkKeyPathElement(o[1]);
@@ -369,7 +369,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     o.partitionId = buildPartitionId();
-    o.path = buildUnnamed1412();
+    o.path = buildUnnamed1213();
   }
   buildCounterKey--;
   return o;
@@ -379,7 +379,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     checkPartitionId(o.partitionId);
-    checkUnnamed1412(o.path);
+    checkUnnamed1213(o.path);
   }
   buildCounterKey--;
 }
@@ -426,14 +426,14 @@
   buildCounterKindExpression--;
 }
 
-buildUnnamed1413() {
+buildUnnamed1214() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1413(core.List<api.Key> o) {
+checkUnnamed1214(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -444,7 +444,7 @@
   var o = new api.LookupRequest();
   buildCounterLookupRequest++;
   if (buildCounterLookupRequest < 3) {
-    o.keys = buildUnnamed1413();
+    o.keys = buildUnnamed1214();
     o.readOptions = buildReadOptions();
   }
   buildCounterLookupRequest--;
@@ -454,46 +454,46 @@
 checkLookupRequest(api.LookupRequest o) {
   buildCounterLookupRequest++;
   if (buildCounterLookupRequest < 3) {
-    checkUnnamed1413(o.keys);
+    checkUnnamed1214(o.keys);
     checkReadOptions(o.readOptions);
   }
   buildCounterLookupRequest--;
 }
 
-buildUnnamed1414() {
+buildUnnamed1215() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1414(core.List<api.Key> o) {
+checkUnnamed1215(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
 }
 
-buildUnnamed1415() {
+buildUnnamed1216() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1415(core.List<api.EntityResult> o) {
+checkUnnamed1216(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
 }
 
-buildUnnamed1416() {
+buildUnnamed1217() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1416(core.List<api.EntityResult> o) {
+checkUnnamed1217(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
@@ -504,10 +504,10 @@
   var o = new api.LookupResponse();
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    o.deferred = buildUnnamed1414();
-    o.found = buildUnnamed1415();
+    o.deferred = buildUnnamed1215();
+    o.found = buildUnnamed1216();
     o.header = buildResponseHeader();
-    o.missing = buildUnnamed1416();
+    o.missing = buildUnnamed1217();
   }
   buildCounterLookupResponse--;
   return o;
@@ -516,74 +516,74 @@
 checkLookupResponse(api.LookupResponse o) {
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    checkUnnamed1414(o.deferred);
-    checkUnnamed1415(o.found);
+    checkUnnamed1215(o.deferred);
+    checkUnnamed1216(o.found);
     checkResponseHeader(o.header);
-    checkUnnamed1416(o.missing);
+    checkUnnamed1217(o.missing);
   }
   buildCounterLookupResponse--;
 }
 
-buildUnnamed1417() {
+buildUnnamed1218() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1417(core.List<api.Key> o) {
+checkUnnamed1218(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
 }
 
-buildUnnamed1418() {
+buildUnnamed1219() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1418(core.List<api.Entity> o) {
+checkUnnamed1219(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1419() {
+buildUnnamed1220() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1419(core.List<api.Entity> o) {
+checkUnnamed1220(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1420() {
+buildUnnamed1221() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1420(core.List<api.Entity> o) {
+checkUnnamed1221(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1421() {
+buildUnnamed1222() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1421(core.List<api.Entity> o) {
+checkUnnamed1222(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
@@ -594,12 +594,12 @@
   var o = new api.Mutation();
   buildCounterMutation++;
   if (buildCounterMutation < 3) {
-    o.delete = buildUnnamed1417();
+    o.delete = buildUnnamed1218();
     o.force = true;
-    o.insert = buildUnnamed1418();
-    o.insertAutoId = buildUnnamed1419();
-    o.update = buildUnnamed1420();
-    o.upsert = buildUnnamed1421();
+    o.insert = buildUnnamed1219();
+    o.insertAutoId = buildUnnamed1220();
+    o.update = buildUnnamed1221();
+    o.upsert = buildUnnamed1222();
   }
   buildCounterMutation--;
   return o;
@@ -608,24 +608,24 @@
 checkMutation(api.Mutation o) {
   buildCounterMutation++;
   if (buildCounterMutation < 3) {
-    checkUnnamed1417(o.delete);
+    checkUnnamed1218(o.delete);
     unittest.expect(o.force, unittest.isTrue);
-    checkUnnamed1418(o.insert);
-    checkUnnamed1419(o.insertAutoId);
-    checkUnnamed1420(o.update);
-    checkUnnamed1421(o.upsert);
+    checkUnnamed1219(o.insert);
+    checkUnnamed1220(o.insertAutoId);
+    checkUnnamed1221(o.update);
+    checkUnnamed1222(o.upsert);
   }
   buildCounterMutation--;
 }
 
-buildUnnamed1422() {
+buildUnnamed1223() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1422(core.List<api.Key> o) {
+checkUnnamed1223(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -637,7 +637,7 @@
   buildCounterMutationResult++;
   if (buildCounterMutationResult < 3) {
     o.indexUpdates = 42;
-    o.insertAutoIdKeys = buildUnnamed1422();
+    o.insertAutoIdKeys = buildUnnamed1223();
   }
   buildCounterMutationResult--;
   return o;
@@ -647,7 +647,7 @@
   buildCounterMutationResult++;
   if (buildCounterMutationResult < 3) {
     unittest.expect(o.indexUpdates, unittest.equals(42));
-    checkUnnamed1422(o.insertAutoIdKeys);
+    checkUnnamed1223(o.insertAutoIdKeys);
   }
   buildCounterMutationResult--;
 }
@@ -673,14 +673,14 @@
   buildCounterPartitionId--;
 }
 
-buildUnnamed1423() {
+buildUnnamed1224() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed1423(core.List<api.Value> o) {
+checkUnnamed1224(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -700,7 +700,7 @@
     o.indexed = true;
     o.integerValue = "foo";
     o.keyValue = buildKey();
-    o.listValue = buildUnnamed1423();
+    o.listValue = buildUnnamed1224();
     o.meaning = 42;
     o.stringValue = "foo";
   }
@@ -720,7 +720,7 @@
     unittest.expect(o.indexed, unittest.isTrue);
     unittest.expect(o.integerValue, unittest.equals('foo'));
     checkKey(o.keyValue);
-    checkUnnamed1423(o.listValue);
+    checkUnnamed1224(o.listValue);
     unittest.expect(o.meaning, unittest.equals(42));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
@@ -811,53 +811,53 @@
   buildCounterPropertyReference--;
 }
 
-buildUnnamed1424() {
+buildUnnamed1225() {
   var o = new core.List<api.PropertyReference>();
   o.add(buildPropertyReference());
   o.add(buildPropertyReference());
   return o;
 }
 
-checkUnnamed1424(core.List<api.PropertyReference> o) {
+checkUnnamed1225(core.List<api.PropertyReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyReference(o[0]);
   checkPropertyReference(o[1]);
 }
 
-buildUnnamed1425() {
+buildUnnamed1226() {
   var o = new core.List<api.KindExpression>();
   o.add(buildKindExpression());
   o.add(buildKindExpression());
   return o;
 }
 
-checkUnnamed1425(core.List<api.KindExpression> o) {
+checkUnnamed1226(core.List<api.KindExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKindExpression(o[0]);
   checkKindExpression(o[1]);
 }
 
-buildUnnamed1426() {
+buildUnnamed1227() {
   var o = new core.List<api.PropertyOrder>();
   o.add(buildPropertyOrder());
   o.add(buildPropertyOrder());
   return o;
 }
 
-checkUnnamed1426(core.List<api.PropertyOrder> o) {
+checkUnnamed1227(core.List<api.PropertyOrder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyOrder(o[0]);
   checkPropertyOrder(o[1]);
 }
 
-buildUnnamed1427() {
+buildUnnamed1228() {
   var o = new core.List<api.PropertyExpression>();
   o.add(buildPropertyExpression());
   o.add(buildPropertyExpression());
   return o;
 }
 
-checkUnnamed1427(core.List<api.PropertyExpression> o) {
+checkUnnamed1228(core.List<api.PropertyExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyExpression(o[0]);
   checkPropertyExpression(o[1]);
@@ -870,12 +870,12 @@
   if (buildCounterQuery < 3) {
     o.endCursor = "foo";
     o.filter = buildFilter();
-    o.groupBy = buildUnnamed1424();
-    o.kinds = buildUnnamed1425();
+    o.groupBy = buildUnnamed1225();
+    o.kinds = buildUnnamed1226();
     o.limit = 42;
     o.offset = 42;
-    o.order = buildUnnamed1426();
-    o.projection = buildUnnamed1427();
+    o.order = buildUnnamed1227();
+    o.projection = buildUnnamed1228();
     o.startCursor = "foo";
   }
   buildCounterQuery--;
@@ -887,25 +887,25 @@
   if (buildCounterQuery < 3) {
     unittest.expect(o.endCursor, unittest.equals('foo'));
     checkFilter(o.filter);
-    checkUnnamed1424(o.groupBy);
-    checkUnnamed1425(o.kinds);
+    checkUnnamed1225(o.groupBy);
+    checkUnnamed1226(o.kinds);
     unittest.expect(o.limit, unittest.equals(42));
     unittest.expect(o.offset, unittest.equals(42));
-    checkUnnamed1426(o.order);
-    checkUnnamed1427(o.projection);
+    checkUnnamed1227(o.order);
+    checkUnnamed1228(o.projection);
     unittest.expect(o.startCursor, unittest.equals('foo'));
   }
   buildCounterQuery--;
 }
 
-buildUnnamed1428() {
+buildUnnamed1229() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1428(core.List<api.EntityResult> o) {
+checkUnnamed1229(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
@@ -918,7 +918,7 @@
   if (buildCounterQueryResultBatch < 3) {
     o.endCursor = "foo";
     o.entityResultType = "foo";
-    o.entityResults = buildUnnamed1428();
+    o.entityResults = buildUnnamed1229();
     o.moreResults = "foo";
     o.skippedResults = 42;
   }
@@ -931,7 +931,7 @@
   if (buildCounterQueryResultBatch < 3) {
     unittest.expect(o.endCursor, unittest.equals('foo'));
     unittest.expect(o.entityResultType, unittest.equals('foo'));
-    checkUnnamed1428(o.entityResults);
+    checkUnnamed1229(o.entityResults);
     unittest.expect(o.moreResults, unittest.equals('foo'));
     unittest.expect(o.skippedResults, unittest.equals(42));
   }
@@ -1062,14 +1062,14 @@
   buildCounterRunQueryResponse--;
 }
 
-buildUnnamed1429() {
+buildUnnamed1230() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed1429(core.List<api.Value> o) {
+checkUnnamed1230(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -1089,7 +1089,7 @@
     o.indexed = true;
     o.integerValue = "foo";
     o.keyValue = buildKey();
-    o.listValue = buildUnnamed1429();
+    o.listValue = buildUnnamed1230();
     o.meaning = 42;
     o.stringValue = "foo";
   }
@@ -1109,7 +1109,7 @@
     unittest.expect(o.indexed, unittest.isTrue);
     unittest.expect(o.integerValue, unittest.equals('foo'));
     checkKey(o.keyValue);
-    checkUnnamed1429(o.listValue);
+    checkUnnamed1230(o.listValue);
     unittest.expect(o.meaning, unittest.equals(42));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
diff --git a/generated/googleapis_beta/test/dns/v1beta1_test.dart b/generated/googleapis_beta/test/dns/v1beta1_test.dart
index 3219e71..68d44d8 100644
--- a/generated/googleapis_beta/test/dns/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/dns/v1beta1_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed1256() {
+buildUnnamed1231() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1256(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1231(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
 }
 
-buildUnnamed1257() {
+buildUnnamed1232() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1257(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1232(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -47,8 +47,8 @@
   var o = new api.Change();
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    o.additions = buildUnnamed1256();
-    o.deletions = buildUnnamed1257();
+    o.additions = buildUnnamed1231();
+    o.deletions = buildUnnamed1232();
     o.id = "foo";
     o.kind = "foo";
     o.startTime = "foo";
@@ -61,8 +61,8 @@
 checkChange(api.Change o) {
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    checkUnnamed1256(o.additions);
-    checkUnnamed1257(o.deletions);
+    checkUnnamed1231(o.additions);
+    checkUnnamed1232(o.deletions);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
@@ -71,14 +71,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed1258() {
+buildUnnamed1233() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed1258(core.List<api.Change> o) {
+checkUnnamed1233(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -89,7 +89,7 @@
   var o = new api.ChangesListResponse();
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    o.changes = buildUnnamed1258();
+    o.changes = buildUnnamed1233();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -100,21 +100,21 @@
 checkChangesListResponse(api.ChangesListResponse o) {
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    checkUnnamed1258(o.changes);
+    checkUnnamed1233(o.changes);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterChangesListResponse--;
 }
 
-buildUnnamed1259() {
+buildUnnamed1234() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1259(core.List<core.String> o) {
+checkUnnamed1234(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -131,7 +131,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.nameServers = buildUnnamed1259();
+    o.nameServers = buildUnnamed1234();
   }
   buildCounterManagedZone--;
   return o;
@@ -146,19 +146,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1259(o.nameServers);
+    checkUnnamed1234(o.nameServers);
   }
   buildCounterManagedZone--;
 }
 
-buildUnnamed1260() {
+buildUnnamed1235() {
   var o = new core.List<api.ManagedZone>();
   o.add(buildManagedZone());
   o.add(buildManagedZone());
   return o;
 }
 
-checkUnnamed1260(core.List<api.ManagedZone> o) {
+checkUnnamed1235(core.List<api.ManagedZone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedZone(o[0]);
   checkManagedZone(o[1]);
@@ -170,7 +170,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     o.kind = "foo";
-    o.managedZones = buildUnnamed1260();
+    o.managedZones = buildUnnamed1235();
     o.nextPageToken = "foo";
   }
   buildCounterManagedZonesListResponse--;
@@ -181,7 +181,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1260(o.managedZones);
+    checkUnnamed1235(o.managedZones);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterManagedZonesListResponse--;
@@ -243,14 +243,14 @@
   buildCounterQuota--;
 }
 
-buildUnnamed1261() {
+buildUnnamed1236() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1261(core.List<core.String> o) {
+checkUnnamed1236(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -263,7 +263,7 @@
   if (buildCounterResourceRecordSet < 3) {
     o.kind = "foo";
     o.name = "foo";
-    o.rrdatas = buildUnnamed1261();
+    o.rrdatas = buildUnnamed1236();
     o.ttl = 42;
     o.type = "foo";
   }
@@ -276,21 +276,21 @@
   if (buildCounterResourceRecordSet < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1261(o.rrdatas);
+    checkUnnamed1236(o.rrdatas);
     unittest.expect(o.ttl, unittest.equals(42));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterResourceRecordSet--;
 }
 
-buildUnnamed1262() {
+buildUnnamed1237() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1262(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1237(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -303,7 +303,7 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.rrsets = buildUnnamed1262();
+    o.rrsets = buildUnnamed1237();
   }
   buildCounterResourceRecordSetsListResponse--;
   return o;
@@ -314,7 +314,7 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1262(o.rrsets);
+    checkUnnamed1237(o.rrsets);
   }
   buildCounterResourceRecordSetsListResponse--;
 }
diff --git a/generated/googleapis_beta/test/genomics/v1beta2_test.dart b/generated/googleapis_beta/test/genomics/v1beta2_test.dart
index be658d1..a511bdd 100644
--- a/generated/googleapis_beta/test/genomics/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/genomics/v1beta2_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed1163() {
+buildUnnamed1291() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1163(core.List<core.String> o) {
+checkUnnamed1291(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1164() {
+buildUnnamed1292() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1164(core.List<core.String> o) {
+checkUnnamed1292(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -47,11 +47,11 @@
   var o = new api.AlignReadGroupSetsRequest();
   buildCounterAlignReadGroupSetsRequest++;
   if (buildCounterAlignReadGroupSetsRequest < 3) {
-    o.bamSourceUris = buildUnnamed1163();
+    o.bamSourceUris = buildUnnamed1291();
     o.datasetId = "foo";
     o.interleavedFastqSource = buildInterleavedFastqSource();
     o.pairedFastqSource = buildPairedFastqSource();
-    o.readGroupSetIds = buildUnnamed1164();
+    o.readGroupSetIds = buildUnnamed1292();
   }
   buildCounterAlignReadGroupSetsRequest--;
   return o;
@@ -60,11 +60,11 @@
 checkAlignReadGroupSetsRequest(api.AlignReadGroupSetsRequest o) {
   buildCounterAlignReadGroupSetsRequest++;
   if (buildCounterAlignReadGroupSetsRequest < 3) {
-    checkUnnamed1163(o.bamSourceUris);
+    checkUnnamed1291(o.bamSourceUris);
     unittest.expect(o.datasetId, unittest.equals('foo'));
     checkInterleavedFastqSource(o.interleavedFastqSource);
     checkPairedFastqSource(o.pairedFastqSource);
-    checkUnnamed1164(o.readGroupSetIds);
+    checkUnnamed1292(o.readGroupSetIds);
   }
   buildCounterAlignReadGroupSetsRequest--;
 }
@@ -88,56 +88,56 @@
   buildCounterAlignReadGroupSetsResponse--;
 }
 
-buildUnnamed1165() {
+buildUnnamed1293() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1165(core.List<core.int> o) {
+checkUnnamed1293(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed1166() {
+buildUnnamed1294() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1166(core.List<core.double> o) {
+checkUnnamed1294(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed1167() {
+buildUnnamed1295() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1167(core.List<core.String> o) {
+checkUnnamed1295(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1168() {
+buildUnnamed1296() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1167();
-  o["y"] = buildUnnamed1167();
+  o["x"] = buildUnnamed1295();
+  o["y"] = buildUnnamed1295();
   return o;
 }
 
-checkUnnamed1168(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1296(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1167(o["x"]);
-  checkUnnamed1167(o["y"]);
+  checkUnnamed1295(o["x"]);
+  checkUnnamed1295(o["y"]);
 }
 
 core.int buildCounterCall = 0;
@@ -147,9 +147,9 @@
   if (buildCounterCall < 3) {
     o.callSetId = "foo";
     o.callSetName = "foo";
-    o.genotype = buildUnnamed1165();
-    o.genotypeLikelihood = buildUnnamed1166();
-    o.info = buildUnnamed1168();
+    o.genotype = buildUnnamed1293();
+    o.genotypeLikelihood = buildUnnamed1294();
+    o.info = buildUnnamed1296();
     o.phaseset = "foo";
   }
   buildCounterCall--;
@@ -161,35 +161,35 @@
   if (buildCounterCall < 3) {
     unittest.expect(o.callSetId, unittest.equals('foo'));
     unittest.expect(o.callSetName, unittest.equals('foo'));
-    checkUnnamed1165(o.genotype);
-    checkUnnamed1166(o.genotypeLikelihood);
-    checkUnnamed1168(o.info);
+    checkUnnamed1293(o.genotype);
+    checkUnnamed1294(o.genotypeLikelihood);
+    checkUnnamed1296(o.info);
     unittest.expect(o.phaseset, unittest.equals('foo'));
   }
   buildCounterCall--;
 }
 
-buildUnnamed1169() {
+buildUnnamed1297() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1169(core.List<core.String> o) {
+checkUnnamed1297(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1170() {
+buildUnnamed1298() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1170(core.List<core.String> o) {
+checkUnnamed1298(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -201,8 +201,8 @@
   buildCounterCallReadGroupSetsRequest++;
   if (buildCounterCallReadGroupSetsRequest < 3) {
     o.datasetId = "foo";
-    o.readGroupSetIds = buildUnnamed1169();
-    o.sourceUris = buildUnnamed1170();
+    o.readGroupSetIds = buildUnnamed1297();
+    o.sourceUris = buildUnnamed1298();
   }
   buildCounterCallReadGroupSetsRequest--;
   return o;
@@ -212,8 +212,8 @@
   buildCounterCallReadGroupSetsRequest++;
   if (buildCounterCallReadGroupSetsRequest < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
-    checkUnnamed1169(o.readGroupSetIds);
-    checkUnnamed1170(o.sourceUris);
+    checkUnnamed1297(o.readGroupSetIds);
+    checkUnnamed1298(o.sourceUris);
   }
   buildCounterCallReadGroupSetsRequest--;
 }
@@ -237,40 +237,40 @@
   buildCounterCallReadGroupSetsResponse--;
 }
 
-buildUnnamed1171() {
+buildUnnamed1299() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1171(core.List<core.String> o) {
+checkUnnamed1299(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1172() {
+buildUnnamed1300() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1171();
-  o["y"] = buildUnnamed1171();
+  o["x"] = buildUnnamed1299();
+  o["y"] = buildUnnamed1299();
   return o;
 }
 
-checkUnnamed1172(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1300(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1171(o["x"]);
-  checkUnnamed1171(o["y"]);
+  checkUnnamed1299(o["x"]);
+  checkUnnamed1299(o["y"]);
 }
 
-buildUnnamed1173() {
+buildUnnamed1301() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1173(core.List<core.String> o) {
+checkUnnamed1301(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -283,10 +283,10 @@
   if (buildCounterCallSet < 3) {
     o.created = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1172();
+    o.info = buildUnnamed1300();
     o.name = "foo";
     o.sampleId = "foo";
-    o.variantSetIds = buildUnnamed1173();
+    o.variantSetIds = buildUnnamed1301();
   }
   buildCounterCallSet--;
   return o;
@@ -297,10 +297,10 @@
   if (buildCounterCallSet < 3) {
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1172(o.info);
+    checkUnnamed1300(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.sampleId, unittest.equals('foo'));
-    checkUnnamed1173(o.variantSetIds);
+    checkUnnamed1301(o.variantSetIds);
   }
   buildCounterCallSet--;
 }
@@ -374,27 +374,27 @@
   buildCounterDataset--;
 }
 
-buildUnnamed1174() {
+buildUnnamed1302() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1174(core.List<core.String> o) {
+checkUnnamed1302(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1175() {
+buildUnnamed1303() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1175(core.List<core.String> o) {
+checkUnnamed1303(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -408,9 +408,9 @@
     o.align = true;
     o.callVariants = true;
     o.gcsOutputPath = "foo";
-    o.pairedSourceUris = buildUnnamed1174();
+    o.pairedSourceUris = buildUnnamed1302();
     o.projectNumber = "foo";
-    o.sourceUris = buildUnnamed1175();
+    o.sourceUris = buildUnnamed1303();
   }
   buildCounterExperimentalCreateJobRequest--;
   return o;
@@ -422,9 +422,9 @@
     unittest.expect(o.align, unittest.isTrue);
     unittest.expect(o.callVariants, unittest.isTrue);
     unittest.expect(o.gcsOutputPath, unittest.equals('foo'));
-    checkUnnamed1174(o.pairedSourceUris);
+    checkUnnamed1302(o.pairedSourceUris);
     unittest.expect(o.projectNumber, unittest.equals('foo'));
-    checkUnnamed1175(o.sourceUris);
+    checkUnnamed1303(o.sourceUris);
   }
   buildCounterExperimentalCreateJobRequest--;
 }
@@ -448,27 +448,27 @@
   buildCounterExperimentalCreateJobResponse--;
 }
 
-buildUnnamed1176() {
+buildUnnamed1304() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1176(core.List<core.String> o) {
+checkUnnamed1304(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1177() {
+buildUnnamed1305() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1177(core.List<core.String> o) {
+checkUnnamed1305(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -481,8 +481,8 @@
   if (buildCounterExportReadGroupSetsRequest < 3) {
     o.exportUri = "foo";
     o.projectNumber = "foo";
-    o.readGroupSetIds = buildUnnamed1176();
-    o.referenceNames = buildUnnamed1177();
+    o.readGroupSetIds = buildUnnamed1304();
+    o.referenceNames = buildUnnamed1305();
   }
   buildCounterExportReadGroupSetsRequest--;
   return o;
@@ -493,8 +493,8 @@
   if (buildCounterExportReadGroupSetsRequest < 3) {
     unittest.expect(o.exportUri, unittest.equals('foo'));
     unittest.expect(o.projectNumber, unittest.equals('foo'));
-    checkUnnamed1176(o.readGroupSetIds);
-    checkUnnamed1177(o.referenceNames);
+    checkUnnamed1304(o.readGroupSetIds);
+    checkUnnamed1305(o.referenceNames);
   }
   buildCounterExportReadGroupSetsRequest--;
 }
@@ -518,14 +518,14 @@
   buildCounterExportReadGroupSetsResponse--;
 }
 
-buildUnnamed1178() {
+buildUnnamed1306() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1178(core.List<core.String> o) {
+checkUnnamed1306(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -538,7 +538,7 @@
   if (buildCounterExportVariantSetRequest < 3) {
     o.bigqueryDataset = "foo";
     o.bigqueryTable = "foo";
-    o.callSetIds = buildUnnamed1178();
+    o.callSetIds = buildUnnamed1306();
     o.format = "foo";
     o.projectNumber = "foo";
   }
@@ -551,7 +551,7 @@
   if (buildCounterExportVariantSetRequest < 3) {
     unittest.expect(o.bigqueryDataset, unittest.equals('foo'));
     unittest.expect(o.bigqueryTable, unittest.equals('foo'));
-    checkUnnamed1178(o.callSetIds);
+    checkUnnamed1306(o.callSetIds);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.projectNumber, unittest.equals('foo'));
   }
@@ -604,14 +604,14 @@
   buildCounterFastqMetadata--;
 }
 
-buildUnnamed1179() {
+buildUnnamed1307() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1179(core.List<core.String> o) {
+checkUnnamed1307(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -624,7 +624,7 @@
   if (buildCounterImportReadGroupSetsRequest < 3) {
     o.datasetId = "foo";
     o.referenceSetId = "foo";
-    o.sourceUris = buildUnnamed1179();
+    o.sourceUris = buildUnnamed1307();
   }
   buildCounterImportReadGroupSetsRequest--;
   return o;
@@ -635,7 +635,7 @@
   if (buildCounterImportReadGroupSetsRequest < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
-    checkUnnamed1179(o.sourceUris);
+    checkUnnamed1307(o.sourceUris);
   }
   buildCounterImportReadGroupSetsRequest--;
 }
@@ -659,14 +659,14 @@
   buildCounterImportReadGroupSetsResponse--;
 }
 
-buildUnnamed1180() {
+buildUnnamed1308() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1180(core.List<core.String> o) {
+checkUnnamed1308(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -678,7 +678,7 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     o.format = "foo";
-    o.sourceUris = buildUnnamed1180();
+    o.sourceUris = buildUnnamed1308();
   }
   buildCounterImportVariantsRequest--;
   return o;
@@ -688,7 +688,7 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     unittest.expect(o.format, unittest.equals('foo'));
-    checkUnnamed1180(o.sourceUris);
+    checkUnnamed1308(o.sourceUris);
   }
   buildCounterImportVariantsRequest--;
 }
@@ -712,14 +712,14 @@
   buildCounterImportVariantsResponse--;
 }
 
-buildUnnamed1181() {
+buildUnnamed1309() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1181(core.List<core.String> o) {
+checkUnnamed1309(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -731,7 +731,7 @@
   buildCounterInterleavedFastqSource++;
   if (buildCounterInterleavedFastqSource < 3) {
     o.metadata = buildFastqMetadata();
-    o.sourceUris = buildUnnamed1181();
+    o.sourceUris = buildUnnamed1309();
   }
   buildCounterInterleavedFastqSource--;
   return o;
@@ -741,45 +741,45 @@
   buildCounterInterleavedFastqSource++;
   if (buildCounterInterleavedFastqSource < 3) {
     checkFastqMetadata(o.metadata);
-    checkUnnamed1181(o.sourceUris);
+    checkUnnamed1309(o.sourceUris);
   }
   buildCounterInterleavedFastqSource--;
 }
 
-buildUnnamed1182() {
+buildUnnamed1310() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1182(core.List<core.String> o) {
+checkUnnamed1310(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1183() {
+buildUnnamed1311() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1183(core.List<core.String> o) {
+checkUnnamed1311(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1184() {
+buildUnnamed1312() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1184(core.List<core.String> o) {
+checkUnnamed1312(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -792,13 +792,13 @@
   if (buildCounterJob < 3) {
     o.created = "foo";
     o.detailedStatus = "foo";
-    o.errors = buildUnnamed1182();
+    o.errors = buildUnnamed1310();
     o.id = "foo";
-    o.importedIds = buildUnnamed1183();
+    o.importedIds = buildUnnamed1311();
     o.projectNumber = "foo";
     o.request = buildJobRequest();
     o.status = "foo";
-    o.warnings = buildUnnamed1184();
+    o.warnings = buildUnnamed1312();
   }
   buildCounterJob--;
   return o;
@@ -809,38 +809,38 @@
   if (buildCounterJob < 3) {
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.detailedStatus, unittest.equals('foo'));
-    checkUnnamed1182(o.errors);
+    checkUnnamed1310(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1183(o.importedIds);
+    checkUnnamed1311(o.importedIds);
     unittest.expect(o.projectNumber, unittest.equals('foo'));
     checkJobRequest(o.request);
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed1184(o.warnings);
+    checkUnnamed1312(o.warnings);
   }
   buildCounterJob--;
 }
 
-buildUnnamed1185() {
+buildUnnamed1313() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1185(core.List<core.String> o) {
+checkUnnamed1313(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1186() {
+buildUnnamed1314() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1186(core.List<core.String> o) {
+checkUnnamed1314(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -851,8 +851,8 @@
   var o = new api.JobRequest();
   buildCounterJobRequest++;
   if (buildCounterJobRequest < 3) {
-    o.destination = buildUnnamed1185();
-    o.source = buildUnnamed1186();
+    o.destination = buildUnnamed1313();
+    o.source = buildUnnamed1314();
     o.type = "foo";
   }
   buildCounterJobRequest--;
@@ -862,21 +862,21 @@
 checkJobRequest(api.JobRequest o) {
   buildCounterJobRequest++;
   if (buildCounterJobRequest < 3) {
-    checkUnnamed1185(o.destination);
-    checkUnnamed1186(o.source);
+    checkUnnamed1313(o.destination);
+    checkUnnamed1314(o.source);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterJobRequest--;
 }
 
-buildUnnamed1187() {
+buildUnnamed1315() {
   var o = new core.List<api.CigarUnit>();
   o.add(buildCigarUnit());
   o.add(buildCigarUnit());
   return o;
 }
 
-checkUnnamed1187(core.List<api.CigarUnit> o) {
+checkUnnamed1315(core.List<api.CigarUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCigarUnit(o[0]);
   checkCigarUnit(o[1]);
@@ -887,7 +887,7 @@
   var o = new api.LinearAlignment();
   buildCounterLinearAlignment++;
   if (buildCounterLinearAlignment < 3) {
-    o.cigar = buildUnnamed1187();
+    o.cigar = buildUnnamed1315();
     o.mappingQuality = 42;
     o.position = buildPosition();
   }
@@ -898,7 +898,7 @@
 checkLinearAlignment(api.LinearAlignment o) {
   buildCounterLinearAlignment++;
   if (buildCounterLinearAlignment < 3) {
-    checkUnnamed1187(o.cigar);
+    checkUnnamed1315(o.cigar);
     unittest.expect(o.mappingQuality, unittest.equals(42));
     checkPosition(o.position);
   }
@@ -928,14 +928,14 @@
   buildCounterListBasesResponse--;
 }
 
-buildUnnamed1188() {
+buildUnnamed1316() {
   var o = new core.List<api.CoverageBucket>();
   o.add(buildCoverageBucket());
   o.add(buildCoverageBucket());
   return o;
 }
 
-checkUnnamed1188(core.List<api.CoverageBucket> o) {
+checkUnnamed1316(core.List<api.CoverageBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCoverageBucket(o[0]);
   checkCoverageBucket(o[1]);
@@ -947,7 +947,7 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     o.bucketWidth = "foo";
-    o.coverageBuckets = buildUnnamed1188();
+    o.coverageBuckets = buildUnnamed1316();
     o.nextPageToken = "foo";
   }
   buildCounterListCoverageBucketsResponse--;
@@ -958,20 +958,20 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     unittest.expect(o.bucketWidth, unittest.equals('foo'));
-    checkUnnamed1188(o.coverageBuckets);
+    checkUnnamed1316(o.coverageBuckets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCoverageBucketsResponse--;
 }
 
-buildUnnamed1189() {
+buildUnnamed1317() {
   var o = new core.List<api.Dataset>();
   o.add(buildDataset());
   o.add(buildDataset());
   return o;
 }
 
-checkUnnamed1189(core.List<api.Dataset> o) {
+checkUnnamed1317(core.List<api.Dataset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataset(o[0]);
   checkDataset(o[1]);
@@ -982,7 +982,7 @@
   var o = new api.ListDatasetsResponse();
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    o.datasets = buildUnnamed1189();
+    o.datasets = buildUnnamed1317();
     o.nextPageToken = "foo";
   }
   buildCounterListDatasetsResponse--;
@@ -992,20 +992,20 @@
 checkListDatasetsResponse(api.ListDatasetsResponse o) {
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    checkUnnamed1189(o.datasets);
+    checkUnnamed1317(o.datasets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDatasetsResponse--;
 }
 
-buildUnnamed1190() {
+buildUnnamed1318() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed1190(core.List<api.Variant> o) {
+checkUnnamed1318(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -1016,7 +1016,7 @@
   var o = new api.MergeVariantsRequest();
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    o.variants = buildUnnamed1190();
+    o.variants = buildUnnamed1318();
   }
   buildCounterMergeVariantsRequest--;
   return o;
@@ -1025,35 +1025,35 @@
 checkMergeVariantsRequest(api.MergeVariantsRequest o) {
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    checkUnnamed1190(o.variants);
+    checkUnnamed1318(o.variants);
   }
   buildCounterMergeVariantsRequest--;
 }
 
-buildUnnamed1191() {
+buildUnnamed1319() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1191(core.List<core.String> o) {
+checkUnnamed1319(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1192() {
+buildUnnamed1320() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1191();
-  o["y"] = buildUnnamed1191();
+  o["x"] = buildUnnamed1319();
+  o["y"] = buildUnnamed1319();
   return o;
 }
 
-checkUnnamed1192(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1320(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1191(o["x"]);
-  checkUnnamed1191(o["y"]);
+  checkUnnamed1319(o["x"]);
+  checkUnnamed1319(o["y"]);
 }
 
 core.int buildCounterMetadata = 0;
@@ -1063,7 +1063,7 @@
   if (buildCounterMetadata < 3) {
     o.description = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1192();
+    o.info = buildUnnamed1320();
     o.key = "foo";
     o.number = "foo";
     o.type = "foo";
@@ -1078,7 +1078,7 @@
   if (buildCounterMetadata < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1192(o.info);
+    checkUnnamed1320(o.info);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1087,27 +1087,27 @@
   buildCounterMetadata--;
 }
 
-buildUnnamed1193() {
+buildUnnamed1321() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1193(core.List<core.String> o) {
+checkUnnamed1321(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1194() {
+buildUnnamed1322() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1194(core.List<core.String> o) {
+checkUnnamed1322(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1118,9 +1118,9 @@
   var o = new api.PairedFastqSource();
   buildCounterPairedFastqSource++;
   if (buildCounterPairedFastqSource < 3) {
-    o.firstSourceUris = buildUnnamed1193();
+    o.firstSourceUris = buildUnnamed1321();
     o.metadata = buildFastqMetadata();
-    o.secondSourceUris = buildUnnamed1194();
+    o.secondSourceUris = buildUnnamed1322();
   }
   buildCounterPairedFastqSource--;
   return o;
@@ -1129,9 +1129,9 @@
 checkPairedFastqSource(api.PairedFastqSource o) {
   buildCounterPairedFastqSource++;
   if (buildCounterPairedFastqSource < 3) {
-    checkUnnamed1193(o.firstSourceUris);
+    checkUnnamed1321(o.firstSourceUris);
     checkFastqMetadata(o.metadata);
-    checkUnnamed1194(o.secondSourceUris);
+    checkUnnamed1322(o.secondSourceUris);
   }
   buildCounterPairedFastqSource--;
 }
@@ -1182,43 +1182,43 @@
   buildCounterRange--;
 }
 
-buildUnnamed1195() {
+buildUnnamed1323() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1195(core.List<core.int> o) {
+checkUnnamed1323(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed1196() {
+buildUnnamed1324() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1196(core.List<core.String> o) {
+checkUnnamed1324(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1197() {
+buildUnnamed1325() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1196();
-  o["y"] = buildUnnamed1196();
+  o["x"] = buildUnnamed1324();
+  o["y"] = buildUnnamed1324();
   return o;
 }
 
-checkUnnamed1197(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1325(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1196(o["x"]);
-  checkUnnamed1196(o["y"]);
+  checkUnnamed1324(o["x"]);
+  checkUnnamed1324(o["y"]);
 }
 
 core.int buildCounterRead = 0;
@@ -1226,7 +1226,7 @@
   var o = new api.Read();
   buildCounterRead++;
   if (buildCounterRead < 3) {
-    o.alignedQuality = buildUnnamed1195();
+    o.alignedQuality = buildUnnamed1323();
     o.alignedSequence = "foo";
     o.alignment = buildLinearAlignment();
     o.duplicateFragment = true;
@@ -1234,7 +1234,7 @@
     o.fragmentLength = 42;
     o.fragmentName = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1197();
+    o.info = buildUnnamed1325();
     o.nextMatePosition = buildPosition();
     o.numberReads = 42;
     o.properPlacement = true;
@@ -1251,7 +1251,7 @@
 checkRead(api.Read o) {
   buildCounterRead++;
   if (buildCounterRead < 3) {
-    checkUnnamed1195(o.alignedQuality);
+    checkUnnamed1323(o.alignedQuality);
     unittest.expect(o.alignedSequence, unittest.equals('foo'));
     checkLinearAlignment(o.alignment);
     unittest.expect(o.duplicateFragment, unittest.isTrue);
@@ -1259,7 +1259,7 @@
     unittest.expect(o.fragmentLength, unittest.equals(42));
     unittest.expect(o.fragmentName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1197(o.info);
+    checkUnnamed1325(o.info);
     checkPosition(o.nextMatePosition);
     unittest.expect(o.numberReads, unittest.equals(42));
     unittest.expect(o.properPlacement, unittest.isTrue);
@@ -1272,40 +1272,40 @@
   buildCounterRead--;
 }
 
-buildUnnamed1198() {
+buildUnnamed1326() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1198(core.List<core.String> o) {
+checkUnnamed1326(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1199() {
+buildUnnamed1327() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1198();
-  o["y"] = buildUnnamed1198();
+  o["x"] = buildUnnamed1326();
+  o["y"] = buildUnnamed1326();
   return o;
 }
 
-checkUnnamed1199(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1327(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1198(o["x"]);
-  checkUnnamed1198(o["y"]);
+  checkUnnamed1326(o["x"]);
+  checkUnnamed1326(o["y"]);
 }
 
-buildUnnamed1200() {
+buildUnnamed1328() {
   var o = new core.List<api.ReadGroupProgram>();
   o.add(buildReadGroupProgram());
   o.add(buildReadGroupProgram());
   return o;
 }
 
-checkUnnamed1200(core.List<api.ReadGroupProgram> o) {
+checkUnnamed1328(core.List<api.ReadGroupProgram> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadGroupProgram(o[0]);
   checkReadGroupProgram(o[1]);
@@ -1320,10 +1320,10 @@
     o.description = "foo";
     o.experiment = buildReadGroupExperiment();
     o.id = "foo";
-    o.info = buildUnnamed1199();
+    o.info = buildUnnamed1327();
     o.name = "foo";
     o.predictedInsertSize = 42;
-    o.programs = buildUnnamed1200();
+    o.programs = buildUnnamed1328();
     o.referenceSetId = "foo";
     o.sampleId = "foo";
   }
@@ -1338,10 +1338,10 @@
     unittest.expect(o.description, unittest.equals('foo'));
     checkReadGroupExperiment(o.experiment);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1199(o.info);
+    checkUnnamed1327(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.predictedInsertSize, unittest.equals(42));
-    checkUnnamed1200(o.programs);
+    checkUnnamed1328(o.programs);
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
     unittest.expect(o.sampleId, unittest.equals('foo'));
   }
@@ -1400,14 +1400,14 @@
   buildCounterReadGroupProgram--;
 }
 
-buildUnnamed1201() {
+buildUnnamed1329() {
   var o = new core.List<api.ReadGroup>();
   o.add(buildReadGroup());
   o.add(buildReadGroup());
   return o;
 }
 
-checkUnnamed1201(core.List<api.ReadGroup> o) {
+checkUnnamed1329(core.List<api.ReadGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadGroup(o[0]);
   checkReadGroup(o[1]);
@@ -1422,7 +1422,7 @@
     o.filename = "foo";
     o.id = "foo";
     o.name = "foo";
-    o.readGroups = buildUnnamed1201();
+    o.readGroups = buildUnnamed1329();
     o.referenceSetId = "foo";
   }
   buildCounterReadGroupSet--;
@@ -1436,20 +1436,20 @@
     unittest.expect(o.filename, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1201(o.readGroups);
+    checkUnnamed1329(o.readGroups);
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
   }
   buildCounterReadGroupSet--;
 }
 
-buildUnnamed1202() {
+buildUnnamed1330() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1202(core.List<core.String> o) {
+checkUnnamed1330(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1465,7 +1465,7 @@
     o.md5checksum = "foo";
     o.name = "foo";
     o.ncbiTaxonId = 42;
-    o.sourceAccessions = buildUnnamed1202();
+    o.sourceAccessions = buildUnnamed1330();
     o.sourceURI = "foo";
   }
   buildCounterReference--;
@@ -1480,7 +1480,7 @@
     unittest.expect(o.md5checksum, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ncbiTaxonId, unittest.equals(42));
-    checkUnnamed1202(o.sourceAccessions);
+    checkUnnamed1330(o.sourceAccessions);
     unittest.expect(o.sourceURI, unittest.equals('foo'));
   }
   buildCounterReference--;
@@ -1507,27 +1507,27 @@
   buildCounterReferenceBound--;
 }
 
-buildUnnamed1203() {
+buildUnnamed1331() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1203(core.List<core.String> o) {
+checkUnnamed1331(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1204() {
+buildUnnamed1332() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1204(core.List<core.String> o) {
+checkUnnamed1332(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1543,8 +1543,8 @@
     o.id = "foo";
     o.md5checksum = "foo";
     o.ncbiTaxonId = 42;
-    o.referenceIds = buildUnnamed1203();
-    o.sourceAccessions = buildUnnamed1204();
+    o.referenceIds = buildUnnamed1331();
+    o.sourceAccessions = buildUnnamed1332();
     o.sourceURI = "foo";
   }
   buildCounterReferenceSet--;
@@ -1559,21 +1559,21 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.md5checksum, unittest.equals('foo'));
     unittest.expect(o.ncbiTaxonId, unittest.equals(42));
-    checkUnnamed1203(o.referenceIds);
-    checkUnnamed1204(o.sourceAccessions);
+    checkUnnamed1331(o.referenceIds);
+    checkUnnamed1332(o.sourceAccessions);
     unittest.expect(o.sourceURI, unittest.equals('foo'));
   }
   buildCounterReferenceSet--;
 }
 
-buildUnnamed1205() {
+buildUnnamed1333() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1205(core.List<core.String> o) {
+checkUnnamed1333(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1587,7 +1587,7 @@
     o.name = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.variantSetIds = buildUnnamed1205();
+    o.variantSetIds = buildUnnamed1333();
   }
   buildCounterSearchCallSetsRequest--;
   return o;
@@ -1599,19 +1599,19 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1205(o.variantSetIds);
+    checkUnnamed1333(o.variantSetIds);
   }
   buildCounterSearchCallSetsRequest--;
 }
 
-buildUnnamed1206() {
+buildUnnamed1334() {
   var o = new core.List<api.CallSet>();
   o.add(buildCallSet());
   o.add(buildCallSet());
   return o;
 }
 
-checkUnnamed1206(core.List<api.CallSet> o) {
+checkUnnamed1334(core.List<api.CallSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCallSet(o[0]);
   checkCallSet(o[1]);
@@ -1622,7 +1622,7 @@
   var o = new api.SearchCallSetsResponse();
   buildCounterSearchCallSetsResponse++;
   if (buildCounterSearchCallSetsResponse < 3) {
-    o.callSets = buildUnnamed1206();
+    o.callSets = buildUnnamed1334();
     o.nextPageToken = "foo";
   }
   buildCounterSearchCallSetsResponse--;
@@ -1632,20 +1632,20 @@
 checkSearchCallSetsResponse(api.SearchCallSetsResponse o) {
   buildCounterSearchCallSetsResponse++;
   if (buildCounterSearchCallSetsResponse < 3) {
-    checkUnnamed1206(o.callSets);
+    checkUnnamed1334(o.callSets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchCallSetsResponse--;
 }
 
-buildUnnamed1207() {
+buildUnnamed1335() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1207(core.List<core.String> o) {
+checkUnnamed1335(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1661,7 +1661,7 @@
     o.pageSize = 42;
     o.pageToken = "foo";
     o.projectNumber = "foo";
-    o.status = buildUnnamed1207();
+    o.status = buildUnnamed1335();
   }
   buildCounterSearchJobsRequest--;
   return o;
@@ -1675,19 +1675,19 @@
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.projectNumber, unittest.equals('foo'));
-    checkUnnamed1207(o.status);
+    checkUnnamed1335(o.status);
   }
   buildCounterSearchJobsRequest--;
 }
 
-buildUnnamed1208() {
+buildUnnamed1336() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed1208(core.List<api.Job> o) {
+checkUnnamed1336(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -1698,7 +1698,7 @@
   var o = new api.SearchJobsResponse();
   buildCounterSearchJobsResponse++;
   if (buildCounterSearchJobsResponse < 3) {
-    o.jobs = buildUnnamed1208();
+    o.jobs = buildUnnamed1336();
     o.nextPageToken = "foo";
   }
   buildCounterSearchJobsResponse--;
@@ -1708,20 +1708,20 @@
 checkSearchJobsResponse(api.SearchJobsResponse o) {
   buildCounterSearchJobsResponse++;
   if (buildCounterSearchJobsResponse < 3) {
-    checkUnnamed1208(o.jobs);
+    checkUnnamed1336(o.jobs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchJobsResponse--;
 }
 
-buildUnnamed1209() {
+buildUnnamed1337() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1209(core.List<core.String> o) {
+checkUnnamed1337(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1732,7 +1732,7 @@
   var o = new api.SearchReadGroupSetsRequest();
   buildCounterSearchReadGroupSetsRequest++;
   if (buildCounterSearchReadGroupSetsRequest < 3) {
-    o.datasetIds = buildUnnamed1209();
+    o.datasetIds = buildUnnamed1337();
     o.name = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
@@ -1744,7 +1744,7 @@
 checkSearchReadGroupSetsRequest(api.SearchReadGroupSetsRequest o) {
   buildCounterSearchReadGroupSetsRequest++;
   if (buildCounterSearchReadGroupSetsRequest < 3) {
-    checkUnnamed1209(o.datasetIds);
+    checkUnnamed1337(o.datasetIds);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
@@ -1752,14 +1752,14 @@
   buildCounterSearchReadGroupSetsRequest--;
 }
 
-buildUnnamed1210() {
+buildUnnamed1338() {
   var o = new core.List<api.ReadGroupSet>();
   o.add(buildReadGroupSet());
   o.add(buildReadGroupSet());
   return o;
 }
 
-checkUnnamed1210(core.List<api.ReadGroupSet> o) {
+checkUnnamed1338(core.List<api.ReadGroupSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadGroupSet(o[0]);
   checkReadGroupSet(o[1]);
@@ -1771,7 +1771,7 @@
   buildCounterSearchReadGroupSetsResponse++;
   if (buildCounterSearchReadGroupSetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.readGroupSets = buildUnnamed1210();
+    o.readGroupSets = buildUnnamed1338();
   }
   buildCounterSearchReadGroupSetsResponse--;
   return o;
@@ -1781,32 +1781,32 @@
   buildCounterSearchReadGroupSetsResponse++;
   if (buildCounterSearchReadGroupSetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1210(o.readGroupSets);
+    checkUnnamed1338(o.readGroupSets);
   }
   buildCounterSearchReadGroupSetsResponse--;
 }
 
-buildUnnamed1211() {
+buildUnnamed1339() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1211(core.List<core.String> o) {
+checkUnnamed1339(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1212() {
+buildUnnamed1340() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1212(core.List<core.String> o) {
+checkUnnamed1340(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1820,8 +1820,8 @@
     o.end = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.readGroupIds = buildUnnamed1211();
-    o.readGroupSetIds = buildUnnamed1212();
+    o.readGroupIds = buildUnnamed1339();
+    o.readGroupSetIds = buildUnnamed1340();
     o.referenceName = "foo";
     o.start = "foo";
   }
@@ -1835,22 +1835,22 @@
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1211(o.readGroupIds);
-    checkUnnamed1212(o.readGroupSetIds);
+    checkUnnamed1339(o.readGroupIds);
+    checkUnnamed1340(o.readGroupSetIds);
     unittest.expect(o.referenceName, unittest.equals('foo'));
     unittest.expect(o.start, unittest.equals('foo'));
   }
   buildCounterSearchReadsRequest--;
 }
 
-buildUnnamed1213() {
+buildUnnamed1341() {
   var o = new core.List<api.Read>();
   o.add(buildRead());
   o.add(buildRead());
   return o;
 }
 
-checkUnnamed1213(core.List<api.Read> o) {
+checkUnnamed1341(core.List<api.Read> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRead(o[0]);
   checkRead(o[1]);
@@ -1861,7 +1861,7 @@
   var o = new api.SearchReadsResponse();
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
-    o.alignments = buildUnnamed1213();
+    o.alignments = buildUnnamed1341();
     o.nextPageToken = "foo";
   }
   buildCounterSearchReadsResponse--;
@@ -1871,33 +1871,33 @@
 checkSearchReadsResponse(api.SearchReadsResponse o) {
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
-    checkUnnamed1213(o.alignments);
+    checkUnnamed1341(o.alignments);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchReadsResponse--;
 }
 
-buildUnnamed1214() {
+buildUnnamed1342() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1214(core.List<core.String> o) {
+checkUnnamed1342(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1215() {
+buildUnnamed1343() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1215(core.List<core.String> o) {
+checkUnnamed1343(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1908,8 +1908,8 @@
   var o = new api.SearchReferenceSetsRequest();
   buildCounterSearchReferenceSetsRequest++;
   if (buildCounterSearchReferenceSetsRequest < 3) {
-    o.accessions = buildUnnamed1214();
-    o.md5checksums = buildUnnamed1215();
+    o.accessions = buildUnnamed1342();
+    o.md5checksums = buildUnnamed1343();
     o.pageSize = 42;
     o.pageToken = "foo";
   }
@@ -1920,22 +1920,22 @@
 checkSearchReferenceSetsRequest(api.SearchReferenceSetsRequest o) {
   buildCounterSearchReferenceSetsRequest++;
   if (buildCounterSearchReferenceSetsRequest < 3) {
-    checkUnnamed1214(o.accessions);
-    checkUnnamed1215(o.md5checksums);
+    checkUnnamed1342(o.accessions);
+    checkUnnamed1343(o.md5checksums);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
   }
   buildCounterSearchReferenceSetsRequest--;
 }
 
-buildUnnamed1216() {
+buildUnnamed1344() {
   var o = new core.List<api.ReferenceSet>();
   o.add(buildReferenceSet());
   o.add(buildReferenceSet());
   return o;
 }
 
-checkUnnamed1216(core.List<api.ReferenceSet> o) {
+checkUnnamed1344(core.List<api.ReferenceSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceSet(o[0]);
   checkReferenceSet(o[1]);
@@ -1947,7 +1947,7 @@
   buildCounterSearchReferenceSetsResponse++;
   if (buildCounterSearchReferenceSetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.referenceSets = buildUnnamed1216();
+    o.referenceSets = buildUnnamed1344();
   }
   buildCounterSearchReferenceSetsResponse--;
   return o;
@@ -1957,32 +1957,32 @@
   buildCounterSearchReferenceSetsResponse++;
   if (buildCounterSearchReferenceSetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1216(o.referenceSets);
+    checkUnnamed1344(o.referenceSets);
   }
   buildCounterSearchReferenceSetsResponse--;
 }
 
-buildUnnamed1217() {
+buildUnnamed1345() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1217(core.List<core.String> o) {
+checkUnnamed1345(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1218() {
+buildUnnamed1346() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1218(core.List<core.String> o) {
+checkUnnamed1346(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1993,8 +1993,8 @@
   var o = new api.SearchReferencesRequest();
   buildCounterSearchReferencesRequest++;
   if (buildCounterSearchReferencesRequest < 3) {
-    o.accessions = buildUnnamed1217();
-    o.md5checksums = buildUnnamed1218();
+    o.accessions = buildUnnamed1345();
+    o.md5checksums = buildUnnamed1346();
     o.pageSize = 42;
     o.pageToken = "foo";
     o.referenceSetId = "foo";
@@ -2006,8 +2006,8 @@
 checkSearchReferencesRequest(api.SearchReferencesRequest o) {
   buildCounterSearchReferencesRequest++;
   if (buildCounterSearchReferencesRequest < 3) {
-    checkUnnamed1217(o.accessions);
-    checkUnnamed1218(o.md5checksums);
+    checkUnnamed1345(o.accessions);
+    checkUnnamed1346(o.md5checksums);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.referenceSetId, unittest.equals('foo'));
@@ -2015,14 +2015,14 @@
   buildCounterSearchReferencesRequest--;
 }
 
-buildUnnamed1219() {
+buildUnnamed1347() {
   var o = new core.List<api.Reference>();
   o.add(buildReference());
   o.add(buildReference());
   return o;
 }
 
-checkUnnamed1219(core.List<api.Reference> o) {
+checkUnnamed1347(core.List<api.Reference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReference(o[0]);
   checkReference(o[1]);
@@ -2034,7 +2034,7 @@
   buildCounterSearchReferencesResponse++;
   if (buildCounterSearchReferencesResponse < 3) {
     o.nextPageToken = "foo";
-    o.references = buildUnnamed1219();
+    o.references = buildUnnamed1347();
   }
   buildCounterSearchReferencesResponse--;
   return o;
@@ -2044,19 +2044,19 @@
   buildCounterSearchReferencesResponse++;
   if (buildCounterSearchReferencesResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1219(o.references);
+    checkUnnamed1347(o.references);
   }
   buildCounterSearchReferencesResponse--;
 }
 
-buildUnnamed1220() {
+buildUnnamed1348() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1220(core.List<core.String> o) {
+checkUnnamed1348(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2067,7 +2067,7 @@
   var o = new api.SearchVariantSetsRequest();
   buildCounterSearchVariantSetsRequest++;
   if (buildCounterSearchVariantSetsRequest < 3) {
-    o.datasetIds = buildUnnamed1220();
+    o.datasetIds = buildUnnamed1348();
     o.pageSize = 42;
     o.pageToken = "foo";
   }
@@ -2078,21 +2078,21 @@
 checkSearchVariantSetsRequest(api.SearchVariantSetsRequest o) {
   buildCounterSearchVariantSetsRequest++;
   if (buildCounterSearchVariantSetsRequest < 3) {
-    checkUnnamed1220(o.datasetIds);
+    checkUnnamed1348(o.datasetIds);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
   }
   buildCounterSearchVariantSetsRequest--;
 }
 
-buildUnnamed1221() {
+buildUnnamed1349() {
   var o = new core.List<api.VariantSet>();
   o.add(buildVariantSet());
   o.add(buildVariantSet());
   return o;
 }
 
-checkUnnamed1221(core.List<api.VariantSet> o) {
+checkUnnamed1349(core.List<api.VariantSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariantSet(o[0]);
   checkVariantSet(o[1]);
@@ -2104,7 +2104,7 @@
   buildCounterSearchVariantSetsResponse++;
   if (buildCounterSearchVariantSetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variantSets = buildUnnamed1221();
+    o.variantSets = buildUnnamed1349();
   }
   buildCounterSearchVariantSetsResponse--;
   return o;
@@ -2114,32 +2114,32 @@
   buildCounterSearchVariantSetsResponse++;
   if (buildCounterSearchVariantSetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1221(o.variantSets);
+    checkUnnamed1349(o.variantSets);
   }
   buildCounterSearchVariantSetsResponse--;
 }
 
-buildUnnamed1222() {
+buildUnnamed1350() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1222(core.List<core.String> o) {
+checkUnnamed1350(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1223() {
+buildUnnamed1351() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1223(core.List<core.String> o) {
+checkUnnamed1351(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2150,7 +2150,7 @@
   var o = new api.SearchVariantsRequest();
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    o.callSetIds = buildUnnamed1222();
+    o.callSetIds = buildUnnamed1350();
     o.end = "foo";
     o.maxCalls = 42;
     o.pageSize = 42;
@@ -2158,7 +2158,7 @@
     o.referenceName = "foo";
     o.start = "foo";
     o.variantName = "foo";
-    o.variantSetIds = buildUnnamed1223();
+    o.variantSetIds = buildUnnamed1351();
   }
   buildCounterSearchVariantsRequest--;
   return o;
@@ -2167,7 +2167,7 @@
 checkSearchVariantsRequest(api.SearchVariantsRequest o) {
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    checkUnnamed1222(o.callSetIds);
+    checkUnnamed1350(o.callSetIds);
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.maxCalls, unittest.equals(42));
     unittest.expect(o.pageSize, unittest.equals(42));
@@ -2175,19 +2175,19 @@
     unittest.expect(o.referenceName, unittest.equals('foo'));
     unittest.expect(o.start, unittest.equals('foo'));
     unittest.expect(o.variantName, unittest.equals('foo'));
-    checkUnnamed1223(o.variantSetIds);
+    checkUnnamed1351(o.variantSetIds);
   }
   buildCounterSearchVariantsRequest--;
 }
 
-buildUnnamed1224() {
+buildUnnamed1352() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed1224(core.List<api.Variant> o) {
+checkUnnamed1352(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -2199,7 +2199,7 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variants = buildUnnamed1224();
+    o.variants = buildUnnamed1352();
   }
   buildCounterSearchVariantsResponse--;
   return o;
@@ -2209,84 +2209,84 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1224(o.variants);
+    checkUnnamed1352(o.variants);
   }
   buildCounterSearchVariantsResponse--;
 }
 
-buildUnnamed1225() {
+buildUnnamed1353() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1225(core.List<core.String> o) {
+checkUnnamed1353(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1226() {
+buildUnnamed1354() {
   var o = new core.List<api.Call>();
   o.add(buildCall());
   o.add(buildCall());
   return o;
 }
 
-checkUnnamed1226(core.List<api.Call> o) {
+checkUnnamed1354(core.List<api.Call> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCall(o[0]);
   checkCall(o[1]);
 }
 
-buildUnnamed1227() {
+buildUnnamed1355() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1227(core.List<core.String> o) {
+checkUnnamed1355(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1228() {
+buildUnnamed1356() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1228(core.List<core.String> o) {
+checkUnnamed1356(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1229() {
+buildUnnamed1357() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1228();
-  o["y"] = buildUnnamed1228();
+  o["x"] = buildUnnamed1356();
+  o["y"] = buildUnnamed1356();
   return o;
 }
 
-checkUnnamed1229(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1357(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1228(o["x"]);
-  checkUnnamed1228(o["y"]);
+  checkUnnamed1356(o["x"]);
+  checkUnnamed1356(o["y"]);
 }
 
-buildUnnamed1230() {
+buildUnnamed1358() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1230(core.List<core.String> o) {
+checkUnnamed1358(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2297,14 +2297,14 @@
   var o = new api.Variant();
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    o.alternateBases = buildUnnamed1225();
-    o.calls = buildUnnamed1226();
+    o.alternateBases = buildUnnamed1353();
+    o.calls = buildUnnamed1354();
     o.created = "foo";
     o.end = "foo";
-    o.filter = buildUnnamed1227();
+    o.filter = buildUnnamed1355();
     o.id = "foo";
-    o.info = buildUnnamed1229();
-    o.names = buildUnnamed1230();
+    o.info = buildUnnamed1357();
+    o.names = buildUnnamed1358();
     o.quality = 42.0;
     o.referenceBases = "foo";
     o.referenceName = "foo";
@@ -2318,14 +2318,14 @@
 checkVariant(api.Variant o) {
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    checkUnnamed1225(o.alternateBases);
-    checkUnnamed1226(o.calls);
+    checkUnnamed1353(o.alternateBases);
+    checkUnnamed1354(o.calls);
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.end, unittest.equals('foo'));
-    checkUnnamed1227(o.filter);
+    checkUnnamed1355(o.filter);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1229(o.info);
-    checkUnnamed1230(o.names);
+    checkUnnamed1357(o.info);
+    checkUnnamed1358(o.names);
     unittest.expect(o.quality, unittest.equals(42.0));
     unittest.expect(o.referenceBases, unittest.equals('foo'));
     unittest.expect(o.referenceName, unittest.equals('foo'));
@@ -2335,27 +2335,27 @@
   buildCounterVariant--;
 }
 
-buildUnnamed1231() {
+buildUnnamed1359() {
   var o = new core.List<api.Metadata>();
   o.add(buildMetadata());
   o.add(buildMetadata());
   return o;
 }
 
-checkUnnamed1231(core.List<api.Metadata> o) {
+checkUnnamed1359(core.List<api.Metadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadata(o[0]);
   checkMetadata(o[1]);
 }
 
-buildUnnamed1232() {
+buildUnnamed1360() {
   var o = new core.List<api.ReferenceBound>();
   o.add(buildReferenceBound());
   o.add(buildReferenceBound());
   return o;
 }
 
-checkUnnamed1232(core.List<api.ReferenceBound> o) {
+checkUnnamed1360(core.List<api.ReferenceBound> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceBound(o[0]);
   checkReferenceBound(o[1]);
@@ -2368,8 +2368,8 @@
   if (buildCounterVariantSet < 3) {
     o.datasetId = "foo";
     o.id = "foo";
-    o.metadata = buildUnnamed1231();
-    o.referenceBounds = buildUnnamed1232();
+    o.metadata = buildUnnamed1359();
+    o.referenceBounds = buildUnnamed1360();
   }
   buildCounterVariantSet--;
   return o;
@@ -2380,8 +2380,8 @@
   if (buildCounterVariantSet < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1231(o.metadata);
-    checkUnnamed1232(o.referenceBounds);
+    checkUnnamed1359(o.metadata);
+    checkUnnamed1360(o.referenceBounds);
   }
   buildCounterVariantSet--;
 }
diff --git a/generated/googleapis_beta/test/genomics/v1beta_test.dart b/generated/googleapis_beta/test/genomics/v1beta_test.dart
index 17368fc..fcce938 100644
--- a/generated/googleapis_beta/test/genomics/v1beta_test.dart
+++ b/generated/googleapis_beta/test/genomics/v1beta_test.dart
@@ -16,56 +16,56 @@
 
 
 
-buildUnnamed1337() {
+buildUnnamed1238() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1337(core.List<core.int> o) {
+checkUnnamed1238(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed1338() {
+buildUnnamed1239() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1338(core.List<core.double> o) {
+checkUnnamed1239(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed1339() {
+buildUnnamed1240() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1339(core.List<core.String> o) {
+checkUnnamed1240(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1340() {
+buildUnnamed1241() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1339();
-  o["y"] = buildUnnamed1339();
+  o["x"] = buildUnnamed1240();
+  o["y"] = buildUnnamed1240();
   return o;
 }
 
-checkUnnamed1340(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1241(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1339(o["x"]);
-  checkUnnamed1339(o["y"]);
+  checkUnnamed1240(o["x"]);
+  checkUnnamed1240(o["y"]);
 }
 
 core.int buildCounterCall = 0;
@@ -75,9 +75,9 @@
   if (buildCounterCall < 3) {
     o.callSetId = "foo";
     o.callSetName = "foo";
-    o.genotype = buildUnnamed1337();
-    o.genotypeLikelihood = buildUnnamed1338();
-    o.info = buildUnnamed1340();
+    o.genotype = buildUnnamed1238();
+    o.genotypeLikelihood = buildUnnamed1239();
+    o.info = buildUnnamed1241();
     o.phaseset = "foo";
   }
   buildCounterCall--;
@@ -89,48 +89,48 @@
   if (buildCounterCall < 3) {
     unittest.expect(o.callSetId, unittest.equals('foo'));
     unittest.expect(o.callSetName, unittest.equals('foo'));
-    checkUnnamed1337(o.genotype);
-    checkUnnamed1338(o.genotypeLikelihood);
-    checkUnnamed1340(o.info);
+    checkUnnamed1238(o.genotype);
+    checkUnnamed1239(o.genotypeLikelihood);
+    checkUnnamed1241(o.info);
     unittest.expect(o.phaseset, unittest.equals('foo'));
   }
   buildCounterCall--;
 }
 
-buildUnnamed1341() {
+buildUnnamed1242() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1341(core.List<core.String> o) {
+checkUnnamed1242(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1342() {
+buildUnnamed1243() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1341();
-  o["y"] = buildUnnamed1341();
+  o["x"] = buildUnnamed1242();
+  o["y"] = buildUnnamed1242();
   return o;
 }
 
-checkUnnamed1342(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1243(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1341(o["x"]);
-  checkUnnamed1341(o["y"]);
+  checkUnnamed1242(o["x"]);
+  checkUnnamed1242(o["y"]);
 }
 
-buildUnnamed1343() {
+buildUnnamed1244() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1343(core.List<core.String> o) {
+checkUnnamed1244(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -143,10 +143,10 @@
   if (buildCounterCallSet < 3) {
     o.created = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1342();
+    o.info = buildUnnamed1243();
     o.name = "foo";
     o.sampleId = "foo";
-    o.variantSetIds = buildUnnamed1343();
+    o.variantSetIds = buildUnnamed1244();
   }
   buildCounterCallSet--;
   return o;
@@ -157,10 +157,10 @@
   if (buildCounterCallSet < 3) {
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1342(o.info);
+    checkUnnamed1243(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.sampleId, unittest.equals('foo'));
-    checkUnnamed1343(o.variantSetIds);
+    checkUnnamed1244(o.variantSetIds);
   }
   buildCounterCallSet--;
 }
@@ -211,27 +211,27 @@
   buildCounterDataset--;
 }
 
-buildUnnamed1344() {
+buildUnnamed1245() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1344(core.List<core.String> o) {
+checkUnnamed1245(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1345() {
+buildUnnamed1246() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1345(core.List<core.String> o) {
+checkUnnamed1246(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -245,9 +245,9 @@
     o.align = true;
     o.callVariants = true;
     o.gcsOutputPath = "foo";
-    o.pairedSourceUris = buildUnnamed1344();
+    o.pairedSourceUris = buildUnnamed1245();
     o.projectId = "foo";
-    o.sourceUris = buildUnnamed1345();
+    o.sourceUris = buildUnnamed1246();
   }
   buildCounterExperimentalCreateJobRequest--;
   return o;
@@ -259,9 +259,9 @@
     unittest.expect(o.align, unittest.isTrue);
     unittest.expect(o.callVariants, unittest.isTrue);
     unittest.expect(o.gcsOutputPath, unittest.equals('foo'));
-    checkUnnamed1344(o.pairedSourceUris);
+    checkUnnamed1245(o.pairedSourceUris);
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed1345(o.sourceUris);
+    checkUnnamed1246(o.sourceUris);
   }
   buildCounterExperimentalCreateJobRequest--;
 }
@@ -285,27 +285,27 @@
   buildCounterExperimentalCreateJobResponse--;
 }
 
-buildUnnamed1346() {
+buildUnnamed1247() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1346(core.List<core.String> o) {
+checkUnnamed1247(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1347() {
+buildUnnamed1248() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1347(core.List<core.String> o) {
+checkUnnamed1248(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -318,8 +318,8 @@
   if (buildCounterExportReadsetsRequest < 3) {
     o.exportUri = "foo";
     o.projectId = "foo";
-    o.readsetIds = buildUnnamed1346();
-    o.referenceNames = buildUnnamed1347();
+    o.readsetIds = buildUnnamed1247();
+    o.referenceNames = buildUnnamed1248();
   }
   buildCounterExportReadsetsRequest--;
   return o;
@@ -330,8 +330,8 @@
   if (buildCounterExportReadsetsRequest < 3) {
     unittest.expect(o.exportUri, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed1346(o.readsetIds);
-    checkUnnamed1347(o.referenceNames);
+    checkUnnamed1247(o.readsetIds);
+    checkUnnamed1248(o.referenceNames);
   }
   buildCounterExportReadsetsRequest--;
 }
@@ -355,14 +355,14 @@
   buildCounterExportReadsetsResponse--;
 }
 
-buildUnnamed1348() {
+buildUnnamed1249() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1348(core.List<core.String> o) {
+checkUnnamed1249(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -375,7 +375,7 @@
   if (buildCounterExportVariantsRequest < 3) {
     o.bigqueryDataset = "foo";
     o.bigqueryTable = "foo";
-    o.callSetIds = buildUnnamed1348();
+    o.callSetIds = buildUnnamed1249();
     o.format = "foo";
     o.projectId = "foo";
     o.variantSetId = "foo";
@@ -389,7 +389,7 @@
   if (buildCounterExportVariantsRequest < 3) {
     unittest.expect(o.bigqueryDataset, unittest.equals('foo'));
     unittest.expect(o.bigqueryTable, unittest.equals('foo'));
-    checkUnnamed1348(o.callSetIds);
+    checkUnnamed1249(o.callSetIds);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.variantSetId, unittest.equals('foo'));
@@ -460,66 +460,66 @@
   buildCounterHeader--;
 }
 
-buildUnnamed1349() {
+buildUnnamed1250() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1349(core.List<core.String> o) {
+checkUnnamed1250(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1350() {
+buildUnnamed1251() {
   var o = new core.List<api.Header>();
   o.add(buildHeader());
   o.add(buildHeader());
   return o;
 }
 
-checkUnnamed1350(core.List<api.Header> o) {
+checkUnnamed1251(core.List<api.Header> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeader(o[0]);
   checkHeader(o[1]);
 }
 
-buildUnnamed1351() {
+buildUnnamed1252() {
   var o = new core.List<api.Program>();
   o.add(buildProgram());
   o.add(buildProgram());
   return o;
 }
 
-checkUnnamed1351(core.List<api.Program> o) {
+checkUnnamed1252(core.List<api.Program> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProgram(o[0]);
   checkProgram(o[1]);
 }
 
-buildUnnamed1352() {
+buildUnnamed1253() {
   var o = new core.List<api.ReadGroup>();
   o.add(buildReadGroup());
   o.add(buildReadGroup());
   return o;
 }
 
-checkUnnamed1352(core.List<api.ReadGroup> o) {
+checkUnnamed1253(core.List<api.ReadGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadGroup(o[0]);
   checkReadGroup(o[1]);
 }
 
-buildUnnamed1353() {
+buildUnnamed1254() {
   var o = new core.List<api.ReferenceSequence>();
   o.add(buildReferenceSequence());
   o.add(buildReferenceSequence());
   return o;
 }
 
-checkUnnamed1353(core.List<api.ReferenceSequence> o) {
+checkUnnamed1254(core.List<api.ReferenceSequence> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceSequence(o[0]);
   checkReferenceSequence(o[1]);
@@ -530,13 +530,13 @@
   var o = new api.HeaderSection();
   buildCounterHeaderSection++;
   if (buildCounterHeaderSection < 3) {
-    o.comments = buildUnnamed1349();
+    o.comments = buildUnnamed1250();
     o.fileUri = "foo";
     o.filename = "foo";
-    o.headers = buildUnnamed1350();
-    o.programs = buildUnnamed1351();
-    o.readGroups = buildUnnamed1352();
-    o.refSequences = buildUnnamed1353();
+    o.headers = buildUnnamed1251();
+    o.programs = buildUnnamed1252();
+    o.readGroups = buildUnnamed1253();
+    o.refSequences = buildUnnamed1254();
   }
   buildCounterHeaderSection--;
   return o;
@@ -545,25 +545,25 @@
 checkHeaderSection(api.HeaderSection o) {
   buildCounterHeaderSection++;
   if (buildCounterHeaderSection < 3) {
-    checkUnnamed1349(o.comments);
+    checkUnnamed1250(o.comments);
     unittest.expect(o.fileUri, unittest.equals('foo'));
     unittest.expect(o.filename, unittest.equals('foo'));
-    checkUnnamed1350(o.headers);
-    checkUnnamed1351(o.programs);
-    checkUnnamed1352(o.readGroups);
-    checkUnnamed1353(o.refSequences);
+    checkUnnamed1251(o.headers);
+    checkUnnamed1252(o.programs);
+    checkUnnamed1253(o.readGroups);
+    checkUnnamed1254(o.refSequences);
   }
   buildCounterHeaderSection--;
 }
 
-buildUnnamed1354() {
+buildUnnamed1255() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1354(core.List<core.String> o) {
+checkUnnamed1255(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -575,7 +575,7 @@
   buildCounterImportReadsetsRequest++;
   if (buildCounterImportReadsetsRequest < 3) {
     o.datasetId = "foo";
-    o.sourceUris = buildUnnamed1354();
+    o.sourceUris = buildUnnamed1255();
   }
   buildCounterImportReadsetsRequest--;
   return o;
@@ -585,7 +585,7 @@
   buildCounterImportReadsetsRequest++;
   if (buildCounterImportReadsetsRequest < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
-    checkUnnamed1354(o.sourceUris);
+    checkUnnamed1255(o.sourceUris);
   }
   buildCounterImportReadsetsRequest--;
 }
@@ -609,14 +609,14 @@
   buildCounterImportReadsetsResponse--;
 }
 
-buildUnnamed1355() {
+buildUnnamed1256() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1355(core.List<core.String> o) {
+checkUnnamed1256(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -628,7 +628,7 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     o.format = "foo";
-    o.sourceUris = buildUnnamed1355();
+    o.sourceUris = buildUnnamed1256();
     o.variantSetId = "foo";
   }
   buildCounterImportVariantsRequest--;
@@ -639,7 +639,7 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     unittest.expect(o.format, unittest.equals('foo'));
-    checkUnnamed1355(o.sourceUris);
+    checkUnnamed1256(o.sourceUris);
     unittest.expect(o.variantSetId, unittest.equals('foo'));
   }
   buildCounterImportVariantsRequest--;
@@ -664,40 +664,40 @@
   buildCounterImportVariantsResponse--;
 }
 
-buildUnnamed1356() {
+buildUnnamed1257() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1356(core.List<core.String> o) {
+checkUnnamed1257(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1357() {
+buildUnnamed1258() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1357(core.List<core.String> o) {
+checkUnnamed1258(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1358() {
+buildUnnamed1259() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1358(core.List<core.String> o) {
+checkUnnamed1259(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -710,13 +710,13 @@
   if (buildCounterJob < 3) {
     o.created = "foo";
     o.description = "foo";
-    o.errors = buildUnnamed1356();
+    o.errors = buildUnnamed1257();
     o.id = "foo";
-    o.importedIds = buildUnnamed1357();
+    o.importedIds = buildUnnamed1258();
     o.projectId = "foo";
     o.request = buildJobRequest();
     o.status = "foo";
-    o.warnings = buildUnnamed1358();
+    o.warnings = buildUnnamed1259();
   }
   buildCounterJob--;
   return o;
@@ -727,38 +727,38 @@
   if (buildCounterJob < 3) {
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1356(o.errors);
+    checkUnnamed1257(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1357(o.importedIds);
+    checkUnnamed1258(o.importedIds);
     unittest.expect(o.projectId, unittest.equals('foo'));
     checkJobRequest(o.request);
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed1358(o.warnings);
+    checkUnnamed1259(o.warnings);
   }
   buildCounterJob--;
 }
 
-buildUnnamed1359() {
+buildUnnamed1260() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1359(core.List<core.String> o) {
+checkUnnamed1260(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1360() {
+buildUnnamed1261() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1360(core.List<core.String> o) {
+checkUnnamed1261(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -769,8 +769,8 @@
   var o = new api.JobRequest();
   buildCounterJobRequest++;
   if (buildCounterJobRequest < 3) {
-    o.destination = buildUnnamed1359();
-    o.source = buildUnnamed1360();
+    o.destination = buildUnnamed1260();
+    o.source = buildUnnamed1261();
     o.type = "foo";
   }
   buildCounterJobRequest--;
@@ -780,21 +780,21 @@
 checkJobRequest(api.JobRequest o) {
   buildCounterJobRequest++;
   if (buildCounterJobRequest < 3) {
-    checkUnnamed1359(o.destination);
-    checkUnnamed1360(o.source);
+    checkUnnamed1260(o.destination);
+    checkUnnamed1261(o.source);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterJobRequest--;
 }
 
-buildUnnamed1361() {
+buildUnnamed1262() {
   var o = new core.List<api.CoverageBucket>();
   o.add(buildCoverageBucket());
   o.add(buildCoverageBucket());
   return o;
 }
 
-checkUnnamed1361(core.List<api.CoverageBucket> o) {
+checkUnnamed1262(core.List<api.CoverageBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCoverageBucket(o[0]);
   checkCoverageBucket(o[1]);
@@ -806,7 +806,7 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     o.bucketWidth = "foo";
-    o.coverageBuckets = buildUnnamed1361();
+    o.coverageBuckets = buildUnnamed1262();
     o.nextPageToken = "foo";
   }
   buildCounterListCoverageBucketsResponse--;
@@ -817,20 +817,20 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     unittest.expect(o.bucketWidth, unittest.equals('foo'));
-    checkUnnamed1361(o.coverageBuckets);
+    checkUnnamed1262(o.coverageBuckets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCoverageBucketsResponse--;
 }
 
-buildUnnamed1362() {
+buildUnnamed1263() {
   var o = new core.List<api.Dataset>();
   o.add(buildDataset());
   o.add(buildDataset());
   return o;
 }
 
-checkUnnamed1362(core.List<api.Dataset> o) {
+checkUnnamed1263(core.List<api.Dataset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataset(o[0]);
   checkDataset(o[1]);
@@ -841,7 +841,7 @@
   var o = new api.ListDatasetsResponse();
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    o.datasets = buildUnnamed1362();
+    o.datasets = buildUnnamed1263();
     o.nextPageToken = "foo";
   }
   buildCounterListDatasetsResponse--;
@@ -851,20 +851,20 @@
 checkListDatasetsResponse(api.ListDatasetsResponse o) {
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    checkUnnamed1362(o.datasets);
+    checkUnnamed1263(o.datasets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDatasetsResponse--;
 }
 
-buildUnnamed1363() {
+buildUnnamed1264() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed1363(core.List<api.Variant> o) {
+checkUnnamed1264(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -875,7 +875,7 @@
   var o = new api.MergeVariantsRequest();
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    o.variants = buildUnnamed1363();
+    o.variants = buildUnnamed1264();
   }
   buildCounterMergeVariantsRequest--;
   return o;
@@ -884,35 +884,35 @@
 checkMergeVariantsRequest(api.MergeVariantsRequest o) {
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    checkUnnamed1363(o.variants);
+    checkUnnamed1264(o.variants);
   }
   buildCounterMergeVariantsRequest--;
 }
 
-buildUnnamed1364() {
+buildUnnamed1265() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1364(core.List<core.String> o) {
+checkUnnamed1265(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1365() {
+buildUnnamed1266() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1364();
-  o["y"] = buildUnnamed1364();
+  o["x"] = buildUnnamed1265();
+  o["y"] = buildUnnamed1265();
   return o;
 }
 
-checkUnnamed1365(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1266(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1364(o["x"]);
-  checkUnnamed1364(o["y"]);
+  checkUnnamed1265(o["x"]);
+  checkUnnamed1265(o["y"]);
 }
 
 core.int buildCounterMetadata = 0;
@@ -922,7 +922,7 @@
   if (buildCounterMetadata < 3) {
     o.description = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1365();
+    o.info = buildUnnamed1266();
     o.key = "foo";
     o.number = "foo";
     o.type = "foo";
@@ -937,7 +937,7 @@
   if (buildCounterMetadata < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1365(o.info);
+    checkUnnamed1266(o.info);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -973,30 +973,30 @@
   buildCounterProgram--;
 }
 
-buildUnnamed1366() {
+buildUnnamed1267() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1366(core.List<core.String> o) {
+checkUnnamed1267(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1367() {
+buildUnnamed1268() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1366();
-  o["y"] = buildUnnamed1366();
+  o["x"] = buildUnnamed1267();
+  o["y"] = buildUnnamed1267();
   return o;
 }
 
-checkUnnamed1367(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1268(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1366(o["x"]);
-  checkUnnamed1366(o["y"]);
+  checkUnnamed1267(o["x"]);
+  checkUnnamed1267(o["y"]);
 }
 
 core.int buildCounterRead = 0;
@@ -1017,7 +1017,7 @@
     o.position = 42;
     o.readsetId = "foo";
     o.referenceSequenceName = "foo";
-    o.tags = buildUnnamed1367();
+    o.tags = buildUnnamed1268();
     o.templateLength = 42;
   }
   buildCounterRead--;
@@ -1040,7 +1040,7 @@
     unittest.expect(o.position, unittest.equals(42));
     unittest.expect(o.readsetId, unittest.equals('foo'));
     unittest.expect(o.referenceSequenceName, unittest.equals('foo'));
-    checkUnnamed1367(o.tags);
+    checkUnnamed1268(o.tags);
     unittest.expect(o.templateLength, unittest.equals(42));
   }
   buildCounterRead--;
@@ -1087,14 +1087,14 @@
   buildCounterReadGroup--;
 }
 
-buildUnnamed1368() {
+buildUnnamed1269() {
   var o = new core.List<api.HeaderSection>();
   o.add(buildHeaderSection());
   o.add(buildHeaderSection());
   return o;
 }
 
-checkUnnamed1368(core.List<api.HeaderSection> o) {
+checkUnnamed1269(core.List<api.HeaderSection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeaderSection(o[0]);
   checkHeaderSection(o[1]);
@@ -1106,7 +1106,7 @@
   buildCounterReadset++;
   if (buildCounterReadset < 3) {
     o.datasetId = "foo";
-    o.fileData = buildUnnamed1368();
+    o.fileData = buildUnnamed1269();
     o.id = "foo";
     o.name = "foo";
   }
@@ -1118,7 +1118,7 @@
   buildCounterReadset++;
   if (buildCounterReadset < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
-    checkUnnamed1368(o.fileData);
+    checkUnnamed1269(o.fileData);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
@@ -1175,14 +1175,14 @@
   buildCounterReferenceSequence--;
 }
 
-buildUnnamed1369() {
+buildUnnamed1270() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1369(core.List<core.String> o) {
+checkUnnamed1270(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1196,7 +1196,7 @@
     o.name = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.variantSetIds = buildUnnamed1369();
+    o.variantSetIds = buildUnnamed1270();
   }
   buildCounterSearchCallSetsRequest--;
   return o;
@@ -1208,19 +1208,19 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1369(o.variantSetIds);
+    checkUnnamed1270(o.variantSetIds);
   }
   buildCounterSearchCallSetsRequest--;
 }
 
-buildUnnamed1370() {
+buildUnnamed1271() {
   var o = new core.List<api.CallSet>();
   o.add(buildCallSet());
   o.add(buildCallSet());
   return o;
 }
 
-checkUnnamed1370(core.List<api.CallSet> o) {
+checkUnnamed1271(core.List<api.CallSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCallSet(o[0]);
   checkCallSet(o[1]);
@@ -1231,7 +1231,7 @@
   var o = new api.SearchCallSetsResponse();
   buildCounterSearchCallSetsResponse++;
   if (buildCounterSearchCallSetsResponse < 3) {
-    o.callSets = buildUnnamed1370();
+    o.callSets = buildUnnamed1271();
     o.nextPageToken = "foo";
   }
   buildCounterSearchCallSetsResponse--;
@@ -1241,20 +1241,20 @@
 checkSearchCallSetsResponse(api.SearchCallSetsResponse o) {
   buildCounterSearchCallSetsResponse++;
   if (buildCounterSearchCallSetsResponse < 3) {
-    checkUnnamed1370(o.callSets);
+    checkUnnamed1271(o.callSets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchCallSetsResponse--;
 }
 
-buildUnnamed1371() {
+buildUnnamed1272() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1371(core.List<core.String> o) {
+checkUnnamed1272(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1270,7 +1270,7 @@
     o.maxResults = "foo";
     o.pageToken = "foo";
     o.projectId = "foo";
-    o.status = buildUnnamed1371();
+    o.status = buildUnnamed1272();
   }
   buildCounterSearchJobsRequest--;
   return o;
@@ -1284,19 +1284,19 @@
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed1371(o.status);
+    checkUnnamed1272(o.status);
   }
   buildCounterSearchJobsRequest--;
 }
 
-buildUnnamed1372() {
+buildUnnamed1273() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed1372(core.List<api.Job> o) {
+checkUnnamed1273(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -1307,7 +1307,7 @@
   var o = new api.SearchJobsResponse();
   buildCounterSearchJobsResponse++;
   if (buildCounterSearchJobsResponse < 3) {
-    o.jobs = buildUnnamed1372();
+    o.jobs = buildUnnamed1273();
     o.nextPageToken = "foo";
   }
   buildCounterSearchJobsResponse--;
@@ -1317,20 +1317,20 @@
 checkSearchJobsResponse(api.SearchJobsResponse o) {
   buildCounterSearchJobsResponse++;
   if (buildCounterSearchJobsResponse < 3) {
-    checkUnnamed1372(o.jobs);
+    checkUnnamed1273(o.jobs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchJobsResponse--;
 }
 
-buildUnnamed1373() {
+buildUnnamed1274() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1373(core.List<core.String> o) {
+checkUnnamed1274(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1343,7 +1343,7 @@
   if (buildCounterSearchReadsRequest < 3) {
     o.maxResults = "foo";
     o.pageToken = "foo";
-    o.readsetIds = buildUnnamed1373();
+    o.readsetIds = buildUnnamed1274();
     o.sequenceEnd = "foo";
     o.sequenceName = "foo";
     o.sequenceStart = "foo";
@@ -1357,7 +1357,7 @@
   if (buildCounterSearchReadsRequest < 3) {
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1373(o.readsetIds);
+    checkUnnamed1274(o.readsetIds);
     unittest.expect(o.sequenceEnd, unittest.equals('foo'));
     unittest.expect(o.sequenceName, unittest.equals('foo'));
     unittest.expect(o.sequenceStart, unittest.equals('foo'));
@@ -1365,14 +1365,14 @@
   buildCounterSearchReadsRequest--;
 }
 
-buildUnnamed1374() {
+buildUnnamed1275() {
   var o = new core.List<api.Read>();
   o.add(buildRead());
   o.add(buildRead());
   return o;
 }
 
-checkUnnamed1374(core.List<api.Read> o) {
+checkUnnamed1275(core.List<api.Read> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRead(o[0]);
   checkRead(o[1]);
@@ -1384,7 +1384,7 @@
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
     o.nextPageToken = "foo";
-    o.reads = buildUnnamed1374();
+    o.reads = buildUnnamed1275();
   }
   buildCounterSearchReadsResponse--;
   return o;
@@ -1394,19 +1394,19 @@
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1374(o.reads);
+    checkUnnamed1275(o.reads);
   }
   buildCounterSearchReadsResponse--;
 }
 
-buildUnnamed1375() {
+buildUnnamed1276() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1375(core.List<core.String> o) {
+checkUnnamed1276(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1417,7 +1417,7 @@
   var o = new api.SearchReadsetsRequest();
   buildCounterSearchReadsetsRequest++;
   if (buildCounterSearchReadsetsRequest < 3) {
-    o.datasetIds = buildUnnamed1375();
+    o.datasetIds = buildUnnamed1276();
     o.maxResults = "foo";
     o.name = "foo";
     o.pageToken = "foo";
@@ -1429,7 +1429,7 @@
 checkSearchReadsetsRequest(api.SearchReadsetsRequest o) {
   buildCounterSearchReadsetsRequest++;
   if (buildCounterSearchReadsetsRequest < 3) {
-    checkUnnamed1375(o.datasetIds);
+    checkUnnamed1276(o.datasetIds);
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
@@ -1437,14 +1437,14 @@
   buildCounterSearchReadsetsRequest--;
 }
 
-buildUnnamed1376() {
+buildUnnamed1277() {
   var o = new core.List<api.Readset>();
   o.add(buildReadset());
   o.add(buildReadset());
   return o;
 }
 
-checkUnnamed1376(core.List<api.Readset> o) {
+checkUnnamed1277(core.List<api.Readset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadset(o[0]);
   checkReadset(o[1]);
@@ -1456,7 +1456,7 @@
   buildCounterSearchReadsetsResponse++;
   if (buildCounterSearchReadsetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.readsets = buildUnnamed1376();
+    o.readsets = buildUnnamed1277();
   }
   buildCounterSearchReadsetsResponse--;
   return o;
@@ -1466,19 +1466,19 @@
   buildCounterSearchReadsetsResponse++;
   if (buildCounterSearchReadsetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1376(o.readsets);
+    checkUnnamed1277(o.readsets);
   }
   buildCounterSearchReadsetsResponse--;
 }
 
-buildUnnamed1377() {
+buildUnnamed1278() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1377(core.List<core.String> o) {
+checkUnnamed1278(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1489,7 +1489,7 @@
   var o = new api.SearchVariantSetsRequest();
   buildCounterSearchVariantSetsRequest++;
   if (buildCounterSearchVariantSetsRequest < 3) {
-    o.datasetIds = buildUnnamed1377();
+    o.datasetIds = buildUnnamed1278();
     o.pageSize = 42;
     o.pageToken = "foo";
   }
@@ -1500,21 +1500,21 @@
 checkSearchVariantSetsRequest(api.SearchVariantSetsRequest o) {
   buildCounterSearchVariantSetsRequest++;
   if (buildCounterSearchVariantSetsRequest < 3) {
-    checkUnnamed1377(o.datasetIds);
+    checkUnnamed1278(o.datasetIds);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
   }
   buildCounterSearchVariantSetsRequest--;
 }
 
-buildUnnamed1378() {
+buildUnnamed1279() {
   var o = new core.List<api.VariantSet>();
   o.add(buildVariantSet());
   o.add(buildVariantSet());
   return o;
 }
 
-checkUnnamed1378(core.List<api.VariantSet> o) {
+checkUnnamed1279(core.List<api.VariantSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariantSet(o[0]);
   checkVariantSet(o[1]);
@@ -1526,7 +1526,7 @@
   buildCounterSearchVariantSetsResponse++;
   if (buildCounterSearchVariantSetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variantSets = buildUnnamed1378();
+    o.variantSets = buildUnnamed1279();
   }
   buildCounterSearchVariantSetsResponse--;
   return o;
@@ -1536,32 +1536,32 @@
   buildCounterSearchVariantSetsResponse++;
   if (buildCounterSearchVariantSetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1378(o.variantSets);
+    checkUnnamed1279(o.variantSets);
   }
   buildCounterSearchVariantSetsResponse--;
 }
 
-buildUnnamed1379() {
+buildUnnamed1280() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1379(core.List<core.String> o) {
+checkUnnamed1280(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1380() {
+buildUnnamed1281() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1380(core.List<core.String> o) {
+checkUnnamed1281(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1572,7 +1572,7 @@
   var o = new api.SearchVariantsRequest();
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    o.callSetIds = buildUnnamed1379();
+    o.callSetIds = buildUnnamed1280();
     o.end = "foo";
     o.maxCalls = 42;
     o.pageSize = 42;
@@ -1580,7 +1580,7 @@
     o.referenceName = "foo";
     o.start = "foo";
     o.variantName = "foo";
-    o.variantSetIds = buildUnnamed1380();
+    o.variantSetIds = buildUnnamed1281();
   }
   buildCounterSearchVariantsRequest--;
   return o;
@@ -1589,7 +1589,7 @@
 checkSearchVariantsRequest(api.SearchVariantsRequest o) {
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    checkUnnamed1379(o.callSetIds);
+    checkUnnamed1280(o.callSetIds);
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.maxCalls, unittest.equals(42));
     unittest.expect(o.pageSize, unittest.equals(42));
@@ -1597,19 +1597,19 @@
     unittest.expect(o.referenceName, unittest.equals('foo'));
     unittest.expect(o.start, unittest.equals('foo'));
     unittest.expect(o.variantName, unittest.equals('foo'));
-    checkUnnamed1380(o.variantSetIds);
+    checkUnnamed1281(o.variantSetIds);
   }
   buildCounterSearchVariantsRequest--;
 }
 
-buildUnnamed1381() {
+buildUnnamed1282() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed1381(core.List<api.Variant> o) {
+checkUnnamed1282(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -1621,7 +1621,7 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variants = buildUnnamed1381();
+    o.variants = buildUnnamed1282();
   }
   buildCounterSearchVariantsResponse--;
   return o;
@@ -1631,84 +1631,84 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1381(o.variants);
+    checkUnnamed1282(o.variants);
   }
   buildCounterSearchVariantsResponse--;
 }
 
-buildUnnamed1382() {
+buildUnnamed1283() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1382(core.List<core.String> o) {
+checkUnnamed1283(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1383() {
+buildUnnamed1284() {
   var o = new core.List<api.Call>();
   o.add(buildCall());
   o.add(buildCall());
   return o;
 }
 
-checkUnnamed1383(core.List<api.Call> o) {
+checkUnnamed1284(core.List<api.Call> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCall(o[0]);
   checkCall(o[1]);
 }
 
-buildUnnamed1384() {
+buildUnnamed1285() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1384(core.List<core.String> o) {
+checkUnnamed1285(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1385() {
+buildUnnamed1286() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1385(core.List<core.String> o) {
+checkUnnamed1286(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1386() {
+buildUnnamed1287() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1385();
-  o["y"] = buildUnnamed1385();
+  o["x"] = buildUnnamed1286();
+  o["y"] = buildUnnamed1286();
   return o;
 }
 
-checkUnnamed1386(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1287(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1385(o["x"]);
-  checkUnnamed1385(o["y"]);
+  checkUnnamed1286(o["x"]);
+  checkUnnamed1286(o["y"]);
 }
 
-buildUnnamed1387() {
+buildUnnamed1288() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1387(core.List<core.String> o) {
+checkUnnamed1288(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1719,14 +1719,14 @@
   var o = new api.Variant();
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    o.alternateBases = buildUnnamed1382();
-    o.calls = buildUnnamed1383();
+    o.alternateBases = buildUnnamed1283();
+    o.calls = buildUnnamed1284();
     o.created = "foo";
     o.end = "foo";
-    o.filter = buildUnnamed1384();
+    o.filter = buildUnnamed1285();
     o.id = "foo";
-    o.info = buildUnnamed1386();
-    o.names = buildUnnamed1387();
+    o.info = buildUnnamed1287();
+    o.names = buildUnnamed1288();
     o.quality = 42.0;
     o.referenceBases = "foo";
     o.referenceName = "foo";
@@ -1740,14 +1740,14 @@
 checkVariant(api.Variant o) {
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    checkUnnamed1382(o.alternateBases);
-    checkUnnamed1383(o.calls);
+    checkUnnamed1283(o.alternateBases);
+    checkUnnamed1284(o.calls);
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.end, unittest.equals('foo'));
-    checkUnnamed1384(o.filter);
+    checkUnnamed1285(o.filter);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1386(o.info);
-    checkUnnamed1387(o.names);
+    checkUnnamed1287(o.info);
+    checkUnnamed1288(o.names);
     unittest.expect(o.quality, unittest.equals(42.0));
     unittest.expect(o.referenceBases, unittest.equals('foo'));
     unittest.expect(o.referenceName, unittest.equals('foo'));
@@ -1757,27 +1757,27 @@
   buildCounterVariant--;
 }
 
-buildUnnamed1388() {
+buildUnnamed1289() {
   var o = new core.List<api.Metadata>();
   o.add(buildMetadata());
   o.add(buildMetadata());
   return o;
 }
 
-checkUnnamed1388(core.List<api.Metadata> o) {
+checkUnnamed1289(core.List<api.Metadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadata(o[0]);
   checkMetadata(o[1]);
 }
 
-buildUnnamed1389() {
+buildUnnamed1290() {
   var o = new core.List<api.ReferenceBound>();
   o.add(buildReferenceBound());
   o.add(buildReferenceBound());
   return o;
 }
 
-checkUnnamed1389(core.List<api.ReferenceBound> o) {
+checkUnnamed1290(core.List<api.ReferenceBound> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceBound(o[0]);
   checkReferenceBound(o[1]);
@@ -1790,8 +1790,8 @@
   if (buildCounterVariantSet < 3) {
     o.datasetId = "foo";
     o.id = "foo";
-    o.metadata = buildUnnamed1388();
-    o.referenceBounds = buildUnnamed1389();
+    o.metadata = buildUnnamed1289();
+    o.referenceBounds = buildUnnamed1290();
   }
   buildCounterVariantSet--;
   return o;
@@ -1802,8 +1802,8 @@
   if (buildCounterVariantSet < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1388(o.metadata);
-    checkUnnamed1389(o.referenceBounds);
+    checkUnnamed1289(o.metadata);
+    checkUnnamed1290(o.referenceBounds);
   }
   buildCounterVariantSet--;
 }
diff --git a/generated/googleapis_beta/test/manager/v1beta2_test.dart b/generated/googleapis_beta/test/manager/v1beta2_test.dart
index e8caef6..4e19cef 100644
--- a/generated/googleapis_beta/test/manager/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/manager/v1beta2_test.dart
@@ -39,14 +39,14 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed1295() {
+buildUnnamed1361() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1295(core.List<core.String> o) {
+checkUnnamed1361(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -57,7 +57,7 @@
   var o = new api.Action();
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    o.commands = buildUnnamed1295();
+    o.commands = buildUnnamed1361();
     o.timeoutMs = 42;
   }
   buildCounterAction--;
@@ -67,20 +67,20 @@
 checkAction(api.Action o) {
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    checkUnnamed1295(o.commands);
+    checkUnnamed1361(o.commands);
     unittest.expect(o.timeoutMs, unittest.equals(42));
   }
   buildCounterAction--;
 }
 
-buildUnnamed1296() {
+buildUnnamed1362() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1296(core.List<core.String> o) {
+checkUnnamed1362(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -92,7 +92,7 @@
   buildCounterAllowedRule++;
   if (buildCounterAllowedRule < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed1296();
+    o.ports = buildUnnamed1362();
   }
   buildCounterAllowedRule--;
   return o;
@@ -102,7 +102,7 @@
   buildCounterAllowedRule++;
   if (buildCounterAllowedRule < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed1296(o.ports);
+    checkUnnamed1362(o.ports);
   }
   buildCounterAllowedRule--;
 }
@@ -178,27 +178,27 @@
   buildCounterDeployState--;
 }
 
-buildUnnamed1297() {
+buildUnnamed1363() {
   var o = new core.Map<core.String, api.ModuleStatus>();
   o["x"] = buildModuleStatus();
   o["y"] = buildModuleStatus();
   return o;
 }
 
-checkUnnamed1297(core.Map<core.String, api.ModuleStatus> o) {
+checkUnnamed1363(core.Map<core.String, api.ModuleStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkModuleStatus(o["x"]);
   checkModuleStatus(o["y"]);
 }
 
-buildUnnamed1298() {
+buildUnnamed1364() {
   var o = new core.List<api.ParamOverride>();
   o.add(buildParamOverride());
   o.add(buildParamOverride());
   return o;
 }
 
-checkUnnamed1298(core.List<api.ParamOverride> o) {
+checkUnnamed1364(core.List<api.ParamOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParamOverride(o[0]);
   checkParamOverride(o[1]);
@@ -211,9 +211,9 @@
   if (buildCounterDeployment < 3) {
     o.creationDate = "foo";
     o.description = "foo";
-    o.modules = buildUnnamed1297();
+    o.modules = buildUnnamed1363();
     o.name = "foo";
-    o.overrides = buildUnnamed1298();
+    o.overrides = buildUnnamed1364();
     o.state = buildDeployState();
     o.templateName = "foo";
   }
@@ -226,23 +226,23 @@
   if (buildCounterDeployment < 3) {
     unittest.expect(o.creationDate, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1297(o.modules);
+    checkUnnamed1363(o.modules);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1298(o.overrides);
+    checkUnnamed1364(o.overrides);
     checkDeployState(o.state);
     unittest.expect(o.templateName, unittest.equals('foo'));
   }
   buildCounterDeployment--;
 }
 
-buildUnnamed1299() {
+buildUnnamed1365() {
   var o = new core.List<api.Deployment>();
   o.add(buildDeployment());
   o.add(buildDeployment());
   return o;
 }
 
-checkUnnamed1299(core.List<api.Deployment> o) {
+checkUnnamed1365(core.List<api.Deployment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeployment(o[0]);
   checkDeployment(o[1]);
@@ -254,7 +254,7 @@
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1299();
+    o.resources = buildUnnamed1365();
   }
   buildCounterDeploymentsListResponse--;
   return o;
@@ -264,7 +264,7 @@
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1299(o.resources);
+    checkUnnamed1365(o.resources);
   }
   buildCounterDeploymentsListResponse--;
 }
@@ -332,53 +332,53 @@
   buildCounterExistingDisk--;
 }
 
-buildUnnamed1300() {
+buildUnnamed1366() {
   var o = new core.List<api.AllowedRule>();
   o.add(buildAllowedRule());
   o.add(buildAllowedRule());
   return o;
 }
 
-checkUnnamed1300(core.List<api.AllowedRule> o) {
+checkUnnamed1366(core.List<api.AllowedRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAllowedRule(o[0]);
   checkAllowedRule(o[1]);
 }
 
-buildUnnamed1301() {
+buildUnnamed1367() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1301(core.List<core.String> o) {
+checkUnnamed1367(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1302() {
+buildUnnamed1368() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1302(core.List<core.String> o) {
+checkUnnamed1368(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1303() {
+buildUnnamed1369() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1303(core.List<core.String> o) {
+checkUnnamed1369(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -389,12 +389,12 @@
   var o = new api.FirewallModule();
   buildCounterFirewallModule++;
   if (buildCounterFirewallModule < 3) {
-    o.allowed = buildUnnamed1300();
+    o.allowed = buildUnnamed1366();
     o.description = "foo";
     o.network = "foo";
-    o.sourceRanges = buildUnnamed1301();
-    o.sourceTags = buildUnnamed1302();
-    o.targetTags = buildUnnamed1303();
+    o.sourceRanges = buildUnnamed1367();
+    o.sourceTags = buildUnnamed1368();
+    o.targetTags = buildUnnamed1369();
   }
   buildCounterFirewallModule--;
   return o;
@@ -403,12 +403,12 @@
 checkFirewallModule(api.FirewallModule o) {
   buildCounterFirewallModule++;
   if (buildCounterFirewallModule < 3) {
-    checkUnnamed1300(o.allowed);
+    checkUnnamed1366(o.allowed);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
-    checkUnnamed1301(o.sourceRanges);
-    checkUnnamed1302(o.sourceTags);
-    checkUnnamed1303(o.targetTags);
+    checkUnnamed1367(o.sourceRanges);
+    checkUnnamed1368(o.sourceTags);
+    checkUnnamed1369(o.targetTags);
   }
   buildCounterFirewallModule--;
 }
@@ -484,27 +484,27 @@
   buildCounterHealthCheckModuleStatus--;
 }
 
-buildUnnamed1304() {
+buildUnnamed1370() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1304(core.List<core.String> o) {
+checkUnnamed1370(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1305() {
+buildUnnamed1371() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1305(core.List<core.String> o) {
+checkUnnamed1371(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -516,12 +516,12 @@
   buildCounterLbModule++;
   if (buildCounterLbModule < 3) {
     o.description = "foo";
-    o.healthChecks = buildUnnamed1304();
+    o.healthChecks = buildUnnamed1370();
     o.ipAddress = "foo";
     o.ipProtocol = "foo";
     o.portRange = "foo";
     o.sessionAffinity = "foo";
-    o.targetModules = buildUnnamed1305();
+    o.targetModules = buildUnnamed1371();
   }
   buildCounterLbModule--;
   return o;
@@ -531,12 +531,12 @@
   buildCounterLbModule++;
   if (buildCounterLbModule < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1304(o.healthChecks);
+    checkUnnamed1370(o.healthChecks);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.ipProtocol, unittest.equals('foo'));
     unittest.expect(o.portRange, unittest.equals('foo'));
     unittest.expect(o.sessionAffinity, unittest.equals('foo'));
-    checkUnnamed1305(o.targetModules);
+    checkUnnamed1371(o.targetModules);
   }
   buildCounterLbModule--;
 }
@@ -562,14 +562,14 @@
   buildCounterLbModuleStatus--;
 }
 
-buildUnnamed1306() {
+buildUnnamed1372() {
   var o = new core.List<api.MetadataItem>();
   o.add(buildMetadataItem());
   o.add(buildMetadataItem());
   return o;
 }
 
-checkUnnamed1306(core.List<api.MetadataItem> o) {
+checkUnnamed1372(core.List<api.MetadataItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItem(o[0]);
   checkMetadataItem(o[1]);
@@ -581,7 +581,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1306();
+    o.items = buildUnnamed1372();
   }
   buildCounterMetadata--;
   return o;
@@ -591,7 +591,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1306(o.items);
+    checkUnnamed1372(o.items);
   }
   buildCounterMetadata--;
 }
@@ -681,14 +681,14 @@
   buildCounterModuleStatus--;
 }
 
-buildUnnamed1307() {
+buildUnnamed1373() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed1307(core.List<api.AccessConfig> o) {
+checkUnnamed1373(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
@@ -699,7 +699,7 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed1307();
+    o.accessConfigs = buildUnnamed1373();
     o.name = "foo";
     o.network = "foo";
     o.networkIp = "foo";
@@ -711,7 +711,7 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed1307(o.accessConfigs);
+    checkUnnamed1373(o.accessConfigs);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.networkIp, unittest.equals('foo'));
@@ -830,27 +830,27 @@
   buildCounterParamOverride--;
 }
 
-buildUnnamed1308() {
+buildUnnamed1374() {
   var o = new core.Map<core.String, api.EnvVariable>();
   o["x"] = buildEnvVariable();
   o["y"] = buildEnvVariable();
   return o;
 }
 
-checkUnnamed1308(core.Map<core.String, api.EnvVariable> o) {
+checkUnnamed1374(core.Map<core.String, api.EnvVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnvVariable(o["x"]);
   checkEnvVariable(o["y"]);
 }
 
-buildUnnamed1309() {
+buildUnnamed1375() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1309(core.List<core.String> o) {
+checkUnnamed1375(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -861,8 +861,8 @@
   var o = new api.ReplicaPoolModule();
   buildCounterReplicaPoolModule++;
   if (buildCounterReplicaPoolModule < 3) {
-    o.envVariables = buildUnnamed1308();
-    o.healthChecks = buildUnnamed1309();
+    o.envVariables = buildUnnamed1374();
+    o.healthChecks = buildUnnamed1375();
     o.numReplicas = 42;
     o.replicaPoolParams = buildReplicaPoolParams();
     o.resourceView = "foo";
@@ -874,8 +874,8 @@
 checkReplicaPoolModule(api.ReplicaPoolModule o) {
   buildCounterReplicaPoolModule++;
   if (buildCounterReplicaPoolModule < 3) {
-    checkUnnamed1308(o.envVariables);
-    checkUnnamed1309(o.healthChecks);
+    checkUnnamed1374(o.envVariables);
+    checkUnnamed1375(o.healthChecks);
     unittest.expect(o.numReplicas, unittest.equals(42));
     checkReplicaPoolParams(o.replicaPoolParams);
     unittest.expect(o.resourceView, unittest.equals('foo'));
@@ -923,53 +923,53 @@
   buildCounterReplicaPoolParams--;
 }
 
-buildUnnamed1310() {
+buildUnnamed1376() {
   var o = new core.List<api.ExistingDisk>();
   o.add(buildExistingDisk());
   o.add(buildExistingDisk());
   return o;
 }
 
-checkUnnamed1310(core.List<api.ExistingDisk> o) {
+checkUnnamed1376(core.List<api.ExistingDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExistingDisk(o[0]);
   checkExistingDisk(o[1]);
 }
 
-buildUnnamed1311() {
+buildUnnamed1377() {
   var o = new core.List<api.NewDisk>();
   o.add(buildNewDisk());
   o.add(buildNewDisk());
   return o;
 }
 
-checkUnnamed1311(core.List<api.NewDisk> o) {
+checkUnnamed1377(core.List<api.NewDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNewDisk(o[0]);
   checkNewDisk(o[1]);
 }
 
-buildUnnamed1312() {
+buildUnnamed1378() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed1312(core.List<api.NetworkInterface> o) {
+checkUnnamed1378(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed1313() {
+buildUnnamed1379() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed1313(core.List<api.ServiceAccount> o) {
+checkUnnamed1379(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -984,14 +984,14 @@
     o.baseInstanceName = "foo";
     o.canIpForward = true;
     o.description = "foo";
-    o.disksToAttach = buildUnnamed1310();
-    o.disksToCreate = buildUnnamed1311();
+    o.disksToAttach = buildUnnamed1376();
+    o.disksToCreate = buildUnnamed1377();
     o.initAction = "foo";
     o.machineType = "foo";
     o.metadata = buildMetadata();
-    o.networkInterfaces = buildUnnamed1312();
+    o.networkInterfaces = buildUnnamed1378();
     o.onHostMaintenance = "foo";
-    o.serviceAccounts = buildUnnamed1313();
+    o.serviceAccounts = buildUnnamed1379();
     o.tags = buildTag();
     o.zone = "foo";
   }
@@ -1006,28 +1006,28 @@
     unittest.expect(o.baseInstanceName, unittest.equals('foo'));
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1310(o.disksToAttach);
-    checkUnnamed1311(o.disksToCreate);
+    checkUnnamed1376(o.disksToAttach);
+    checkUnnamed1377(o.disksToCreate);
     unittest.expect(o.initAction, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
-    checkUnnamed1312(o.networkInterfaces);
+    checkUnnamed1378(o.networkInterfaces);
     unittest.expect(o.onHostMaintenance, unittest.equals('foo'));
-    checkUnnamed1313(o.serviceAccounts);
+    checkUnnamed1379(o.serviceAccounts);
     checkTag(o.tags);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterReplicaPoolParamsV1Beta1--;
 }
 
-buildUnnamed1314() {
+buildUnnamed1380() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1314(core.List<core.String> o) {
+checkUnnamed1380(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1039,7 +1039,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed1314();
+    o.scopes = buildUnnamed1380();
   }
   buildCounterServiceAccount--;
   return o;
@@ -1049,19 +1049,19 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed1314(o.scopes);
+    checkUnnamed1380(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed1315() {
+buildUnnamed1381() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1315(core.List<core.String> o) {
+checkUnnamed1381(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1073,7 +1073,7 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1315();
+    o.items = buildUnnamed1381();
   }
   buildCounterTag--;
   return o;
@@ -1083,32 +1083,32 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1315(o.items);
+    checkUnnamed1381(o.items);
   }
   buildCounterTag--;
 }
 
-buildUnnamed1316() {
+buildUnnamed1382() {
   var o = new core.Map<core.String, api.Action>();
   o["x"] = buildAction();
   o["y"] = buildAction();
   return o;
 }
 
-checkUnnamed1316(core.Map<core.String, api.Action> o) {
+checkUnnamed1382(core.Map<core.String, api.Action> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAction(o["x"]);
   checkAction(o["y"]);
 }
 
-buildUnnamed1317() {
+buildUnnamed1383() {
   var o = new core.Map<core.String, api.Module>();
   o["x"] = buildModule();
   o["y"] = buildModule();
   return o;
 }
 
-checkUnnamed1317(core.Map<core.String, api.Module> o) {
+checkUnnamed1383(core.Map<core.String, api.Module> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkModule(o["x"]);
   checkModule(o["y"]);
@@ -1119,9 +1119,9 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.actions = buildUnnamed1316();
+    o.actions = buildUnnamed1382();
     o.description = "foo";
-    o.modules = buildUnnamed1317();
+    o.modules = buildUnnamed1383();
     o.name = "foo";
   }
   buildCounterTemplate--;
@@ -1131,22 +1131,22 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed1316(o.actions);
+    checkUnnamed1382(o.actions);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1317(o.modules);
+    checkUnnamed1383(o.modules);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterTemplate--;
 }
 
-buildUnnamed1318() {
+buildUnnamed1384() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed1318(core.List<api.Template> o) {
+checkUnnamed1384(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -1158,7 +1158,7 @@
   buildCounterTemplatesListResponse++;
   if (buildCounterTemplatesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1318();
+    o.resources = buildUnnamed1384();
   }
   buildCounterTemplatesListResponse--;
   return o;
@@ -1168,7 +1168,7 @@
   buildCounterTemplatesListResponse++;
   if (buildCounterTemplatesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1318(o.resources);
+    checkUnnamed1384(o.resources);
   }
   buildCounterTemplatesListResponse--;
 }
diff --git a/generated/googleapis_beta/test/pubsub/v1beta1_test.dart b/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
index 8d46e85..a25841f 100644
--- a/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1390() {
+buildUnnamed1385() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1390(core.List<core.String> o) {
+checkUnnamed1385(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.AcknowledgeRequest();
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    o.ackId = buildUnnamed1390();
+    o.ackId = buildUnnamed1385();
     o.subscription = "foo";
   }
   buildCounterAcknowledgeRequest--;
@@ -44,7 +44,7 @@
 checkAcknowledgeRequest(api.AcknowledgeRequest o) {
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    checkUnnamed1390(o.ackId);
+    checkUnnamed1385(o.ackId);
     unittest.expect(o.subscription, unittest.equals('foo'));
   }
   buildCounterAcknowledgeRequest--;
@@ -73,14 +73,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1391() {
+buildUnnamed1386() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed1391(core.List<api.Subscription> o) {
+checkUnnamed1386(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -92,7 +92,7 @@
   buildCounterListSubscriptionsResponse++;
   if (buildCounterListSubscriptionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.subscription = buildUnnamed1391();
+    o.subscription = buildUnnamed1386();
   }
   buildCounterListSubscriptionsResponse--;
   return o;
@@ -102,19 +102,19 @@
   buildCounterListSubscriptionsResponse++;
   if (buildCounterListSubscriptionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1391(o.subscription);
+    checkUnnamed1386(o.subscription);
   }
   buildCounterListSubscriptionsResponse--;
 }
 
-buildUnnamed1392() {
+buildUnnamed1387() {
   var o = new core.List<api.Topic>();
   o.add(buildTopic());
   o.add(buildTopic());
   return o;
 }
 
-checkUnnamed1392(core.List<api.Topic> o) {
+checkUnnamed1387(core.List<api.Topic> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTopic(o[0]);
   checkTopic(o[1]);
@@ -126,7 +126,7 @@
   buildCounterListTopicsResponse++;
   if (buildCounterListTopicsResponse < 3) {
     o.nextPageToken = "foo";
-    o.topic = buildUnnamed1392();
+    o.topic = buildUnnamed1387();
   }
   buildCounterListTopicsResponse--;
   return o;
@@ -136,7 +136,7 @@
   buildCounterListTopicsResponse++;
   if (buildCounterListTopicsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1392(o.topic);
+    checkUnnamed1387(o.topic);
   }
   buildCounterListTopicsResponse--;
 }
@@ -185,14 +185,14 @@
   buildCounterModifyPushConfigRequest--;
 }
 
-buildUnnamed1393() {
+buildUnnamed1388() {
   var o = new core.List<api.PubsubMessage>();
   o.add(buildPubsubMessage());
   o.add(buildPubsubMessage());
   return o;
 }
 
-checkUnnamed1393(core.List<api.PubsubMessage> o) {
+checkUnnamed1388(core.List<api.PubsubMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPubsubMessage(o[0]);
   checkPubsubMessage(o[1]);
@@ -203,7 +203,7 @@
   var o = new api.PublishBatchRequest();
   buildCounterPublishBatchRequest++;
   if (buildCounterPublishBatchRequest < 3) {
-    o.messages = buildUnnamed1393();
+    o.messages = buildUnnamed1388();
     o.topic = "foo";
   }
   buildCounterPublishBatchRequest--;
@@ -213,20 +213,20 @@
 checkPublishBatchRequest(api.PublishBatchRequest o) {
   buildCounterPublishBatchRequest++;
   if (buildCounterPublishBatchRequest < 3) {
-    checkUnnamed1393(o.messages);
+    checkUnnamed1388(o.messages);
     unittest.expect(o.topic, unittest.equals('foo'));
   }
   buildCounterPublishBatchRequest--;
 }
 
-buildUnnamed1394() {
+buildUnnamed1389() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1394(core.List<core.String> o) {
+checkUnnamed1389(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -237,7 +237,7 @@
   var o = new api.PublishBatchResponse();
   buildCounterPublishBatchResponse++;
   if (buildCounterPublishBatchResponse < 3) {
-    o.messageIds = buildUnnamed1394();
+    o.messageIds = buildUnnamed1389();
   }
   buildCounterPublishBatchResponse--;
   return o;
@@ -246,7 +246,7 @@
 checkPublishBatchResponse(api.PublishBatchResponse o) {
   buildCounterPublishBatchResponse++;
   if (buildCounterPublishBatchResponse < 3) {
-    checkUnnamed1394(o.messageIds);
+    checkUnnamed1389(o.messageIds);
   }
   buildCounterPublishBatchResponse--;
 }
@@ -297,14 +297,14 @@
   buildCounterPubsubEvent--;
 }
 
-buildUnnamed1395() {
+buildUnnamed1390() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1395(core.List<api.Label> o) {
+checkUnnamed1390(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
@@ -316,7 +316,7 @@
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
     o.data = "foo";
-    o.label = buildUnnamed1395();
+    o.label = buildUnnamed1390();
     o.messageId = "foo";
   }
   buildCounterPubsubMessage--;
@@ -327,7 +327,7 @@
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
     unittest.expect(o.data, unittest.equals('foo'));
-    checkUnnamed1395(o.label);
+    checkUnnamed1390(o.label);
     unittest.expect(o.messageId, unittest.equals('foo'));
   }
   buildCounterPubsubMessage--;
@@ -356,14 +356,14 @@
   buildCounterPullBatchRequest--;
 }
 
-buildUnnamed1396() {
+buildUnnamed1391() {
   var o = new core.List<api.PullResponse>();
   o.add(buildPullResponse());
   o.add(buildPullResponse());
   return o;
 }
 
-checkUnnamed1396(core.List<api.PullResponse> o) {
+checkUnnamed1391(core.List<api.PullResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPullResponse(o[0]);
   checkPullResponse(o[1]);
@@ -374,7 +374,7 @@
   var o = new api.PullBatchResponse();
   buildCounterPullBatchResponse++;
   if (buildCounterPullBatchResponse < 3) {
-    o.pullResponses = buildUnnamed1396();
+    o.pullResponses = buildUnnamed1391();
   }
   buildCounterPullBatchResponse--;
   return o;
@@ -383,7 +383,7 @@
 checkPullBatchResponse(api.PullBatchResponse o) {
   buildCounterPullBatchResponse++;
   if (buildCounterPullBatchResponse < 3) {
-    checkUnnamed1396(o.pullResponses);
+    checkUnnamed1391(o.pullResponses);
   }
   buildCounterPullBatchResponse--;
 }
diff --git a/generated/googleapis_beta/test/replicapool/v1beta2_test.dart b/generated/googleapis_beta/test/replicapool/v1beta2_test.dart
index f73a5f4..5879257 100644
--- a/generated/googleapis_beta/test/replicapool/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/replicapool/v1beta2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1327() {
+buildUnnamed1392() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1327(core.List<core.String> o) {
+checkUnnamed1392(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -45,7 +45,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.selfLink = "foo";
-    o.targetPools = buildUnnamed1327();
+    o.targetPools = buildUnnamed1392();
     o.targetSize = 42;
   }
   buildCounterInstanceGroupManager--;
@@ -66,20 +66,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed1327(o.targetPools);
+    checkUnnamed1392(o.targetPools);
     unittest.expect(o.targetSize, unittest.equals(42));
   }
   buildCounterInstanceGroupManager--;
 }
 
-buildUnnamed1328() {
+buildUnnamed1393() {
   var o = new core.List<api.InstanceGroupManager>();
   o.add(buildInstanceGroupManager());
   o.add(buildInstanceGroupManager());
   return o;
 }
 
-checkUnnamed1328(core.List<api.InstanceGroupManager> o) {
+checkUnnamed1393(core.List<api.InstanceGroupManager> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceGroupManager(o[0]);
   checkInstanceGroupManager(o[1]);
@@ -91,7 +91,7 @@
   buildCounterInstanceGroupManagerList++;
   if (buildCounterInstanceGroupManagerList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1328();
+    o.items = buildUnnamed1393();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -104,7 +104,7 @@
   buildCounterInstanceGroupManagerList++;
   if (buildCounterInstanceGroupManagerList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1328(o.items);
+    checkUnnamed1393(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -112,14 +112,14 @@
   buildCounterInstanceGroupManagerList--;
 }
 
-buildUnnamed1329() {
+buildUnnamed1394() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1329(core.List<core.String> o) {
+checkUnnamed1394(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -130,7 +130,7 @@
   var o = new api.InstanceGroupManagersAbandonInstancesRequest();
   buildCounterInstanceGroupManagersAbandonInstancesRequest++;
   if (buildCounterInstanceGroupManagersAbandonInstancesRequest < 3) {
-    o.instances = buildUnnamed1329();
+    o.instances = buildUnnamed1394();
   }
   buildCounterInstanceGroupManagersAbandonInstancesRequest--;
   return o;
@@ -139,19 +139,19 @@
 checkInstanceGroupManagersAbandonInstancesRequest(api.InstanceGroupManagersAbandonInstancesRequest o) {
   buildCounterInstanceGroupManagersAbandonInstancesRequest++;
   if (buildCounterInstanceGroupManagersAbandonInstancesRequest < 3) {
-    checkUnnamed1329(o.instances);
+    checkUnnamed1394(o.instances);
   }
   buildCounterInstanceGroupManagersAbandonInstancesRequest--;
 }
 
-buildUnnamed1330() {
+buildUnnamed1395() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1330(core.List<core.String> o) {
+checkUnnamed1395(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -162,7 +162,7 @@
   var o = new api.InstanceGroupManagersDeleteInstancesRequest();
   buildCounterInstanceGroupManagersDeleteInstancesRequest++;
   if (buildCounterInstanceGroupManagersDeleteInstancesRequest < 3) {
-    o.instances = buildUnnamed1330();
+    o.instances = buildUnnamed1395();
   }
   buildCounterInstanceGroupManagersDeleteInstancesRequest--;
   return o;
@@ -171,19 +171,19 @@
 checkInstanceGroupManagersDeleteInstancesRequest(api.InstanceGroupManagersDeleteInstancesRequest o) {
   buildCounterInstanceGroupManagersDeleteInstancesRequest++;
   if (buildCounterInstanceGroupManagersDeleteInstancesRequest < 3) {
-    checkUnnamed1330(o.instances);
+    checkUnnamed1395(o.instances);
   }
   buildCounterInstanceGroupManagersDeleteInstancesRequest--;
 }
 
-buildUnnamed1331() {
+buildUnnamed1396() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1331(core.List<core.String> o) {
+checkUnnamed1396(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -194,7 +194,7 @@
   var o = new api.InstanceGroupManagersRecreateInstancesRequest();
   buildCounterInstanceGroupManagersRecreateInstancesRequest++;
   if (buildCounterInstanceGroupManagersRecreateInstancesRequest < 3) {
-    o.instances = buildUnnamed1331();
+    o.instances = buildUnnamed1396();
   }
   buildCounterInstanceGroupManagersRecreateInstancesRequest--;
   return o;
@@ -203,7 +203,7 @@
 checkInstanceGroupManagersRecreateInstancesRequest(api.InstanceGroupManagersRecreateInstancesRequest o) {
   buildCounterInstanceGroupManagersRecreateInstancesRequest++;
   if (buildCounterInstanceGroupManagersRecreateInstancesRequest < 3) {
-    checkUnnamed1331(o.instances);
+    checkUnnamed1396(o.instances);
   }
   buildCounterInstanceGroupManagersRecreateInstancesRequest--;
 }
@@ -227,14 +227,14 @@
   buildCounterInstanceGroupManagersSetInstanceTemplateRequest--;
 }
 
-buildUnnamed1332() {
+buildUnnamed1397() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1332(core.List<core.String> o) {
+checkUnnamed1397(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -246,7 +246,7 @@
   buildCounterInstanceGroupManagersSetTargetPoolsRequest++;
   if (buildCounterInstanceGroupManagersSetTargetPoolsRequest < 3) {
     o.fingerprint = "foo";
-    o.targetPools = buildUnnamed1332();
+    o.targetPools = buildUnnamed1397();
   }
   buildCounterInstanceGroupManagersSetTargetPoolsRequest--;
   return o;
@@ -256,7 +256,7 @@
   buildCounterInstanceGroupManagersSetTargetPoolsRequest++;
   if (buildCounterInstanceGroupManagersSetTargetPoolsRequest < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed1332(o.targetPools);
+    checkUnnamed1397(o.targetPools);
   }
   buildCounterInstanceGroupManagersSetTargetPoolsRequest--;
 }
@@ -284,14 +284,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed1333() {
+buildUnnamed1398() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed1333(core.List<api.OperationErrorErrors> o) {
+checkUnnamed1398(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -302,7 +302,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed1333();
+    o.errors = buildUnnamed1398();
   }
   buildCounterOperationError--;
   return o;
@@ -311,7 +311,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed1333(o.errors);
+    checkUnnamed1398(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -337,14 +337,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed1334() {
+buildUnnamed1399() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed1334(core.List<api.OperationWarningsData> o) {
+checkUnnamed1399(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -356,7 +356,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed1334();
+    o.data = buildUnnamed1399();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -367,20 +367,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed1334(o.data);
+    checkUnnamed1399(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed1335() {
+buildUnnamed1400() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed1335(core.List<api.OperationWarnings> o) {
+checkUnnamed1400(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -411,7 +411,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed1335();
+    o.warnings = buildUnnamed1400();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -441,20 +441,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed1335(o.warnings);
+    checkUnnamed1400(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1336() {
+buildUnnamed1401() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1336(core.List<api.Operation> o) {
+checkUnnamed1401(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -466,7 +466,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1336();
+    o.items = buildUnnamed1401();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -479,7 +479,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1336(o.items);
+    checkUnnamed1401(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
diff --git a/generated/googleapis_beta/test/replicapoolupdater/v1beta1_test.dart b/generated/googleapis_beta/test/replicapoolupdater/v1beta1_test.dart
index 1de835c..b574832 100644
--- a/generated/googleapis_beta/test/replicapoolupdater/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/replicapoolupdater/v1beta1_test.dart
@@ -56,14 +56,14 @@
   buildCounterInstanceUpdate--;
 }
 
-buildUnnamed1278() {
+buildUnnamed1402() {
   var o = new core.List<api.InstanceUpdate>();
   o.add(buildInstanceUpdate());
   o.add(buildInstanceUpdate());
   return o;
 }
 
-checkUnnamed1278(core.List<api.InstanceUpdate> o) {
+checkUnnamed1402(core.List<api.InstanceUpdate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceUpdate(o[0]);
   checkInstanceUpdate(o[1]);
@@ -74,15 +74,17 @@
   var o = new api.Update();
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
+    o.creationTimestamp = "foo";
     o.details = "foo";
     o.handle = "foo";
     o.instanceTemplate = "foo";
-    o.instanceUpdates = buildUnnamed1278();
+    o.instanceUpdates = buildUnnamed1402();
     o.kind = "foo";
     o.policy = buildUpdatePolicy();
     o.selfLink = "foo";
     o.state = "foo";
     o.targetState = "foo";
+    o.user = "foo";
   }
   buildCounterUpdate--;
   return o;
@@ -91,27 +93,29 @@
 checkUpdate(api.Update o) {
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
+    unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.details, unittest.equals('foo'));
     unittest.expect(o.handle, unittest.equals('foo'));
     unittest.expect(o.instanceTemplate, unittest.equals('foo'));
-    checkUnnamed1278(o.instanceUpdates);
+    checkUnnamed1402(o.instanceUpdates);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUpdatePolicy(o.policy);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.targetState, unittest.equals('foo'));
+    unittest.expect(o.user, unittest.equals('foo'));
   }
   buildCounterUpdate--;
 }
 
-buildUnnamed1279() {
+buildUnnamed1403() {
   var o = new core.List<api.Update>();
   o.add(buildUpdate());
   o.add(buildUpdate());
   return o;
 }
 
-checkUnnamed1279(core.List<api.Update> o) {
+checkUnnamed1403(core.List<api.Update> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpdate(o[0]);
   checkUpdate(o[1]);
@@ -122,7 +126,7 @@
   var o = new api.UpdateList();
   buildCounterUpdateList++;
   if (buildCounterUpdateList < 3) {
-    o.items = buildUnnamed1279();
+    o.items = buildUnnamed1403();
     o.nextPageToken = "foo";
   }
   buildCounterUpdateList--;
@@ -132,7 +136,7 @@
 checkUpdateList(api.UpdateList o) {
   buildCounterUpdateList++;
   if (buildCounterUpdateList < 3) {
-    checkUnnamed1279(o.items);
+    checkUnnamed1403(o.items);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUpdateList--;
diff --git a/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart b/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
index bd8ec3a..e1aed6a 100644
--- a/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
@@ -37,14 +37,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1285() {
+buildUnnamed1404() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1285(core.List<core.String> o) {
+checkUnnamed1404(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -55,7 +55,7 @@
   var o = new api.RegionViewsAddResourcesRequest();
   buildCounterRegionViewsAddResourcesRequest++;
   if (buildCounterRegionViewsAddResourcesRequest < 3) {
-    o.resources = buildUnnamed1285();
+    o.resources = buildUnnamed1404();
   }
   buildCounterRegionViewsAddResourcesRequest--;
   return o;
@@ -64,7 +64,7 @@
 checkRegionViewsAddResourcesRequest(api.RegionViewsAddResourcesRequest o) {
   buildCounterRegionViewsAddResourcesRequest++;
   if (buildCounterRegionViewsAddResourcesRequest < 3) {
-    checkUnnamed1285(o.resources);
+    checkUnnamed1404(o.resources);
   }
   buildCounterRegionViewsAddResourcesRequest--;
 }
@@ -88,14 +88,14 @@
   buildCounterRegionViewsInsertResponse--;
 }
 
-buildUnnamed1286() {
+buildUnnamed1405() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1286(core.List<core.String> o) {
+checkUnnamed1405(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -106,7 +106,7 @@
   var o = new api.RegionViewsListResourcesResponse();
   buildCounterRegionViewsListResourcesResponse++;
   if (buildCounterRegionViewsListResourcesResponse < 3) {
-    o.members = buildUnnamed1286();
+    o.members = buildUnnamed1405();
     o.nextPageToken = "foo";
   }
   buildCounterRegionViewsListResourcesResponse--;
@@ -116,20 +116,20 @@
 checkRegionViewsListResourcesResponse(api.RegionViewsListResourcesResponse o) {
   buildCounterRegionViewsListResourcesResponse++;
   if (buildCounterRegionViewsListResourcesResponse < 3) {
-    checkUnnamed1286(o.members);
+    checkUnnamed1405(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterRegionViewsListResourcesResponse--;
 }
 
-buildUnnamed1287() {
+buildUnnamed1406() {
   var o = new core.List<api.ResourceView>();
   o.add(buildResourceView());
   o.add(buildResourceView());
   return o;
 }
 
-checkUnnamed1287(core.List<api.ResourceView> o) {
+checkUnnamed1406(core.List<api.ResourceView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceView(o[0]);
   checkResourceView(o[1]);
@@ -141,7 +141,7 @@
   buildCounterRegionViewsListResponse++;
   if (buildCounterRegionViewsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resourceViews = buildUnnamed1287();
+    o.resourceViews = buildUnnamed1406();
   }
   buildCounterRegionViewsListResponse--;
   return o;
@@ -151,19 +151,19 @@
   buildCounterRegionViewsListResponse++;
   if (buildCounterRegionViewsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1287(o.resourceViews);
+    checkUnnamed1406(o.resourceViews);
   }
   buildCounterRegionViewsListResponse--;
 }
 
-buildUnnamed1288() {
+buildUnnamed1407() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1288(core.List<core.String> o) {
+checkUnnamed1407(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -174,7 +174,7 @@
   var o = new api.RegionViewsRemoveResourcesRequest();
   buildCounterRegionViewsRemoveResourcesRequest++;
   if (buildCounterRegionViewsRemoveResourcesRequest < 3) {
-    o.resources = buildUnnamed1288();
+    o.resources = buildUnnamed1407();
   }
   buildCounterRegionViewsRemoveResourcesRequest--;
   return o;
@@ -183,32 +183,32 @@
 checkRegionViewsRemoveResourcesRequest(api.RegionViewsRemoveResourcesRequest o) {
   buildCounterRegionViewsRemoveResourcesRequest++;
   if (buildCounterRegionViewsRemoveResourcesRequest < 3) {
-    checkUnnamed1288(o.resources);
+    checkUnnamed1407(o.resources);
   }
   buildCounterRegionViewsRemoveResourcesRequest--;
 }
 
-buildUnnamed1289() {
+buildUnnamed1408() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1289(core.List<api.Label> o) {
+checkUnnamed1408(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
 }
 
-buildUnnamed1290() {
+buildUnnamed1409() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1290(core.List<core.String> o) {
+checkUnnamed1409(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -223,9 +223,9 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed1289();
+    o.labels = buildUnnamed1408();
     o.lastModified = "foo";
-    o.members = buildUnnamed1290();
+    o.members = buildUnnamed1409();
     o.name = "foo";
     o.numMembers = 42;
     o.selfLink = "foo";
@@ -241,9 +241,9 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1289(o.labels);
+    checkUnnamed1408(o.labels);
     unittest.expect(o.lastModified, unittest.equals('foo'));
-    checkUnnamed1290(o.members);
+    checkUnnamed1409(o.members);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.numMembers, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -251,14 +251,14 @@
   buildCounterResourceView--;
 }
 
-buildUnnamed1291() {
+buildUnnamed1410() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1291(core.List<core.String> o) {
+checkUnnamed1410(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -269,7 +269,7 @@
   var o = new api.ZoneViewsAddResourcesRequest();
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    o.resources = buildUnnamed1291();
+    o.resources = buildUnnamed1410();
   }
   buildCounterZoneViewsAddResourcesRequest--;
   return o;
@@ -278,7 +278,7 @@
 checkZoneViewsAddResourcesRequest(api.ZoneViewsAddResourcesRequest o) {
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    checkUnnamed1291(o.resources);
+    checkUnnamed1410(o.resources);
   }
   buildCounterZoneViewsAddResourcesRequest--;
 }
@@ -302,14 +302,14 @@
   buildCounterZoneViewsInsertResponse--;
 }
 
-buildUnnamed1292() {
+buildUnnamed1411() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1292(core.List<core.String> o) {
+checkUnnamed1411(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -320,7 +320,7 @@
   var o = new api.ZoneViewsListResourcesResponse();
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    o.members = buildUnnamed1292();
+    o.members = buildUnnamed1411();
     o.nextPageToken = "foo";
   }
   buildCounterZoneViewsListResourcesResponse--;
@@ -330,20 +330,20 @@
 checkZoneViewsListResourcesResponse(api.ZoneViewsListResourcesResponse o) {
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    checkUnnamed1292(o.members);
+    checkUnnamed1411(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterZoneViewsListResourcesResponse--;
 }
 
-buildUnnamed1293() {
+buildUnnamed1412() {
   var o = new core.List<api.ResourceView>();
   o.add(buildResourceView());
   o.add(buildResourceView());
   return o;
 }
 
-checkUnnamed1293(core.List<api.ResourceView> o) {
+checkUnnamed1412(core.List<api.ResourceView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceView(o[0]);
   checkResourceView(o[1]);
@@ -355,7 +355,7 @@
   buildCounterZoneViewsListResponse++;
   if (buildCounterZoneViewsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resourceViews = buildUnnamed1293();
+    o.resourceViews = buildUnnamed1412();
   }
   buildCounterZoneViewsListResponse--;
   return o;
@@ -365,19 +365,19 @@
   buildCounterZoneViewsListResponse++;
   if (buildCounterZoneViewsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1293(o.resourceViews);
+    checkUnnamed1412(o.resourceViews);
   }
   buildCounterZoneViewsListResponse--;
 }
 
-buildUnnamed1294() {
+buildUnnamed1413() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1294(core.List<core.String> o) {
+checkUnnamed1413(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -388,7 +388,7 @@
   var o = new api.ZoneViewsRemoveResourcesRequest();
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    o.resources = buildUnnamed1294();
+    o.resources = buildUnnamed1413();
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
   return o;
@@ -397,7 +397,7 @@
 checkZoneViewsRemoveResourcesRequest(api.ZoneViewsRemoveResourcesRequest o) {
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    checkUnnamed1294(o.resources);
+    checkUnnamed1413(o.resources);
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
 }
diff --git a/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart b/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart
index c315bdf..13d4a8c 100644
--- a/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart
@@ -37,30 +37,30 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1263() {
+buildUnnamed1414() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1263(core.List<core.int> o) {
+checkUnnamed1414(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed1264() {
+buildUnnamed1415() {
   var o = new core.Map<core.String, core.List<core.int>>();
-  o["x"] = buildUnnamed1263();
-  o["y"] = buildUnnamed1263();
+  o["x"] = buildUnnamed1414();
+  o["y"] = buildUnnamed1414();
   return o;
 }
 
-checkUnnamed1264(core.Map<core.String, core.List<core.int>> o) {
+checkUnnamed1415(core.Map<core.String, core.List<core.int>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1263(o["x"]);
-  checkUnnamed1263(o["y"]);
+  checkUnnamed1414(o["x"]);
+  checkUnnamed1414(o["y"]);
 }
 
 core.int buildCounterListResourceResponseItem = 0;
@@ -68,7 +68,7 @@
   var o = new api.ListResourceResponseItem();
   buildCounterListResourceResponseItem++;
   if (buildCounterListResourceResponseItem < 3) {
-    o.endpoints = buildUnnamed1264();
+    o.endpoints = buildUnnamed1415();
     o.resource = "foo";
   }
   buildCounterListResourceResponseItem--;
@@ -78,7 +78,7 @@
 checkListResourceResponseItem(api.ListResourceResponseItem o) {
   buildCounterListResourceResponseItem++;
   if (buildCounterListResourceResponseItem < 3) {
-    checkUnnamed1264(o.endpoints);
+    checkUnnamed1415(o.endpoints);
     unittest.expect(o.resource, unittest.equals('foo'));
   }
   buildCounterListResourceResponseItem--;
@@ -107,14 +107,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed1265() {
+buildUnnamed1416() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed1265(core.List<api.OperationErrorErrors> o) {
+checkUnnamed1416(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -125,7 +125,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed1265();
+    o.errors = buildUnnamed1416();
   }
   buildCounterOperationError--;
   return o;
@@ -134,7 +134,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed1265(o.errors);
+    checkUnnamed1416(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -160,14 +160,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed1266() {
+buildUnnamed1417() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed1266(core.List<api.OperationWarningsData> o) {
+checkUnnamed1417(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -179,7 +179,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed1266();
+    o.data = buildUnnamed1417();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -190,20 +190,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed1266(o.data);
+    checkUnnamed1417(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed1267() {
+buildUnnamed1418() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed1267(core.List<api.OperationWarnings> o) {
+checkUnnamed1418(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -234,7 +234,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed1267();
+    o.warnings = buildUnnamed1418();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -264,20 +264,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed1267(o.warnings);
+    checkUnnamed1418(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1268() {
+buildUnnamed1419() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1268(core.List<api.Operation> o) {
+checkUnnamed1419(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -289,7 +289,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1268();
+    o.items = buildUnnamed1419();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -302,7 +302,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1268(o.items);
+    checkUnnamed1419(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -310,40 +310,40 @@
   buildCounterOperationList--;
 }
 
-buildUnnamed1269() {
+buildUnnamed1420() {
   var o = new core.List<api.ServiceEndpoint>();
   o.add(buildServiceEndpoint());
   o.add(buildServiceEndpoint());
   return o;
 }
 
-checkUnnamed1269(core.List<api.ServiceEndpoint> o) {
+checkUnnamed1420(core.List<api.ServiceEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceEndpoint(o[0]);
   checkServiceEndpoint(o[1]);
 }
 
-buildUnnamed1270() {
+buildUnnamed1421() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1270(core.List<api.Label> o) {
+checkUnnamed1421(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
 }
 
-buildUnnamed1271() {
+buildUnnamed1422() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1271(core.List<core.String> o) {
+checkUnnamed1422(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -356,14 +356,14 @@
   if (buildCounterResourceView < 3) {
     o.creationTimestamp = "foo";
     o.description = "foo";
-    o.endpoints = buildUnnamed1269();
+    o.endpoints = buildUnnamed1420();
     o.fingerprint = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed1270();
+    o.labels = buildUnnamed1421();
     o.name = "foo";
     o.network = "foo";
-    o.resources = buildUnnamed1271();
+    o.resources = buildUnnamed1422();
     o.selfLink = "foo";
     o.size = 42;
   }
@@ -376,14 +376,14 @@
   if (buildCounterResourceView < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1269(o.endpoints);
+    checkUnnamed1420(o.endpoints);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1270(o.labels);
+    checkUnnamed1421(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
-    checkUnnamed1271(o.resources);
+    checkUnnamed1422(o.resources);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.size, unittest.equals(42));
   }
@@ -411,14 +411,14 @@
   buildCounterServiceEndpoint--;
 }
 
-buildUnnamed1272() {
+buildUnnamed1423() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1272(core.List<core.String> o) {
+checkUnnamed1423(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -429,7 +429,7 @@
   var o = new api.ZoneViewsAddResourcesRequest();
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    o.resources = buildUnnamed1272();
+    o.resources = buildUnnamed1423();
   }
   buildCounterZoneViewsAddResourcesRequest--;
   return o;
@@ -438,19 +438,19 @@
 checkZoneViewsAddResourcesRequest(api.ZoneViewsAddResourcesRequest o) {
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    checkUnnamed1272(o.resources);
+    checkUnnamed1423(o.resources);
   }
   buildCounterZoneViewsAddResourcesRequest--;
 }
 
-buildUnnamed1273() {
+buildUnnamed1424() {
   var o = new core.List<api.ServiceEndpoint>();
   o.add(buildServiceEndpoint());
   o.add(buildServiceEndpoint());
   return o;
 }
 
-checkUnnamed1273(core.List<api.ServiceEndpoint> o) {
+checkUnnamed1424(core.List<api.ServiceEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceEndpoint(o[0]);
   checkServiceEndpoint(o[1]);
@@ -461,7 +461,7 @@
   var o = new api.ZoneViewsGetServiceResponse();
   buildCounterZoneViewsGetServiceResponse++;
   if (buildCounterZoneViewsGetServiceResponse < 3) {
-    o.endpoints = buildUnnamed1273();
+    o.endpoints = buildUnnamed1424();
     o.fingerprint = "foo";
   }
   buildCounterZoneViewsGetServiceResponse--;
@@ -471,20 +471,20 @@
 checkZoneViewsGetServiceResponse(api.ZoneViewsGetServiceResponse o) {
   buildCounterZoneViewsGetServiceResponse++;
   if (buildCounterZoneViewsGetServiceResponse < 3) {
-    checkUnnamed1273(o.endpoints);
+    checkUnnamed1424(o.endpoints);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
   }
   buildCounterZoneViewsGetServiceResponse--;
 }
 
-buildUnnamed1274() {
+buildUnnamed1425() {
   var o = new core.List<api.ResourceView>();
   o.add(buildResourceView());
   o.add(buildResourceView());
   return o;
 }
 
-checkUnnamed1274(core.List<api.ResourceView> o) {
+checkUnnamed1425(core.List<api.ResourceView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceView(o[0]);
   checkResourceView(o[1]);
@@ -495,7 +495,7 @@
   var o = new api.ZoneViewsList();
   buildCounterZoneViewsList++;
   if (buildCounterZoneViewsList < 3) {
-    o.items = buildUnnamed1274();
+    o.items = buildUnnamed1425();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -507,7 +507,7 @@
 checkZoneViewsList(api.ZoneViewsList o) {
   buildCounterZoneViewsList++;
   if (buildCounterZoneViewsList < 3) {
-    checkUnnamed1274(o.items);
+    checkUnnamed1425(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -515,14 +515,14 @@
   buildCounterZoneViewsList--;
 }
 
-buildUnnamed1275() {
+buildUnnamed1426() {
   var o = new core.List<api.ListResourceResponseItem>();
   o.add(buildListResourceResponseItem());
   o.add(buildListResourceResponseItem());
   return o;
 }
 
-checkUnnamed1275(core.List<api.ListResourceResponseItem> o) {
+checkUnnamed1426(core.List<api.ListResourceResponseItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListResourceResponseItem(o[0]);
   checkListResourceResponseItem(o[1]);
@@ -533,7 +533,7 @@
   var o = new api.ZoneViewsListResourcesResponse();
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    o.items = buildUnnamed1275();
+    o.items = buildUnnamed1426();
     o.network = "foo";
     o.nextPageToken = "foo";
   }
@@ -544,21 +544,21 @@
 checkZoneViewsListResourcesResponse(api.ZoneViewsListResourcesResponse o) {
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    checkUnnamed1275(o.items);
+    checkUnnamed1426(o.items);
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterZoneViewsListResourcesResponse--;
 }
 
-buildUnnamed1276() {
+buildUnnamed1427() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1276(core.List<core.String> o) {
+checkUnnamed1427(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -569,7 +569,7 @@
   var o = new api.ZoneViewsRemoveResourcesRequest();
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    o.resources = buildUnnamed1276();
+    o.resources = buildUnnamed1427();
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
   return o;
@@ -578,19 +578,19 @@
 checkZoneViewsRemoveResourcesRequest(api.ZoneViewsRemoveResourcesRequest o) {
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    checkUnnamed1276(o.resources);
+    checkUnnamed1427(o.resources);
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
 }
 
-buildUnnamed1277() {
+buildUnnamed1428() {
   var o = new core.List<api.ServiceEndpoint>();
   o.add(buildServiceEndpoint());
   o.add(buildServiceEndpoint());
   return o;
 }
 
-checkUnnamed1277(core.List<api.ServiceEndpoint> o) {
+checkUnnamed1428(core.List<api.ServiceEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceEndpoint(o[0]);
   checkServiceEndpoint(o[1]);
@@ -601,7 +601,7 @@
   var o = new api.ZoneViewsSetServiceRequest();
   buildCounterZoneViewsSetServiceRequest++;
   if (buildCounterZoneViewsSetServiceRequest < 3) {
-    o.endpoints = buildUnnamed1277();
+    o.endpoints = buildUnnamed1428();
     o.fingerprint = "foo";
     o.resourceName = "foo";
   }
@@ -612,7 +612,7 @@
 checkZoneViewsSetServiceRequest(api.ZoneViewsSetServiceRequest o) {
   buildCounterZoneViewsSetServiceRequest++;
   if (buildCounterZoneViewsSetServiceRequest < 3) {
-    checkUnnamed1277(o.endpoints);
+    checkUnnamed1428(o.endpoints);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.resourceName, unittest.equals('foo'));
   }
diff --git a/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart b/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
index 90b38a3..138aff8 100644
--- a/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
+++ b/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
@@ -78,14 +78,14 @@
   buildCounterBackupRun--;
 }
 
-buildUnnamed1237() {
+buildUnnamed1429() {
   var o = new core.List<api.BackupRun>();
   o.add(buildBackupRun());
   o.add(buildBackupRun());
   return o;
 }
 
-checkUnnamed1237(core.List<api.BackupRun> o) {
+checkUnnamed1429(core.List<api.BackupRun> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackupRun(o[0]);
   checkBackupRun(o[1]);
@@ -96,7 +96,7 @@
   var o = new api.BackupRunsListResponse();
   buildCounterBackupRunsListResponse++;
   if (buildCounterBackupRunsListResponse < 3) {
-    o.items = buildUnnamed1237();
+    o.items = buildUnnamed1429();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -107,7 +107,7 @@
 checkBackupRunsListResponse(api.BackupRunsListResponse o) {
   buildCounterBackupRunsListResponse++;
   if (buildCounterBackupRunsListResponse < 3) {
-    checkUnnamed1237(o.items);
+    checkUnnamed1429(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -183,27 +183,27 @@
   buildCounterDatabaseFlags--;
 }
 
-buildUnnamed1238() {
+buildUnnamed1430() {
   var o = new core.List<api.IpMapping>();
   o.add(buildIpMapping());
   o.add(buildIpMapping());
   return o;
 }
 
-checkUnnamed1238(core.List<api.IpMapping> o) {
+checkUnnamed1430(core.List<api.IpMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIpMapping(o[0]);
   checkIpMapping(o[1]);
 }
 
-buildUnnamed1239() {
+buildUnnamed1431() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1239(core.List<core.String> o) {
+checkUnnamed1431(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -219,14 +219,14 @@
     o.etag = "foo";
     o.instance = "foo";
     o.instanceType = "foo";
-    o.ipAddresses = buildUnnamed1238();
+    o.ipAddresses = buildUnnamed1430();
     o.ipv6Address = "foo";
     o.kind = "foo";
     o.masterInstanceName = "foo";
     o.maxDiskSize = "foo";
     o.project = "foo";
     o.region = "foo";
-    o.replicaNames = buildUnnamed1239();
+    o.replicaNames = buildUnnamed1431();
     o.serverCaCert = buildSslCert();
     o.settings = buildSettings();
     o.state = "foo";
@@ -243,14 +243,14 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.instance, unittest.equals('foo'));
     unittest.expect(o.instanceType, unittest.equals('foo'));
-    checkUnnamed1238(o.ipAddresses);
+    checkUnnamed1430(o.ipAddresses);
     unittest.expect(o.ipv6Address, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.masterInstanceName, unittest.equals('foo'));
     unittest.expect(o.maxDiskSize, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed1239(o.replicaNames);
+    checkUnnamed1431(o.replicaNames);
     checkSslCert(o.serverCaCert);
     checkSettings(o.settings);
     unittest.expect(o.state, unittest.equals('foo'));
@@ -258,27 +258,27 @@
   buildCounterDatabaseInstance--;
 }
 
-buildUnnamed1240() {
+buildUnnamed1432() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1240(core.List<core.String> o) {
+checkUnnamed1432(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1241() {
+buildUnnamed1433() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1241(core.List<core.String> o) {
+checkUnnamed1433(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -289,9 +289,9 @@
   var o = new api.ExportContext();
   buildCounterExportContext++;
   if (buildCounterExportContext < 3) {
-    o.database = buildUnnamed1240();
+    o.database = buildUnnamed1432();
     o.kind = "foo";
-    o.table = buildUnnamed1241();
+    o.table = buildUnnamed1433();
     o.uri = "foo";
   }
   buildCounterExportContext--;
@@ -301,35 +301,35 @@
 checkExportContext(api.ExportContext o) {
   buildCounterExportContext++;
   if (buildCounterExportContext < 3) {
-    checkUnnamed1240(o.database);
+    checkUnnamed1432(o.database);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1241(o.table);
+    checkUnnamed1433(o.table);
     unittest.expect(o.uri, unittest.equals('foo'));
   }
   buildCounterExportContext--;
 }
 
-buildUnnamed1242() {
+buildUnnamed1434() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1242(core.List<core.String> o) {
+checkUnnamed1434(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1243() {
+buildUnnamed1435() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1243(core.List<core.String> o) {
+checkUnnamed1435(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -340,8 +340,8 @@
   var o = new api.Flag();
   buildCounterFlag++;
   if (buildCounterFlag < 3) {
-    o.allowedStringValues = buildUnnamed1242();
-    o.appliesTo = buildUnnamed1243();
+    o.allowedStringValues = buildUnnamed1434();
+    o.appliesTo = buildUnnamed1435();
     o.kind = "foo";
     o.maxValue = "foo";
     o.minValue = "foo";
@@ -355,8 +355,8 @@
 checkFlag(api.Flag o) {
   buildCounterFlag++;
   if (buildCounterFlag < 3) {
-    checkUnnamed1242(o.allowedStringValues);
-    checkUnnamed1243(o.appliesTo);
+    checkUnnamed1434(o.allowedStringValues);
+    checkUnnamed1435(o.appliesTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.maxValue, unittest.equals('foo'));
     unittest.expect(o.minValue, unittest.equals('foo'));
@@ -366,14 +366,14 @@
   buildCounterFlag--;
 }
 
-buildUnnamed1244() {
+buildUnnamed1436() {
   var o = new core.List<api.Flag>();
   o.add(buildFlag());
   o.add(buildFlag());
   return o;
 }
 
-checkUnnamed1244(core.List<api.Flag> o) {
+checkUnnamed1436(core.List<api.Flag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFlag(o[0]);
   checkFlag(o[1]);
@@ -384,7 +384,7 @@
   var o = new api.FlagsListResponse();
   buildCounterFlagsListResponse++;
   if (buildCounterFlagsListResponse < 3) {
-    o.items = buildUnnamed1244();
+    o.items = buildUnnamed1436();
     o.kind = "foo";
   }
   buildCounterFlagsListResponse--;
@@ -394,20 +394,20 @@
 checkFlagsListResponse(api.FlagsListResponse o) {
   buildCounterFlagsListResponse++;
   if (buildCounterFlagsListResponse < 3) {
-    checkUnnamed1244(o.items);
+    checkUnnamed1436(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterFlagsListResponse--;
 }
 
-buildUnnamed1245() {
+buildUnnamed1437() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1245(core.List<core.String> o) {
+checkUnnamed1437(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -420,7 +420,7 @@
   if (buildCounterImportContext < 3) {
     o.database = "foo";
     o.kind = "foo";
-    o.uri = buildUnnamed1245();
+    o.uri = buildUnnamed1437();
   }
   buildCounterImportContext--;
   return o;
@@ -431,19 +431,19 @@
   if (buildCounterImportContext < 3) {
     unittest.expect(o.database, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1245(o.uri);
+    checkUnnamed1437(o.uri);
   }
   buildCounterImportContext--;
 }
 
-buildUnnamed1246() {
+buildUnnamed1438() {
   var o = new core.List<api.OperationError>();
   o.add(buildOperationError());
   o.add(buildOperationError());
   return o;
 }
 
-checkUnnamed1246(core.List<api.OperationError> o) {
+checkUnnamed1438(core.List<api.OperationError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationError(o[0]);
   checkOperationError(o[1]);
@@ -456,7 +456,7 @@
   if (buildCounterInstanceOperation < 3) {
     o.endTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.enqueuedTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.error = buildUnnamed1246();
+    o.error = buildUnnamed1438();
     o.exportContext = buildExportContext();
     o.importContext = buildImportContext();
     o.instance = "foo";
@@ -476,7 +476,7 @@
   if (buildCounterInstanceOperation < 3) {
     unittest.expect(o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.enqueuedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1246(o.error);
+    checkUnnamed1438(o.error);
     checkExportContext(o.exportContext);
     checkImportContext(o.importContext);
     unittest.expect(o.instance, unittest.equals('foo'));
@@ -671,14 +671,14 @@
   buildCounterInstancesInsertResponse--;
 }
 
-buildUnnamed1247() {
+buildUnnamed1439() {
   var o = new core.List<api.DatabaseInstance>();
   o.add(buildDatabaseInstance());
   o.add(buildDatabaseInstance());
   return o;
 }
 
-checkUnnamed1247(core.List<api.DatabaseInstance> o) {
+checkUnnamed1439(core.List<api.DatabaseInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatabaseInstance(o[0]);
   checkDatabaseInstance(o[1]);
@@ -689,7 +689,7 @@
   var o = new api.InstancesListResponse();
   buildCounterInstancesListResponse++;
   if (buildCounterInstancesListResponse < 3) {
-    o.items = buildUnnamed1247();
+    o.items = buildUnnamed1439();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -700,7 +700,7 @@
 checkInstancesListResponse(api.InstancesListResponse o) {
   buildCounterInstancesListResponse++;
   if (buildCounterInstancesListResponse < 3) {
-    checkUnnamed1247(o.items);
+    checkUnnamed1439(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -833,14 +833,14 @@
   buildCounterInstancesUpdateResponse--;
 }
 
-buildUnnamed1248() {
+buildUnnamed1440() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1248(core.List<core.String> o) {
+checkUnnamed1440(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -851,7 +851,7 @@
   var o = new api.IpConfiguration();
   buildCounterIpConfiguration++;
   if (buildCounterIpConfiguration < 3) {
-    o.authorizedNetworks = buildUnnamed1248();
+    o.authorizedNetworks = buildUnnamed1440();
     o.enabled = true;
     o.kind = "foo";
     o.requireSsl = true;
@@ -863,7 +863,7 @@
 checkIpConfiguration(api.IpConfiguration o) {
   buildCounterIpConfiguration++;
   if (buildCounterIpConfiguration < 3) {
-    checkUnnamed1248(o.authorizedNetworks);
+    checkUnnamed1440(o.authorizedNetworks);
     unittest.expect(o.enabled, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requireSsl, unittest.isTrue);
@@ -936,14 +936,14 @@
   buildCounterOperationError--;
 }
 
-buildUnnamed1249() {
+buildUnnamed1441() {
   var o = new core.List<api.InstanceOperation>();
   o.add(buildInstanceOperation());
   o.add(buildInstanceOperation());
   return o;
 }
 
-checkUnnamed1249(core.List<api.InstanceOperation> o) {
+checkUnnamed1441(core.List<api.InstanceOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceOperation(o[0]);
   checkInstanceOperation(o[1]);
@@ -954,7 +954,7 @@
   var o = new api.OperationsListResponse();
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
-    o.items = buildUnnamed1249();
+    o.items = buildUnnamed1441();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -965,7 +965,7 @@
 checkOperationsListResponse(api.OperationsListResponse o) {
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
-    checkUnnamed1249(o.items);
+    checkUnnamed1441(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -993,40 +993,40 @@
   buildCounterSetRootPasswordContext--;
 }
 
-buildUnnamed1250() {
+buildUnnamed1442() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1250(core.List<core.String> o) {
+checkUnnamed1442(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1251() {
+buildUnnamed1443() {
   var o = new core.List<api.BackupConfiguration>();
   o.add(buildBackupConfiguration());
   o.add(buildBackupConfiguration());
   return o;
 }
 
-checkUnnamed1251(core.List<api.BackupConfiguration> o) {
+checkUnnamed1443(core.List<api.BackupConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackupConfiguration(o[0]);
   checkBackupConfiguration(o[1]);
 }
 
-buildUnnamed1252() {
+buildUnnamed1444() {
   var o = new core.List<api.DatabaseFlags>();
   o.add(buildDatabaseFlags());
   o.add(buildDatabaseFlags());
   return o;
 }
 
-checkUnnamed1252(core.List<api.DatabaseFlags> o) {
+checkUnnamed1444(core.List<api.DatabaseFlags> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatabaseFlags(o[0]);
   checkDatabaseFlags(o[1]);
@@ -1038,9 +1038,9 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     o.activationPolicy = "foo";
-    o.authorizedGaeApplications = buildUnnamed1250();
-    o.backupConfiguration = buildUnnamed1251();
-    o.databaseFlags = buildUnnamed1252();
+    o.authorizedGaeApplications = buildUnnamed1442();
+    o.backupConfiguration = buildUnnamed1443();
+    o.databaseFlags = buildUnnamed1444();
     o.databaseReplicationEnabled = true;
     o.ipConfiguration = buildIpConfiguration();
     o.kind = "foo";
@@ -1058,9 +1058,9 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     unittest.expect(o.activationPolicy, unittest.equals('foo'));
-    checkUnnamed1250(o.authorizedGaeApplications);
-    checkUnnamed1251(o.backupConfiguration);
-    checkUnnamed1252(o.databaseFlags);
+    checkUnnamed1442(o.authorizedGaeApplications);
+    checkUnnamed1443(o.backupConfiguration);
+    checkUnnamed1444(o.databaseFlags);
     unittest.expect(o.databaseReplicationEnabled, unittest.isTrue);
     checkIpConfiguration(o.ipConfiguration);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1190,14 +1190,14 @@
   buildCounterSslCertsInsertResponse--;
 }
 
-buildUnnamed1253() {
+buildUnnamed1445() {
   var o = new core.List<api.SslCert>();
   o.add(buildSslCert());
   o.add(buildSslCert());
   return o;
 }
 
-checkUnnamed1253(core.List<api.SslCert> o) {
+checkUnnamed1445(core.List<api.SslCert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSslCert(o[0]);
   checkSslCert(o[1]);
@@ -1208,7 +1208,7 @@
   var o = new api.SslCertsListResponse();
   buildCounterSslCertsListResponse++;
   if (buildCounterSslCertsListResponse < 3) {
-    o.items = buildUnnamed1253();
+    o.items = buildUnnamed1445();
     o.kind = "foo";
   }
   buildCounterSslCertsListResponse--;
@@ -1218,20 +1218,20 @@
 checkSslCertsListResponse(api.SslCertsListResponse o) {
   buildCounterSslCertsListResponse++;
   if (buildCounterSslCertsListResponse < 3) {
-    checkUnnamed1253(o.items);
+    checkUnnamed1445(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSslCertsListResponse--;
 }
 
-buildUnnamed1254() {
+buildUnnamed1446() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1254(core.List<core.String> o) {
+checkUnnamed1446(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1245,7 +1245,7 @@
     o.DiskQuota = "foo";
     o.RAM = "foo";
     o.kind = "foo";
-    o.region = buildUnnamed1254();
+    o.region = buildUnnamed1446();
     o.tier = "foo";
   }
   buildCounterTier--;
@@ -1258,20 +1258,20 @@
     unittest.expect(o.DiskQuota, unittest.equals('foo'));
     unittest.expect(o.RAM, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1254(o.region);
+    checkUnnamed1446(o.region);
     unittest.expect(o.tier, unittest.equals('foo'));
   }
   buildCounterTier--;
 }
 
-buildUnnamed1255() {
+buildUnnamed1447() {
   var o = new core.List<api.Tier>();
   o.add(buildTier());
   o.add(buildTier());
   return o;
 }
 
-checkUnnamed1255(core.List<api.Tier> o) {
+checkUnnamed1447(core.List<api.Tier> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTier(o[0]);
   checkTier(o[1]);
@@ -1282,7 +1282,7 @@
   var o = new api.TiersListResponse();
   buildCounterTiersListResponse++;
   if (buildCounterTiersListResponse < 3) {
-    o.items = buildUnnamed1255();
+    o.items = buildUnnamed1447();
     o.kind = "foo";
   }
   buildCounterTiersListResponse--;
@@ -1292,7 +1292,7 @@
 checkTiersListResponse(api.TiersListResponse o) {
   buildCounterTiersListResponse++;
   if (buildCounterTiersListResponse < 3) {
-    checkUnnamed1255(o.items);
+    checkUnnamed1447(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTiersListResponse--;
diff --git a/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart b/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
index 0d231a1..a6933db 100644
--- a/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
@@ -49,40 +49,40 @@
   buildCounterTask--;
 }
 
-buildUnnamed1280() {
+buildUnnamed1448() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1280(core.List<core.String> o) {
+checkUnnamed1448(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1281() {
+buildUnnamed1449() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1281(core.List<core.String> o) {
+checkUnnamed1449(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1282() {
+buildUnnamed1450() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1282(core.List<core.String> o) {
+checkUnnamed1450(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -93,9 +93,9 @@
   var o = new api.TaskQueueAcl();
   buildCounterTaskQueueAcl++;
   if (buildCounterTaskQueueAcl < 3) {
-    o.adminEmails = buildUnnamed1280();
-    o.consumerEmails = buildUnnamed1281();
-    o.producerEmails = buildUnnamed1282();
+    o.adminEmails = buildUnnamed1448();
+    o.consumerEmails = buildUnnamed1449();
+    o.producerEmails = buildUnnamed1450();
   }
   buildCounterTaskQueueAcl--;
   return o;
@@ -104,9 +104,9 @@
 checkTaskQueueAcl(api.TaskQueueAcl o) {
   buildCounterTaskQueueAcl++;
   if (buildCounterTaskQueueAcl < 3) {
-    checkUnnamed1280(o.adminEmails);
-    checkUnnamed1281(o.consumerEmails);
-    checkUnnamed1282(o.producerEmails);
+    checkUnnamed1448(o.adminEmails);
+    checkUnnamed1449(o.consumerEmails);
+    checkUnnamed1450(o.producerEmails);
   }
   buildCounterTaskQueueAcl--;
 }
@@ -163,14 +163,14 @@
   buildCounterTaskQueue--;
 }
 
-buildUnnamed1283() {
+buildUnnamed1451() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1283(core.List<api.Task> o) {
+checkUnnamed1451(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -181,7 +181,7 @@
   var o = new api.Tasks();
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
-    o.items = buildUnnamed1283();
+    o.items = buildUnnamed1451();
     o.kind = "foo";
   }
   buildCounterTasks--;
@@ -191,20 +191,20 @@
 checkTasks(api.Tasks o) {
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
-    checkUnnamed1283(o.items);
+    checkUnnamed1451(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTasks--;
 }
 
-buildUnnamed1284() {
+buildUnnamed1452() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1284(core.List<api.Task> o) {
+checkUnnamed1452(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -215,7 +215,7 @@
   var o = new api.Tasks2();
   buildCounterTasks2++;
   if (buildCounterTasks2 < 3) {
-    o.items = buildUnnamed1284();
+    o.items = buildUnnamed1452();
     o.kind = "foo";
   }
   buildCounterTasks2--;
@@ -225,7 +225,7 @@
 checkTasks2(api.Tasks2 o) {
   buildCounterTasks2++;
   if (buildCounterTasks2 < 3) {
-    checkUnnamed1284(o.items);
+    checkUnnamed1452(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTasks2--;
diff --git a/pubspec.lock b/pubspec.lock
index 428fa21..0572252 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -39,7 +39,7 @@
   source_span:
     description: source_span
     source: hosted
-    version: "1.0.0"
+    version: "1.0.2"
   stack_trace:
     description: stack_trace
     source: hosted
diff --git a/resources/googleapis/CHANGELOG.md b/resources/googleapis/CHANGELOG.md
index b4cd654..00c07c0 100644
--- a/resources/googleapis/CHANGELOG.md
+++ b/resources/googleapis/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 0.5.0
+
+* [apis] bigquery:v2: schema changes
+* [apis] books:v1: additional resource/schema changes
+* [apis] doubleclicksearch:v2: schema changes
+* [apis] fitness:v1: method changes
+* [apis] reseller:v1: schema changes
+* [apis] youtube:v3: schema changes
+* [apis-breaking] calendar:v3: Removed title from EventAttachment
+* [apis-breaking] tagmanager:v1: Removed dependencies from Tag and schema changes
+* [apis-breaking] youtubeanalytics:v1: schema changes
+
+
 ## 0.4.1
 
 * [apis] bigquery:v2: schema changes
diff --git a/resources/googleapis_beta/CHANGELOG.md b/resources/googleapis_beta/CHANGELOG.md
index ff485f4..1c4cb6d 100644
--- a/resources/googleapis_beta/CHANGELOG.md
+++ b/resources/googleapis_beta/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.5.2
+
+* [apis] container:v1beta1: schema changes
+* [apis] replicapoolupdater:v1beta1: schema changes
+
 ## 0.5.1
 
 * [apis] pubsub:v1beta1: schema changes
