all: autogenerated update (2018-05-09)

Add:
- androidpublisher/v3
- photoslibrary/v1

Update:
- androidenterprise/v1
- content/v2
- deploymentmanager/v0.alpha
- deploymentmanager/v2
- deploymentmanager/v2beta
- pubsub/v1
- pubsub/v1beta2
- sheets/v4
- spanner/v1
- storage/v1
diff --git a/androidenterprise/v1/androidenterprise-api.json b/androidenterprise/v1/androidenterprise-api.json
index 7e4b44b..b0c6672 100644
--- a/androidenterprise/v1/androidenterprise-api.json
+++ b/androidenterprise/v1/androidenterprise-api.json
@@ -15,7 +15,7 @@
   "description": "Manages the deployment of apps to Android for Work users.",
   "discoveryVersion": "v1",
   "documentationLink": "https://developers.google.com/android/work/play/emm-api",
-  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/7F-eJBLaASTTYJaC0mgfyno2lxc\"",
+  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/AFFEHUmDMrEYdaOxnZWUFow58ns\"",
   "icons": {
     "x16": "https://www.google.com/images/icons/product/android-16.png",
     "x32": "https://www.google.com/images/icons/product/android-32.png"
@@ -2804,7 +2804,7 @@
       }
     }
   },
-  "revision": "20180425",
+  "revision": "20180502",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "Administrator": {
@@ -3776,7 +3776,7 @@
           "description": "The maintenance window defining when apps running in the foreground should be updated."
         },
         "productAvailabilityPolicy": {
-          "description": "The availability granted to the device for the specified products. \"all\" gives the device access to all products, regardless of approval status. \"allApproved\" entitles the device to access all products that are approved for the enterprise. \"allApproved\" and \"all\" do not enable automatic visibility of \"alpha\" or \"beta\" tracks. \"whitelist\" grants the device access the products specified in productPolicy[]. Only products that are approved or products that were previously approved (products with revoked approval) by the enterprise can be whitelisted. If no value is provided, the availability set at the user level is applied by default.",
+          "description": "The availability granted to the device for the specified products. \"all\" gives the device access to all products, regardless of approval status. \"all\" does not enable automatic visibility of \"alpha\" or \"beta\" tracks. \"whitelist\" grants the device access the products specified in productPolicy[]. Only products that are approved or products that were previously approved (products with revoked approval) by the enterprise can be whitelisted. If no value is provided, the availability set at the user level is applied by default.",
           "type": "string"
         },
         "productPolicy": {
diff --git a/androidenterprise/v1/androidenterprise-gen.go b/androidenterprise/v1/androidenterprise-gen.go
index d1a2912..ccc221c 100644
--- a/androidenterprise/v1/androidenterprise-gen.go
+++ b/androidenterprise/v1/androidenterprise-gen.go
@@ -2142,15 +2142,13 @@
 
 	// ProductAvailabilityPolicy: The availability granted to the device for
 	// the specified products. "all" gives the device access to all
-	// products, regardless of approval status. "allApproved" entitles the
-	// device to access all products that are approved for the enterprise.
-	// "allApproved" and "all" do not enable automatic visibility of "alpha"
-	// or "beta" tracks. "whitelist" grants the device access the products
-	// specified in productPolicy[]. Only products that are approved or
-	// products that were previously approved (products with revoked
-	// approval) by the enterprise can be whitelisted. If no value is
-	// provided, the availability set at the user level is applied by
-	// default.
+	// products, regardless of approval status. "all" does not enable
+	// automatic visibility of "alpha" or "beta" tracks. "whitelist" grants
+	// the device access the products specified in productPolicy[]. Only
+	// products that are approved or products that were previously approved
+	// (products with revoked approval) by the enterprise can be
+	// whitelisted. If no value is provided, the availability set at the
+	// user level is applied by default.
 	ProductAvailabilityPolicy string `json:"productAvailabilityPolicy,omitempty"`
 
 	// ProductPolicy: The list of product policies.
diff --git a/androidpublisher/v3/androidpublisher-api.json b/androidpublisher/v3/androidpublisher-api.json
new file mode 100644
index 0000000..a4d5276
--- /dev/null
+++ b/androidpublisher/v3/androidpublisher-api.json
@@ -0,0 +1,3205 @@
+{
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/androidpublisher": {
+          "description": "View and manage your Google Play Developer account"
+        }
+      }
+    }
+  },
+  "basePath": "/androidpublisher/v3/applications/",
+  "baseUrl": "https://www.googleapis.com/androidpublisher/v3/applications/",
+  "batchPath": "batch/androidpublisher/v3",
+  "canonicalName": "Android Publisher",
+  "description": "Lets Android application developers access their Google Play accounts.",
+  "discoveryVersion": "v1",
+  "documentationLink": "https://developers.google.com/android-publisher",
+  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/BkJxqosH1a00zAdsgGajyPHSOBg\"",
+  "icons": {
+    "x16": "https://www.google.com/images/icons/product/android-16.png",
+    "x32": "https://www.google.com/images/icons/product/android-32.png"
+  },
+  "id": "androidpublisher:v3",
+  "kind": "discovery#restDescription",
+  "name": "androidpublisher",
+  "ownerDomain": "google.com",
+  "ownerName": "Google",
+  "parameters": {
+    "alt": {
+      "default": "json",
+      "description": "Data format for the response.",
+      "enum": [
+        "json"
+      ],
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json"
+      ],
+      "location": "query",
+      "type": "string"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "location": "query",
+      "type": "string"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "location": "query",
+      "type": "string"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "location": "query",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "default": "true",
+      "description": "Returns response with indentations and line breaks.",
+      "location": "query",
+      "type": "boolean"
+    },
+    "quotaUser": {
+      "description": "An opaque string that represents a user for quota purposes. Must not exceed 40 characters.",
+      "location": "query",
+      "type": "string"
+    },
+    "userIp": {
+      "description": "Deprecated. Please use quotaUser instead.",
+      "location": "query",
+      "type": "string"
+    }
+  },
+  "protocol": "rest",
+  "resources": {
+    "edits": {
+      "methods": {
+        "commit": {
+          "description": "Commits/applies the changes made in this edit back to the app.",
+          "httpMethod": "POST",
+          "id": "androidpublisher.edits.commit",
+          "parameterOrder": [
+            "packageName",
+            "editId"
+          ],
+          "parameters": {
+            "editId": {
+              "description": "Unique identifier for this edit.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "packageName": {
+              "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/edits/{editId}:commit",
+          "response": {
+            "$ref": "AppEdit"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        },
+        "delete": {
+          "description": "Deletes an edit for an app. Creating a new edit will automatically delete any of your previous edits so this method need only be called if you want to preemptively abandon an edit.",
+          "httpMethod": "DELETE",
+          "id": "androidpublisher.edits.delete",
+          "parameterOrder": [
+            "packageName",
+            "editId"
+          ],
+          "parameters": {
+            "editId": {
+              "description": "Unique identifier for this edit.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "packageName": {
+              "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/edits/{editId}",
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        },
+        "get": {
+          "description": "Returns information about the edit specified. Calls will fail if the edit is no long active (e.g. has been deleted, superseded or expired).",
+          "httpMethod": "GET",
+          "id": "androidpublisher.edits.get",
+          "parameterOrder": [
+            "packageName",
+            "editId"
+          ],
+          "parameters": {
+            "editId": {
+              "description": "Unique identifier for this edit.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "packageName": {
+              "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/edits/{editId}",
+          "response": {
+            "$ref": "AppEdit"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        },
+        "insert": {
+          "description": "Creates a new edit for an app, populated with the app's current state.",
+          "httpMethod": "POST",
+          "id": "androidpublisher.edits.insert",
+          "parameterOrder": [
+            "packageName"
+          ],
+          "parameters": {
+            "packageName": {
+              "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/edits",
+          "request": {
+            "$ref": "AppEdit"
+          },
+          "response": {
+            "$ref": "AppEdit"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        },
+        "validate": {
+          "description": "Checks that the edit can be successfully committed. The edit's changes are not applied to the live app.",
+          "httpMethod": "POST",
+          "id": "androidpublisher.edits.validate",
+          "parameterOrder": [
+            "packageName",
+            "editId"
+          ],
+          "parameters": {
+            "editId": {
+              "description": "Unique identifier for this edit.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "packageName": {
+              "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/edits/{editId}:validate",
+          "response": {
+            "$ref": "AppEdit"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        }
+      },
+      "resources": {
+        "apks": {
+          "methods": {
+            "addexternallyhosted": {
+              "description": "Creates a new APK without uploading the APK itself to Google Play, instead hosting the APK at a specified URL. This function is only available to enterprises using Google Play for Work whose application is configured to restrict distribution to the enterprise domain.",
+              "httpMethod": "POST",
+              "id": "androidpublisher.edits.apks.addexternallyhosted",
+              "parameterOrder": [
+                "packageName",
+                "editId"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/apks/externallyHosted",
+              "request": {
+                "$ref": "ApksAddExternallyHostedRequest"
+              },
+              "response": {
+                "$ref": "ApksAddExternallyHostedResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "list": {
+              "httpMethod": "GET",
+              "id": "androidpublisher.edits.apks.list",
+              "parameterOrder": [
+                "packageName",
+                "editId"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/apks",
+              "response": {
+                "$ref": "ApksListResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "upload": {
+              "httpMethod": "POST",
+              "id": "androidpublisher.edits.apks.upload",
+              "mediaUpload": {
+                "accept": [
+                  "application/octet-stream",
+                  "application/vnd.android.package-archive"
+                ],
+                "maxSize": "1GB",
+                "protocols": {
+                  "resumable": {
+                    "multipart": true,
+                    "path": "/resumable/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks"
+                  },
+                  "simple": {
+                    "multipart": true,
+                    "path": "/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks"
+                  }
+                }
+              },
+              "parameterOrder": [
+                "packageName",
+                "editId"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/apks",
+              "response": {
+                "$ref": "Apk"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ],
+              "supportsMediaUpload": true
+            }
+          }
+        },
+        "deobfuscationfiles": {
+          "methods": {
+            "upload": {
+              "description": "Uploads the deobfuscation file of the specified APK. If a deobfuscation file already exists, it will be replaced.",
+              "httpMethod": "POST",
+              "id": "androidpublisher.edits.deobfuscationfiles.upload",
+              "mediaUpload": {
+                "accept": [
+                  "application/octet-stream"
+                ],
+                "maxSize": "300MB",
+                "protocols": {
+                  "resumable": {
+                    "multipart": true,
+                    "path": "/resumable/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/deobfuscationFiles/{deobfuscationFileType}"
+                  },
+                  "simple": {
+                    "multipart": true,
+                    "path": "/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/deobfuscationFiles/{deobfuscationFileType}"
+                  }
+                }
+              },
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "apkVersionCode",
+                "deobfuscationFileType"
+              ],
+              "parameters": {
+                "apkVersionCode": {
+                  "description": "The version code of the APK whose deobfuscation file is being uploaded.",
+                  "format": "int32",
+                  "location": "path",
+                  "required": true,
+                  "type": "integer"
+                },
+                "deobfuscationFileType": {
+                  "enum": [
+                    "proguard"
+                  ],
+                  "enumDescriptions": [
+                    ""
+                  ],
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier of the Android app for which the deobfuscatiuon files are being uploaded; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/apks/{apkVersionCode}/deobfuscationFiles/{deobfuscationFileType}",
+              "response": {
+                "$ref": "DeobfuscationFilesUploadResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ],
+              "supportsMediaUpload": true
+            }
+          }
+        },
+        "details": {
+          "methods": {
+            "get": {
+              "description": "Fetches app details for this edit. This includes the default language and developer support contact information.",
+              "httpMethod": "GET",
+              "id": "androidpublisher.edits.details.get",
+              "parameterOrder": [
+                "packageName",
+                "editId"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/details",
+              "response": {
+                "$ref": "AppDetails"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "patch": {
+              "description": "Updates app details for this edit. This method supports patch semantics.",
+              "httpMethod": "PATCH",
+              "id": "androidpublisher.edits.details.patch",
+              "parameterOrder": [
+                "packageName",
+                "editId"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/details",
+              "request": {
+                "$ref": "AppDetails"
+              },
+              "response": {
+                "$ref": "AppDetails"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "update": {
+              "description": "Updates app details for this edit.",
+              "httpMethod": "PUT",
+              "id": "androidpublisher.edits.details.update",
+              "parameterOrder": [
+                "packageName",
+                "editId"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/details",
+              "request": {
+                "$ref": "AppDetails"
+              },
+              "response": {
+                "$ref": "AppDetails"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            }
+          }
+        },
+        "expansionfiles": {
+          "methods": {
+            "get": {
+              "description": "Fetches the Expansion File configuration for the APK specified.",
+              "httpMethod": "GET",
+              "id": "androidpublisher.edits.expansionfiles.get",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "apkVersionCode",
+                "expansionFileType"
+              ],
+              "parameters": {
+                "apkVersionCode": {
+                  "description": "The version code of the APK whose Expansion File configuration is being read or modified.",
+                  "format": "int32",
+                  "location": "path",
+                  "required": true,
+                  "type": "integer"
+                },
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "expansionFileType": {
+                  "enum": [
+                    "main",
+                    "patch"
+                  ],
+                  "enumDescriptions": [
+                    "",
+                    ""
+                  ],
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}",
+              "response": {
+                "$ref": "ExpansionFile"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "patch": {
+              "description": "Updates the APK's Expansion File configuration to reference another APK's Expansion Files. To add a new Expansion File use the Upload method. This method supports patch semantics.",
+              "httpMethod": "PATCH",
+              "id": "androidpublisher.edits.expansionfiles.patch",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "apkVersionCode",
+                "expansionFileType"
+              ],
+              "parameters": {
+                "apkVersionCode": {
+                  "description": "The version code of the APK whose Expansion File configuration is being read or modified.",
+                  "format": "int32",
+                  "location": "path",
+                  "required": true,
+                  "type": "integer"
+                },
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "expansionFileType": {
+                  "enum": [
+                    "main",
+                    "patch"
+                  ],
+                  "enumDescriptions": [
+                    "",
+                    ""
+                  ],
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}",
+              "request": {
+                "$ref": "ExpansionFile"
+              },
+              "response": {
+                "$ref": "ExpansionFile"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "update": {
+              "description": "Updates the APK's Expansion File configuration to reference another APK's Expansion Files. To add a new Expansion File use the Upload method.",
+              "httpMethod": "PUT",
+              "id": "androidpublisher.edits.expansionfiles.update",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "apkVersionCode",
+                "expansionFileType"
+              ],
+              "parameters": {
+                "apkVersionCode": {
+                  "description": "The version code of the APK whose Expansion File configuration is being read or modified.",
+                  "format": "int32",
+                  "location": "path",
+                  "required": true,
+                  "type": "integer"
+                },
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "expansionFileType": {
+                  "enum": [
+                    "main",
+                    "patch"
+                  ],
+                  "enumDescriptions": [
+                    "",
+                    ""
+                  ],
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}",
+              "request": {
+                "$ref": "ExpansionFile"
+              },
+              "response": {
+                "$ref": "ExpansionFile"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "upload": {
+              "description": "Uploads and attaches a new Expansion File to the APK specified.",
+              "httpMethod": "POST",
+              "id": "androidpublisher.edits.expansionfiles.upload",
+              "mediaUpload": {
+                "accept": [
+                  "application/octet-stream"
+                ],
+                "maxSize": "2048MB",
+                "protocols": {
+                  "resumable": {
+                    "multipart": true,
+                    "path": "/resumable/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}"
+                  },
+                  "simple": {
+                    "multipart": true,
+                    "path": "/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}"
+                  }
+                }
+              },
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "apkVersionCode",
+                "expansionFileType"
+              ],
+              "parameters": {
+                "apkVersionCode": {
+                  "description": "The version code of the APK whose Expansion File configuration is being read or modified.",
+                  "format": "int32",
+                  "location": "path",
+                  "required": true,
+                  "type": "integer"
+                },
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "expansionFileType": {
+                  "enum": [
+                    "main",
+                    "patch"
+                  ],
+                  "enumDescriptions": [
+                    "",
+                    ""
+                  ],
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}",
+              "response": {
+                "$ref": "ExpansionFilesUploadResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ],
+              "supportsMediaUpload": true
+            }
+          }
+        },
+        "images": {
+          "methods": {
+            "delete": {
+              "description": "Deletes the image (specified by id) from the edit.",
+              "httpMethod": "DELETE",
+              "id": "androidpublisher.edits.images.delete",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "language",
+                "imageType",
+                "imageId"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "imageId": {
+                  "description": "Unique identifier an image within the set of images attached to this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "imageType": {
+                  "enum": [
+                    "featureGraphic",
+                    "icon",
+                    "phoneScreenshots",
+                    "promoGraphic",
+                    "sevenInchScreenshots",
+                    "tenInchScreenshots",
+                    "tvBanner",
+                    "tvScreenshots",
+                    "wearScreenshots"
+                  ],
+                  "enumDescriptions": [
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    ""
+                  ],
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "language": {
+                  "description": "The language code (a BCP-47 language tag) of the localized listing whose images are to read or modified. For example, to select Austrian German, pass \"de-AT\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/listings/{language}/{imageType}/{imageId}",
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "deleteall": {
+              "description": "Deletes all images for the specified language and image type.",
+              "httpMethod": "DELETE",
+              "id": "androidpublisher.edits.images.deleteall",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "language",
+                "imageType"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "imageType": {
+                  "enum": [
+                    "featureGraphic",
+                    "icon",
+                    "phoneScreenshots",
+                    "promoGraphic",
+                    "sevenInchScreenshots",
+                    "tenInchScreenshots",
+                    "tvBanner",
+                    "tvScreenshots",
+                    "wearScreenshots"
+                  ],
+                  "enumDescriptions": [
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    ""
+                  ],
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "language": {
+                  "description": "The language code (a BCP-47 language tag) of the localized listing whose images are to read or modified. For example, to select Austrian German, pass \"de-AT\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/listings/{language}/{imageType}",
+              "response": {
+                "$ref": "ImagesDeleteAllResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "list": {
+              "description": "Lists all images for the specified language and image type.",
+              "httpMethod": "GET",
+              "id": "androidpublisher.edits.images.list",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "language",
+                "imageType"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "imageType": {
+                  "enum": [
+                    "featureGraphic",
+                    "icon",
+                    "phoneScreenshots",
+                    "promoGraphic",
+                    "sevenInchScreenshots",
+                    "tenInchScreenshots",
+                    "tvBanner",
+                    "tvScreenshots",
+                    "wearScreenshots"
+                  ],
+                  "enumDescriptions": [
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    ""
+                  ],
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "language": {
+                  "description": "The language code (a BCP-47 language tag) of the localized listing whose images are to read or modified. For example, to select Austrian German, pass \"de-AT\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/listings/{language}/{imageType}",
+              "response": {
+                "$ref": "ImagesListResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "upload": {
+              "description": "Uploads a new image and adds it to the list of images for the specified language and image type.",
+              "httpMethod": "POST",
+              "id": "androidpublisher.edits.images.upload",
+              "mediaUpload": {
+                "accept": [
+                  "image/*"
+                ],
+                "maxSize": "15MB",
+                "protocols": {
+                  "resumable": {
+                    "multipart": true,
+                    "path": "/resumable/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}"
+                  },
+                  "simple": {
+                    "multipart": true,
+                    "path": "/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}"
+                  }
+                }
+              },
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "language",
+                "imageType"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "imageType": {
+                  "enum": [
+                    "featureGraphic",
+                    "icon",
+                    "phoneScreenshots",
+                    "promoGraphic",
+                    "sevenInchScreenshots",
+                    "tenInchScreenshots",
+                    "tvBanner",
+                    "tvScreenshots",
+                    "wearScreenshots"
+                  ],
+                  "enumDescriptions": [
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    "",
+                    ""
+                  ],
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "language": {
+                  "description": "The language code (a BCP-47 language tag) of the localized listing whose images are to read or modified. For example, to select Austrian German, pass \"de-AT\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/listings/{language}/{imageType}",
+              "response": {
+                "$ref": "ImagesUploadResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ],
+              "supportsMediaUpload": true
+            }
+          }
+        },
+        "listings": {
+          "methods": {
+            "delete": {
+              "description": "Deletes the specified localized store listing from an edit.",
+              "httpMethod": "DELETE",
+              "id": "androidpublisher.edits.listings.delete",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "language"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "language": {
+                  "description": "The language code (a BCP-47 language tag) of the localized listing to read or modify. For example, to select Austrian German, pass \"de-AT\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/listings/{language}",
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "deleteall": {
+              "description": "Deletes all localized listings from an edit.",
+              "httpMethod": "DELETE",
+              "id": "androidpublisher.edits.listings.deleteall",
+              "parameterOrder": [
+                "packageName",
+                "editId"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/listings",
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "get": {
+              "description": "Fetches information about a localized store listing.",
+              "httpMethod": "GET",
+              "id": "androidpublisher.edits.listings.get",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "language"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "language": {
+                  "description": "The language code (a BCP-47 language tag) of the localized listing to read or modify. For example, to select Austrian German, pass \"de-AT\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/listings/{language}",
+              "response": {
+                "$ref": "Listing"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "list": {
+              "description": "Returns all of the localized store listings attached to this edit.",
+              "httpMethod": "GET",
+              "id": "androidpublisher.edits.listings.list",
+              "parameterOrder": [
+                "packageName",
+                "editId"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/listings",
+              "response": {
+                "$ref": "ListingsListResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "patch": {
+              "description": "Creates or updates a localized store listing. This method supports patch semantics.",
+              "httpMethod": "PATCH",
+              "id": "androidpublisher.edits.listings.patch",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "language"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "language": {
+                  "description": "The language code (a BCP-47 language tag) of the localized listing to read or modify. For example, to select Austrian German, pass \"de-AT\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/listings/{language}",
+              "request": {
+                "$ref": "Listing"
+              },
+              "response": {
+                "$ref": "Listing"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "update": {
+              "description": "Creates or updates a localized store listing.",
+              "httpMethod": "PUT",
+              "id": "androidpublisher.edits.listings.update",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "language"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "language": {
+                  "description": "The language code (a BCP-47 language tag) of the localized listing to read or modify. For example, to select Austrian German, pass \"de-AT\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/listings/{language}",
+              "request": {
+                "$ref": "Listing"
+              },
+              "response": {
+                "$ref": "Listing"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            }
+          }
+        },
+        "testers": {
+          "methods": {
+            "get": {
+              "httpMethod": "GET",
+              "id": "androidpublisher.edits.testers.get",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "track"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "track": {
+                  "description": "The track to read or modify. Acceptable values are: \"alpha\", \"beta\", \"production\", \"rollout\" or \"internal\".",
+                  "location": "path",
+                  "pattern": "(alpha|beta|production|rollout|internal)",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/testers/{track}",
+              "response": {
+                "$ref": "Testers"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "patch": {
+              "httpMethod": "PATCH",
+              "id": "androidpublisher.edits.testers.patch",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "track"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "track": {
+                  "description": "The track to read or modify. Acceptable values are: \"alpha\", \"beta\", \"production\", \"rollout\" or \"internal\".",
+                  "location": "path",
+                  "pattern": "(alpha|beta|production|rollout|internal)",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/testers/{track}",
+              "request": {
+                "$ref": "Testers"
+              },
+              "response": {
+                "$ref": "Testers"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "update": {
+              "httpMethod": "PUT",
+              "id": "androidpublisher.edits.testers.update",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "track"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "track": {
+                  "description": "The track to read or modify. Acceptable values are: \"alpha\", \"beta\", \"production\", \"rollout\" or \"internal\".",
+                  "location": "path",
+                  "pattern": "(alpha|beta|production|rollout|internal)",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/testers/{track}",
+              "request": {
+                "$ref": "Testers"
+              },
+              "response": {
+                "$ref": "Testers"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            }
+          }
+        },
+        "tracks": {
+          "methods": {
+            "get": {
+              "description": "Fetches the track configuration for the specified track type. Includes the APK version codes that are in this track.",
+              "httpMethod": "GET",
+              "id": "androidpublisher.edits.tracks.get",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "track"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "track": {
+                  "description": "The track to read or modify.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/tracks/{track}",
+              "response": {
+                "$ref": "Track"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "list": {
+              "description": "Lists all the track configurations for this edit.",
+              "httpMethod": "GET",
+              "id": "androidpublisher.edits.tracks.list",
+              "parameterOrder": [
+                "packageName",
+                "editId"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/tracks",
+              "response": {
+                "$ref": "TracksListResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "patch": {
+              "description": "Updates the track configuration for the specified track type. When halted, the rollout track cannot be updated without adding new APKs, and adding new APKs will cause it to resume. This method supports patch semantics.",
+              "httpMethod": "PATCH",
+              "id": "androidpublisher.edits.tracks.patch",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "track"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "track": {
+                  "description": "The track to read or modify.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/tracks/{track}",
+              "request": {
+                "$ref": "Track"
+              },
+              "response": {
+                "$ref": "Track"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "update": {
+              "description": "Updates the track configuration for the specified track type. When halted, the rollout track cannot be updated without adding new APKs, and adding new APKs will cause it to resume.",
+              "httpMethod": "PUT",
+              "id": "androidpublisher.edits.tracks.update",
+              "parameterOrder": [
+                "packageName",
+                "editId",
+                "track"
+              ],
+              "parameters": {
+                "editId": {
+                  "description": "Unique identifier for this edit.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "packageName": {
+                  "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "track": {
+                  "description": "The track to read or modify.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/edits/{editId}/tracks/{track}",
+              "request": {
+                "$ref": "Track"
+              },
+              "response": {
+                "$ref": "Track"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            }
+          }
+        }
+      }
+    },
+    "inappproducts": {
+      "methods": {
+        "delete": {
+          "description": "Delete an in-app product for an app.",
+          "httpMethod": "DELETE",
+          "id": "androidpublisher.inappproducts.delete",
+          "parameterOrder": [
+            "packageName",
+            "sku"
+          ],
+          "parameters": {
+            "packageName": {
+              "description": "Unique identifier for the Android app with the in-app product; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "sku": {
+              "description": "Unique identifier for the in-app product.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/inappproducts/{sku}",
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        },
+        "get": {
+          "description": "Returns information about the in-app product specified.",
+          "httpMethod": "GET",
+          "id": "androidpublisher.inappproducts.get",
+          "parameterOrder": [
+            "packageName",
+            "sku"
+          ],
+          "parameters": {
+            "packageName": {
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "sku": {
+              "description": "Unique identifier for the in-app product.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/inappproducts/{sku}",
+          "response": {
+            "$ref": "InAppProduct"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        },
+        "insert": {
+          "description": "Creates a new in-app product for an app.",
+          "httpMethod": "POST",
+          "id": "androidpublisher.inappproducts.insert",
+          "parameterOrder": [
+            "packageName"
+          ],
+          "parameters": {
+            "autoConvertMissingPrices": {
+              "description": "If true the prices for all regions targeted by the parent app that don't have a price specified for this in-app product will be auto converted to the target currency based on the default price. Defaults to false.",
+              "location": "query",
+              "type": "boolean"
+            },
+            "packageName": {
+              "description": "Unique identifier for the Android app; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/inappproducts",
+          "request": {
+            "$ref": "InAppProduct"
+          },
+          "response": {
+            "$ref": "InAppProduct"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        },
+        "list": {
+          "description": "List all the in-app products for an Android app, both subscriptions and managed in-app products..",
+          "httpMethod": "GET",
+          "id": "androidpublisher.inappproducts.list",
+          "parameterOrder": [
+            "packageName"
+          ],
+          "parameters": {
+            "maxResults": {
+              "format": "uint32",
+              "location": "query",
+              "type": "integer"
+            },
+            "packageName": {
+              "description": "Unique identifier for the Android app with in-app products; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "startIndex": {
+              "format": "uint32",
+              "location": "query",
+              "type": "integer"
+            },
+            "token": {
+              "location": "query",
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/inappproducts",
+          "response": {
+            "$ref": "InappproductsListResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        },
+        "patch": {
+          "description": "Updates the details of an in-app product. This method supports patch semantics.",
+          "httpMethod": "PATCH",
+          "id": "androidpublisher.inappproducts.patch",
+          "parameterOrder": [
+            "packageName",
+            "sku"
+          ],
+          "parameters": {
+            "autoConvertMissingPrices": {
+              "description": "If true the prices for all regions targeted by the parent app that don't have a price specified for this in-app product will be auto converted to the target currency based on the default price. Defaults to false.",
+              "location": "query",
+              "type": "boolean"
+            },
+            "packageName": {
+              "description": "Unique identifier for the Android app with the in-app product; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "sku": {
+              "description": "Unique identifier for the in-app product.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/inappproducts/{sku}",
+          "request": {
+            "$ref": "InAppProduct"
+          },
+          "response": {
+            "$ref": "InAppProduct"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        },
+        "update": {
+          "description": "Updates the details of an in-app product.",
+          "httpMethod": "PUT",
+          "id": "androidpublisher.inappproducts.update",
+          "parameterOrder": [
+            "packageName",
+            "sku"
+          ],
+          "parameters": {
+            "autoConvertMissingPrices": {
+              "description": "If true the prices for all regions targeted by the parent app that don't have a price specified for this in-app product will be auto converted to the target currency based on the default price. Defaults to false.",
+              "location": "query",
+              "type": "boolean"
+            },
+            "packageName": {
+              "description": "Unique identifier for the Android app with the in-app product; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "sku": {
+              "description": "Unique identifier for the in-app product.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/inappproducts/{sku}",
+          "request": {
+            "$ref": "InAppProduct"
+          },
+          "response": {
+            "$ref": "InAppProduct"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        }
+      }
+    },
+    "purchases": {
+      "resources": {
+        "products": {
+          "methods": {
+            "get": {
+              "description": "Checks the purchase and consumption status of an inapp item.",
+              "httpMethod": "GET",
+              "id": "androidpublisher.purchases.products.get",
+              "parameterOrder": [
+                "packageName",
+                "productId",
+                "token"
+              ],
+              "parameters": {
+                "packageName": {
+                  "description": "The package name of the application the inapp product was sold in (for example, 'com.some.thing').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "productId": {
+                  "description": "The inapp product SKU (for example, 'com.some.thing.inapp1').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "token": {
+                  "description": "The token provided to the user's device when the inapp product was purchased.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/purchases/products/{productId}/tokens/{token}",
+              "response": {
+                "$ref": "ProductPurchase"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            }
+          }
+        },
+        "subscriptions": {
+          "methods": {
+            "cancel": {
+              "description": "Cancels a user's subscription purchase. The subscription remains valid until its expiration time.",
+              "httpMethod": "POST",
+              "id": "androidpublisher.purchases.subscriptions.cancel",
+              "parameterOrder": [
+                "packageName",
+                "subscriptionId",
+                "token"
+              ],
+              "parameters": {
+                "packageName": {
+                  "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "subscriptionId": {
+                  "description": "The purchased subscription ID (for example, 'monthly001').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "token": {
+                  "description": "The token provided to the user's device when the subscription was purchased.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:cancel",
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "defer": {
+              "description": "Defers a user's subscription purchase until a specified future expiration time.",
+              "httpMethod": "POST",
+              "id": "androidpublisher.purchases.subscriptions.defer",
+              "parameterOrder": [
+                "packageName",
+                "subscriptionId",
+                "token"
+              ],
+              "parameters": {
+                "packageName": {
+                  "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "subscriptionId": {
+                  "description": "The purchased subscription ID (for example, 'monthly001').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "token": {
+                  "description": "The token provided to the user's device when the subscription was purchased.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:defer",
+              "request": {
+                "$ref": "SubscriptionPurchasesDeferRequest"
+              },
+              "response": {
+                "$ref": "SubscriptionPurchasesDeferResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "get": {
+              "description": "Checks whether a user's subscription purchase is valid and returns its expiry time.",
+              "httpMethod": "GET",
+              "id": "androidpublisher.purchases.subscriptions.get",
+              "parameterOrder": [
+                "packageName",
+                "subscriptionId",
+                "token"
+              ],
+              "parameters": {
+                "packageName": {
+                  "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "subscriptionId": {
+                  "description": "The purchased subscription ID (for example, 'monthly001').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "token": {
+                  "description": "The token provided to the user's device when the subscription was purchased.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}",
+              "response": {
+                "$ref": "SubscriptionPurchase"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "refund": {
+              "description": "Refunds a user's subscription purchase, but the subscription remains valid until its expiration time and it will continue to recur.",
+              "httpMethod": "POST",
+              "id": "androidpublisher.purchases.subscriptions.refund",
+              "parameterOrder": [
+                "packageName",
+                "subscriptionId",
+                "token"
+              ],
+              "parameters": {
+                "packageName": {
+                  "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "subscriptionId": {
+                  "description": "The purchased subscription ID (for example, 'monthly001').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "token": {
+                  "description": "The token provided to the user's device when the subscription was purchased.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:refund",
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            },
+            "revoke": {
+              "description": "Refunds and immediately revokes a user's subscription purchase. Access to the subscription will be terminated immediately and it will stop recurring.",
+              "httpMethod": "POST",
+              "id": "androidpublisher.purchases.subscriptions.revoke",
+              "parameterOrder": [
+                "packageName",
+                "subscriptionId",
+                "token"
+              ],
+              "parameters": {
+                "packageName": {
+                  "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "subscriptionId": {
+                  "description": "The purchased subscription ID (for example, 'monthly001').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "token": {
+                  "description": "The token provided to the user's device when the subscription was purchased.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:revoke",
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            }
+          }
+        },
+        "voidedpurchases": {
+          "methods": {
+            "list": {
+              "description": "Lists the purchases that were canceled, refunded or charged-back.",
+              "httpMethod": "GET",
+              "id": "androidpublisher.purchases.voidedpurchases.list",
+              "parameterOrder": [
+                "packageName"
+              ],
+              "parameters": {
+                "endTime": {
+                  "description": "The time, in milliseconds since the Epoch, of the newest voided in-app product purchase that you want to see in the response. The value of this parameter cannot be greater than the current time and is ignored if a pagination token is set. Default value is current time. Note: This filter is applied on the time at which the record is seen as voided by our systems and not the actual voided time returned in the response.",
+                  "format": "int64",
+                  "location": "query",
+                  "type": "string"
+                },
+                "maxResults": {
+                  "format": "uint32",
+                  "location": "query",
+                  "type": "integer"
+                },
+                "packageName": {
+                  "description": "The package name of the application for which voided purchases need to be returned (for example, 'com.some.thing').",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "startIndex": {
+                  "format": "uint32",
+                  "location": "query",
+                  "type": "integer"
+                },
+                "startTime": {
+                  "description": "The time, in milliseconds since the Epoch, of the oldest voided in-app product purchase that you want to see in the response. The value of this parameter cannot be older than 30 days and is ignored if a pagination token is set. Default value is current time minus 30 days. Note: This filter is applied on the time at which the record is seen as voided by our systems and not the actual voided time returned in the response.",
+                  "format": "int64",
+                  "location": "query",
+                  "type": "string"
+                },
+                "token": {
+                  "location": "query",
+                  "type": "string"
+                }
+              },
+              "path": "{packageName}/purchases/voidedpurchases",
+              "response": {
+                "$ref": "VoidedPurchasesListResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/androidpublisher"
+              ]
+            }
+          }
+        }
+      }
+    },
+    "reviews": {
+      "methods": {
+        "get": {
+          "description": "Returns a single review.",
+          "httpMethod": "GET",
+          "id": "androidpublisher.reviews.get",
+          "parameterOrder": [
+            "packageName",
+            "reviewId"
+          ],
+          "parameters": {
+            "packageName": {
+              "description": "Unique identifier for the Android app for which we want reviews; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "reviewId": {
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "translationLanguage": {
+              "location": "query",
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/reviews/{reviewId}",
+          "response": {
+            "$ref": "Review"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        },
+        "list": {
+          "description": "Returns a list of reviews. Only reviews from last week will be returned.",
+          "httpMethod": "GET",
+          "id": "androidpublisher.reviews.list",
+          "parameterOrder": [
+            "packageName"
+          ],
+          "parameters": {
+            "maxResults": {
+              "format": "uint32",
+              "location": "query",
+              "type": "integer"
+            },
+            "packageName": {
+              "description": "Unique identifier for the Android app for which we want reviews; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "startIndex": {
+              "format": "uint32",
+              "location": "query",
+              "type": "integer"
+            },
+            "token": {
+              "location": "query",
+              "type": "string"
+            },
+            "translationLanguage": {
+              "location": "query",
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/reviews",
+          "response": {
+            "$ref": "ReviewsListResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        },
+        "reply": {
+          "description": "Reply to a single review, or update an existing reply.",
+          "httpMethod": "POST",
+          "id": "androidpublisher.reviews.reply",
+          "parameterOrder": [
+            "packageName",
+            "reviewId"
+          ],
+          "parameters": {
+            "packageName": {
+              "description": "Unique identifier for the Android app for which we want reviews; for example, \"com.spiffygame\".",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "reviewId": {
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{packageName}/reviews/{reviewId}:reply",
+          "request": {
+            "$ref": "ReviewsReplyRequest"
+          },
+          "response": {
+            "$ref": "ReviewsReplyResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/androidpublisher"
+          ]
+        }
+      }
+    }
+  },
+  "revision": "20180502",
+  "rootUrl": "https://www.googleapis.com/",
+  "schemas": {
+    "Apk": {
+      "id": "Apk",
+      "properties": {
+        "binary": {
+          "$ref": "ApkBinary",
+          "description": "Information about the binary payload of this APK."
+        },
+        "versionCode": {
+          "description": "The version code of the APK, as specified in the APK's manifest file.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "ApkBinary": {
+      "description": "Represents the binary payload of an APK.",
+      "id": "ApkBinary",
+      "properties": {
+        "sha1": {
+          "description": "A sha1 hash of the APK payload, encoded as a hex string and matching the output of the sha1sum command.",
+          "type": "string"
+        },
+        "sha256": {
+          "description": "A sha256 hash of the APK payload, encoded as a hex string and matching the output of the sha256sum command.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "ApksAddExternallyHostedRequest": {
+      "id": "ApksAddExternallyHostedRequest",
+      "properties": {
+        "externallyHostedApk": {
+          "$ref": "ExternallyHostedApk",
+          "description": "The definition of the externally-hosted APK and where it is located."
+        }
+      },
+      "type": "object"
+    },
+    "ApksAddExternallyHostedResponse": {
+      "id": "ApksAddExternallyHostedResponse",
+      "properties": {
+        "externallyHostedApk": {
+          "$ref": "ExternallyHostedApk",
+          "description": "The definition of the externally-hosted APK and where it is located."
+        }
+      },
+      "type": "object"
+    },
+    "ApksListResponse": {
+      "id": "ApksListResponse",
+      "properties": {
+        "apks": {
+          "items": {
+            "$ref": "Apk"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "default": "androidpublisher#apksListResponse",
+          "description": "Identifies what kind of resource this is. Value: the fixed string \"androidpublisher#apksListResponse\".",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "AppDetails": {
+      "id": "AppDetails",
+      "properties": {
+        "contactEmail": {
+          "description": "The user-visible support email for this app.",
+          "type": "string"
+        },
+        "contactPhone": {
+          "description": "The user-visible support telephone number for this app.",
+          "type": "string"
+        },
+        "contactWebsite": {
+          "description": "The user-visible website for this app.",
+          "type": "string"
+        },
+        "defaultLanguage": {
+          "description": "Default language code, in BCP 47 format (eg \"en-US\").",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "AppEdit": {
+      "description": "Represents an edit of an app. An edit allows clients to make multiple changes before committing them in one operation.",
+      "id": "AppEdit",
+      "properties": {
+        "expiryTimeSeconds": {
+          "description": "The time at which the edit will expire and will be no longer valid for use in any subsequent API calls (encoded as seconds since the Epoch).",
+          "type": "string"
+        },
+        "id": {
+          "description": "The ID of the edit that can be used in subsequent API calls.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "Comment": {
+      "id": "Comment",
+      "properties": {
+        "developerComment": {
+          "$ref": "DeveloperComment",
+          "description": "A comment from a developer."
+        },
+        "userComment": {
+          "$ref": "UserComment",
+          "description": "A comment from a user."
+        }
+      },
+      "type": "object"
+    },
+    "DeobfuscationFile": {
+      "description": "Represents a deobfuscation file.",
+      "id": "DeobfuscationFile",
+      "properties": {
+        "symbolType": {
+          "description": "The type of the deobfuscation file.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "DeobfuscationFilesUploadResponse": {
+      "id": "DeobfuscationFilesUploadResponse",
+      "properties": {
+        "deobfuscationFile": {
+          "$ref": "DeobfuscationFile"
+        }
+      },
+      "type": "object"
+    },
+    "DeveloperComment": {
+      "id": "DeveloperComment",
+      "properties": {
+        "lastModified": {
+          "$ref": "Timestamp",
+          "description": "The last time at which this comment was updated."
+        },
+        "text": {
+          "description": "The content of the comment, i.e. reply body.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "DeviceMetadata": {
+      "id": "DeviceMetadata",
+      "properties": {
+        "cpuMake": {
+          "description": "Device CPU make e.g. \"Qualcomm\"",
+          "type": "string"
+        },
+        "cpuModel": {
+          "description": "Device CPU model e.g. \"MSM8974\"",
+          "type": "string"
+        },
+        "deviceClass": {
+          "description": "Device class (e.g. tablet)",
+          "type": "string"
+        },
+        "glEsVersion": {
+          "description": "OpenGL version",
+          "format": "int32",
+          "type": "integer"
+        },
+        "manufacturer": {
+          "description": "Device manufacturer (e.g. Motorola)",
+          "type": "string"
+        },
+        "nativePlatform": {
+          "description": "Comma separated list of native platforms (e.g. \"arm\", \"arm7\")",
+          "type": "string"
+        },
+        "productName": {
+          "description": "Device model name (e.g. Droid)",
+          "type": "string"
+        },
+        "ramMb": {
+          "description": "Device RAM in Megabytes e.g. \"2048\"",
+          "format": "int32",
+          "type": "integer"
+        },
+        "screenDensityDpi": {
+          "description": "Screen density in DPI",
+          "format": "int32",
+          "type": "integer"
+        },
+        "screenHeightPx": {
+          "description": "Screen height in pixels",
+          "format": "int32",
+          "type": "integer"
+        },
+        "screenWidthPx": {
+          "description": "Screen width in pixels",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "ExpansionFile": {
+      "id": "ExpansionFile",
+      "properties": {
+        "fileSize": {
+          "description": "If set this field indicates that this APK has an Expansion File uploaded to it: this APK does not reference another APK's Expansion File. The field's value is the size of the uploaded Expansion File in bytes.",
+          "format": "int64",
+          "type": "string"
+        },
+        "referencesVersion": {
+          "description": "If set this APK's Expansion File references another APK's Expansion File. The file_size field will not be set.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "ExpansionFilesUploadResponse": {
+      "id": "ExpansionFilesUploadResponse",
+      "properties": {
+        "expansionFile": {
+          "$ref": "ExpansionFile"
+        }
+      },
+      "type": "object"
+    },
+    "ExternallyHostedApk": {
+      "description": "Defines an APK available for this application that is hosted externally and not uploaded to Google Play. This function is only available to enterprises who are using Google Play for Work, and whos application is restricted to the enterprise private channel",
+      "id": "ExternallyHostedApk",
+      "properties": {
+        "applicationLabel": {
+          "description": "The application label.",
+          "type": "string"
+        },
+        "certificateBase64s": {
+          "description": "A certificate (or array of certificates if a certificate-chain is used) used to signed this APK, represented as a base64 encoded byte array.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "externallyHostedUrl": {
+          "description": "The URL at which the APK is hosted. This must be an https URL.",
+          "type": "string"
+        },
+        "fileSha1Base64": {
+          "description": "The SHA1 checksum of this APK, represented as a base64 encoded byte array.",
+          "type": "string"
+        },
+        "fileSha256Base64": {
+          "description": "The SHA256 checksum of this APK, represented as a base64 encoded byte array.",
+          "type": "string"
+        },
+        "fileSize": {
+          "description": "The file size in bytes of this APK.",
+          "format": "int64",
+          "type": "string"
+        },
+        "iconBase64": {
+          "description": "The icon image from the APK, as a base64 encoded byte array.",
+          "type": "string"
+        },
+        "maximumSdk": {
+          "description": "The maximum SDK supported by this APK (optional).",
+          "format": "int32",
+          "type": "integer"
+        },
+        "minimumSdk": {
+          "description": "The minimum SDK targeted by this APK.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "nativeCodes": {
+          "description": "The native code environments supported by this APK (optional).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "packageName": {
+          "description": "The package name.",
+          "type": "string"
+        },
+        "usesFeatures": {
+          "description": "The features required by this APK (optional).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "usesPermissions": {
+          "description": "The permissions requested by this APK.",
+          "items": {
+            "$ref": "ExternallyHostedApkUsesPermission"
+          },
+          "type": "array"
+        },
+        "versionCode": {
+          "description": "The version code of this APK.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "versionName": {
+          "description": "The version name of this APK.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "ExternallyHostedApkUsesPermission": {
+      "description": "A permission used by this APK.",
+      "id": "ExternallyHostedApkUsesPermission",
+      "properties": {
+        "maxSdkVersion": {
+          "description": "Optionally, the maximum SDK version for which the permission is required.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "name": {
+          "description": "The name of the permission requested.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "Image": {
+      "id": "Image",
+      "properties": {
+        "id": {
+          "description": "A unique id representing this image.",
+          "type": "string"
+        },
+        "sha1": {
+          "description": "A sha1 hash of the image that was uploaded.",
+          "type": "string"
+        },
+        "url": {
+          "description": "A URL that will serve a preview of the image.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "ImagesDeleteAllResponse": {
+      "id": "ImagesDeleteAllResponse",
+      "properties": {
+        "deleted": {
+          "items": {
+            "$ref": "Image"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "ImagesListResponse": {
+      "id": "ImagesListResponse",
+      "properties": {
+        "images": {
+          "items": {
+            "$ref": "Image"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "ImagesUploadResponse": {
+      "id": "ImagesUploadResponse",
+      "properties": {
+        "image": {
+          "$ref": "Image"
+        }
+      },
+      "type": "object"
+    },
+    "InAppProduct": {
+      "id": "InAppProduct",
+      "properties": {
+        "defaultLanguage": {
+          "description": "The default language of the localized data, as defined by BCP 47. e.g. \"en-US\", \"en-GB\".",
+          "type": "string"
+        },
+        "defaultPrice": {
+          "$ref": "Price",
+          "description": "Default price cannot be zero. In-app products can never be free. Default price is always in the developer's Checkout merchant currency."
+        },
+        "listings": {
+          "additionalProperties": {
+            "$ref": "InAppProductListing",
+            "description": "The language of the localized data, as defined by BCP 47. i.e.: \"en-US\", \"en-GB\"."
+          },
+          "description": "List of localized title and description data.",
+          "type": "object"
+        },
+        "packageName": {
+          "description": "The package name of the parent app.",
+          "type": "string"
+        },
+        "prices": {
+          "additionalProperties": {
+            "$ref": "Price",
+            "description": "Region code, as defined by ISO 3166-2."
+          },
+          "description": "Prices per buyer region. None of these prices should be zero. In-app products can never be free.",
+          "type": "object"
+        },
+        "purchaseType": {
+          "description": "Purchase type enum value. Unmodifiable after creation.",
+          "type": "string"
+        },
+        "season": {
+          "$ref": "Season",
+          "description": "Definition of a season for a seasonal subscription. Can be defined only for yearly subscriptions."
+        },
+        "sku": {
+          "description": "The stock-keeping-unit (SKU) of the product, unique within an app.",
+          "type": "string"
+        },
+        "status": {
+          "type": "string"
+        },
+        "subscriptionPeriod": {
+          "description": "Subscription period, specified in ISO 8601 format. Acceptable values are \"P1W\" (one week), \"P1M\" (one month), \"P3M\" (three months), \"P6M\" (six months), and \"P1Y\" (one year).",
+          "type": "string"
+        },
+        "trialPeriod": {
+          "description": "Trial period, specified in ISO 8601 format. Acceptable values are anything between \"P7D\" (seven days) and \"P999D\" (999 days). Seasonal subscriptions cannot have a trial period.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "InAppProductListing": {
+      "id": "InAppProductListing",
+      "properties": {
+        "description": {
+          "type": "string"
+        },
+        "title": {
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "InappproductsListResponse": {
+      "id": "InappproductsListResponse",
+      "properties": {
+        "inappproduct": {
+          "items": {
+            "$ref": "InAppProduct"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "default": "androidpublisher#inappproductsListResponse",
+          "description": "Identifies what kind of resource this is. Value: the fixed string \"androidpublisher#inappproductsListResponse\".",
+          "type": "string"
+        },
+        "pageInfo": {
+          "$ref": "PageInfo"
+        },
+        "tokenPagination": {
+          "$ref": "TokenPagination"
+        }
+      },
+      "type": "object"
+    },
+    "Listing": {
+      "id": "Listing",
+      "properties": {
+        "fullDescription": {
+          "description": "Full description of the app; this may be up to 4000 characters in length.",
+          "type": "string"
+        },
+        "language": {
+          "description": "Language localization code (for example, \"de-AT\" for Austrian German).",
+          "type": "string"
+        },
+        "shortDescription": {
+          "description": "Short description of the app (previously known as promo text); this may be up to 80 characters in length.",
+          "type": "string"
+        },
+        "title": {
+          "description": "App's localized title.",
+          "type": "string"
+        },
+        "video": {
+          "description": "URL of a promotional YouTube video for the app.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "ListingsListResponse": {
+      "id": "ListingsListResponse",
+      "properties": {
+        "kind": {
+          "default": "androidpublisher#listingsListResponse",
+          "description": "Identifies what kind of resource this is. Value: the fixed string \"androidpublisher#listingsListResponse\".",
+          "type": "string"
+        },
+        "listings": {
+          "items": {
+            "$ref": "Listing"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "LocalizedText": {
+      "id": "LocalizedText",
+      "properties": {
+        "language": {
+          "description": "The language code, in BCP 47 format (eg \"en-US\").",
+          "type": "string"
+        },
+        "text": {
+          "description": "The text in the given `language`.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "MonthDay": {
+      "id": "MonthDay",
+      "properties": {
+        "day": {
+          "description": "Day of a month, value in [1, 31] range. Valid range depends on the specified month.",
+          "format": "uint32",
+          "type": "integer"
+        },
+        "month": {
+          "description": "Month of a year. e.g. 1 = JAN, 2 = FEB etc.",
+          "format": "uint32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "PageInfo": {
+      "id": "PageInfo",
+      "properties": {
+        "resultPerPage": {
+          "format": "int32",
+          "type": "integer"
+        },
+        "startIndex": {
+          "format": "int32",
+          "type": "integer"
+        },
+        "totalResults": {
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "Price": {
+      "id": "Price",
+      "properties": {
+        "currency": {
+          "description": "3 letter Currency code, as defined by ISO 4217.",
+          "type": "string"
+        },
+        "priceMicros": {
+          "description": "The price in millionths of the currency base unit represented as a string.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "ProductPurchase": {
+      "description": "A ProductPurchase resource indicates the status of a user's inapp product purchase.",
+      "id": "ProductPurchase",
+      "properties": {
+        "consumptionState": {
+          "description": "The consumption state of the inapp product. Possible values are:  \n- Yet to be consumed \n- Consumed",
+          "format": "int32",
+          "type": "integer"
+        },
+        "developerPayload": {
+          "description": "A developer-specified string that contains supplemental information about an order.",
+          "type": "string"
+        },
+        "kind": {
+          "default": "androidpublisher#productPurchase",
+          "description": "This kind represents an inappPurchase object in the androidpublisher service.",
+          "type": "string"
+        },
+        "orderId": {
+          "description": "The order id associated with the purchase of the inapp product.",
+          "type": "string"
+        },
+        "purchaseState": {
+          "description": "The purchase state of the order. Possible values are:  \n- Purchased \n- Canceled",
+          "format": "int32",
+          "type": "integer"
+        },
+        "purchaseTimeMillis": {
+          "description": "The time the product was purchased, in milliseconds since the epoch (Jan 1, 1970).",
+          "format": "int64",
+          "type": "string"
+        },
+        "purchaseType": {
+          "description": "The type of purchase of the inapp product. This field is only set if this purchase was not made using the standard in-app billing flow. Possible values are:  \n- Test (i.e. purchased from a license testing account) \n- Promo (i.e. purchased using a promo code)",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "Prorate": {
+      "id": "Prorate",
+      "properties": {
+        "defaultPrice": {
+          "$ref": "Price",
+          "description": "Default price cannot be zero and must be less than the full subscription price. Default price is always in the developer's Checkout merchant currency. Targeted countries have their prices set automatically based on the default_price."
+        },
+        "start": {
+          "$ref": "MonthDay",
+          "description": "Defines the first day on which the price takes effect."
+        }
+      },
+      "type": "object"
+    },
+    "Review": {
+      "id": "Review",
+      "properties": {
+        "authorName": {
+          "description": "The name of the user who wrote the review.",
+          "type": "string"
+        },
+        "comments": {
+          "description": "A repeated field containing comments for the review.",
+          "items": {
+            "$ref": "Comment"
+          },
+          "type": "array"
+        },
+        "reviewId": {
+          "description": "Unique identifier for this review.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "ReviewReplyResult": {
+      "id": "ReviewReplyResult",
+      "properties": {
+        "lastEdited": {
+          "$ref": "Timestamp",
+          "description": "The time at which the reply took effect."
+        },
+        "replyText": {
+          "description": "The reply text that was applied.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "ReviewsListResponse": {
+      "id": "ReviewsListResponse",
+      "properties": {
+        "pageInfo": {
+          "$ref": "PageInfo"
+        },
+        "reviews": {
+          "items": {
+            "$ref": "Review"
+          },
+          "type": "array"
+        },
+        "tokenPagination": {
+          "$ref": "TokenPagination"
+        }
+      },
+      "type": "object"
+    },
+    "ReviewsReplyRequest": {
+      "id": "ReviewsReplyRequest",
+      "properties": {
+        "replyText": {
+          "description": "The text to set as the reply. Replies of more than approximately 350 characters will be rejected. HTML tags will be stripped.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "ReviewsReplyResponse": {
+      "id": "ReviewsReplyResponse",
+      "properties": {
+        "result": {
+          "$ref": "ReviewReplyResult"
+        }
+      },
+      "type": "object"
+    },
+    "Season": {
+      "id": "Season",
+      "properties": {
+        "end": {
+          "$ref": "MonthDay",
+          "description": "Inclusive end date of the recurrence period."
+        },
+        "prorations": {
+          "description": "Optionally present list of prorations for the season. Each proration is a one-off discounted entry into a subscription. Each proration contains the first date on which the discount is available and the new pricing information.",
+          "items": {
+            "$ref": "Prorate"
+          },
+          "type": "array"
+        },
+        "start": {
+          "$ref": "MonthDay",
+          "description": "Inclusive start date of the recurrence period."
+        }
+      },
+      "type": "object"
+    },
+    "SubscriptionCancelSurveyResult": {
+      "description": "Information provided by the user when they complete the subscription cancellation flow (cancellation reason survey).",
+      "id": "SubscriptionCancelSurveyResult",
+      "properties": {
+        "cancelSurveyReason": {
+          "description": "The cancellation reason the user chose in the survey. Possible values are:  \n- Other \n- I don't use this service enough \n- Technical issues \n- Cost-related reasons \n- I found a better app",
+          "format": "int32",
+          "type": "integer"
+        },
+        "userInputCancelReason": {
+          "description": "The customized input cancel reason from the user. Only present when cancelReason is 0.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "SubscriptionDeferralInfo": {
+      "description": "A SubscriptionDeferralInfo contains the data needed to defer a subscription purchase to a future expiry time.",
+      "id": "SubscriptionDeferralInfo",
+      "properties": {
+        "desiredExpiryTimeMillis": {
+          "description": "The desired next expiry time to assign to the subscription, in milliseconds since the Epoch. The given time must be later/greater than the current expiry time for the subscription.",
+          "format": "int64",
+          "type": "string"
+        },
+        "expectedExpiryTimeMillis": {
+          "description": "The expected expiry time for the subscription. If the current expiry time for the subscription is not the value specified here, the deferral will not occur.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "SubscriptionPurchase": {
+      "description": "A SubscriptionPurchase resource indicates the status of a user's subscription purchase.",
+      "id": "SubscriptionPurchase",
+      "properties": {
+        "autoRenewing": {
+          "description": "Whether the subscription will automatically be renewed when it reaches its current expiry time.",
+          "type": "boolean"
+        },
+        "cancelReason": {
+          "description": "The reason why a subscription was canceled or is not auto-renewing. Possible values are:  \n- User canceled the subscription \n- Subscription was canceled by the system, for example because of a billing problem \n- Subscription was replaced with a new subscription \n- Subscription was canceled by the developer",
+          "format": "int32",
+          "type": "integer"
+        },
+        "cancelSurveyResult": {
+          "$ref": "SubscriptionCancelSurveyResult",
+          "description": "Information provided by the user when they complete the subscription cancellation flow (cancellation reason survey)."
+        },
+        "countryCode": {
+          "description": "ISO 3166-1 alpha-2 billing country/region code of the user at the time the subscription was granted.",
+          "type": "string"
+        },
+        "developerPayload": {
+          "description": "A developer-specified string that contains supplemental information about an order.",
+          "type": "string"
+        },
+        "emailAddress": {
+          "description": "The email address of the user when the subscription was purchased. Only present for purchases made with 'Subscribe with Google'.",
+          "type": "string"
+        },
+        "expiryTimeMillis": {
+          "description": "Time at which the subscription will expire, in milliseconds since the Epoch.",
+          "format": "int64",
+          "type": "string"
+        },
+        "familyName": {
+          "description": "The family name of the user when the subscription was purchased. Only present for purchases made with 'Subscribe with Google'.",
+          "type": "string"
+        },
+        "givenName": {
+          "description": "The given name of the user when the subscription was purchased. Only present for purchases made with 'Subscribe with Google'.",
+          "type": "string"
+        },
+        "kind": {
+          "default": "androidpublisher#subscriptionPurchase",
+          "description": "This kind represents a subscriptionPurchase object in the androidpublisher service.",
+          "type": "string"
+        },
+        "linkedPurchaseToken": {
+          "description": "The purchase token of the originating purchase if this subscription is one of the following:  \n- Re-signup of a canceled but non-lapsed subscription \n- Upgrade/downgrade from a previous subscription  For example, suppose a user originally signs up and you receive purchase token X, then the user cancels and goes through the resignup flow (before their subscription lapses) and you receive purchase token Y, and finally the user upgrades their subscription and you receive purchase token Z. If you call this API with purchase token Z, this field will be set to Y. If you call this API with purchase token Y, this field will be set to X. If you call this API with purchase token X, this field will not be set.",
+          "type": "string"
+        },
+        "orderId": {
+          "description": "The order id of the latest recurring order associated with the purchase of the subscription.",
+          "type": "string"
+        },
+        "paymentState": {
+          "description": "The payment state of the subscription. Possible values are:  \n- Payment pending \n- Payment received \n- Free trial",
+          "format": "int32",
+          "type": "integer"
+        },
+        "priceAmountMicros": {
+          "description": "Price of the subscription, not including tax. Price is expressed in micro-units, where 1,000,000 micro-units represents one unit of the currency. For example, if the subscription price is €1.99, price_amount_micros is 1990000.",
+          "format": "int64",
+          "type": "string"
+        },
+        "priceCurrencyCode": {
+          "description": "ISO 4217 currency code for the subscription price. For example, if the price is specified in British pounds sterling, price_currency_code is \"GBP\".",
+          "type": "string"
+        },
+        "profileId": {
+          "description": "The profile id of the user when the subscription was purchased. Only present for purchases made with 'Subscribe with Google'.",
+          "type": "string"
+        },
+        "profileName": {
+          "description": "The profile name of the user when the subscription was purchased. Only present for purchases made with 'Subscribe with Google'.",
+          "type": "string"
+        },
+        "purchaseType": {
+          "description": "The type of purchase of the subscription. This field is only set if this purchase was not made using the standard in-app billing flow. Possible values are:  \n- Test (i.e. purchased from a license testing account)",
+          "format": "int32",
+          "type": "integer"
+        },
+        "startTimeMillis": {
+          "description": "Time at which the subscription was granted, in milliseconds since the Epoch.",
+          "format": "int64",
+          "type": "string"
+        },
+        "userCancellationTimeMillis": {
+          "description": "The time at which the subscription was canceled by the user, in milliseconds since the epoch. Only present if cancelReason is 0.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "SubscriptionPurchasesDeferRequest": {
+      "id": "SubscriptionPurchasesDeferRequest",
+      "properties": {
+        "deferralInfo": {
+          "$ref": "SubscriptionDeferralInfo",
+          "description": "The information about the new desired expiry time for the subscription."
+        }
+      },
+      "type": "object"
+    },
+    "SubscriptionPurchasesDeferResponse": {
+      "id": "SubscriptionPurchasesDeferResponse",
+      "properties": {
+        "newExpiryTimeMillis": {
+          "description": "The new expiry time for the subscription in milliseconds since the Epoch.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "Testers": {
+      "id": "Testers",
+      "properties": {
+        "googleGroups": {
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "googlePlusCommunities": {
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "Timestamp": {
+      "id": "Timestamp",
+      "properties": {
+        "nanos": {
+          "format": "int32",
+          "type": "integer"
+        },
+        "seconds": {
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "TokenPagination": {
+      "id": "TokenPagination",
+      "properties": {
+        "nextPageToken": {
+          "type": "string"
+        },
+        "previousPageToken": {
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "Track": {
+      "id": "Track",
+      "properties": {
+        "releases": {
+          "description": "A list of all active releases in this track during a read request. On an update request, it represents desired changes.",
+          "items": {
+            "$ref": "TrackRelease"
+          },
+          "type": "array"
+        },
+        "track": {
+          "description": "Identifier for this track. One of \"alpha\", \"beta\", \"production\", \"rollout\" or \"internal\".",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "TrackRelease": {
+      "id": "TrackRelease",
+      "properties": {
+        "name": {
+          "description": "The release name, used to identify this release in the Play Console UI. Not required to be unique. This is optional, if not set it will be generated from the version_name in the APKs.",
+          "type": "string"
+        },
+        "releaseNotes": {
+          "description": "The description of what is new in the app in this release.",
+          "items": {
+            "$ref": "LocalizedText"
+          },
+          "type": "array"
+        },
+        "status": {
+          "description": "The desired status of this release.",
+          "type": "string"
+        },
+        "userFraction": {
+          "description": "Fraction of users who are eligible to receive the release. 0 \u003c= fraction \u003c 1. To be set, release status must be IN_PROGRESS or HALTED.",
+          "format": "double",
+          "type": "number"
+        },
+        "versionCodes": {
+          "description": "A list of version codes of APKs that will be exposed to the users of this track when this release is rolled out.",
+          "items": {
+            "format": "int64",
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "TracksListResponse": {
+      "id": "TracksListResponse",
+      "properties": {
+        "kind": {
+          "default": "androidpublisher#tracksListResponse",
+          "description": "Identifies what kind of resource this is. Value: the fixed string \"androidpublisher#tracksListResponse\".",
+          "type": "string"
+        },
+        "tracks": {
+          "items": {
+            "$ref": "Track"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "UserComment": {
+      "id": "UserComment",
+      "properties": {
+        "androidOsVersion": {
+          "description": "Integer Android SDK version of the user's device at the time the review was written, e.g. 23 is Marshmallow. May be absent.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "appVersionCode": {
+          "description": "Integer version code of the app as installed at the time the review was written. May be absent.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "appVersionName": {
+          "description": "String version name of the app as installed at the time the review was written. May be absent.",
+          "type": "string"
+        },
+        "device": {
+          "description": "Codename for the reviewer's device, e.g. klte, flounder. May be absent.",
+          "type": "string"
+        },
+        "deviceMetadata": {
+          "$ref": "DeviceMetadata",
+          "description": "Some information about the characteristics of the user's device"
+        },
+        "lastModified": {
+          "$ref": "Timestamp",
+          "description": "The last time at which this comment was updated."
+        },
+        "originalText": {
+          "description": "Untranslated text of the review, in the case where the review has been translated. If the review has not been translated this is left blank.",
+          "type": "string"
+        },
+        "reviewerLanguage": {
+          "description": "Language code for the reviewer. This is taken from the device settings so is not guaranteed to match the language the review is written in. May be absent.",
+          "type": "string"
+        },
+        "starRating": {
+          "description": "The star rating associated with the review, from 1 to 5.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "text": {
+          "description": "The content of the comment, i.e. review body. In some cases users have been able to write a review with separate title and body; in those cases the title and body are concatenated and separated by a tab character.",
+          "type": "string"
+        },
+        "thumbsDownCount": {
+          "description": "Number of users who have given this review a thumbs down",
+          "format": "int32",
+          "type": "integer"
+        },
+        "thumbsUpCount": {
+          "description": "Number of users who have given this review a thumbs up",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "VoidedPurchase": {
+      "description": "A VoidedPurchase resource indicates a purchase that was either canceled/refunded/charged-back.",
+      "id": "VoidedPurchase",
+      "properties": {
+        "kind": {
+          "default": "androidpublisher#voidedPurchase",
+          "description": "This kind represents a voided purchase object in the androidpublisher service.",
+          "type": "string"
+        },
+        "purchaseTimeMillis": {
+          "description": "The time at which the purchase was made, in milliseconds since the epoch (Jan 1, 1970).",
+          "format": "int64",
+          "type": "string"
+        },
+        "purchaseToken": {
+          "description": "The token that was generated when a purchase was made. This uniquely identifies a purchase.",
+          "type": "string"
+        },
+        "voidedTimeMillis": {
+          "description": "The time at which the purchase was canceled/refunded/charged-back, in milliseconds since the epoch (Jan 1, 1970).",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "VoidedPurchasesListResponse": {
+      "id": "VoidedPurchasesListResponse",
+      "properties": {
+        "pageInfo": {
+          "$ref": "PageInfo"
+        },
+        "tokenPagination": {
+          "$ref": "TokenPagination"
+        },
+        "voidedPurchases": {
+          "items": {
+            "$ref": "VoidedPurchase"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    }
+  },
+  "servicePath": "androidpublisher/v3/applications/",
+  "title": "Google Play Developer API",
+  "version": "v3"
+}
\ No newline at end of file
diff --git a/androidpublisher/v3/androidpublisher-gen.go b/androidpublisher/v3/androidpublisher-gen.go
new file mode 100644
index 0000000..09ff557
--- /dev/null
+++ b/androidpublisher/v3/androidpublisher-gen.go
@@ -0,0 +1,9966 @@
+// Package androidpublisher provides access to the Google Play Developer API.
+//
+// See https://developers.google.com/android-publisher
+//
+// Usage example:
+//
+//   import "google.golang.org/api/androidpublisher/v3"
+//   ...
+//   androidpublisherService, err := androidpublisher.New(oauthHttpClient)
+package androidpublisher // import "google.golang.org/api/androidpublisher/v3"
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	context "golang.org/x/net/context"
+	ctxhttp "golang.org/x/net/context/ctxhttp"
+	gensupport "google.golang.org/api/gensupport"
+	googleapi "google.golang.org/api/googleapi"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
+var _ = bytes.NewBuffer
+var _ = strconv.Itoa
+var _ = fmt.Sprintf
+var _ = json.NewDecoder
+var _ = io.Copy
+var _ = url.Parse
+var _ = gensupport.MarshalJSON
+var _ = googleapi.Version
+var _ = errors.New
+var _ = strings.Replace
+var _ = context.Canceled
+var _ = ctxhttp.Do
+
+const apiId = "androidpublisher:v3"
+const apiName = "androidpublisher"
+const apiVersion = "v3"
+const basePath = "https://www.googleapis.com/androidpublisher/v3/applications/"
+
+// OAuth2 scopes used by this API.
+const (
+	// View and manage your Google Play Developer account
+	AndroidpublisherScope = "https://www.googleapis.com/auth/androidpublisher"
+)
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client, BasePath: basePath}
+	s.Edits = NewEditsService(s)
+	s.Inappproducts = NewInappproductsService(s)
+	s.Purchases = NewPurchasesService(s)
+	s.Reviews = NewReviewsService(s)
+	return s, nil
+}
+
+type Service struct {
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+
+	Edits *EditsService
+
+	Inappproducts *InappproductsService
+
+	Purchases *PurchasesService
+
+	Reviews *ReviewsService
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
+func NewEditsService(s *Service) *EditsService {
+	rs := &EditsService{s: s}
+	rs.Apks = NewEditsApksService(s)
+	rs.Deobfuscationfiles = NewEditsDeobfuscationfilesService(s)
+	rs.Details = NewEditsDetailsService(s)
+	rs.Expansionfiles = NewEditsExpansionfilesService(s)
+	rs.Images = NewEditsImagesService(s)
+	rs.Listings = NewEditsListingsService(s)
+	rs.Testers = NewEditsTestersService(s)
+	rs.Tracks = NewEditsTracksService(s)
+	return rs
+}
+
+type EditsService struct {
+	s *Service
+
+	Apks *EditsApksService
+
+	Deobfuscationfiles *EditsDeobfuscationfilesService
+
+	Details *EditsDetailsService
+
+	Expansionfiles *EditsExpansionfilesService
+
+	Images *EditsImagesService
+
+	Listings *EditsListingsService
+
+	Testers *EditsTestersService
+
+	Tracks *EditsTracksService
+}
+
+func NewEditsApksService(s *Service) *EditsApksService {
+	rs := &EditsApksService{s: s}
+	return rs
+}
+
+type EditsApksService struct {
+	s *Service
+}
+
+func NewEditsDeobfuscationfilesService(s *Service) *EditsDeobfuscationfilesService {
+	rs := &EditsDeobfuscationfilesService{s: s}
+	return rs
+}
+
+type EditsDeobfuscationfilesService struct {
+	s *Service
+}
+
+func NewEditsDetailsService(s *Service) *EditsDetailsService {
+	rs := &EditsDetailsService{s: s}
+	return rs
+}
+
+type EditsDetailsService struct {
+	s *Service
+}
+
+func NewEditsExpansionfilesService(s *Service) *EditsExpansionfilesService {
+	rs := &EditsExpansionfilesService{s: s}
+	return rs
+}
+
+type EditsExpansionfilesService struct {
+	s *Service
+}
+
+func NewEditsImagesService(s *Service) *EditsImagesService {
+	rs := &EditsImagesService{s: s}
+	return rs
+}
+
+type EditsImagesService struct {
+	s *Service
+}
+
+func NewEditsListingsService(s *Service) *EditsListingsService {
+	rs := &EditsListingsService{s: s}
+	return rs
+}
+
+type EditsListingsService struct {
+	s *Service
+}
+
+func NewEditsTestersService(s *Service) *EditsTestersService {
+	rs := &EditsTestersService{s: s}
+	return rs
+}
+
+type EditsTestersService struct {
+	s *Service
+}
+
+func NewEditsTracksService(s *Service) *EditsTracksService {
+	rs := &EditsTracksService{s: s}
+	return rs
+}
+
+type EditsTracksService struct {
+	s *Service
+}
+
+func NewInappproductsService(s *Service) *InappproductsService {
+	rs := &InappproductsService{s: s}
+	return rs
+}
+
+type InappproductsService struct {
+	s *Service
+}
+
+func NewPurchasesService(s *Service) *PurchasesService {
+	rs := &PurchasesService{s: s}
+	rs.Products = NewPurchasesProductsService(s)
+	rs.Subscriptions = NewPurchasesSubscriptionsService(s)
+	rs.Voidedpurchases = NewPurchasesVoidedpurchasesService(s)
+	return rs
+}
+
+type PurchasesService struct {
+	s *Service
+
+	Products *PurchasesProductsService
+
+	Subscriptions *PurchasesSubscriptionsService
+
+	Voidedpurchases *PurchasesVoidedpurchasesService
+}
+
+func NewPurchasesProductsService(s *Service) *PurchasesProductsService {
+	rs := &PurchasesProductsService{s: s}
+	return rs
+}
+
+type PurchasesProductsService struct {
+	s *Service
+}
+
+func NewPurchasesSubscriptionsService(s *Service) *PurchasesSubscriptionsService {
+	rs := &PurchasesSubscriptionsService{s: s}
+	return rs
+}
+
+type PurchasesSubscriptionsService struct {
+	s *Service
+}
+
+func NewPurchasesVoidedpurchasesService(s *Service) *PurchasesVoidedpurchasesService {
+	rs := &PurchasesVoidedpurchasesService{s: s}
+	return rs
+}
+
+type PurchasesVoidedpurchasesService struct {
+	s *Service
+}
+
+func NewReviewsService(s *Service) *ReviewsService {
+	rs := &ReviewsService{s: s}
+	return rs
+}
+
+type ReviewsService struct {
+	s *Service
+}
+
+type Apk struct {
+	// Binary: Information about the binary payload of this APK.
+	Binary *ApkBinary `json:"binary,omitempty"`
+
+	// VersionCode: The version code of the APK, as specified in the APK's
+	// manifest file.
+	VersionCode int64 `json:"versionCode,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Binary") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Binary") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Apk) MarshalJSON() ([]byte, error) {
+	type NoMethod Apk
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// ApkBinary: Represents the binary payload of an APK.
+type ApkBinary struct {
+	// Sha1: A sha1 hash of the APK payload, encoded as a hex string and
+	// matching the output of the sha1sum command.
+	Sha1 string `json:"sha1,omitempty"`
+
+	// Sha256: A sha256 hash of the APK payload, encoded as a hex string and
+	// matching the output of the sha256sum command.
+	Sha256 string `json:"sha256,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Sha1") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Sha1") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ApkBinary) MarshalJSON() ([]byte, error) {
+	type NoMethod ApkBinary
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ApksAddExternallyHostedRequest struct {
+	// ExternallyHostedApk: The definition of the externally-hosted APK and
+	// where it is located.
+	ExternallyHostedApk *ExternallyHostedApk `json:"externallyHostedApk,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "ExternallyHostedApk")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ExternallyHostedApk") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ApksAddExternallyHostedRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod ApksAddExternallyHostedRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ApksAddExternallyHostedResponse struct {
+	// ExternallyHostedApk: The definition of the externally-hosted APK and
+	// where it is located.
+	ExternallyHostedApk *ExternallyHostedApk `json:"externallyHostedApk,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "ExternallyHostedApk")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ExternallyHostedApk") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ApksAddExternallyHostedResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ApksAddExternallyHostedResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ApksListResponse struct {
+	Apks []*Apk `json:"apks,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidpublisher#apksListResponse".
+	Kind string `json:"kind,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Apks") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Apks") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ApksListResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ApksListResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type AppDetails struct {
+	// ContactEmail: The user-visible support email for this app.
+	ContactEmail string `json:"contactEmail,omitempty"`
+
+	// ContactPhone: The user-visible support telephone number for this app.
+	ContactPhone string `json:"contactPhone,omitempty"`
+
+	// ContactWebsite: The user-visible website for this app.
+	ContactWebsite string `json:"contactWebsite,omitempty"`
+
+	// DefaultLanguage: Default language code, in BCP 47 format (eg
+	// "en-US").
+	DefaultLanguage string `json:"defaultLanguage,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "ContactEmail") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ContactEmail") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AppDetails) MarshalJSON() ([]byte, error) {
+	type NoMethod AppDetails
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// AppEdit: Represents an edit of an app. An edit allows clients to make
+// multiple changes before committing them in one operation.
+type AppEdit struct {
+	// ExpiryTimeSeconds: The time at which the edit will expire and will be
+	// no longer valid for use in any subsequent API calls (encoded as
+	// seconds since the Epoch).
+	ExpiryTimeSeconds string `json:"expiryTimeSeconds,omitempty"`
+
+	// Id: The ID of the edit that can be used in subsequent API calls.
+	Id string `json:"id,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "ExpiryTimeSeconds")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ExpiryTimeSeconds") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AppEdit) MarshalJSON() ([]byte, error) {
+	type NoMethod AppEdit
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type Comment struct {
+	// DeveloperComment: A comment from a developer.
+	DeveloperComment *DeveloperComment `json:"developerComment,omitempty"`
+
+	// UserComment: A comment from a user.
+	UserComment *UserComment `json:"userComment,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "DeveloperComment") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "DeveloperComment") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Comment) MarshalJSON() ([]byte, error) {
+	type NoMethod Comment
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// DeobfuscationFile: Represents a deobfuscation file.
+type DeobfuscationFile struct {
+	// SymbolType: The type of the deobfuscation file.
+	SymbolType string `json:"symbolType,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "SymbolType") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "SymbolType") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *DeobfuscationFile) MarshalJSON() ([]byte, error) {
+	type NoMethod DeobfuscationFile
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type DeobfuscationFilesUploadResponse struct {
+	DeobfuscationFile *DeobfuscationFile `json:"deobfuscationFile,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "DeobfuscationFile")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "DeobfuscationFile") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *DeobfuscationFilesUploadResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod DeobfuscationFilesUploadResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type DeveloperComment struct {
+	// LastModified: The last time at which this comment was updated.
+	LastModified *Timestamp `json:"lastModified,omitempty"`
+
+	// Text: The content of the comment, i.e. reply body.
+	Text string `json:"text,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "LastModified") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "LastModified") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *DeveloperComment) MarshalJSON() ([]byte, error) {
+	type NoMethod DeveloperComment
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type DeviceMetadata struct {
+	// CpuMake: Device CPU make e.g. "Qualcomm"
+	CpuMake string `json:"cpuMake,omitempty"`
+
+	// CpuModel: Device CPU model e.g. "MSM8974"
+	CpuModel string `json:"cpuModel,omitempty"`
+
+	// DeviceClass: Device class (e.g. tablet)
+	DeviceClass string `json:"deviceClass,omitempty"`
+
+	// GlEsVersion: OpenGL version
+	GlEsVersion int64 `json:"glEsVersion,omitempty"`
+
+	// Manufacturer: Device manufacturer (e.g. Motorola)
+	Manufacturer string `json:"manufacturer,omitempty"`
+
+	// NativePlatform: Comma separated list of native platforms (e.g. "arm",
+	// "arm7")
+	NativePlatform string `json:"nativePlatform,omitempty"`
+
+	// ProductName: Device model name (e.g. Droid)
+	ProductName string `json:"productName,omitempty"`
+
+	// RamMb: Device RAM in Megabytes e.g. "2048"
+	RamMb int64 `json:"ramMb,omitempty"`
+
+	// ScreenDensityDpi: Screen density in DPI
+	ScreenDensityDpi int64 `json:"screenDensityDpi,omitempty"`
+
+	// ScreenHeightPx: Screen height in pixels
+	ScreenHeightPx int64 `json:"screenHeightPx,omitempty"`
+
+	// ScreenWidthPx: Screen width in pixels
+	ScreenWidthPx int64 `json:"screenWidthPx,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "CpuMake") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "CpuMake") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *DeviceMetadata) MarshalJSON() ([]byte, error) {
+	type NoMethod DeviceMetadata
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ExpansionFile struct {
+	// FileSize: If set this field indicates that this APK has an Expansion
+	// File uploaded to it: this APK does not reference another APK's
+	// Expansion File. The field's value is the size of the uploaded
+	// Expansion File in bytes.
+	FileSize int64 `json:"fileSize,omitempty,string"`
+
+	// ReferencesVersion: If set this APK's Expansion File references
+	// another APK's Expansion File. The file_size field will not be set.
+	ReferencesVersion int64 `json:"referencesVersion,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "FileSize") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "FileSize") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ExpansionFile) MarshalJSON() ([]byte, error) {
+	type NoMethod ExpansionFile
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ExpansionFilesUploadResponse struct {
+	ExpansionFile *ExpansionFile `json:"expansionFile,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "ExpansionFile") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ExpansionFile") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ExpansionFilesUploadResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ExpansionFilesUploadResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// ExternallyHostedApk: Defines an APK available for this application
+// that is hosted externally and not uploaded to Google Play. This
+// function is only available to enterprises who are using Google Play
+// for Work, and whos application is restricted to the enterprise
+// private channel
+type ExternallyHostedApk struct {
+	// ApplicationLabel: The application label.
+	ApplicationLabel string `json:"applicationLabel,omitempty"`
+
+	// CertificateBase64s: A certificate (or array of certificates if a
+	// certificate-chain is used) used to signed this APK, represented as a
+	// base64 encoded byte array.
+	CertificateBase64s []string `json:"certificateBase64s,omitempty"`
+
+	// ExternallyHostedUrl: The URL at which the APK is hosted. This must be
+	// an https URL.
+	ExternallyHostedUrl string `json:"externallyHostedUrl,omitempty"`
+
+	// FileSha1Base64: The SHA1 checksum of this APK, represented as a
+	// base64 encoded byte array.
+	FileSha1Base64 string `json:"fileSha1Base64,omitempty"`
+
+	// FileSha256Base64: The SHA256 checksum of this APK, represented as a
+	// base64 encoded byte array.
+	FileSha256Base64 string `json:"fileSha256Base64,omitempty"`
+
+	// FileSize: The file size in bytes of this APK.
+	FileSize int64 `json:"fileSize,omitempty,string"`
+
+	// IconBase64: The icon image from the APK, as a base64 encoded byte
+	// array.
+	IconBase64 string `json:"iconBase64,omitempty"`
+
+	// MaximumSdk: The maximum SDK supported by this APK (optional).
+	MaximumSdk int64 `json:"maximumSdk,omitempty"`
+
+	// MinimumSdk: The minimum SDK targeted by this APK.
+	MinimumSdk int64 `json:"minimumSdk,omitempty"`
+
+	// NativeCodes: The native code environments supported by this APK
+	// (optional).
+	NativeCodes []string `json:"nativeCodes,omitempty"`
+
+	// PackageName: The package name.
+	PackageName string `json:"packageName,omitempty"`
+
+	// UsesFeatures: The features required by this APK (optional).
+	UsesFeatures []string `json:"usesFeatures,omitempty"`
+
+	// UsesPermissions: The permissions requested by this APK.
+	UsesPermissions []*ExternallyHostedApkUsesPermission `json:"usesPermissions,omitempty"`
+
+	// VersionCode: The version code of this APK.
+	VersionCode int64 `json:"versionCode,omitempty"`
+
+	// VersionName: The version name of this APK.
+	VersionName string `json:"versionName,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "ApplicationLabel") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ApplicationLabel") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ExternallyHostedApk) MarshalJSON() ([]byte, error) {
+	type NoMethod ExternallyHostedApk
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// ExternallyHostedApkUsesPermission: A permission used by this APK.
+type ExternallyHostedApkUsesPermission struct {
+	// MaxSdkVersion: Optionally, the maximum SDK version for which the
+	// permission is required.
+	MaxSdkVersion int64 `json:"maxSdkVersion,omitempty"`
+
+	// Name: The name of the permission requested.
+	Name string `json:"name,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "MaxSdkVersion") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "MaxSdkVersion") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ExternallyHostedApkUsesPermission) MarshalJSON() ([]byte, error) {
+	type NoMethod ExternallyHostedApkUsesPermission
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type Image struct {
+	// Id: A unique id representing this image.
+	Id string `json:"id,omitempty"`
+
+	// Sha1: A sha1 hash of the image that was uploaded.
+	Sha1 string `json:"sha1,omitempty"`
+
+	// Url: A URL that will serve a preview of the image.
+	Url string `json:"url,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Id") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Id") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Image) MarshalJSON() ([]byte, error) {
+	type NoMethod Image
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ImagesDeleteAllResponse struct {
+	Deleted []*Image `json:"deleted,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Deleted") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Deleted") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ImagesDeleteAllResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ImagesDeleteAllResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ImagesListResponse struct {
+	Images []*Image `json:"images,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Images") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Images") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ImagesListResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ImagesListResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ImagesUploadResponse struct {
+	Image *Image `json:"image,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Image") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Image") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ImagesUploadResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ImagesUploadResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type InAppProduct struct {
+	// DefaultLanguage: The default language of the localized data, as
+	// defined by BCP 47. e.g. "en-US", "en-GB".
+	DefaultLanguage string `json:"defaultLanguage,omitempty"`
+
+	// DefaultPrice: Default price cannot be zero. In-app products can never
+	// be free. Default price is always in the developer's Checkout merchant
+	// currency.
+	DefaultPrice *Price `json:"defaultPrice,omitempty"`
+
+	// Listings: List of localized title and description data.
+	Listings map[string]InAppProductListing `json:"listings,omitempty"`
+
+	// PackageName: The package name of the parent app.
+	PackageName string `json:"packageName,omitempty"`
+
+	// Prices: Prices per buyer region. None of these prices should be zero.
+	// In-app products can never be free.
+	Prices map[string]Price `json:"prices,omitempty"`
+
+	// PurchaseType: Purchase type enum value. Unmodifiable after creation.
+	PurchaseType string `json:"purchaseType,omitempty"`
+
+	// Season: Definition of a season for a seasonal subscription. Can be
+	// defined only for yearly subscriptions.
+	Season *Season `json:"season,omitempty"`
+
+	// Sku: The stock-keeping-unit (SKU) of the product, unique within an
+	// app.
+	Sku string `json:"sku,omitempty"`
+
+	Status string `json:"status,omitempty"`
+
+	// SubscriptionPeriod: Subscription period, specified in ISO 8601
+	// format. Acceptable values are "P1W" (one week), "P1M" (one month),
+	// "P3M" (three months), "P6M" (six months), and "P1Y" (one year).
+	SubscriptionPeriod string `json:"subscriptionPeriod,omitempty"`
+
+	// TrialPeriod: Trial period, specified in ISO 8601 format. Acceptable
+	// values are anything between "P7D" (seven days) and "P999D" (999
+	// days). Seasonal subscriptions cannot have a trial period.
+	TrialPeriod string `json:"trialPeriod,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "DefaultLanguage") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "DefaultLanguage") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *InAppProduct) MarshalJSON() ([]byte, error) {
+	type NoMethod InAppProduct
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type InAppProductListing struct {
+	Description string `json:"description,omitempty"`
+
+	Title string `json:"title,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Description") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Description") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *InAppProductListing) MarshalJSON() ([]byte, error) {
+	type NoMethod InAppProductListing
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type InappproductsListResponse struct {
+	Inappproduct []*InAppProduct `json:"inappproduct,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidpublisher#inappproductsListResponse".
+	Kind string `json:"kind,omitempty"`
+
+	PageInfo *PageInfo `json:"pageInfo,omitempty"`
+
+	TokenPagination *TokenPagination `json:"tokenPagination,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Inappproduct") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Inappproduct") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *InappproductsListResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod InappproductsListResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type Listing struct {
+	// FullDescription: Full description of the app; this may be up to 4000
+	// characters in length.
+	FullDescription string `json:"fullDescription,omitempty"`
+
+	// Language: Language localization code (for example, "de-AT" for
+	// Austrian German).
+	Language string `json:"language,omitempty"`
+
+	// ShortDescription: Short description of the app (previously known as
+	// promo text); this may be up to 80 characters in length.
+	ShortDescription string `json:"shortDescription,omitempty"`
+
+	// Title: App's localized title.
+	Title string `json:"title,omitempty"`
+
+	// Video: URL of a promotional YouTube video for the app.
+	Video string `json:"video,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "FullDescription") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "FullDescription") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Listing) MarshalJSON() ([]byte, error) {
+	type NoMethod Listing
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ListingsListResponse struct {
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidpublisher#listingsListResponse".
+	Kind string `json:"kind,omitempty"`
+
+	Listings []*Listing `json:"listings,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Kind") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Kind") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ListingsListResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ListingsListResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type LocalizedText struct {
+	// Language: The language code, in BCP 47 format (eg "en-US").
+	Language string `json:"language,omitempty"`
+
+	// Text: The text in the given `language`.
+	Text string `json:"text,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Language") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Language") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *LocalizedText) MarshalJSON() ([]byte, error) {
+	type NoMethod LocalizedText
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type MonthDay struct {
+	// Day: Day of a month, value in [1, 31] range. Valid range depends on
+	// the specified month.
+	Day int64 `json:"day,omitempty"`
+
+	// Month: Month of a year. e.g. 1 = JAN, 2 = FEB etc.
+	Month int64 `json:"month,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Day") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Day") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *MonthDay) MarshalJSON() ([]byte, error) {
+	type NoMethod MonthDay
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type PageInfo struct {
+	ResultPerPage int64 `json:"resultPerPage,omitempty"`
+
+	StartIndex int64 `json:"startIndex,omitempty"`
+
+	TotalResults int64 `json:"totalResults,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "ResultPerPage") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ResultPerPage") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *PageInfo) MarshalJSON() ([]byte, error) {
+	type NoMethod PageInfo
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type Price struct {
+	// Currency: 3 letter Currency code, as defined by ISO 4217.
+	Currency string `json:"currency,omitempty"`
+
+	// PriceMicros: The price in millionths of the currency base unit
+	// represented as a string.
+	PriceMicros string `json:"priceMicros,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Currency") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Currency") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Price) MarshalJSON() ([]byte, error) {
+	type NoMethod Price
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// ProductPurchase: A ProductPurchase resource indicates the status of a
+// user's inapp product purchase.
+type ProductPurchase struct {
+	// ConsumptionState: The consumption state of the inapp product.
+	// Possible values are:
+	// - Yet to be consumed
+	// - Consumed
+	ConsumptionState int64 `json:"consumptionState,omitempty"`
+
+	// DeveloperPayload: A developer-specified string that contains
+	// supplemental information about an order.
+	DeveloperPayload string `json:"developerPayload,omitempty"`
+
+	// Kind: This kind represents an inappPurchase object in the
+	// androidpublisher service.
+	Kind string `json:"kind,omitempty"`
+
+	// OrderId: The order id associated with the purchase of the inapp
+	// product.
+	OrderId string `json:"orderId,omitempty"`
+
+	// PurchaseState: The purchase state of the order. Possible values are:
+	//
+	// - Purchased
+	// - Canceled
+	PurchaseState int64 `json:"purchaseState,omitempty"`
+
+	// PurchaseTimeMillis: The time the product was purchased, in
+	// milliseconds since the epoch (Jan 1, 1970).
+	PurchaseTimeMillis int64 `json:"purchaseTimeMillis,omitempty,string"`
+
+	// PurchaseType: The type of purchase of the inapp product. This field
+	// is only set if this purchase was not made using the standard in-app
+	// billing flow. Possible values are:
+	// - Test (i.e. purchased from a license testing account)
+	// - Promo (i.e. purchased using a promo code)
+	PurchaseType int64 `json:"purchaseType,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "ConsumptionState") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ConsumptionState") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ProductPurchase) MarshalJSON() ([]byte, error) {
+	type NoMethod ProductPurchase
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type Prorate struct {
+	// DefaultPrice: Default price cannot be zero and must be less than the
+	// full subscription price. Default price is always in the developer's
+	// Checkout merchant currency. Targeted countries have their prices set
+	// automatically based on the default_price.
+	DefaultPrice *Price `json:"defaultPrice,omitempty"`
+
+	// Start: Defines the first day on which the price takes effect.
+	Start *MonthDay `json:"start,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "DefaultPrice") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "DefaultPrice") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Prorate) MarshalJSON() ([]byte, error) {
+	type NoMethod Prorate
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type Review struct {
+	// AuthorName: The name of the user who wrote the review.
+	AuthorName string `json:"authorName,omitempty"`
+
+	// Comments: A repeated field containing comments for the review.
+	Comments []*Comment `json:"comments,omitempty"`
+
+	// ReviewId: Unique identifier for this review.
+	ReviewId string `json:"reviewId,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "AuthorName") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AuthorName") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Review) MarshalJSON() ([]byte, error) {
+	type NoMethod Review
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ReviewReplyResult struct {
+	// LastEdited: The time at which the reply took effect.
+	LastEdited *Timestamp `json:"lastEdited,omitempty"`
+
+	// ReplyText: The reply text that was applied.
+	ReplyText string `json:"replyText,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "LastEdited") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "LastEdited") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ReviewReplyResult) MarshalJSON() ([]byte, error) {
+	type NoMethod ReviewReplyResult
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ReviewsListResponse struct {
+	PageInfo *PageInfo `json:"pageInfo,omitempty"`
+
+	Reviews []*Review `json:"reviews,omitempty"`
+
+	TokenPagination *TokenPagination `json:"tokenPagination,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "PageInfo") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "PageInfo") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ReviewsListResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ReviewsListResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ReviewsReplyRequest struct {
+	// ReplyText: The text to set as the reply. Replies of more than
+	// approximately 350 characters will be rejected. HTML tags will be
+	// stripped.
+	ReplyText string `json:"replyText,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "ReplyText") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ReplyText") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ReviewsReplyRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod ReviewsReplyRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ReviewsReplyResponse struct {
+	Result *ReviewReplyResult `json:"result,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Result") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Result") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ReviewsReplyResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ReviewsReplyResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type Season struct {
+	// End: Inclusive end date of the recurrence period.
+	End *MonthDay `json:"end,omitempty"`
+
+	// Prorations: Optionally present list of prorations for the season.
+	// Each proration is a one-off discounted entry into a subscription.
+	// Each proration contains the first date on which the discount is
+	// available and the new pricing information.
+	Prorations []*Prorate `json:"prorations,omitempty"`
+
+	// Start: Inclusive start date of the recurrence period.
+	Start *MonthDay `json:"start,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "End") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "End") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Season) MarshalJSON() ([]byte, error) {
+	type NoMethod Season
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// SubscriptionCancelSurveyResult: Information provided by the user when
+// they complete the subscription cancellation flow (cancellation reason
+// survey).
+type SubscriptionCancelSurveyResult struct {
+	// CancelSurveyReason: The cancellation reason the user chose in the
+	// survey. Possible values are:
+	// - Other
+	// - I don't use this service enough
+	// - Technical issues
+	// - Cost-related reasons
+	// - I found a better app
+	CancelSurveyReason int64 `json:"cancelSurveyReason,omitempty"`
+
+	// UserInputCancelReason: The customized input cancel reason from the
+	// user. Only present when cancelReason is 0.
+	UserInputCancelReason string `json:"userInputCancelReason,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "CancelSurveyReason")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "CancelSurveyReason") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SubscriptionCancelSurveyResult) MarshalJSON() ([]byte, error) {
+	type NoMethod SubscriptionCancelSurveyResult
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// SubscriptionDeferralInfo: A SubscriptionDeferralInfo contains the
+// data needed to defer a subscription purchase to a future expiry time.
+type SubscriptionDeferralInfo struct {
+	// DesiredExpiryTimeMillis: The desired next expiry time to assign to
+	// the subscription, in milliseconds since the Epoch. The given time
+	// must be later/greater than the current expiry time for the
+	// subscription.
+	DesiredExpiryTimeMillis int64 `json:"desiredExpiryTimeMillis,omitempty,string"`
+
+	// ExpectedExpiryTimeMillis: The expected expiry time for the
+	// subscription. If the current expiry time for the subscription is not
+	// the value specified here, the deferral will not occur.
+	ExpectedExpiryTimeMillis int64 `json:"expectedExpiryTimeMillis,omitempty,string"`
+
+	// ForceSendFields is a list of field names (e.g.
+	// "DesiredExpiryTimeMillis") to unconditionally include in API
+	// requests. By default, fields with empty values are omitted from API
+	// requests. However, any non-pointer, non-interface field appearing in
+	// ForceSendFields will be sent to the server regardless of whether the
+	// field is empty or not. This may be used to include empty fields in
+	// Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "DesiredExpiryTimeMillis")
+	// to include in API requests with the JSON null value. By default,
+	// fields with empty values are omitted from API requests. However, any
+	// field with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SubscriptionDeferralInfo) MarshalJSON() ([]byte, error) {
+	type NoMethod SubscriptionDeferralInfo
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// SubscriptionPurchase: A SubscriptionPurchase resource indicates the
+// status of a user's subscription purchase.
+type SubscriptionPurchase struct {
+	// AutoRenewing: Whether the subscription will automatically be renewed
+	// when it reaches its current expiry time.
+	AutoRenewing bool `json:"autoRenewing,omitempty"`
+
+	// CancelReason: The reason why a subscription was canceled or is not
+	// auto-renewing. Possible values are:
+	// - User canceled the subscription
+	// - Subscription was canceled by the system, for example because of a
+	// billing problem
+	// - Subscription was replaced with a new subscription
+	// - Subscription was canceled by the developer
+	CancelReason int64 `json:"cancelReason,omitempty"`
+
+	// CancelSurveyResult: Information provided by the user when they
+	// complete the subscription cancellation flow (cancellation reason
+	// survey).
+	CancelSurveyResult *SubscriptionCancelSurveyResult `json:"cancelSurveyResult,omitempty"`
+
+	// CountryCode: ISO 3166-1 alpha-2 billing country/region code of the
+	// user at the time the subscription was granted.
+	CountryCode string `json:"countryCode,omitempty"`
+
+	// DeveloperPayload: A developer-specified string that contains
+	// supplemental information about an order.
+	DeveloperPayload string `json:"developerPayload,omitempty"`
+
+	// EmailAddress: The email address of the user when the subscription was
+	// purchased. Only present for purchases made with 'Subscribe with
+	// Google'.
+	EmailAddress string `json:"emailAddress,omitempty"`
+
+	// ExpiryTimeMillis: Time at which the subscription will expire, in
+	// milliseconds since the Epoch.
+	ExpiryTimeMillis int64 `json:"expiryTimeMillis,omitempty,string"`
+
+	// FamilyName: The family name of the user when the subscription was
+	// purchased. Only present for purchases made with 'Subscribe with
+	// Google'.
+	FamilyName string `json:"familyName,omitempty"`
+
+	// GivenName: The given name of the user when the subscription was
+	// purchased. Only present for purchases made with 'Subscribe with
+	// Google'.
+	GivenName string `json:"givenName,omitempty"`
+
+	// Kind: This kind represents a subscriptionPurchase object in the
+	// androidpublisher service.
+	Kind string `json:"kind,omitempty"`
+
+	// LinkedPurchaseToken: The purchase token of the originating purchase
+	// if this subscription is one of the following:
+	// - Re-signup of a canceled but non-lapsed subscription
+	// - Upgrade/downgrade from a previous subscription  For example,
+	// suppose a user originally signs up and you receive purchase token X,
+	// then the user cancels and goes through the resignup flow (before
+	// their subscription lapses) and you receive purchase token Y, and
+	// finally the user upgrades their subscription and you receive purchase
+	// token Z. If you call this API with purchase token Z, this field will
+	// be set to Y. If you call this API with purchase token Y, this field
+	// will be set to X. If you call this API with purchase token X, this
+	// field will not be set.
+	LinkedPurchaseToken string `json:"linkedPurchaseToken,omitempty"`
+
+	// OrderId: The order id of the latest recurring order associated with
+	// the purchase of the subscription.
+	OrderId string `json:"orderId,omitempty"`
+
+	// PaymentState: The payment state of the subscription. Possible values
+	// are:
+	// - Payment pending
+	// - Payment received
+	// - Free trial
+	PaymentState int64 `json:"paymentState,omitempty"`
+
+	// PriceAmountMicros: Price of the subscription, not including tax.
+	// Price is expressed in micro-units, where 1,000,000 micro-units
+	// represents one unit of the currency. For example, if the subscription
+	// price is €1.99, price_amount_micros is 1990000.
+	PriceAmountMicros int64 `json:"priceAmountMicros,omitempty,string"`
+
+	// PriceCurrencyCode: ISO 4217 currency code for the subscription price.
+	// For example, if the price is specified in British pounds sterling,
+	// price_currency_code is "GBP".
+	PriceCurrencyCode string `json:"priceCurrencyCode,omitempty"`
+
+	// ProfileId: The profile id of the user when the subscription was
+	// purchased. Only present for purchases made with 'Subscribe with
+	// Google'.
+	ProfileId string `json:"profileId,omitempty"`
+
+	// ProfileName: The profile name of the user when the subscription was
+	// purchased. Only present for purchases made with 'Subscribe with
+	// Google'.
+	ProfileName string `json:"profileName,omitempty"`
+
+	// PurchaseType: The type of purchase of the subscription. This field is
+	// only set if this purchase was not made using the standard in-app
+	// billing flow. Possible values are:
+	// - Test (i.e. purchased from a license testing account)
+	PurchaseType int64 `json:"purchaseType,omitempty"`
+
+	// StartTimeMillis: Time at which the subscription was granted, in
+	// milliseconds since the Epoch.
+	StartTimeMillis int64 `json:"startTimeMillis,omitempty,string"`
+
+	// UserCancellationTimeMillis: The time at which the subscription was
+	// canceled by the user, in milliseconds since the epoch. Only present
+	// if cancelReason is 0.
+	UserCancellationTimeMillis int64 `json:"userCancellationTimeMillis,omitempty,string"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "AutoRenewing") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AutoRenewing") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SubscriptionPurchase) MarshalJSON() ([]byte, error) {
+	type NoMethod SubscriptionPurchase
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type SubscriptionPurchasesDeferRequest struct {
+	// DeferralInfo: The information about the new desired expiry time for
+	// the subscription.
+	DeferralInfo *SubscriptionDeferralInfo `json:"deferralInfo,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "DeferralInfo") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "DeferralInfo") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SubscriptionPurchasesDeferRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod SubscriptionPurchasesDeferRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type SubscriptionPurchasesDeferResponse struct {
+	// NewExpiryTimeMillis: The new expiry time for the subscription in
+	// milliseconds since the Epoch.
+	NewExpiryTimeMillis int64 `json:"newExpiryTimeMillis,omitempty,string"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "NewExpiryTimeMillis")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "NewExpiryTimeMillis") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SubscriptionPurchasesDeferResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod SubscriptionPurchasesDeferResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type Testers struct {
+	GoogleGroups []string `json:"googleGroups,omitempty"`
+
+	GooglePlusCommunities []string `json:"googlePlusCommunities,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "GoogleGroups") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "GoogleGroups") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Testers) MarshalJSON() ([]byte, error) {
+	type NoMethod Testers
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type Timestamp struct {
+	Nanos int64 `json:"nanos,omitempty"`
+
+	Seconds int64 `json:"seconds,omitempty,string"`
+
+	// ForceSendFields is a list of field names (e.g. "Nanos") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Nanos") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Timestamp) MarshalJSON() ([]byte, error) {
+	type NoMethod Timestamp
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type TokenPagination struct {
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	PreviousPageToken string `json:"previousPageToken,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "NextPageToken") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "NextPageToken") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *TokenPagination) MarshalJSON() ([]byte, error) {
+	type NoMethod TokenPagination
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type Track struct {
+	// Releases: A list of all active releases in this track during a read
+	// request. On an update request, it represents desired changes.
+	Releases []*TrackRelease `json:"releases,omitempty"`
+
+	// Track: Identifier for this track. One of "alpha", "beta",
+	// "production", "rollout" or "internal".
+	Track string `json:"track,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Releases") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Releases") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Track) MarshalJSON() ([]byte, error) {
+	type NoMethod Track
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type TrackRelease struct {
+	// Name: The release name, used to identify this release in the Play
+	// Console UI. Not required to be unique. This is optional, if not set
+	// it will be generated from the version_name in the APKs.
+	Name string `json:"name,omitempty"`
+
+	// ReleaseNotes: The description of what is new in the app in this
+	// release.
+	ReleaseNotes []*LocalizedText `json:"releaseNotes,omitempty"`
+
+	// Status: The desired status of this release.
+	Status string `json:"status,omitempty"`
+
+	// UserFraction: Fraction of users who are eligible to receive the
+	// release. 0 <= fraction < 1. To be set, release status must be
+	// IN_PROGRESS or HALTED.
+	UserFraction float64 `json:"userFraction,omitempty"`
+
+	// VersionCodes: A list of version codes of APKs that will be exposed to
+	// the users of this track when this release is rolled out.
+	VersionCodes googleapi.Int64s `json:"versionCodes,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Name") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Name") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *TrackRelease) MarshalJSON() ([]byte, error) {
+	type NoMethod TrackRelease
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+func (s *TrackRelease) UnmarshalJSON(data []byte) error {
+	type NoMethod TrackRelease
+	var s1 struct {
+		UserFraction gensupport.JSONFloat64 `json:"userFraction"`
+		*NoMethod
+	}
+	s1.NoMethod = (*NoMethod)(s)
+	if err := json.Unmarshal(data, &s1); err != nil {
+		return err
+	}
+	s.UserFraction = float64(s1.UserFraction)
+	return nil
+}
+
+type TracksListResponse struct {
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidpublisher#tracksListResponse".
+	Kind string `json:"kind,omitempty"`
+
+	Tracks []*Track `json:"tracks,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Kind") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Kind") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *TracksListResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod TracksListResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type UserComment struct {
+	// AndroidOsVersion: Integer Android SDK version of the user's device at
+	// the time the review was written, e.g. 23 is Marshmallow. May be
+	// absent.
+	AndroidOsVersion int64 `json:"androidOsVersion,omitempty"`
+
+	// AppVersionCode: Integer version code of the app as installed at the
+	// time the review was written. May be absent.
+	AppVersionCode int64 `json:"appVersionCode,omitempty"`
+
+	// AppVersionName: String version name of the app as installed at the
+	// time the review was written. May be absent.
+	AppVersionName string `json:"appVersionName,omitempty"`
+
+	// Device: Codename for the reviewer's device, e.g. klte, flounder. May
+	// be absent.
+	Device string `json:"device,omitempty"`
+
+	// DeviceMetadata: Some information about the characteristics of the
+	// user's device
+	DeviceMetadata *DeviceMetadata `json:"deviceMetadata,omitempty"`
+
+	// LastModified: The last time at which this comment was updated.
+	LastModified *Timestamp `json:"lastModified,omitempty"`
+
+	// OriginalText: Untranslated text of the review, in the case where the
+	// review has been translated. If the review has not been translated
+	// this is left blank.
+	OriginalText string `json:"originalText,omitempty"`
+
+	// ReviewerLanguage: Language code for the reviewer. This is taken from
+	// the device settings so is not guaranteed to match the language the
+	// review is written in. May be absent.
+	ReviewerLanguage string `json:"reviewerLanguage,omitempty"`
+
+	// StarRating: The star rating associated with the review, from 1 to 5.
+	StarRating int64 `json:"starRating,omitempty"`
+
+	// Text: The content of the comment, i.e. review body. In some cases
+	// users have been able to write a review with separate title and body;
+	// in those cases the title and body are concatenated and separated by a
+	// tab character.
+	Text string `json:"text,omitempty"`
+
+	// ThumbsDownCount: Number of users who have given this review a thumbs
+	// down
+	ThumbsDownCount int64 `json:"thumbsDownCount,omitempty"`
+
+	// ThumbsUpCount: Number of users who have given this review a thumbs up
+	ThumbsUpCount int64 `json:"thumbsUpCount,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "AndroidOsVersion") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AndroidOsVersion") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *UserComment) MarshalJSON() ([]byte, error) {
+	type NoMethod UserComment
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// VoidedPurchase: A VoidedPurchase resource indicates a purchase that
+// was either canceled/refunded/charged-back.
+type VoidedPurchase struct {
+	// Kind: This kind represents a voided purchase object in the
+	// androidpublisher service.
+	Kind string `json:"kind,omitempty"`
+
+	// PurchaseTimeMillis: The time at which the purchase was made, in
+	// milliseconds since the epoch (Jan 1, 1970).
+	PurchaseTimeMillis int64 `json:"purchaseTimeMillis,omitempty,string"`
+
+	// PurchaseToken: The token that was generated when a purchase was made.
+	// This uniquely identifies a purchase.
+	PurchaseToken string `json:"purchaseToken,omitempty"`
+
+	// VoidedTimeMillis: The time at which the purchase was
+	// canceled/refunded/charged-back, in milliseconds since the epoch (Jan
+	// 1, 1970).
+	VoidedTimeMillis int64 `json:"voidedTimeMillis,omitempty,string"`
+
+	// ForceSendFields is a list of field names (e.g. "Kind") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Kind") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *VoidedPurchase) MarshalJSON() ([]byte, error) {
+	type NoMethod VoidedPurchase
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type VoidedPurchasesListResponse struct {
+	PageInfo *PageInfo `json:"pageInfo,omitempty"`
+
+	TokenPagination *TokenPagination `json:"tokenPagination,omitempty"`
+
+	VoidedPurchases []*VoidedPurchase `json:"voidedPurchases,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "PageInfo") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "PageInfo") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *VoidedPurchasesListResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod VoidedPurchasesListResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// method id "androidpublisher.edits.commit":
+
+type EditsCommitCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Commit: Commits/applies the changes made in this edit back to the
+// app.
+func (r *EditsService) Commit(packageNameid string, editId string) *EditsCommitCall {
+	c := &EditsCommitCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsCommitCall) Fields(s ...googleapi.Field) *EditsCommitCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsCommitCall) Context(ctx context.Context) *EditsCommitCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsCommitCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsCommitCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}:commit")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.commit" call.
+// Exactly one of *AppEdit or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *AppEdit.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsCommitCall) Do(opts ...googleapi.CallOption) (*AppEdit, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AppEdit{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Commits/applies the changes made in this edit back to the app.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.edits.commit",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}:commit",
+	//   "response": {
+	//     "$ref": "AppEdit"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.delete":
+
+type EditsDeleteCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Delete: Deletes an edit for an app. Creating a new edit will
+// automatically delete any of your previous edits so this method need
+// only be called if you want to preemptively abandon an edit.
+func (r *EditsService) Delete(packageNameid string, editId string) *EditsDeleteCall {
+	c := &EditsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsDeleteCall) Fields(s ...googleapi.Field) *EditsDeleteCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsDeleteCall) Context(ctx context.Context) *EditsDeleteCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsDeleteCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsDeleteCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.delete" call.
+func (c *EditsDeleteCall) Do(opts ...googleapi.CallOption) error {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Deletes an edit for an app. Creating a new edit will automatically delete any of your previous edits so this method need only be called if you want to preemptively abandon an edit.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidpublisher.edits.delete",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.get":
+
+type EditsGetCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Get: Returns information about the edit specified. Calls will fail if
+// the edit is no long active (e.g. has been deleted, superseded or
+// expired).
+func (r *EditsService) Get(packageNameid string, editId string) *EditsGetCall {
+	c := &EditsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsGetCall) Fields(s ...googleapi.Field) *EditsGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *EditsGetCall) IfNoneMatch(entityTag string) *EditsGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsGetCall) Context(ctx context.Context) *EditsGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.get" call.
+// Exactly one of *AppEdit or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *AppEdit.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsGetCall) Do(opts ...googleapi.CallOption) (*AppEdit, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AppEdit{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns information about the edit specified. Calls will fail if the edit is no long active (e.g. has been deleted, superseded or expired).",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.edits.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}",
+	//   "response": {
+	//     "$ref": "AppEdit"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.insert":
+
+type EditsInsertCall struct {
+	s             *Service
+	packageNameid string
+	appedit       *AppEdit
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Insert: Creates a new edit for an app, populated with the app's
+// current state.
+func (r *EditsService) Insert(packageNameid string, appedit *AppEdit) *EditsInsertCall {
+	c := &EditsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.appedit = appedit
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsInsertCall) Fields(s ...googleapi.Field) *EditsInsertCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsInsertCall) Context(ctx context.Context) *EditsInsertCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsInsertCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsInsertCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.appedit)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.insert" call.
+// Exactly one of *AppEdit or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *AppEdit.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsInsertCall) Do(opts ...googleapi.CallOption) (*AppEdit, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AppEdit{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates a new edit for an app, populated with the app's current state.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.edits.insert",
+	//   "parameterOrder": [
+	//     "packageName"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits",
+	//   "request": {
+	//     "$ref": "AppEdit"
+	//   },
+	//   "response": {
+	//     "$ref": "AppEdit"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.validate":
+
+type EditsValidateCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Validate: Checks that the edit can be successfully committed. The
+// edit's changes are not applied to the live app.
+func (r *EditsService) Validate(packageNameid string, editId string) *EditsValidateCall {
+	c := &EditsValidateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsValidateCall) Fields(s ...googleapi.Field) *EditsValidateCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsValidateCall) Context(ctx context.Context) *EditsValidateCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsValidateCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsValidateCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}:validate")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.validate" call.
+// Exactly one of *AppEdit or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *AppEdit.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsValidateCall) Do(opts ...googleapi.CallOption) (*AppEdit, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AppEdit{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Checks that the edit can be successfully committed. The edit's changes are not applied to the live app.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.edits.validate",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}:validate",
+	//   "response": {
+	//     "$ref": "AppEdit"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.apks.addexternallyhosted":
+
+type EditsApksAddexternallyhostedCall struct {
+	s                              *Service
+	packageNameid                  string
+	editId                         string
+	apksaddexternallyhostedrequest *ApksAddExternallyHostedRequest
+	urlParams_                     gensupport.URLParams
+	ctx_                           context.Context
+	header_                        http.Header
+}
+
+// Addexternallyhosted: Creates a new APK without uploading the APK
+// itself to Google Play, instead hosting the APK at a specified URL.
+// This function is only available to enterprises using Google Play for
+// Work whose application is configured to restrict distribution to the
+// enterprise domain.
+func (r *EditsApksService) Addexternallyhosted(packageNameid string, editId string, apksaddexternallyhostedrequest *ApksAddExternallyHostedRequest) *EditsApksAddexternallyhostedCall {
+	c := &EditsApksAddexternallyhostedCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.apksaddexternallyhostedrequest = apksaddexternallyhostedrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsApksAddexternallyhostedCall) Fields(s ...googleapi.Field) *EditsApksAddexternallyhostedCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsApksAddexternallyhostedCall) Context(ctx context.Context) *EditsApksAddexternallyhostedCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsApksAddexternallyhostedCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsApksAddexternallyhostedCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.apksaddexternallyhostedrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks/externallyHosted")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.apks.addexternallyhosted" call.
+// Exactly one of *ApksAddExternallyHostedResponse or error will be
+// non-nil. Any non-2xx status code is an error. Response headers are in
+// either *ApksAddExternallyHostedResponse.ServerResponse.Header or (if
+// a response was returned at all) in error.(*googleapi.Error).Header.
+// Use googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsApksAddexternallyhostedCall) Do(opts ...googleapi.CallOption) (*ApksAddExternallyHostedResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ApksAddExternallyHostedResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates a new APK without uploading the APK itself to Google Play, instead hosting the APK at a specified URL. This function is only available to enterprises using Google Play for Work whose application is configured to restrict distribution to the enterprise domain.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.edits.apks.addexternallyhosted",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/apks/externallyHosted",
+	//   "request": {
+	//     "$ref": "ApksAddExternallyHostedRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "ApksAddExternallyHostedResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.apks.list":
+
+type EditsApksListCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// List:
+func (r *EditsApksService) List(packageNameid string, editId string) *EditsApksListCall {
+	c := &EditsApksListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsApksListCall) Fields(s ...googleapi.Field) *EditsApksListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *EditsApksListCall) IfNoneMatch(entityTag string) *EditsApksListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsApksListCall) Context(ctx context.Context) *EditsApksListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsApksListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsApksListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.apks.list" call.
+// Exactly one of *ApksListResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ApksListResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsApksListCall) Do(opts ...googleapi.CallOption) (*ApksListResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ApksListResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.edits.apks.list",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/apks",
+	//   "response": {
+	//     "$ref": "ApksListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.apks.upload":
+
+type EditsApksUploadCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	urlParams_    gensupport.URLParams
+	mediaInfo_    *gensupport.MediaInfo
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Upload:
+func (r *EditsApksService) Upload(packageNameid string, editId string) *EditsApksUploadCall {
+	c := &EditsApksUploadCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	return c
+}
+
+// Media specifies the media to upload in one or more chunks. The chunk
+// size may be controlled by supplying a MediaOption generated by
+// googleapi.ChunkSize. The chunk size defaults to
+// googleapi.DefaultUploadChunkSize.The Content-Type header used in the
+// upload request will be determined by sniffing the contents of r,
+// unless a MediaOption generated by googleapi.ContentType is
+// supplied.
+// At most one of Media and ResumableMedia may be set.
+func (c *EditsApksUploadCall) Media(r io.Reader, options ...googleapi.MediaOption) *EditsApksUploadCall {
+	c.mediaInfo_ = gensupport.NewInfoFromMedia(r, options)
+	return c
+}
+
+// ResumableMedia specifies the media to upload in chunks and can be
+// canceled with ctx.
+//
+// Deprecated: use Media instead.
+//
+// At most one of Media and ResumableMedia may be set. mediaType
+// identifies the MIME media type of the upload, such as "image/png". If
+// mediaType is "", it will be auto-detected. The provided ctx will
+// supersede any context previously provided to the Context method.
+func (c *EditsApksUploadCall) ResumableMedia(ctx context.Context, r io.ReaderAt, size int64, mediaType string) *EditsApksUploadCall {
+	c.ctx_ = ctx
+	c.mediaInfo_ = gensupport.NewInfoFromResumableMedia(r, size, mediaType)
+	return c
+}
+
+// ProgressUpdater provides a callback function that will be called
+// after every chunk. It should be a low-latency function in order to
+// not slow down the upload operation. This should only be called when
+// using ResumableMedia (as opposed to Media).
+func (c *EditsApksUploadCall) ProgressUpdater(pu googleapi.ProgressUpdater) *EditsApksUploadCall {
+	c.mediaInfo_.SetProgressUpdater(pu)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsApksUploadCall) Fields(s ...googleapi.Field) *EditsApksUploadCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+// This context will supersede any context previously provided to the
+// ResumableMedia method.
+func (c *EditsApksUploadCall) Context(ctx context.Context) *EditsApksUploadCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsApksUploadCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsApksUploadCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks")
+	if c.mediaInfo_ != nil {
+		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
+		c.urlParams_.Set("uploadType", c.mediaInfo_.UploadType())
+	}
+	if body == nil {
+		body = new(bytes.Buffer)
+		reqHeaders.Set("Content-Type", "application/json")
+	}
+	body, getBody, cleanup := c.mediaInfo_.UploadRequest(reqHeaders, body)
+	defer cleanup()
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	gensupport.SetGetBody(req, getBody)
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.apks.upload" call.
+// Exactly one of *Apk or error will be non-nil. Any non-2xx status code
+// is an error. Response headers are in either
+// *Apk.ServerResponse.Header or (if a response was returned at all) in
+// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check
+// whether the returned error was because http.StatusNotModified was
+// returned.
+func (c *EditsApksUploadCall) Do(opts ...googleapi.CallOption) (*Apk, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	rx := c.mediaInfo_.ResumableUpload(res.Header.Get("Location"))
+	if rx != nil {
+		rx.Client = c.s.client
+		rx.UserAgent = c.s.userAgent()
+		ctx := c.ctx_
+		if ctx == nil {
+			ctx = context.TODO()
+		}
+		res, err = rx.Upload(ctx)
+		if err != nil {
+			return nil, err
+		}
+		defer res.Body.Close()
+		if err := googleapi.CheckResponse(res); err != nil {
+			return nil, err
+		}
+	}
+	ret := &Apk{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.edits.apks.upload",
+	//   "mediaUpload": {
+	//     "accept": [
+	//       "application/octet-stream",
+	//       "application/vnd.android.package-archive"
+	//     ],
+	//     "maxSize": "1GB",
+	//     "protocols": {
+	//       "resumable": {
+	//         "multipart": true,
+	//         "path": "/resumable/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks"
+	//       },
+	//       "simple": {
+	//         "multipart": true,
+	//         "path": "/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks"
+	//       }
+	//     }
+	//   },
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/apks",
+	//   "response": {
+	//     "$ref": "Apk"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ],
+	//   "supportsMediaUpload": true
+	// }
+
+}
+
+// method id "androidpublisher.edits.deobfuscationfiles.upload":
+
+type EditsDeobfuscationfilesUploadCall struct {
+	s                     *Service
+	packageNameid         string
+	editId                string
+	apkVersionCode        int64
+	deobfuscationFileType string
+	urlParams_            gensupport.URLParams
+	mediaInfo_            *gensupport.MediaInfo
+	ctx_                  context.Context
+	header_               http.Header
+}
+
+// Upload: Uploads the deobfuscation file of the specified APK. If a
+// deobfuscation file already exists, it will be replaced.
+func (r *EditsDeobfuscationfilesService) Upload(packageNameid string, editId string, apkVersionCode int64, deobfuscationFileType string) *EditsDeobfuscationfilesUploadCall {
+	c := &EditsDeobfuscationfilesUploadCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.apkVersionCode = apkVersionCode
+	c.deobfuscationFileType = deobfuscationFileType
+	return c
+}
+
+// Media specifies the media to upload in one or more chunks. The chunk
+// size may be controlled by supplying a MediaOption generated by
+// googleapi.ChunkSize. The chunk size defaults to
+// googleapi.DefaultUploadChunkSize.The Content-Type header used in the
+// upload request will be determined by sniffing the contents of r,
+// unless a MediaOption generated by googleapi.ContentType is
+// supplied.
+// At most one of Media and ResumableMedia may be set.
+func (c *EditsDeobfuscationfilesUploadCall) Media(r io.Reader, options ...googleapi.MediaOption) *EditsDeobfuscationfilesUploadCall {
+	c.mediaInfo_ = gensupport.NewInfoFromMedia(r, options)
+	return c
+}
+
+// ResumableMedia specifies the media to upload in chunks and can be
+// canceled with ctx.
+//
+// Deprecated: use Media instead.
+//
+// At most one of Media and ResumableMedia may be set. mediaType
+// identifies the MIME media type of the upload, such as "image/png". If
+// mediaType is "", it will be auto-detected. The provided ctx will
+// supersede any context previously provided to the Context method.
+func (c *EditsDeobfuscationfilesUploadCall) ResumableMedia(ctx context.Context, r io.ReaderAt, size int64, mediaType string) *EditsDeobfuscationfilesUploadCall {
+	c.ctx_ = ctx
+	c.mediaInfo_ = gensupport.NewInfoFromResumableMedia(r, size, mediaType)
+	return c
+}
+
+// ProgressUpdater provides a callback function that will be called
+// after every chunk. It should be a low-latency function in order to
+// not slow down the upload operation. This should only be called when
+// using ResumableMedia (as opposed to Media).
+func (c *EditsDeobfuscationfilesUploadCall) ProgressUpdater(pu googleapi.ProgressUpdater) *EditsDeobfuscationfilesUploadCall {
+	c.mediaInfo_.SetProgressUpdater(pu)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsDeobfuscationfilesUploadCall) Fields(s ...googleapi.Field) *EditsDeobfuscationfilesUploadCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+// This context will supersede any context previously provided to the
+// ResumableMedia method.
+func (c *EditsDeobfuscationfilesUploadCall) Context(ctx context.Context) *EditsDeobfuscationfilesUploadCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsDeobfuscationfilesUploadCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsDeobfuscationfilesUploadCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks/{apkVersionCode}/deobfuscationFiles/{deobfuscationFileType}")
+	if c.mediaInfo_ != nil {
+		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
+		c.urlParams_.Set("uploadType", c.mediaInfo_.UploadType())
+	}
+	if body == nil {
+		body = new(bytes.Buffer)
+		reqHeaders.Set("Content-Type", "application/json")
+	}
+	body, getBody, cleanup := c.mediaInfo_.UploadRequest(reqHeaders, body)
+	defer cleanup()
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	gensupport.SetGetBody(req, getBody)
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName":           c.packageNameid,
+		"editId":                c.editId,
+		"apkVersionCode":        strconv.FormatInt(c.apkVersionCode, 10),
+		"deobfuscationFileType": c.deobfuscationFileType,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.deobfuscationfiles.upload" call.
+// Exactly one of *DeobfuscationFilesUploadResponse or error will be
+// non-nil. Any non-2xx status code is an error. Response headers are in
+// either *DeobfuscationFilesUploadResponse.ServerResponse.Header or (if
+// a response was returned at all) in error.(*googleapi.Error).Header.
+// Use googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsDeobfuscationfilesUploadCall) Do(opts ...googleapi.CallOption) (*DeobfuscationFilesUploadResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	rx := c.mediaInfo_.ResumableUpload(res.Header.Get("Location"))
+	if rx != nil {
+		rx.Client = c.s.client
+		rx.UserAgent = c.s.userAgent()
+		ctx := c.ctx_
+		if ctx == nil {
+			ctx = context.TODO()
+		}
+		res, err = rx.Upload(ctx)
+		if err != nil {
+			return nil, err
+		}
+		defer res.Body.Close()
+		if err := googleapi.CheckResponse(res); err != nil {
+			return nil, err
+		}
+	}
+	ret := &DeobfuscationFilesUploadResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Uploads the deobfuscation file of the specified APK. If a deobfuscation file already exists, it will be replaced.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.edits.deobfuscationfiles.upload",
+	//   "mediaUpload": {
+	//     "accept": [
+	//       "application/octet-stream"
+	//     ],
+	//     "maxSize": "300MB",
+	//     "protocols": {
+	//       "resumable": {
+	//         "multipart": true,
+	//         "path": "/resumable/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/deobfuscationFiles/{deobfuscationFileType}"
+	//       },
+	//       "simple": {
+	//         "multipart": true,
+	//         "path": "/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/deobfuscationFiles/{deobfuscationFileType}"
+	//       }
+	//     }
+	//   },
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "apkVersionCode",
+	//     "deobfuscationFileType"
+	//   ],
+	//   "parameters": {
+	//     "apkVersionCode": {
+	//       "description": "The version code of the APK whose deobfuscation file is being uploaded.",
+	//       "format": "int32",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "integer"
+	//     },
+	//     "deobfuscationFileType": {
+	//       "enum": [
+	//         "proguard"
+	//       ],
+	//       "enumDescriptions": [
+	//         ""
+	//       ],
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier of the Android app for which the deobfuscatiuon files are being uploaded; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/apks/{apkVersionCode}/deobfuscationFiles/{deobfuscationFileType}",
+	//   "response": {
+	//     "$ref": "DeobfuscationFilesUploadResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ],
+	//   "supportsMediaUpload": true
+	// }
+
+}
+
+// method id "androidpublisher.edits.details.get":
+
+type EditsDetailsGetCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Get: Fetches app details for this edit. This includes the default
+// language and developer support contact information.
+func (r *EditsDetailsService) Get(packageNameid string, editId string) *EditsDetailsGetCall {
+	c := &EditsDetailsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsDetailsGetCall) Fields(s ...googleapi.Field) *EditsDetailsGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *EditsDetailsGetCall) IfNoneMatch(entityTag string) *EditsDetailsGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsDetailsGetCall) Context(ctx context.Context) *EditsDetailsGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsDetailsGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsDetailsGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/details")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.details.get" call.
+// Exactly one of *AppDetails or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *AppDetails.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *EditsDetailsGetCall) Do(opts ...googleapi.CallOption) (*AppDetails, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AppDetails{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Fetches app details for this edit. This includes the default language and developer support contact information.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.edits.details.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/details",
+	//   "response": {
+	//     "$ref": "AppDetails"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.details.patch":
+
+type EditsDetailsPatchCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	appdetails    *AppDetails
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Patch: Updates app details for this edit. This method supports patch
+// semantics.
+func (r *EditsDetailsService) Patch(packageNameid string, editId string, appdetails *AppDetails) *EditsDetailsPatchCall {
+	c := &EditsDetailsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.appdetails = appdetails
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsDetailsPatchCall) Fields(s ...googleapi.Field) *EditsDetailsPatchCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsDetailsPatchCall) Context(ctx context.Context) *EditsDetailsPatchCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsDetailsPatchCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsDetailsPatchCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.appdetails)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/details")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.details.patch" call.
+// Exactly one of *AppDetails or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *AppDetails.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *EditsDetailsPatchCall) Do(opts ...googleapi.CallOption) (*AppDetails, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AppDetails{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates app details for this edit. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "androidpublisher.edits.details.patch",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/details",
+	//   "request": {
+	//     "$ref": "AppDetails"
+	//   },
+	//   "response": {
+	//     "$ref": "AppDetails"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.details.update":
+
+type EditsDetailsUpdateCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	appdetails    *AppDetails
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Update: Updates app details for this edit.
+func (r *EditsDetailsService) Update(packageNameid string, editId string, appdetails *AppDetails) *EditsDetailsUpdateCall {
+	c := &EditsDetailsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.appdetails = appdetails
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsDetailsUpdateCall) Fields(s ...googleapi.Field) *EditsDetailsUpdateCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsDetailsUpdateCall) Context(ctx context.Context) *EditsDetailsUpdateCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsDetailsUpdateCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsDetailsUpdateCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.appdetails)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/details")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.details.update" call.
+// Exactly one of *AppDetails or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *AppDetails.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *EditsDetailsUpdateCall) Do(opts ...googleapi.CallOption) (*AppDetails, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AppDetails{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates app details for this edit.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidpublisher.edits.details.update",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/details",
+	//   "request": {
+	//     "$ref": "AppDetails"
+	//   },
+	//   "response": {
+	//     "$ref": "AppDetails"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.expansionfiles.get":
+
+type EditsExpansionfilesGetCall struct {
+	s                 *Service
+	packageNameid     string
+	editId            string
+	apkVersionCode    int64
+	expansionFileType string
+	urlParams_        gensupport.URLParams
+	ifNoneMatch_      string
+	ctx_              context.Context
+	header_           http.Header
+}
+
+// Get: Fetches the Expansion File configuration for the APK specified.
+func (r *EditsExpansionfilesService) Get(packageNameid string, editId string, apkVersionCode int64, expansionFileType string) *EditsExpansionfilesGetCall {
+	c := &EditsExpansionfilesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.apkVersionCode = apkVersionCode
+	c.expansionFileType = expansionFileType
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsExpansionfilesGetCall) Fields(s ...googleapi.Field) *EditsExpansionfilesGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *EditsExpansionfilesGetCall) IfNoneMatch(entityTag string) *EditsExpansionfilesGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsExpansionfilesGetCall) Context(ctx context.Context) *EditsExpansionfilesGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsExpansionfilesGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsExpansionfilesGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName":       c.packageNameid,
+		"editId":            c.editId,
+		"apkVersionCode":    strconv.FormatInt(c.apkVersionCode, 10),
+		"expansionFileType": c.expansionFileType,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.expansionfiles.get" call.
+// Exactly one of *ExpansionFile or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *ExpansionFile.ServerResponse.Header or (if a response was returned
+// at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsExpansionfilesGetCall) Do(opts ...googleapi.CallOption) (*ExpansionFile, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ExpansionFile{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Fetches the Expansion File configuration for the APK specified.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.edits.expansionfiles.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "apkVersionCode",
+	//     "expansionFileType"
+	//   ],
+	//   "parameters": {
+	//     "apkVersionCode": {
+	//       "description": "The version code of the APK whose Expansion File configuration is being read or modified.",
+	//       "format": "int32",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "integer"
+	//     },
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "expansionFileType": {
+	//       "enum": [
+	//         "main",
+	//         "patch"
+	//       ],
+	//       "enumDescriptions": [
+	//         "",
+	//         ""
+	//       ],
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}",
+	//   "response": {
+	//     "$ref": "ExpansionFile"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.expansionfiles.patch":
+
+type EditsExpansionfilesPatchCall struct {
+	s                 *Service
+	packageNameid     string
+	editId            string
+	apkVersionCode    int64
+	expansionFileType string
+	expansionfile     *ExpansionFile
+	urlParams_        gensupport.URLParams
+	ctx_              context.Context
+	header_           http.Header
+}
+
+// Patch: Updates the APK's Expansion File configuration to reference
+// another APK's Expansion Files. To add a new Expansion File use the
+// Upload method. This method supports patch semantics.
+func (r *EditsExpansionfilesService) Patch(packageNameid string, editId string, apkVersionCode int64, expansionFileType string, expansionfile *ExpansionFile) *EditsExpansionfilesPatchCall {
+	c := &EditsExpansionfilesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.apkVersionCode = apkVersionCode
+	c.expansionFileType = expansionFileType
+	c.expansionfile = expansionfile
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsExpansionfilesPatchCall) Fields(s ...googleapi.Field) *EditsExpansionfilesPatchCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsExpansionfilesPatchCall) Context(ctx context.Context) *EditsExpansionfilesPatchCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsExpansionfilesPatchCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsExpansionfilesPatchCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.expansionfile)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName":       c.packageNameid,
+		"editId":            c.editId,
+		"apkVersionCode":    strconv.FormatInt(c.apkVersionCode, 10),
+		"expansionFileType": c.expansionFileType,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.expansionfiles.patch" call.
+// Exactly one of *ExpansionFile or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *ExpansionFile.ServerResponse.Header or (if a response was returned
+// at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsExpansionfilesPatchCall) Do(opts ...googleapi.CallOption) (*ExpansionFile, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ExpansionFile{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates the APK's Expansion File configuration to reference another APK's Expansion Files. To add a new Expansion File use the Upload method. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "androidpublisher.edits.expansionfiles.patch",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "apkVersionCode",
+	//     "expansionFileType"
+	//   ],
+	//   "parameters": {
+	//     "apkVersionCode": {
+	//       "description": "The version code of the APK whose Expansion File configuration is being read or modified.",
+	//       "format": "int32",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "integer"
+	//     },
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "expansionFileType": {
+	//       "enum": [
+	//         "main",
+	//         "patch"
+	//       ],
+	//       "enumDescriptions": [
+	//         "",
+	//         ""
+	//       ],
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}",
+	//   "request": {
+	//     "$ref": "ExpansionFile"
+	//   },
+	//   "response": {
+	//     "$ref": "ExpansionFile"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.expansionfiles.update":
+
+type EditsExpansionfilesUpdateCall struct {
+	s                 *Service
+	packageNameid     string
+	editId            string
+	apkVersionCode    int64
+	expansionFileType string
+	expansionfile     *ExpansionFile
+	urlParams_        gensupport.URLParams
+	ctx_              context.Context
+	header_           http.Header
+}
+
+// Update: Updates the APK's Expansion File configuration to reference
+// another APK's Expansion Files. To add a new Expansion File use the
+// Upload method.
+func (r *EditsExpansionfilesService) Update(packageNameid string, editId string, apkVersionCode int64, expansionFileType string, expansionfile *ExpansionFile) *EditsExpansionfilesUpdateCall {
+	c := &EditsExpansionfilesUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.apkVersionCode = apkVersionCode
+	c.expansionFileType = expansionFileType
+	c.expansionfile = expansionfile
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsExpansionfilesUpdateCall) Fields(s ...googleapi.Field) *EditsExpansionfilesUpdateCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsExpansionfilesUpdateCall) Context(ctx context.Context) *EditsExpansionfilesUpdateCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsExpansionfilesUpdateCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsExpansionfilesUpdateCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.expansionfile)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName":       c.packageNameid,
+		"editId":            c.editId,
+		"apkVersionCode":    strconv.FormatInt(c.apkVersionCode, 10),
+		"expansionFileType": c.expansionFileType,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.expansionfiles.update" call.
+// Exactly one of *ExpansionFile or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *ExpansionFile.ServerResponse.Header or (if a response was returned
+// at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsExpansionfilesUpdateCall) Do(opts ...googleapi.CallOption) (*ExpansionFile, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ExpansionFile{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates the APK's Expansion File configuration to reference another APK's Expansion Files. To add a new Expansion File use the Upload method.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidpublisher.edits.expansionfiles.update",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "apkVersionCode",
+	//     "expansionFileType"
+	//   ],
+	//   "parameters": {
+	//     "apkVersionCode": {
+	//       "description": "The version code of the APK whose Expansion File configuration is being read or modified.",
+	//       "format": "int32",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "integer"
+	//     },
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "expansionFileType": {
+	//       "enum": [
+	//         "main",
+	//         "patch"
+	//       ],
+	//       "enumDescriptions": [
+	//         "",
+	//         ""
+	//       ],
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}",
+	//   "request": {
+	//     "$ref": "ExpansionFile"
+	//   },
+	//   "response": {
+	//     "$ref": "ExpansionFile"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.expansionfiles.upload":
+
+type EditsExpansionfilesUploadCall struct {
+	s                 *Service
+	packageNameid     string
+	editId            string
+	apkVersionCode    int64
+	expansionFileType string
+	urlParams_        gensupport.URLParams
+	mediaInfo_        *gensupport.MediaInfo
+	ctx_              context.Context
+	header_           http.Header
+}
+
+// Upload: Uploads and attaches a new Expansion File to the APK
+// specified.
+func (r *EditsExpansionfilesService) Upload(packageNameid string, editId string, apkVersionCode int64, expansionFileType string) *EditsExpansionfilesUploadCall {
+	c := &EditsExpansionfilesUploadCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.apkVersionCode = apkVersionCode
+	c.expansionFileType = expansionFileType
+	return c
+}
+
+// Media specifies the media to upload in one or more chunks. The chunk
+// size may be controlled by supplying a MediaOption generated by
+// googleapi.ChunkSize. The chunk size defaults to
+// googleapi.DefaultUploadChunkSize.The Content-Type header used in the
+// upload request will be determined by sniffing the contents of r,
+// unless a MediaOption generated by googleapi.ContentType is
+// supplied.
+// At most one of Media and ResumableMedia may be set.
+func (c *EditsExpansionfilesUploadCall) Media(r io.Reader, options ...googleapi.MediaOption) *EditsExpansionfilesUploadCall {
+	c.mediaInfo_ = gensupport.NewInfoFromMedia(r, options)
+	return c
+}
+
+// ResumableMedia specifies the media to upload in chunks and can be
+// canceled with ctx.
+//
+// Deprecated: use Media instead.
+//
+// At most one of Media and ResumableMedia may be set. mediaType
+// identifies the MIME media type of the upload, such as "image/png". If
+// mediaType is "", it will be auto-detected. The provided ctx will
+// supersede any context previously provided to the Context method.
+func (c *EditsExpansionfilesUploadCall) ResumableMedia(ctx context.Context, r io.ReaderAt, size int64, mediaType string) *EditsExpansionfilesUploadCall {
+	c.ctx_ = ctx
+	c.mediaInfo_ = gensupport.NewInfoFromResumableMedia(r, size, mediaType)
+	return c
+}
+
+// ProgressUpdater provides a callback function that will be called
+// after every chunk. It should be a low-latency function in order to
+// not slow down the upload operation. This should only be called when
+// using ResumableMedia (as opposed to Media).
+func (c *EditsExpansionfilesUploadCall) ProgressUpdater(pu googleapi.ProgressUpdater) *EditsExpansionfilesUploadCall {
+	c.mediaInfo_.SetProgressUpdater(pu)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsExpansionfilesUploadCall) Fields(s ...googleapi.Field) *EditsExpansionfilesUploadCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+// This context will supersede any context previously provided to the
+// ResumableMedia method.
+func (c *EditsExpansionfilesUploadCall) Context(ctx context.Context) *EditsExpansionfilesUploadCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsExpansionfilesUploadCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsExpansionfilesUploadCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}")
+	if c.mediaInfo_ != nil {
+		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
+		c.urlParams_.Set("uploadType", c.mediaInfo_.UploadType())
+	}
+	if body == nil {
+		body = new(bytes.Buffer)
+		reqHeaders.Set("Content-Type", "application/json")
+	}
+	body, getBody, cleanup := c.mediaInfo_.UploadRequest(reqHeaders, body)
+	defer cleanup()
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	gensupport.SetGetBody(req, getBody)
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName":       c.packageNameid,
+		"editId":            c.editId,
+		"apkVersionCode":    strconv.FormatInt(c.apkVersionCode, 10),
+		"expansionFileType": c.expansionFileType,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.expansionfiles.upload" call.
+// Exactly one of *ExpansionFilesUploadResponse or error will be
+// non-nil. Any non-2xx status code is an error. Response headers are in
+// either *ExpansionFilesUploadResponse.ServerResponse.Header or (if a
+// response was returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsExpansionfilesUploadCall) Do(opts ...googleapi.CallOption) (*ExpansionFilesUploadResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	rx := c.mediaInfo_.ResumableUpload(res.Header.Get("Location"))
+	if rx != nil {
+		rx.Client = c.s.client
+		rx.UserAgent = c.s.userAgent()
+		ctx := c.ctx_
+		if ctx == nil {
+			ctx = context.TODO()
+		}
+		res, err = rx.Upload(ctx)
+		if err != nil {
+			return nil, err
+		}
+		defer res.Body.Close()
+		if err := googleapi.CheckResponse(res); err != nil {
+			return nil, err
+		}
+	}
+	ret := &ExpansionFilesUploadResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Uploads and attaches a new Expansion File to the APK specified.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.edits.expansionfiles.upload",
+	//   "mediaUpload": {
+	//     "accept": [
+	//       "application/octet-stream"
+	//     ],
+	//     "maxSize": "2048MB",
+	//     "protocols": {
+	//       "resumable": {
+	//         "multipart": true,
+	//         "path": "/resumable/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}"
+	//       },
+	//       "simple": {
+	//         "multipart": true,
+	//         "path": "/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}"
+	//       }
+	//     }
+	//   },
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "apkVersionCode",
+	//     "expansionFileType"
+	//   ],
+	//   "parameters": {
+	//     "apkVersionCode": {
+	//       "description": "The version code of the APK whose Expansion File configuration is being read or modified.",
+	//       "format": "int32",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "integer"
+	//     },
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "expansionFileType": {
+	//       "enum": [
+	//         "main",
+	//         "patch"
+	//       ],
+	//       "enumDescriptions": [
+	//         "",
+	//         ""
+	//       ],
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}",
+	//   "response": {
+	//     "$ref": "ExpansionFilesUploadResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ],
+	//   "supportsMediaUpload": true
+	// }
+
+}
+
+// method id "androidpublisher.edits.images.delete":
+
+type EditsImagesDeleteCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	language      string
+	imageType     string
+	imageId       string
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Delete: Deletes the image (specified by id) from the edit.
+func (r *EditsImagesService) Delete(packageNameid string, editId string, language string, imageType string, imageId string) *EditsImagesDeleteCall {
+	c := &EditsImagesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.language = language
+	c.imageType = imageType
+	c.imageId = imageId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsImagesDeleteCall) Fields(s ...googleapi.Field) *EditsImagesDeleteCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsImagesDeleteCall) Context(ctx context.Context) *EditsImagesDeleteCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsImagesDeleteCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsImagesDeleteCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}/{imageType}/{imageId}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"language":    c.language,
+		"imageType":   c.imageType,
+		"imageId":     c.imageId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.images.delete" call.
+func (c *EditsImagesDeleteCall) Do(opts ...googleapi.CallOption) error {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Deletes the image (specified by id) from the edit.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidpublisher.edits.images.delete",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "language",
+	//     "imageType",
+	//     "imageId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "imageId": {
+	//       "description": "Unique identifier an image within the set of images attached to this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "imageType": {
+	//       "enum": [
+	//         "featureGraphic",
+	//         "icon",
+	//         "phoneScreenshots",
+	//         "promoGraphic",
+	//         "sevenInchScreenshots",
+	//         "tenInchScreenshots",
+	//         "tvBanner",
+	//         "tvScreenshots",
+	//         "wearScreenshots"
+	//       ],
+	//       "enumDescriptions": [
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         ""
+	//       ],
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "language": {
+	//       "description": "The language code (a BCP-47 language tag) of the localized listing whose images are to read or modified. For example, to select Austrian German, pass \"de-AT\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/listings/{language}/{imageType}/{imageId}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.images.deleteall":
+
+type EditsImagesDeleteallCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	language      string
+	imageType     string
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Deleteall: Deletes all images for the specified language and image
+// type.
+func (r *EditsImagesService) Deleteall(packageNameid string, editId string, language string, imageType string) *EditsImagesDeleteallCall {
+	c := &EditsImagesDeleteallCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.language = language
+	c.imageType = imageType
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsImagesDeleteallCall) Fields(s ...googleapi.Field) *EditsImagesDeleteallCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsImagesDeleteallCall) Context(ctx context.Context) *EditsImagesDeleteallCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsImagesDeleteallCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsImagesDeleteallCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}/{imageType}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"language":    c.language,
+		"imageType":   c.imageType,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.images.deleteall" call.
+// Exactly one of *ImagesDeleteAllResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ImagesDeleteAllResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsImagesDeleteallCall) Do(opts ...googleapi.CallOption) (*ImagesDeleteAllResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ImagesDeleteAllResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes all images for the specified language and image type.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidpublisher.edits.images.deleteall",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "language",
+	//     "imageType"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "imageType": {
+	//       "enum": [
+	//         "featureGraphic",
+	//         "icon",
+	//         "phoneScreenshots",
+	//         "promoGraphic",
+	//         "sevenInchScreenshots",
+	//         "tenInchScreenshots",
+	//         "tvBanner",
+	//         "tvScreenshots",
+	//         "wearScreenshots"
+	//       ],
+	//       "enumDescriptions": [
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         ""
+	//       ],
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "language": {
+	//       "description": "The language code (a BCP-47 language tag) of the localized listing whose images are to read or modified. For example, to select Austrian German, pass \"de-AT\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/listings/{language}/{imageType}",
+	//   "response": {
+	//     "$ref": "ImagesDeleteAllResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.images.list":
+
+type EditsImagesListCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	language      string
+	imageType     string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// List: Lists all images for the specified language and image type.
+func (r *EditsImagesService) List(packageNameid string, editId string, language string, imageType string) *EditsImagesListCall {
+	c := &EditsImagesListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.language = language
+	c.imageType = imageType
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsImagesListCall) Fields(s ...googleapi.Field) *EditsImagesListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *EditsImagesListCall) IfNoneMatch(entityTag string) *EditsImagesListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsImagesListCall) Context(ctx context.Context) *EditsImagesListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsImagesListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsImagesListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}/{imageType}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"language":    c.language,
+		"imageType":   c.imageType,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.images.list" call.
+// Exactly one of *ImagesListResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ImagesListResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsImagesListCall) Do(opts ...googleapi.CallOption) (*ImagesListResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ImagesListResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists all images for the specified language and image type.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.edits.images.list",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "language",
+	//     "imageType"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "imageType": {
+	//       "enum": [
+	//         "featureGraphic",
+	//         "icon",
+	//         "phoneScreenshots",
+	//         "promoGraphic",
+	//         "sevenInchScreenshots",
+	//         "tenInchScreenshots",
+	//         "tvBanner",
+	//         "tvScreenshots",
+	//         "wearScreenshots"
+	//       ],
+	//       "enumDescriptions": [
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         ""
+	//       ],
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "language": {
+	//       "description": "The language code (a BCP-47 language tag) of the localized listing whose images are to read or modified. For example, to select Austrian German, pass \"de-AT\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/listings/{language}/{imageType}",
+	//   "response": {
+	//     "$ref": "ImagesListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.images.upload":
+
+type EditsImagesUploadCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	language      string
+	imageType     string
+	urlParams_    gensupport.URLParams
+	mediaInfo_    *gensupport.MediaInfo
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Upload: Uploads a new image and adds it to the list of images for the
+// specified language and image type.
+func (r *EditsImagesService) Upload(packageNameid string, editId string, language string, imageType string) *EditsImagesUploadCall {
+	c := &EditsImagesUploadCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.language = language
+	c.imageType = imageType
+	return c
+}
+
+// Media specifies the media to upload in one or more chunks. The chunk
+// size may be controlled by supplying a MediaOption generated by
+// googleapi.ChunkSize. The chunk size defaults to
+// googleapi.DefaultUploadChunkSize.The Content-Type header used in the
+// upload request will be determined by sniffing the contents of r,
+// unless a MediaOption generated by googleapi.ContentType is
+// supplied.
+// At most one of Media and ResumableMedia may be set.
+func (c *EditsImagesUploadCall) Media(r io.Reader, options ...googleapi.MediaOption) *EditsImagesUploadCall {
+	c.mediaInfo_ = gensupport.NewInfoFromMedia(r, options)
+	return c
+}
+
+// ResumableMedia specifies the media to upload in chunks and can be
+// canceled with ctx.
+//
+// Deprecated: use Media instead.
+//
+// At most one of Media and ResumableMedia may be set. mediaType
+// identifies the MIME media type of the upload, such as "image/png". If
+// mediaType is "", it will be auto-detected. The provided ctx will
+// supersede any context previously provided to the Context method.
+func (c *EditsImagesUploadCall) ResumableMedia(ctx context.Context, r io.ReaderAt, size int64, mediaType string) *EditsImagesUploadCall {
+	c.ctx_ = ctx
+	c.mediaInfo_ = gensupport.NewInfoFromResumableMedia(r, size, mediaType)
+	return c
+}
+
+// ProgressUpdater provides a callback function that will be called
+// after every chunk. It should be a low-latency function in order to
+// not slow down the upload operation. This should only be called when
+// using ResumableMedia (as opposed to Media).
+func (c *EditsImagesUploadCall) ProgressUpdater(pu googleapi.ProgressUpdater) *EditsImagesUploadCall {
+	c.mediaInfo_.SetProgressUpdater(pu)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsImagesUploadCall) Fields(s ...googleapi.Field) *EditsImagesUploadCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+// This context will supersede any context previously provided to the
+// ResumableMedia method.
+func (c *EditsImagesUploadCall) Context(ctx context.Context) *EditsImagesUploadCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsImagesUploadCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsImagesUploadCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}/{imageType}")
+	if c.mediaInfo_ != nil {
+		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
+		c.urlParams_.Set("uploadType", c.mediaInfo_.UploadType())
+	}
+	if body == nil {
+		body = new(bytes.Buffer)
+		reqHeaders.Set("Content-Type", "application/json")
+	}
+	body, getBody, cleanup := c.mediaInfo_.UploadRequest(reqHeaders, body)
+	defer cleanup()
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	gensupport.SetGetBody(req, getBody)
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"language":    c.language,
+		"imageType":   c.imageType,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.images.upload" call.
+// Exactly one of *ImagesUploadResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ImagesUploadResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsImagesUploadCall) Do(opts ...googleapi.CallOption) (*ImagesUploadResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	rx := c.mediaInfo_.ResumableUpload(res.Header.Get("Location"))
+	if rx != nil {
+		rx.Client = c.s.client
+		rx.UserAgent = c.s.userAgent()
+		ctx := c.ctx_
+		if ctx == nil {
+			ctx = context.TODO()
+		}
+		res, err = rx.Upload(ctx)
+		if err != nil {
+			return nil, err
+		}
+		defer res.Body.Close()
+		if err := googleapi.CheckResponse(res); err != nil {
+			return nil, err
+		}
+	}
+	ret := &ImagesUploadResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Uploads a new image and adds it to the list of images for the specified language and image type.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.edits.images.upload",
+	//   "mediaUpload": {
+	//     "accept": [
+	//       "image/*"
+	//     ],
+	//     "maxSize": "15MB",
+	//     "protocols": {
+	//       "resumable": {
+	//         "multipart": true,
+	//         "path": "/resumable/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}"
+	//       },
+	//       "simple": {
+	//         "multipart": true,
+	//         "path": "/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}"
+	//       }
+	//     }
+	//   },
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "language",
+	//     "imageType"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "imageType": {
+	//       "enum": [
+	//         "featureGraphic",
+	//         "icon",
+	//         "phoneScreenshots",
+	//         "promoGraphic",
+	//         "sevenInchScreenshots",
+	//         "tenInchScreenshots",
+	//         "tvBanner",
+	//         "tvScreenshots",
+	//         "wearScreenshots"
+	//       ],
+	//       "enumDescriptions": [
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         "",
+	//         ""
+	//       ],
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "language": {
+	//       "description": "The language code (a BCP-47 language tag) of the localized listing whose images are to read or modified. For example, to select Austrian German, pass \"de-AT\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/listings/{language}/{imageType}",
+	//   "response": {
+	//     "$ref": "ImagesUploadResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ],
+	//   "supportsMediaUpload": true
+	// }
+
+}
+
+// method id "androidpublisher.edits.listings.delete":
+
+type EditsListingsDeleteCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	language      string
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Delete: Deletes the specified localized store listing from an edit.
+func (r *EditsListingsService) Delete(packageNameid string, editId string, language string) *EditsListingsDeleteCall {
+	c := &EditsListingsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.language = language
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsListingsDeleteCall) Fields(s ...googleapi.Field) *EditsListingsDeleteCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsListingsDeleteCall) Context(ctx context.Context) *EditsListingsDeleteCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsListingsDeleteCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsListingsDeleteCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"language":    c.language,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.listings.delete" call.
+func (c *EditsListingsDeleteCall) Do(opts ...googleapi.CallOption) error {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Deletes the specified localized store listing from an edit.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidpublisher.edits.listings.delete",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "language"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "language": {
+	//       "description": "The language code (a BCP-47 language tag) of the localized listing to read or modify. For example, to select Austrian German, pass \"de-AT\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/listings/{language}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.listings.deleteall":
+
+type EditsListingsDeleteallCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Deleteall: Deletes all localized listings from an edit.
+func (r *EditsListingsService) Deleteall(packageNameid string, editId string) *EditsListingsDeleteallCall {
+	c := &EditsListingsDeleteallCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsListingsDeleteallCall) Fields(s ...googleapi.Field) *EditsListingsDeleteallCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsListingsDeleteallCall) Context(ctx context.Context) *EditsListingsDeleteallCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsListingsDeleteallCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsListingsDeleteallCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.listings.deleteall" call.
+func (c *EditsListingsDeleteallCall) Do(opts ...googleapi.CallOption) error {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Deletes all localized listings from an edit.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidpublisher.edits.listings.deleteall",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/listings",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.listings.get":
+
+type EditsListingsGetCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	language      string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Get: Fetches information about a localized store listing.
+func (r *EditsListingsService) Get(packageNameid string, editId string, language string) *EditsListingsGetCall {
+	c := &EditsListingsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.language = language
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsListingsGetCall) Fields(s ...googleapi.Field) *EditsListingsGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *EditsListingsGetCall) IfNoneMatch(entityTag string) *EditsListingsGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsListingsGetCall) Context(ctx context.Context) *EditsListingsGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsListingsGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsListingsGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"language":    c.language,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.listings.get" call.
+// Exactly one of *Listing or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Listing.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsListingsGetCall) Do(opts ...googleapi.CallOption) (*Listing, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Listing{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Fetches information about a localized store listing.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.edits.listings.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "language"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "language": {
+	//       "description": "The language code (a BCP-47 language tag) of the localized listing to read or modify. For example, to select Austrian German, pass \"de-AT\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/listings/{language}",
+	//   "response": {
+	//     "$ref": "Listing"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.listings.list":
+
+type EditsListingsListCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// List: Returns all of the localized store listings attached to this
+// edit.
+func (r *EditsListingsService) List(packageNameid string, editId string) *EditsListingsListCall {
+	c := &EditsListingsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsListingsListCall) Fields(s ...googleapi.Field) *EditsListingsListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *EditsListingsListCall) IfNoneMatch(entityTag string) *EditsListingsListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsListingsListCall) Context(ctx context.Context) *EditsListingsListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsListingsListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsListingsListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.listings.list" call.
+// Exactly one of *ListingsListResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ListingsListResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsListingsListCall) Do(opts ...googleapi.CallOption) (*ListingsListResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ListingsListResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns all of the localized store listings attached to this edit.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.edits.listings.list",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/listings",
+	//   "response": {
+	//     "$ref": "ListingsListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.listings.patch":
+
+type EditsListingsPatchCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	language      string
+	listing       *Listing
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Patch: Creates or updates a localized store listing. This method
+// supports patch semantics.
+func (r *EditsListingsService) Patch(packageNameid string, editId string, language string, listing *Listing) *EditsListingsPatchCall {
+	c := &EditsListingsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.language = language
+	c.listing = listing
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsListingsPatchCall) Fields(s ...googleapi.Field) *EditsListingsPatchCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsListingsPatchCall) Context(ctx context.Context) *EditsListingsPatchCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsListingsPatchCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsListingsPatchCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.listing)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"language":    c.language,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.listings.patch" call.
+// Exactly one of *Listing or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Listing.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsListingsPatchCall) Do(opts ...googleapi.CallOption) (*Listing, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Listing{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates or updates a localized store listing. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "androidpublisher.edits.listings.patch",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "language"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "language": {
+	//       "description": "The language code (a BCP-47 language tag) of the localized listing to read or modify. For example, to select Austrian German, pass \"de-AT\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/listings/{language}",
+	//   "request": {
+	//     "$ref": "Listing"
+	//   },
+	//   "response": {
+	//     "$ref": "Listing"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.listings.update":
+
+type EditsListingsUpdateCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	language      string
+	listing       *Listing
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Update: Creates or updates a localized store listing.
+func (r *EditsListingsService) Update(packageNameid string, editId string, language string, listing *Listing) *EditsListingsUpdateCall {
+	c := &EditsListingsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.language = language
+	c.listing = listing
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsListingsUpdateCall) Fields(s ...googleapi.Field) *EditsListingsUpdateCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsListingsUpdateCall) Context(ctx context.Context) *EditsListingsUpdateCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsListingsUpdateCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsListingsUpdateCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.listing)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"language":    c.language,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.listings.update" call.
+// Exactly one of *Listing or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Listing.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsListingsUpdateCall) Do(opts ...googleapi.CallOption) (*Listing, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Listing{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates or updates a localized store listing.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidpublisher.edits.listings.update",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "language"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "language": {
+	//       "description": "The language code (a BCP-47 language tag) of the localized listing to read or modify. For example, to select Austrian German, pass \"de-AT\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/listings/{language}",
+	//   "request": {
+	//     "$ref": "Listing"
+	//   },
+	//   "response": {
+	//     "$ref": "Listing"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.testers.get":
+
+type EditsTestersGetCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	track         string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Get:
+func (r *EditsTestersService) Get(packageNameid string, editId string, track string) *EditsTestersGetCall {
+	c := &EditsTestersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.track = track
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsTestersGetCall) Fields(s ...googleapi.Field) *EditsTestersGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *EditsTestersGetCall) IfNoneMatch(entityTag string) *EditsTestersGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsTestersGetCall) Context(ctx context.Context) *EditsTestersGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsTestersGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsTestersGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/testers/{track}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"track":       c.track,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.testers.get" call.
+// Exactly one of *Testers or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Testers.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsTestersGetCall) Do(opts ...googleapi.CallOption) (*Testers, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Testers{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.edits.testers.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "track"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "track": {
+	//       "description": "The track to read or modify. Acceptable values are: \"alpha\", \"beta\", \"production\", \"rollout\" or \"internal\".",
+	//       "location": "path",
+	//       "pattern": "(alpha|beta|production|rollout|internal)",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/testers/{track}",
+	//   "response": {
+	//     "$ref": "Testers"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.testers.patch":
+
+type EditsTestersPatchCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	track         string
+	testers       *Testers
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Patch:
+func (r *EditsTestersService) Patch(packageNameid string, editId string, track string, testers *Testers) *EditsTestersPatchCall {
+	c := &EditsTestersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.track = track
+	c.testers = testers
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsTestersPatchCall) Fields(s ...googleapi.Field) *EditsTestersPatchCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsTestersPatchCall) Context(ctx context.Context) *EditsTestersPatchCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsTestersPatchCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsTestersPatchCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testers)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/testers/{track}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"track":       c.track,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.testers.patch" call.
+// Exactly one of *Testers or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Testers.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsTestersPatchCall) Do(opts ...googleapi.CallOption) (*Testers, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Testers{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "httpMethod": "PATCH",
+	//   "id": "androidpublisher.edits.testers.patch",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "track"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "track": {
+	//       "description": "The track to read or modify. Acceptable values are: \"alpha\", \"beta\", \"production\", \"rollout\" or \"internal\".",
+	//       "location": "path",
+	//       "pattern": "(alpha|beta|production|rollout|internal)",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/testers/{track}",
+	//   "request": {
+	//     "$ref": "Testers"
+	//   },
+	//   "response": {
+	//     "$ref": "Testers"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.testers.update":
+
+type EditsTestersUpdateCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	track         string
+	testers       *Testers
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Update:
+func (r *EditsTestersService) Update(packageNameid string, editId string, track string, testers *Testers) *EditsTestersUpdateCall {
+	c := &EditsTestersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.track = track
+	c.testers = testers
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsTestersUpdateCall) Fields(s ...googleapi.Field) *EditsTestersUpdateCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsTestersUpdateCall) Context(ctx context.Context) *EditsTestersUpdateCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsTestersUpdateCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsTestersUpdateCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testers)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/testers/{track}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"track":       c.track,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.testers.update" call.
+// Exactly one of *Testers or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Testers.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsTestersUpdateCall) Do(opts ...googleapi.CallOption) (*Testers, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Testers{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "httpMethod": "PUT",
+	//   "id": "androidpublisher.edits.testers.update",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "track"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "track": {
+	//       "description": "The track to read or modify. Acceptable values are: \"alpha\", \"beta\", \"production\", \"rollout\" or \"internal\".",
+	//       "location": "path",
+	//       "pattern": "(alpha|beta|production|rollout|internal)",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/testers/{track}",
+	//   "request": {
+	//     "$ref": "Testers"
+	//   },
+	//   "response": {
+	//     "$ref": "Testers"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.tracks.get":
+
+type EditsTracksGetCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	track         string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Get: Fetches the track configuration for the specified track type.
+// Includes the APK version codes that are in this track.
+func (r *EditsTracksService) Get(packageNameid string, editId string, track string) *EditsTracksGetCall {
+	c := &EditsTracksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.track = track
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsTracksGetCall) Fields(s ...googleapi.Field) *EditsTracksGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *EditsTracksGetCall) IfNoneMatch(entityTag string) *EditsTracksGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsTracksGetCall) Context(ctx context.Context) *EditsTracksGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsTracksGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsTracksGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/tracks/{track}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"track":       c.track,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.tracks.get" call.
+// Exactly one of *Track or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Track.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsTracksGetCall) Do(opts ...googleapi.CallOption) (*Track, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Track{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Fetches the track configuration for the specified track type. Includes the APK version codes that are in this track.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.edits.tracks.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "track"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "track": {
+	//       "description": "The track to read or modify.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/tracks/{track}",
+	//   "response": {
+	//     "$ref": "Track"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.tracks.list":
+
+type EditsTracksListCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// List: Lists all the track configurations for this edit.
+func (r *EditsTracksService) List(packageNameid string, editId string) *EditsTracksListCall {
+	c := &EditsTracksListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsTracksListCall) Fields(s ...googleapi.Field) *EditsTracksListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *EditsTracksListCall) IfNoneMatch(entityTag string) *EditsTracksListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsTracksListCall) Context(ctx context.Context) *EditsTracksListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsTracksListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsTracksListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/tracks")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.tracks.list" call.
+// Exactly one of *TracksListResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *TracksListResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *EditsTracksListCall) Do(opts ...googleapi.CallOption) (*TracksListResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &TracksListResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists all the track configurations for this edit.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.edits.tracks.list",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/tracks",
+	//   "response": {
+	//     "$ref": "TracksListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.tracks.patch":
+
+type EditsTracksPatchCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	track         string
+	track2        *Track
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Patch: Updates the track configuration for the specified track type.
+// When halted, the rollout track cannot be updated without adding new
+// APKs, and adding new APKs will cause it to resume. This method
+// supports patch semantics.
+func (r *EditsTracksService) Patch(packageNameid string, editId string, track string, track2 *Track) *EditsTracksPatchCall {
+	c := &EditsTracksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.track = track
+	c.track2 = track2
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsTracksPatchCall) Fields(s ...googleapi.Field) *EditsTracksPatchCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsTracksPatchCall) Context(ctx context.Context) *EditsTracksPatchCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsTracksPatchCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsTracksPatchCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.track2)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/tracks/{track}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"track":       c.track,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.tracks.patch" call.
+// Exactly one of *Track or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Track.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsTracksPatchCall) Do(opts ...googleapi.CallOption) (*Track, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Track{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates the track configuration for the specified track type. When halted, the rollout track cannot be updated without adding new APKs, and adding new APKs will cause it to resume. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "androidpublisher.edits.tracks.patch",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "track"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "track": {
+	//       "description": "The track to read or modify.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/tracks/{track}",
+	//   "request": {
+	//     "$ref": "Track"
+	//   },
+	//   "response": {
+	//     "$ref": "Track"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.edits.tracks.update":
+
+type EditsTracksUpdateCall struct {
+	s             *Service
+	packageNameid string
+	editId        string
+	track         string
+	track2        *Track
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Update: Updates the track configuration for the specified track type.
+// When halted, the rollout track cannot be updated without adding new
+// APKs, and adding new APKs will cause it to resume.
+func (r *EditsTracksService) Update(packageNameid string, editId string, track string, track2 *Track) *EditsTracksUpdateCall {
+	c := &EditsTracksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.editId = editId
+	c.track = track
+	c.track2 = track2
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EditsTracksUpdateCall) Fields(s ...googleapi.Field) *EditsTracksUpdateCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *EditsTracksUpdateCall) Context(ctx context.Context) *EditsTracksUpdateCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *EditsTracksUpdateCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *EditsTracksUpdateCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.track2)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/tracks/{track}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"editId":      c.editId,
+		"track":       c.track,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.edits.tracks.update" call.
+// Exactly one of *Track or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Track.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *EditsTracksUpdateCall) Do(opts ...googleapi.CallOption) (*Track, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Track{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates the track configuration for the specified track type. When halted, the rollout track cannot be updated without adding new APKs, and adding new APKs will cause it to resume.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidpublisher.edits.tracks.update",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "editId",
+	//     "track"
+	//   ],
+	//   "parameters": {
+	//     "editId": {
+	//       "description": "Unique identifier for this edit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app that is being updated; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "track": {
+	//       "description": "The track to read or modify.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/edits/{editId}/tracks/{track}",
+	//   "request": {
+	//     "$ref": "Track"
+	//   },
+	//   "response": {
+	//     "$ref": "Track"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.inappproducts.delete":
+
+type InappproductsDeleteCall struct {
+	s             *Service
+	packageNameid string
+	skuid         string
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Delete: Delete an in-app product for an app.
+func (r *InappproductsService) Delete(packageNameid string, skuid string) *InappproductsDeleteCall {
+	c := &InappproductsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.skuid = skuid
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InappproductsDeleteCall) Fields(s ...googleapi.Field) *InappproductsDeleteCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *InappproductsDeleteCall) Context(ctx context.Context) *InappproductsDeleteCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *InappproductsDeleteCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *InappproductsDeleteCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/inappproducts/{sku}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"sku":         c.skuid,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.inappproducts.delete" call.
+func (c *InappproductsDeleteCall) Do(opts ...googleapi.CallOption) error {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Delete an in-app product for an app.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidpublisher.inappproducts.delete",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "sku"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app with the in-app product; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "sku": {
+	//       "description": "Unique identifier for the in-app product.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/inappproducts/{sku}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.inappproducts.get":
+
+type InappproductsGetCall struct {
+	s            *Service
+	packageName  string
+	skuid        string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// Get: Returns information about the in-app product specified.
+func (r *InappproductsService) Get(packageName string, skuid string) *InappproductsGetCall {
+	c := &InappproductsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageName = packageName
+	c.skuid = skuid
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InappproductsGetCall) Fields(s ...googleapi.Field) *InappproductsGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *InappproductsGetCall) IfNoneMatch(entityTag string) *InappproductsGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *InappproductsGetCall) Context(ctx context.Context) *InappproductsGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *InappproductsGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *InappproductsGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/inappproducts/{sku}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageName,
+		"sku":         c.skuid,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.inappproducts.get" call.
+// Exactly one of *InAppProduct or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *InAppProduct.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *InappproductsGetCall) Do(opts ...googleapi.CallOption) (*InAppProduct, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &InAppProduct{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns information about the in-app product specified.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.inappproducts.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "sku"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "sku": {
+	//       "description": "Unique identifier for the in-app product.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/inappproducts/{sku}",
+	//   "response": {
+	//     "$ref": "InAppProduct"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.inappproducts.insert":
+
+type InappproductsInsertCall struct {
+	s             *Service
+	packageNameid string
+	inappproduct  *InAppProduct
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Insert: Creates a new in-app product for an app.
+func (r *InappproductsService) Insert(packageNameid string, inappproduct *InAppProduct) *InappproductsInsertCall {
+	c := &InappproductsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.inappproduct = inappproduct
+	return c
+}
+
+// AutoConvertMissingPrices sets the optional parameter
+// "autoConvertMissingPrices": If true the prices for all regions
+// targeted by the parent app that don't have a price specified for this
+// in-app product will be auto converted to the target currency based on
+// the default price. Defaults to false.
+func (c *InappproductsInsertCall) AutoConvertMissingPrices(autoConvertMissingPrices bool) *InappproductsInsertCall {
+	c.urlParams_.Set("autoConvertMissingPrices", fmt.Sprint(autoConvertMissingPrices))
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InappproductsInsertCall) Fields(s ...googleapi.Field) *InappproductsInsertCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *InappproductsInsertCall) Context(ctx context.Context) *InappproductsInsertCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *InappproductsInsertCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *InappproductsInsertCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.inappproduct)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/inappproducts")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.inappproducts.insert" call.
+// Exactly one of *InAppProduct or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *InAppProduct.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *InappproductsInsertCall) Do(opts ...googleapi.CallOption) (*InAppProduct, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &InAppProduct{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates a new in-app product for an app.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.inappproducts.insert",
+	//   "parameterOrder": [
+	//     "packageName"
+	//   ],
+	//   "parameters": {
+	//     "autoConvertMissingPrices": {
+	//       "description": "If true the prices for all regions targeted by the parent app that don't have a price specified for this in-app product will be auto converted to the target currency based on the default price. Defaults to false.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/inappproducts",
+	//   "request": {
+	//     "$ref": "InAppProduct"
+	//   },
+	//   "response": {
+	//     "$ref": "InAppProduct"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.inappproducts.list":
+
+type InappproductsListCall struct {
+	s             *Service
+	packageNameid string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// List: List all the in-app products for an Android app, both
+// subscriptions and managed in-app products..
+func (r *InappproductsService) List(packageNameid string) *InappproductsListCall {
+	c := &InappproductsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults":
+func (c *InappproductsListCall) MaxResults(maxResults int64) *InappproductsListCall {
+	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
+	return c
+}
+
+// StartIndex sets the optional parameter "startIndex":
+func (c *InappproductsListCall) StartIndex(startIndex int64) *InappproductsListCall {
+	c.urlParams_.Set("startIndex", fmt.Sprint(startIndex))
+	return c
+}
+
+// Token sets the optional parameter "token":
+func (c *InappproductsListCall) Token(token string) *InappproductsListCall {
+	c.urlParams_.Set("token", token)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InappproductsListCall) Fields(s ...googleapi.Field) *InappproductsListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *InappproductsListCall) IfNoneMatch(entityTag string) *InappproductsListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *InappproductsListCall) Context(ctx context.Context) *InappproductsListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *InappproductsListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *InappproductsListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/inappproducts")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.inappproducts.list" call.
+// Exactly one of *InappproductsListResponse or error will be non-nil.
+// Any non-2xx status code is an error. Response headers are in either
+// *InappproductsListResponse.ServerResponse.Header or (if a response
+// was returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *InappproductsListCall) Do(opts ...googleapi.CallOption) (*InappproductsListResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &InappproductsListResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all the in-app products for an Android app, both subscriptions and managed in-app products..",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.inappproducts.list",
+	//   "parameterOrder": [
+	//     "packageName"
+	//   ],
+	//   "parameters": {
+	//     "maxResults": {
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "type": "integer"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app with in-app products; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "startIndex": {
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "type": "integer"
+	//     },
+	//     "token": {
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/inappproducts",
+	//   "response": {
+	//     "$ref": "InappproductsListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.inappproducts.patch":
+
+type InappproductsPatchCall struct {
+	s             *Service
+	packageNameid string
+	skuid         string
+	inappproduct  *InAppProduct
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Patch: Updates the details of an in-app product. This method supports
+// patch semantics.
+func (r *InappproductsService) Patch(packageNameid string, skuid string, inappproduct *InAppProduct) *InappproductsPatchCall {
+	c := &InappproductsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.skuid = skuid
+	c.inappproduct = inappproduct
+	return c
+}
+
+// AutoConvertMissingPrices sets the optional parameter
+// "autoConvertMissingPrices": If true the prices for all regions
+// targeted by the parent app that don't have a price specified for this
+// in-app product will be auto converted to the target currency based on
+// the default price. Defaults to false.
+func (c *InappproductsPatchCall) AutoConvertMissingPrices(autoConvertMissingPrices bool) *InappproductsPatchCall {
+	c.urlParams_.Set("autoConvertMissingPrices", fmt.Sprint(autoConvertMissingPrices))
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InappproductsPatchCall) Fields(s ...googleapi.Field) *InappproductsPatchCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *InappproductsPatchCall) Context(ctx context.Context) *InappproductsPatchCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *InappproductsPatchCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *InappproductsPatchCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.inappproduct)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/inappproducts/{sku}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"sku":         c.skuid,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.inappproducts.patch" call.
+// Exactly one of *InAppProduct or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *InAppProduct.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *InappproductsPatchCall) Do(opts ...googleapi.CallOption) (*InAppProduct, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &InAppProduct{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates the details of an in-app product. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "androidpublisher.inappproducts.patch",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "sku"
+	//   ],
+	//   "parameters": {
+	//     "autoConvertMissingPrices": {
+	//       "description": "If true the prices for all regions targeted by the parent app that don't have a price specified for this in-app product will be auto converted to the target currency based on the default price. Defaults to false.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app with the in-app product; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "sku": {
+	//       "description": "Unique identifier for the in-app product.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/inappproducts/{sku}",
+	//   "request": {
+	//     "$ref": "InAppProduct"
+	//   },
+	//   "response": {
+	//     "$ref": "InAppProduct"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.inappproducts.update":
+
+type InappproductsUpdateCall struct {
+	s             *Service
+	packageNameid string
+	skuid         string
+	inappproduct  *InAppProduct
+	urlParams_    gensupport.URLParams
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Update: Updates the details of an in-app product.
+func (r *InappproductsService) Update(packageNameid string, skuid string, inappproduct *InAppProduct) *InappproductsUpdateCall {
+	c := &InappproductsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.skuid = skuid
+	c.inappproduct = inappproduct
+	return c
+}
+
+// AutoConvertMissingPrices sets the optional parameter
+// "autoConvertMissingPrices": If true the prices for all regions
+// targeted by the parent app that don't have a price specified for this
+// in-app product will be auto converted to the target currency based on
+// the default price. Defaults to false.
+func (c *InappproductsUpdateCall) AutoConvertMissingPrices(autoConvertMissingPrices bool) *InappproductsUpdateCall {
+	c.urlParams_.Set("autoConvertMissingPrices", fmt.Sprint(autoConvertMissingPrices))
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InappproductsUpdateCall) Fields(s ...googleapi.Field) *InappproductsUpdateCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *InappproductsUpdateCall) Context(ctx context.Context) *InappproductsUpdateCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *InappproductsUpdateCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *InappproductsUpdateCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.inappproduct)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/inappproducts/{sku}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"sku":         c.skuid,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.inappproducts.update" call.
+// Exactly one of *InAppProduct or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *InAppProduct.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *InappproductsUpdateCall) Do(opts ...googleapi.CallOption) (*InAppProduct, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &InAppProduct{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates the details of an in-app product.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidpublisher.inappproducts.update",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "sku"
+	//   ],
+	//   "parameters": {
+	//     "autoConvertMissingPrices": {
+	//       "description": "If true the prices for all regions targeted by the parent app that don't have a price specified for this in-app product will be auto converted to the target currency based on the default price. Defaults to false.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app with the in-app product; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "sku": {
+	//       "description": "Unique identifier for the in-app product.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/inappproducts/{sku}",
+	//   "request": {
+	//     "$ref": "InAppProduct"
+	//   },
+	//   "response": {
+	//     "$ref": "InAppProduct"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.purchases.products.get":
+
+type PurchasesProductsGetCall struct {
+	s            *Service
+	packageName  string
+	productId    string
+	token        string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// Get: Checks the purchase and consumption status of an inapp item.
+func (r *PurchasesProductsService) Get(packageName string, productId string, token string) *PurchasesProductsGetCall {
+	c := &PurchasesProductsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageName = packageName
+	c.productId = productId
+	c.token = token
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *PurchasesProductsGetCall) Fields(s ...googleapi.Field) *PurchasesProductsGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *PurchasesProductsGetCall) IfNoneMatch(entityTag string) *PurchasesProductsGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *PurchasesProductsGetCall) Context(ctx context.Context) *PurchasesProductsGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *PurchasesProductsGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *PurchasesProductsGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/purchases/products/{productId}/tokens/{token}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageName,
+		"productId":   c.productId,
+		"token":       c.token,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.purchases.products.get" call.
+// Exactly one of *ProductPurchase or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *ProductPurchase.ServerResponse.Header or (if a response was returned
+// at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *PurchasesProductsGetCall) Do(opts ...googleapi.CallOption) (*ProductPurchase, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ProductPurchase{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Checks the purchase and consumption status of an inapp item.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.purchases.products.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "productId",
+	//     "token"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "The package name of the application the inapp product was sold in (for example, 'com.some.thing').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "productId": {
+	//       "description": "The inapp product SKU (for example, 'com.some.thing.inapp1').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "token": {
+	//       "description": "The token provided to the user's device when the inapp product was purchased.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/purchases/products/{productId}/tokens/{token}",
+	//   "response": {
+	//     "$ref": "ProductPurchase"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.purchases.subscriptions.cancel":
+
+type PurchasesSubscriptionsCancelCall struct {
+	s              *Service
+	packageName    string
+	subscriptionId string
+	token          string
+	urlParams_     gensupport.URLParams
+	ctx_           context.Context
+	header_        http.Header
+}
+
+// Cancel: Cancels a user's subscription purchase. The subscription
+// remains valid until its expiration time.
+func (r *PurchasesSubscriptionsService) Cancel(packageName string, subscriptionId string, token string) *PurchasesSubscriptionsCancelCall {
+	c := &PurchasesSubscriptionsCancelCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageName = packageName
+	c.subscriptionId = subscriptionId
+	c.token = token
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *PurchasesSubscriptionsCancelCall) Fields(s ...googleapi.Field) *PurchasesSubscriptionsCancelCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *PurchasesSubscriptionsCancelCall) Context(ctx context.Context) *PurchasesSubscriptionsCancelCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *PurchasesSubscriptionsCancelCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *PurchasesSubscriptionsCancelCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:cancel")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName":    c.packageName,
+		"subscriptionId": c.subscriptionId,
+		"token":          c.token,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.purchases.subscriptions.cancel" call.
+func (c *PurchasesSubscriptionsCancelCall) Do(opts ...googleapi.CallOption) error {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Cancels a user's subscription purchase. The subscription remains valid until its expiration time.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.purchases.subscriptions.cancel",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "subscriptionId",
+	//     "token"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "subscriptionId": {
+	//       "description": "The purchased subscription ID (for example, 'monthly001').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "token": {
+	//       "description": "The token provided to the user's device when the subscription was purchased.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:cancel",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.purchases.subscriptions.defer":
+
+type PurchasesSubscriptionsDeferCall struct {
+	s                                 *Service
+	packageName                       string
+	subscriptionId                    string
+	token                             string
+	subscriptionpurchasesdeferrequest *SubscriptionPurchasesDeferRequest
+	urlParams_                        gensupport.URLParams
+	ctx_                              context.Context
+	header_                           http.Header
+}
+
+// Defer: Defers a user's subscription purchase until a specified future
+// expiration time.
+func (r *PurchasesSubscriptionsService) Defer(packageName string, subscriptionId string, token string, subscriptionpurchasesdeferrequest *SubscriptionPurchasesDeferRequest) *PurchasesSubscriptionsDeferCall {
+	c := &PurchasesSubscriptionsDeferCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageName = packageName
+	c.subscriptionId = subscriptionId
+	c.token = token
+	c.subscriptionpurchasesdeferrequest = subscriptionpurchasesdeferrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *PurchasesSubscriptionsDeferCall) Fields(s ...googleapi.Field) *PurchasesSubscriptionsDeferCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *PurchasesSubscriptionsDeferCall) Context(ctx context.Context) *PurchasesSubscriptionsDeferCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *PurchasesSubscriptionsDeferCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *PurchasesSubscriptionsDeferCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscriptionpurchasesdeferrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:defer")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName":    c.packageName,
+		"subscriptionId": c.subscriptionId,
+		"token":          c.token,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.purchases.subscriptions.defer" call.
+// Exactly one of *SubscriptionPurchasesDeferResponse or error will be
+// non-nil. Any non-2xx status code is an error. Response headers are in
+// either *SubscriptionPurchasesDeferResponse.ServerResponse.Header or
+// (if a response was returned at all) in
+// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check
+// whether the returned error was because http.StatusNotModified was
+// returned.
+func (c *PurchasesSubscriptionsDeferCall) Do(opts ...googleapi.CallOption) (*SubscriptionPurchasesDeferResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &SubscriptionPurchasesDeferResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Defers a user's subscription purchase until a specified future expiration time.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.purchases.subscriptions.defer",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "subscriptionId",
+	//     "token"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "subscriptionId": {
+	//       "description": "The purchased subscription ID (for example, 'monthly001').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "token": {
+	//       "description": "The token provided to the user's device when the subscription was purchased.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:defer",
+	//   "request": {
+	//     "$ref": "SubscriptionPurchasesDeferRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "SubscriptionPurchasesDeferResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.purchases.subscriptions.get":
+
+type PurchasesSubscriptionsGetCall struct {
+	s              *Service
+	packageName    string
+	subscriptionId string
+	token          string
+	urlParams_     gensupport.URLParams
+	ifNoneMatch_   string
+	ctx_           context.Context
+	header_        http.Header
+}
+
+// Get: Checks whether a user's subscription purchase is valid and
+// returns its expiry time.
+func (r *PurchasesSubscriptionsService) Get(packageName string, subscriptionId string, token string) *PurchasesSubscriptionsGetCall {
+	c := &PurchasesSubscriptionsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageName = packageName
+	c.subscriptionId = subscriptionId
+	c.token = token
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *PurchasesSubscriptionsGetCall) Fields(s ...googleapi.Field) *PurchasesSubscriptionsGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *PurchasesSubscriptionsGetCall) IfNoneMatch(entityTag string) *PurchasesSubscriptionsGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *PurchasesSubscriptionsGetCall) Context(ctx context.Context) *PurchasesSubscriptionsGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *PurchasesSubscriptionsGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *PurchasesSubscriptionsGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName":    c.packageName,
+		"subscriptionId": c.subscriptionId,
+		"token":          c.token,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.purchases.subscriptions.get" call.
+// Exactly one of *SubscriptionPurchase or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *SubscriptionPurchase.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *PurchasesSubscriptionsGetCall) Do(opts ...googleapi.CallOption) (*SubscriptionPurchase, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &SubscriptionPurchase{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Checks whether a user's subscription purchase is valid and returns its expiry time.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.purchases.subscriptions.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "subscriptionId",
+	//     "token"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "subscriptionId": {
+	//       "description": "The purchased subscription ID (for example, 'monthly001').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "token": {
+	//       "description": "The token provided to the user's device when the subscription was purchased.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}",
+	//   "response": {
+	//     "$ref": "SubscriptionPurchase"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.purchases.subscriptions.refund":
+
+type PurchasesSubscriptionsRefundCall struct {
+	s              *Service
+	packageName    string
+	subscriptionId string
+	token          string
+	urlParams_     gensupport.URLParams
+	ctx_           context.Context
+	header_        http.Header
+}
+
+// Refund: Refunds a user's subscription purchase, but the subscription
+// remains valid until its expiration time and it will continue to
+// recur.
+func (r *PurchasesSubscriptionsService) Refund(packageName string, subscriptionId string, token string) *PurchasesSubscriptionsRefundCall {
+	c := &PurchasesSubscriptionsRefundCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageName = packageName
+	c.subscriptionId = subscriptionId
+	c.token = token
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *PurchasesSubscriptionsRefundCall) Fields(s ...googleapi.Field) *PurchasesSubscriptionsRefundCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *PurchasesSubscriptionsRefundCall) Context(ctx context.Context) *PurchasesSubscriptionsRefundCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *PurchasesSubscriptionsRefundCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *PurchasesSubscriptionsRefundCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:refund")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName":    c.packageName,
+		"subscriptionId": c.subscriptionId,
+		"token":          c.token,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.purchases.subscriptions.refund" call.
+func (c *PurchasesSubscriptionsRefundCall) Do(opts ...googleapi.CallOption) error {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Refunds a user's subscription purchase, but the subscription remains valid until its expiration time and it will continue to recur.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.purchases.subscriptions.refund",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "subscriptionId",
+	//     "token"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "subscriptionId": {
+	//       "description": "The purchased subscription ID (for example, 'monthly001').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "token": {
+	//       "description": "The token provided to the user's device when the subscription was purchased.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:refund",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.purchases.subscriptions.revoke":
+
+type PurchasesSubscriptionsRevokeCall struct {
+	s              *Service
+	packageName    string
+	subscriptionId string
+	token          string
+	urlParams_     gensupport.URLParams
+	ctx_           context.Context
+	header_        http.Header
+}
+
+// Revoke: Refunds and immediately revokes a user's subscription
+// purchase. Access to the subscription will be terminated immediately
+// and it will stop recurring.
+func (r *PurchasesSubscriptionsService) Revoke(packageName string, subscriptionId string, token string) *PurchasesSubscriptionsRevokeCall {
+	c := &PurchasesSubscriptionsRevokeCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageName = packageName
+	c.subscriptionId = subscriptionId
+	c.token = token
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *PurchasesSubscriptionsRevokeCall) Fields(s ...googleapi.Field) *PurchasesSubscriptionsRevokeCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *PurchasesSubscriptionsRevokeCall) Context(ctx context.Context) *PurchasesSubscriptionsRevokeCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *PurchasesSubscriptionsRevokeCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *PurchasesSubscriptionsRevokeCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:revoke")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName":    c.packageName,
+		"subscriptionId": c.subscriptionId,
+		"token":          c.token,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.purchases.subscriptions.revoke" call.
+func (c *PurchasesSubscriptionsRevokeCall) Do(opts ...googleapi.CallOption) error {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Refunds and immediately revokes a user's subscription purchase. Access to the subscription will be terminated immediately and it will stop recurring.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.purchases.subscriptions.revoke",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "subscriptionId",
+	//     "token"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "subscriptionId": {
+	//       "description": "The purchased subscription ID (for example, 'monthly001').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "token": {
+	//       "description": "The token provided to the user's device when the subscription was purchased.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:revoke",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.purchases.voidedpurchases.list":
+
+type PurchasesVoidedpurchasesListCall struct {
+	s            *Service
+	packageName  string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// List: Lists the purchases that were canceled, refunded or
+// charged-back.
+func (r *PurchasesVoidedpurchasesService) List(packageName string) *PurchasesVoidedpurchasesListCall {
+	c := &PurchasesVoidedpurchasesListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageName = packageName
+	return c
+}
+
+// EndTime sets the optional parameter "endTime": The time, in
+// milliseconds since the Epoch, of the newest voided in-app product
+// purchase that you want to see in the response. The value of this
+// parameter cannot be greater than the current time and is ignored if a
+// pagination token is set. Default value is current time. Note: This
+// filter is applied on the time at which the record is seen as voided
+// by our systems and not the actual voided time returned in the
+// response.
+func (c *PurchasesVoidedpurchasesListCall) EndTime(endTime int64) *PurchasesVoidedpurchasesListCall {
+	c.urlParams_.Set("endTime", fmt.Sprint(endTime))
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults":
+func (c *PurchasesVoidedpurchasesListCall) MaxResults(maxResults int64) *PurchasesVoidedpurchasesListCall {
+	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
+	return c
+}
+
+// StartIndex sets the optional parameter "startIndex":
+func (c *PurchasesVoidedpurchasesListCall) StartIndex(startIndex int64) *PurchasesVoidedpurchasesListCall {
+	c.urlParams_.Set("startIndex", fmt.Sprint(startIndex))
+	return c
+}
+
+// StartTime sets the optional parameter "startTime": The time, in
+// milliseconds since the Epoch, of the oldest voided in-app product
+// purchase that you want to see in the response. The value of this
+// parameter cannot be older than 30 days and is ignored if a pagination
+// token is set. Default value is current time minus 30 days. Note: This
+// filter is applied on the time at which the record is seen as voided
+// by our systems and not the actual voided time returned in the
+// response.
+func (c *PurchasesVoidedpurchasesListCall) StartTime(startTime int64) *PurchasesVoidedpurchasesListCall {
+	c.urlParams_.Set("startTime", fmt.Sprint(startTime))
+	return c
+}
+
+// Token sets the optional parameter "token":
+func (c *PurchasesVoidedpurchasesListCall) Token(token string) *PurchasesVoidedpurchasesListCall {
+	c.urlParams_.Set("token", token)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *PurchasesVoidedpurchasesListCall) Fields(s ...googleapi.Field) *PurchasesVoidedpurchasesListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *PurchasesVoidedpurchasesListCall) IfNoneMatch(entityTag string) *PurchasesVoidedpurchasesListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *PurchasesVoidedpurchasesListCall) Context(ctx context.Context) *PurchasesVoidedpurchasesListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *PurchasesVoidedpurchasesListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *PurchasesVoidedpurchasesListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/purchases/voidedpurchases")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageName,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.purchases.voidedpurchases.list" call.
+// Exactly one of *VoidedPurchasesListResponse or error will be non-nil.
+// Any non-2xx status code is an error. Response headers are in either
+// *VoidedPurchasesListResponse.ServerResponse.Header or (if a response
+// was returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *PurchasesVoidedpurchasesListCall) Do(opts ...googleapi.CallOption) (*VoidedPurchasesListResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &VoidedPurchasesListResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists the purchases that were canceled, refunded or charged-back.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.purchases.voidedpurchases.list",
+	//   "parameterOrder": [
+	//     "packageName"
+	//   ],
+	//   "parameters": {
+	//     "endTime": {
+	//       "description": "The time, in milliseconds since the Epoch, of the newest voided in-app product purchase that you want to see in the response. The value of this parameter cannot be greater than the current time and is ignored if a pagination token is set. Default value is current time. Note: This filter is applied on the time at which the record is seen as voided by our systems and not the actual voided time returned in the response.",
+	//       "format": "int64",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "type": "integer"
+	//     },
+	//     "packageName": {
+	//       "description": "The package name of the application for which voided purchases need to be returned (for example, 'com.some.thing').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "startIndex": {
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "type": "integer"
+	//     },
+	//     "startTime": {
+	//       "description": "The time, in milliseconds since the Epoch, of the oldest voided in-app product purchase that you want to see in the response. The value of this parameter cannot be older than 30 days and is ignored if a pagination token is set. Default value is current time minus 30 days. Note: This filter is applied on the time at which the record is seen as voided by our systems and not the actual voided time returned in the response.",
+	//       "format": "int64",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "token": {
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/purchases/voidedpurchases",
+	//   "response": {
+	//     "$ref": "VoidedPurchasesListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.reviews.get":
+
+type ReviewsGetCall struct {
+	s             *Service
+	packageNameid string
+	reviewId      string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// Get: Returns a single review.
+func (r *ReviewsService) Get(packageNameid string, reviewId string) *ReviewsGetCall {
+	c := &ReviewsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.reviewId = reviewId
+	return c
+}
+
+// TranslationLanguage sets the optional parameter
+// "translationLanguage":
+func (c *ReviewsGetCall) TranslationLanguage(translationLanguage string) *ReviewsGetCall {
+	c.urlParams_.Set("translationLanguage", translationLanguage)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ReviewsGetCall) Fields(s ...googleapi.Field) *ReviewsGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *ReviewsGetCall) IfNoneMatch(entityTag string) *ReviewsGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ReviewsGetCall) Context(ctx context.Context) *ReviewsGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ReviewsGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ReviewsGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/reviews/{reviewId}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"reviewId":    c.reviewId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.reviews.get" call.
+// Exactly one of *Review or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Review.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *ReviewsGetCall) Do(opts ...googleapi.CallOption) (*Review, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Review{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns a single review.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.reviews.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "reviewId"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app for which we want reviews; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "reviewId": {
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "translationLanguage": {
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/reviews/{reviewId}",
+	//   "response": {
+	//     "$ref": "Review"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.reviews.list":
+
+type ReviewsListCall struct {
+	s             *Service
+	packageNameid string
+	urlParams_    gensupport.URLParams
+	ifNoneMatch_  string
+	ctx_          context.Context
+	header_       http.Header
+}
+
+// List: Returns a list of reviews. Only reviews from last week will be
+// returned.
+func (r *ReviewsService) List(packageNameid string) *ReviewsListCall {
+	c := &ReviewsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults":
+func (c *ReviewsListCall) MaxResults(maxResults int64) *ReviewsListCall {
+	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
+	return c
+}
+
+// StartIndex sets the optional parameter "startIndex":
+func (c *ReviewsListCall) StartIndex(startIndex int64) *ReviewsListCall {
+	c.urlParams_.Set("startIndex", fmt.Sprint(startIndex))
+	return c
+}
+
+// Token sets the optional parameter "token":
+func (c *ReviewsListCall) Token(token string) *ReviewsListCall {
+	c.urlParams_.Set("token", token)
+	return c
+}
+
+// TranslationLanguage sets the optional parameter
+// "translationLanguage":
+func (c *ReviewsListCall) TranslationLanguage(translationLanguage string) *ReviewsListCall {
+	c.urlParams_.Set("translationLanguage", translationLanguage)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ReviewsListCall) Fields(s ...googleapi.Field) *ReviewsListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *ReviewsListCall) IfNoneMatch(entityTag string) *ReviewsListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ReviewsListCall) Context(ctx context.Context) *ReviewsListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ReviewsListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ReviewsListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/reviews")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.reviews.list" call.
+// Exactly one of *ReviewsListResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ReviewsListResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *ReviewsListCall) Do(opts ...googleapi.CallOption) (*ReviewsListResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ReviewsListResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns a list of reviews. Only reviews from last week will be returned.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.reviews.list",
+	//   "parameterOrder": [
+	//     "packageName"
+	//   ],
+	//   "parameters": {
+	//     "maxResults": {
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "type": "integer"
+	//     },
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app for which we want reviews; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "startIndex": {
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "type": "integer"
+	//     },
+	//     "token": {
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "translationLanguage": {
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/reviews",
+	//   "response": {
+	//     "$ref": "ReviewsListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
+
+// method id "androidpublisher.reviews.reply":
+
+type ReviewsReplyCall struct {
+	s                   *Service
+	packageNameid       string
+	reviewId            string
+	reviewsreplyrequest *ReviewsReplyRequest
+	urlParams_          gensupport.URLParams
+	ctx_                context.Context
+	header_             http.Header
+}
+
+// Reply: Reply to a single review, or update an existing reply.
+func (r *ReviewsService) Reply(packageNameid string, reviewId string, reviewsreplyrequest *ReviewsReplyRequest) *ReviewsReplyCall {
+	c := &ReviewsReplyCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.packageNameid = packageNameid
+	c.reviewId = reviewId
+	c.reviewsreplyrequest = reviewsreplyrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ReviewsReplyCall) Fields(s ...googleapi.Field) *ReviewsReplyCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ReviewsReplyCall) Context(ctx context.Context) *ReviewsReplyCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ReviewsReplyCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ReviewsReplyCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.reviewsreplyrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/reviews/{reviewId}:reply")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"packageName": c.packageNameid,
+		"reviewId":    c.reviewId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "androidpublisher.reviews.reply" call.
+// Exactly one of *ReviewsReplyResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ReviewsReplyResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *ReviewsReplyCall) Do(opts ...googleapi.CallOption) (*ReviewsReplyResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ReviewsReplyResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Reply to a single review, or update an existing reply.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.reviews.reply",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "reviewId"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "Unique identifier for the Android app for which we want reviews; for example, \"com.spiffygame\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "reviewId": {
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/reviews/{reviewId}:reply",
+	//   "request": {
+	//     "$ref": "ReviewsReplyRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "ReviewsReplyResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidpublisher"
+	//   ]
+	// }
+
+}
diff --git a/api-list.json b/api-list.json
index 6896912..740fab3 100644
--- a/api-list.json
+++ b/api-list.json
@@ -380,6 +380,22 @@
     "x32": "https://www.google.com/images/icons/product/android-32.png"
    },
    "documentationLink": "https://developers.google.com/android-publisher",
+   "preferred": false
+  },
+  {
+   "kind": "discovery#directoryItem",
+   "id": "androidpublisher:v3",
+   "name": "androidpublisher",
+   "version": "v3",
+   "title": "Google Play Developer API",
+   "description": "Lets Android application developers access their Google Play accounts.",
+   "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/androidpublisher/v3/rest",
+   "discoveryLink": "./apis/androidpublisher/v3/rest",
+   "icons": {
+    "x16": "https://www.google.com/images/icons/product/android-16.png",
+    "x32": "https://www.google.com/images/icons/product/android-32.png"
+   },
+   "documentationLink": "https://developers.google.com/android-publisher",
    "preferred": true
   },
   {
@@ -2015,6 +2031,21 @@
   },
   {
    "kind": "discovery#directoryItem",
+   "id": "photoslibrary:v1",
+   "name": "photoslibrary",
+   "version": "v1",
+   "title": "Photos Library API",
+   "description": "Manage photos, videos, and albums in Google Photos",
+   "discoveryRestUrl": "https://photoslibrary.googleapis.com/$discovery/rest?version=v1",
+   "icons": {
+    "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
+    "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
+   },
+   "documentationLink": "https://developers.google.com/photos/",
+   "preferred": true
+  },
+  {
+   "kind": "discovery#directoryItem",
    "id": "playcustomapp:v1",
    "name": "playcustomapp",
    "version": "v1",
diff --git a/content/v2/content-api.json b/content/v2/content-api.json
index 41bd887..783c630 100644
--- a/content/v2/content-api.json
+++ b/content/v2/content-api.json
@@ -15,7 +15,7 @@
   "description": "Manages product items, inventory, and Merchant Center accounts for Google Shopping.",
   "discoveryVersion": "v1",
   "documentationLink": "https://developers.google.com/shopping-content",
-  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/PNUnFmurkt6UcyajxjbWsLH2mTY\"",
+  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/fYQPONZBNcqEhRZuvE1tarGD280\"",
   "icons": {
     "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
     "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
@@ -2891,7 +2891,7 @@
       }
     }
   },
-  "revision": "20180410",
+  "revision": "20180507",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "Account": {
@@ -4731,6 +4731,15 @@
         },
         "method": {
           "type": "string"
+        },
+        "posExternalAccountId": {
+          "description": "The account ID by which this merchant is known to the POS provider.",
+          "type": "string"
+        },
+        "posProviderId": {
+          "description": "The ID of POS provider. Required only for SetPosProvider.",
+          "format": "uint64",
+          "type": "string"
         }
       },
       "type": "object"
@@ -4777,6 +4786,13 @@
         "liaSettings": {
           "$ref": "LiaSettings",
           "description": "The retrieved or updated Lia settings."
+        },
+        "posProviders": {
+          "description": "The list of POS providers.",
+          "items": {
+            "$ref": "PosProviders"
+          },
+          "type": "array"
         }
       },
       "type": "object"
@@ -7068,6 +7084,42 @@
       },
       "type": "object"
     },
+    "PosProviders": {
+      "id": "PosProviders",
+      "properties": {
+        "country": {
+          "description": "Country code.",
+          "type": "string"
+        },
+        "posProviders": {
+          "description": "A list of POS providers.",
+          "items": {
+            "$ref": "PosProvidersPosProvider"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "PosProvidersPosProvider": {
+      "id": "PosProvidersPosProvider",
+      "properties": {
+        "displayName": {
+          "description": "The display name of Pos Provider.",
+          "type": "string"
+        },
+        "fullName": {
+          "description": "The full name of this POS Provider.",
+          "type": "string"
+        },
+        "providerId": {
+          "description": "The ID of the account.",
+          "format": "uint64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "PosSale": {
       "description": "The change of the available quantity of an item at the given store.",
       "id": "PosSale",
diff --git a/content/v2/content-gen.go b/content/v2/content-gen.go
index dbc801a..151247f 100644
--- a/content/v2/content-gen.go
+++ b/content/v2/content-gen.go
@@ -3143,6 +3143,14 @@
 
 	Method string `json:"method,omitempty"`
 
+	// PosExternalAccountId: The account ID by which this merchant is known
+	// to the POS provider.
+	PosExternalAccountId string `json:"posExternalAccountId,omitempty"`
+
+	// PosProviderId: The ID of POS provider. Required only for
+	// SetPosProvider.
+	PosProviderId uint64 `json:"posProviderId,omitempty,string"`
+
 	// ForceSendFields is a list of field names (e.g. "AccountId") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -3218,6 +3226,9 @@
 	// LiaSettings: The retrieved or updated Lia settings.
 	LiaSettings *LiaSettings `json:"liaSettings,omitempty"`
 
+	// PosProviders: The list of POS providers.
+	PosProviders []*PosProviders `json:"posProviders,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "BatchId") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -6718,6 +6729,69 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type PosProviders struct {
+	// Country: Country code.
+	Country string `json:"country,omitempty"`
+
+	// PosProviders: A list of POS providers.
+	PosProviders []*PosProvidersPosProvider `json:"posProviders,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Country") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Country") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *PosProviders) MarshalJSON() ([]byte, error) {
+	type NoMethod PosProviders
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type PosProvidersPosProvider struct {
+	// DisplayName: The display name of Pos Provider.
+	DisplayName string `json:"displayName,omitempty"`
+
+	// FullName: The full name of this POS Provider.
+	FullName string `json:"fullName,omitempty"`
+
+	// ProviderId: The ID of the account.
+	ProviderId uint64 `json:"providerId,omitempty,string"`
+
+	// ForceSendFields is a list of field names (e.g. "DisplayName") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "DisplayName") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *PosProvidersPosProvider) MarshalJSON() ([]byte, error) {
+	type NoMethod PosProvidersPosProvider
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // PosSale: The change of the available quantity of an item at the given
 // store.
 type PosSale struct {
diff --git a/deploymentmanager/v0.alpha/deploymentmanager-api.json b/deploymentmanager/v0.alpha/deploymentmanager-api.json
index 1ed830c..ba314a5 100644
--- a/deploymentmanager/v0.alpha/deploymentmanager-api.json
+++ b/deploymentmanager/v0.alpha/deploymentmanager-api.json
@@ -24,7 +24,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://cloud.google.com/deployment-manager/",
-  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/Kwe2DoH7rGZUK2tfaHT_blT-rl4\"",
+  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/QyjeiBDPAKfEILFHHxFubksx4MU\"",
   "icons": {
     "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
     "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
@@ -652,7 +652,7 @@
           },
           "path": "{project}/global/deployments/{resource}/setIamPolicy",
           "request": {
-            "$ref": "Policy"
+            "$ref": "GlobalSetPolicyRequest"
           },
           "response": {
             "$ref": "Policy"
@@ -1650,7 +1650,7 @@
       }
     }
   },
-  "revision": "20180323",
+  "revision": "20180503",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "AsyncOptions": {
@@ -1744,7 +1744,7 @@
           "description": "The condition that is associated with this binding. NOTE: an unsatisfied condition will not allow user access via current binding. Different bindings, including their conditions, are examined independently. This field is only visible as GOOGLE_INTERNAL or CONDITION_TRUSTED_TESTER."
         },
         "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`.\n\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example, `google.com` or `example.com`.",
+          "description": "Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@gmail.com` .\n\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`.\n\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example, `google.com` or `example.com`.",
           "items": {
             "type": "string"
           },
@@ -2151,6 +2151,28 @@
       },
       "type": "object"
     },
+    "GlobalSetPolicyRequest": {
+      "id": "GlobalSetPolicyRequest",
+      "properties": {
+        "bindings": {
+          "description": "Flatten Policy to create a backwacd compatible wire-format. Deprecated. Use 'policy' to specify bindings.",
+          "items": {
+            "$ref": "Binding"
+          },
+          "type": "array"
+        },
+        "etag": {
+          "description": "Flatten Policy to create a backward compatible wire-format. Deprecated. Use 'policy' to specify the etag.",
+          "format": "byte",
+          "type": "string"
+        },
+        "policy": {
+          "$ref": "Policy",
+          "description": "REQUIRED: The complete policy to be applied to the 'resource'. The size of the policy is limited to a few 10s of KB. An empty policy is in general a valid policy but certain services (like Projects) might reject them."
+        }
+      },
+      "type": "object"
+    },
     "ImportFile": {
       "description": "",
       "id": "ImportFile",
@@ -2342,7 +2364,7 @@
       "id": "Operation",
       "properties": {
         "clientOperationId": {
-          "description": "[Output Only] Reserved for future use.",
+          "description": "[Output Only] The value of `requestId` if you provided it in the request. Not present otherwise.",
           "type": "string"
         },
         "creationTimestamp": {
@@ -2542,7 +2564,7 @@
       "type": "object"
     },
     "Policy": {
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to specify access control policies for Cloud Platform resources.\n\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of `members` to a `role`, where the members can be user accounts, Google groups, Google domains, and service accounts. A `role` is a named list of permissions defined by IAM.\n\n**Example**\n\n{ \"bindings\": [ { \"role\": \"roles/owner\", \"members\": [ \"user:mike@example.com\", \"group:admins@example.com\", \"domain:google.com\", \"serviceAccount:my-other-app@appspot.gserviceaccount.com\", ] }, { \"role\": \"roles/viewer\", \"members\": [\"user:sean@example.com\"] } ] }\n\nFor a description of IAM and its features, see the [IAM developer's guide](https://cloud.google.com/iam/docs).",
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to specify access control policies for Cloud Platform resources.\n\n\n\nA `Policy` consists of a list of `bindings`. A `binding` binds a list of `members` to a `role`, where the members can be user accounts, Google groups, Google domains, and service accounts. A `role` is a named list of permissions defined by IAM.\n\n**JSON Example**\n\n{ \"bindings\": [ { \"role\": \"roles/owner\", \"members\": [ \"user:mike@example.com\", \"group:admins@example.com\", \"domain:google.com\", \"serviceAccount:my-other-app@appspot.gserviceaccount.com\" ] }, { \"role\": \"roles/viewer\", \"members\": [\"user:sean@example.com\"] } ] }\n\n**YAML Example**\n\nbindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-other-app@appspot.gserviceaccount.com role: roles/owner - members: - user:sean@example.com role: roles/viewer\n\n\n\nFor a description of IAM and its features, see the [IAM developer's guide](https://cloud.google.com/iam/docs).",
       "id": "Policy",
       "properties": {
         "auditConfigs": {
diff --git a/deploymentmanager/v0.alpha/deploymentmanager-gen.go b/deploymentmanager/v0.alpha/deploymentmanager-gen.go
index f2bf917..6521d9f 100644
--- a/deploymentmanager/v0.alpha/deploymentmanager-gen.go
+++ b/deploymentmanager/v0.alpha/deploymentmanager-gen.go
@@ -381,8 +381,7 @@
 	// account.
 	//
 	// * `user:{emailid}`: An email address that represents a specific
-	// Google account. For example, `alice@gmail.com` or
-	// `joe@example.com`.
+	// Google account. For example, `alice@gmail.com` .
 	//
 	//
 	//
@@ -1158,6 +1157,44 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type GlobalSetPolicyRequest struct {
+	// Bindings: Flatten Policy to create a backwacd compatible wire-format.
+	// Deprecated. Use 'policy' to specify bindings.
+	Bindings []*Binding `json:"bindings,omitempty"`
+
+	// Etag: Flatten Policy to create a backward compatible wire-format.
+	// Deprecated. Use 'policy' to specify the etag.
+	Etag string `json:"etag,omitempty"`
+
+	// Policy: REQUIRED: The complete policy to be applied to the
+	// 'resource'. The size of the policy is limited to a few 10s of KB. An
+	// empty policy is in general a valid policy but certain services (like
+	// Projects) might reject them.
+	Policy *Policy `json:"policy,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Bindings") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Bindings") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *GlobalSetPolicyRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod GlobalSetPolicyRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 type ImportFile struct {
 	// Content: The contents of the file.
 	Content string `json:"content,omitempty"`
@@ -1525,7 +1562,8 @@
 // (== resource_for beta.regionOperations ==) (== resource_for
 // v1.zoneOperations ==) (== resource_for beta.zoneOperations ==)
 type Operation struct {
-	// ClientOperationId: [Output Only] Reserved for future use.
+	// ClientOperationId: [Output Only] The value of `requestId` if you
+	// provided it in the request. Not present otherwise.
 	ClientOperationId string `json:"clientOperationId,omitempty"`
 
 	// CreationTimestamp: [Deprecated] This field is deprecated.
@@ -1874,20 +1912,30 @@
 //
 //
 //
-// A `Policy` consists of a list of `bindings`. A `Binding` binds a list
+// A `Policy` consists of a list of `bindings`. A `binding` binds a list
 // of `members` to a `role`, where the members can be user accounts,
 // Google groups, Google domains, and service accounts. A `role` is a
 // named list of permissions defined by IAM.
 //
-// **Example**
+// **JSON Example**
 //
 // { "bindings": [ { "role": "roles/owner", "members": [
 // "user:mike@example.com", "group:admins@example.com",
 // "domain:google.com",
-// "serviceAccount:my-other-app@appspot.gserviceaccount.com", ] }, {
+// "serviceAccount:my-other-app@appspot.gserviceaccount.com" ] }, {
 // "role": "roles/viewer", "members": ["user:sean@example.com"] } ]
 // }
 //
+// **YAML Example**
+//
+// bindings: - members: - user:mike@example.com -
+// group:admins@example.com - domain:google.com -
+// serviceAccount:my-other-app@appspot.gserviceaccount.com role:
+// roles/owner - members: - user:sean@example.com role:
+// roles/viewer
+//
+//
+//
 // For a description of IAM and its features, see the [IAM developer's
 // guide](https://cloud.google.com/iam/docs).
 type Policy struct {
@@ -5305,22 +5353,22 @@
 // method id "deploymentmanager.deployments.setIamPolicy":
 
 type DeploymentsSetIamPolicyCall struct {
-	s          *Service
-	project    string
-	resource   string
-	policy     *Policy
-	urlParams_ gensupport.URLParams
-	ctx_       context.Context
-	header_    http.Header
+	s                      *Service
+	project                string
+	resource               string
+	globalsetpolicyrequest *GlobalSetPolicyRequest
+	urlParams_             gensupport.URLParams
+	ctx_                   context.Context
+	header_                http.Header
 }
 
 // SetIamPolicy: Sets the access control policy on the specified
 // resource. Replaces any existing policy.
-func (r *DeploymentsService) SetIamPolicy(project string, resource string, policy *Policy) *DeploymentsSetIamPolicyCall {
+func (r *DeploymentsService) SetIamPolicy(project string, resource string, globalsetpolicyrequest *GlobalSetPolicyRequest) *DeploymentsSetIamPolicyCall {
 	c := &DeploymentsSetIamPolicyCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.project = project
 	c.resource = resource
-	c.policy = policy
+	c.globalsetpolicyrequest = globalsetpolicyrequest
 	return c
 }
 
@@ -5356,7 +5404,7 @@
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
 	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetpolicyrequest)
 	if err != nil {
 		return nil, err
 	}
@@ -5436,7 +5484,7 @@
 	//   },
 	//   "path": "{project}/global/deployments/{resource}/setIamPolicy",
 	//   "request": {
-	//     "$ref": "Policy"
+	//     "$ref": "GlobalSetPolicyRequest"
 	//   },
 	//   "response": {
 	//     "$ref": "Policy"
diff --git a/deploymentmanager/v2/deploymentmanager-api.json b/deploymentmanager/v2/deploymentmanager-api.json
index 918d96f..bcde71f 100644
--- a/deploymentmanager/v2/deploymentmanager-api.json
+++ b/deploymentmanager/v2/deploymentmanager-api.json
@@ -24,7 +24,7 @@
   "description": "Declares, configures, and deploys complex solutions on Google Cloud Platform.",
   "discoveryVersion": "v1",
   "documentationLink": "https://cloud.google.com/deployment-manager/",
-  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/AwjFnEseEkjUP7nl3FbV-mrXtTg\"",
+  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/4vHGfy0PBj0rG7tIHK1cZJWS9Ek\"",
   "icons": {
     "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
     "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
@@ -426,7 +426,7 @@
           },
           "path": "{project}/global/deployments/{resource}/setIamPolicy",
           "request": {
-            "$ref": "Policy"
+            "$ref": "GlobalSetPolicyRequest"
           },
           "response": {
             "$ref": "Policy"
@@ -932,7 +932,7 @@
       }
     }
   },
-  "revision": "20180323",
+  "revision": "20180503",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "AuditConfig": {
@@ -998,7 +998,7 @@
           "description": "The condition that is associated with this binding. NOTE: an unsatisfied condition will not allow user access via current binding. Different bindings, including their conditions, are examined independently. This field is only visible as GOOGLE_INTERNAL or CONDITION_TRUSTED_TESTER."
         },
         "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`.\n\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example, `google.com` or `example.com`.",
+          "description": "Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@gmail.com` .\n\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`.\n\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example, `google.com` or `example.com`.",
           "items": {
             "type": "string"
           },
@@ -1223,6 +1223,28 @@
       },
       "type": "object"
     },
+    "GlobalSetPolicyRequest": {
+      "id": "GlobalSetPolicyRequest",
+      "properties": {
+        "bindings": {
+          "description": "Flatten Policy to create a backwacd compatible wire-format. Deprecated. Use 'policy' to specify bindings.",
+          "items": {
+            "$ref": "Binding"
+          },
+          "type": "array"
+        },
+        "etag": {
+          "description": "Flatten Policy to create a backward compatible wire-format. Deprecated. Use 'policy' to specify the etag.",
+          "format": "byte",
+          "type": "string"
+        },
+        "policy": {
+          "$ref": "Policy",
+          "description": "REQUIRED: The complete policy to be applied to the 'resource'. The size of the policy is limited to a few 10s of KB. An empty policy is in general a valid policy but certain services (like Projects) might reject them."
+        }
+      },
+      "type": "object"
+    },
     "ImportFile": {
       "description": "",
       "id": "ImportFile",
@@ -1364,7 +1386,7 @@
       "id": "Operation",
       "properties": {
         "clientOperationId": {
-          "description": "[Output Only] Reserved for future use.",
+          "description": "[Output Only] The value of `requestId` if you provided it in the request. Not present otherwise.",
           "type": "string"
         },
         "creationTimestamp": {
@@ -1535,7 +1557,7 @@
       "type": "object"
     },
     "Policy": {
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to specify access control policies for Cloud Platform resources.\n\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of `members` to a `role`, where the members can be user accounts, Google groups, Google domains, and service accounts. A `role` is a named list of permissions defined by IAM.\n\n**Example**\n\n{ \"bindings\": [ { \"role\": \"roles/owner\", \"members\": [ \"user:mike@example.com\", \"group:admins@example.com\", \"domain:google.com\", \"serviceAccount:my-other-app@appspot.gserviceaccount.com\", ] }, { \"role\": \"roles/viewer\", \"members\": [\"user:sean@example.com\"] } ] }\n\nFor a description of IAM and its features, see the [IAM developer's guide](https://cloud.google.com/iam/docs).",
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to specify access control policies for Cloud Platform resources.\n\n\n\nA `Policy` consists of a list of `bindings`. A `binding` binds a list of `members` to a `role`, where the members can be user accounts, Google groups, Google domains, and service accounts. A `role` is a named list of permissions defined by IAM.\n\n**JSON Example**\n\n{ \"bindings\": [ { \"role\": \"roles/owner\", \"members\": [ \"user:mike@example.com\", \"group:admins@example.com\", \"domain:google.com\", \"serviceAccount:my-other-app@appspot.gserviceaccount.com\" ] }, { \"role\": \"roles/viewer\", \"members\": [\"user:sean@example.com\"] } ] }\n\n**YAML Example**\n\nbindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-other-app@appspot.gserviceaccount.com role: roles/owner - members: - user:sean@example.com role: roles/viewer\n\n\n\nFor a description of IAM and its features, see the [IAM developer's guide](https://cloud.google.com/iam/docs).",
       "id": "Policy",
       "properties": {
         "auditConfigs": {
diff --git a/deploymentmanager/v2/deploymentmanager-gen.go b/deploymentmanager/v2/deploymentmanager-gen.go
index b96d4b5..80cfcf6 100644
--- a/deploymentmanager/v2/deploymentmanager-gen.go
+++ b/deploymentmanager/v2/deploymentmanager-gen.go
@@ -294,8 +294,7 @@
 	// account.
 	//
 	// * `user:{emailid}`: An email address that represents a specific
-	// Google account. For example, `alice@gmail.com` or
-	// `joe@example.com`.
+	// Google account. For example, `alice@gmail.com` .
 	//
 	//
 	//
@@ -757,6 +756,44 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type GlobalSetPolicyRequest struct {
+	// Bindings: Flatten Policy to create a backwacd compatible wire-format.
+	// Deprecated. Use 'policy' to specify bindings.
+	Bindings []*Binding `json:"bindings,omitempty"`
+
+	// Etag: Flatten Policy to create a backward compatible wire-format.
+	// Deprecated. Use 'policy' to specify the etag.
+	Etag string `json:"etag,omitempty"`
+
+	// Policy: REQUIRED: The complete policy to be applied to the
+	// 'resource'. The size of the policy is limited to a few 10s of KB. An
+	// empty policy is in general a valid policy but certain services (like
+	// Projects) might reject them.
+	Policy *Policy `json:"policy,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Bindings") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Bindings") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *GlobalSetPolicyRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod GlobalSetPolicyRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 type ImportFile struct {
 	// Content: The contents of the file.
 	Content string `json:"content,omitempty"`
@@ -1039,7 +1076,8 @@
 // (== resource_for beta.regionOperations ==) (== resource_for
 // v1.zoneOperations ==) (== resource_for beta.zoneOperations ==)
 type Operation struct {
-	// ClientOperationId: [Output Only] Reserved for future use.
+	// ClientOperationId: [Output Only] The value of `requestId` if you
+	// provided it in the request. Not present otherwise.
 	ClientOperationId string `json:"clientOperationId,omitempty"`
 
 	// CreationTimestamp: [Deprecated] This field is deprecated.
@@ -1347,20 +1385,30 @@
 //
 //
 //
-// A `Policy` consists of a list of `bindings`. A `Binding` binds a list
+// A `Policy` consists of a list of `bindings`. A `binding` binds a list
 // of `members` to a `role`, where the members can be user accounts,
 // Google groups, Google domains, and service accounts. A `role` is a
 // named list of permissions defined by IAM.
 //
-// **Example**
+// **JSON Example**
 //
 // { "bindings": [ { "role": "roles/owner", "members": [
 // "user:mike@example.com", "group:admins@example.com",
 // "domain:google.com",
-// "serviceAccount:my-other-app@appspot.gserviceaccount.com", ] }, {
+// "serviceAccount:my-other-app@appspot.gserviceaccount.com" ] }, {
 // "role": "roles/viewer", "members": ["user:sean@example.com"] } ]
 // }
 //
+// **YAML Example**
+//
+// bindings: - members: - user:mike@example.com -
+// group:admins@example.com - domain:google.com -
+// serviceAccount:my-other-app@appspot.gserviceaccount.com role:
+// roles/owner - members: - user:sean@example.com role:
+// roles/viewer
+//
+//
+//
 // For a description of IAM and its features, see the [IAM developer's
 // guide](https://cloud.google.com/iam/docs).
 type Policy struct {
@@ -3325,22 +3373,22 @@
 // method id "deploymentmanager.deployments.setIamPolicy":
 
 type DeploymentsSetIamPolicyCall struct {
-	s          *Service
-	project    string
-	resource   string
-	policy     *Policy
-	urlParams_ gensupport.URLParams
-	ctx_       context.Context
-	header_    http.Header
+	s                      *Service
+	project                string
+	resource               string
+	globalsetpolicyrequest *GlobalSetPolicyRequest
+	urlParams_             gensupport.URLParams
+	ctx_                   context.Context
+	header_                http.Header
 }
 
 // SetIamPolicy: Sets the access control policy on the specified
 // resource. Replaces any existing policy.
-func (r *DeploymentsService) SetIamPolicy(project string, resource string, policy *Policy) *DeploymentsSetIamPolicyCall {
+func (r *DeploymentsService) SetIamPolicy(project string, resource string, globalsetpolicyrequest *GlobalSetPolicyRequest) *DeploymentsSetIamPolicyCall {
 	c := &DeploymentsSetIamPolicyCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.project = project
 	c.resource = resource
-	c.policy = policy
+	c.globalsetpolicyrequest = globalsetpolicyrequest
 	return c
 }
 
@@ -3376,7 +3424,7 @@
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
 	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetpolicyrequest)
 	if err != nil {
 		return nil, err
 	}
@@ -3456,7 +3504,7 @@
 	//   },
 	//   "path": "{project}/global/deployments/{resource}/setIamPolicy",
 	//   "request": {
-	//     "$ref": "Policy"
+	//     "$ref": "GlobalSetPolicyRequest"
 	//   },
 	//   "response": {
 	//     "$ref": "Policy"
diff --git a/deploymentmanager/v2beta/deploymentmanager-api.json b/deploymentmanager/v2beta/deploymentmanager-api.json
index 9c1bf64..c732f4c 100644
--- a/deploymentmanager/v2beta/deploymentmanager-api.json
+++ b/deploymentmanager/v2beta/deploymentmanager-api.json
@@ -24,7 +24,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": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/PCWAG75AZikXgM-QdvShE4zYkug\"",
+  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/I3fEDzAKzoHjLm0fligiKYeSqzc\"",
   "icons": {
     "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
     "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
@@ -652,7 +652,7 @@
           },
           "path": "{project}/global/deployments/{resource}/setIamPolicy",
           "request": {
-            "$ref": "Policy"
+            "$ref": "GlobalSetPolicyRequest"
           },
           "response": {
             "$ref": "Policy"
@@ -1482,7 +1482,7 @@
       }
     }
   },
-  "revision": "20180323",
+  "revision": "20180503",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "AsyncOptions": {
@@ -1602,7 +1602,7 @@
           "description": "The condition that is associated with this binding. NOTE: an unsatisfied condition will not allow user access via current binding. Different bindings, including their conditions, are examined independently. This field is only visible as GOOGLE_INTERNAL or CONDITION_TRUSTED_TESTER."
         },
         "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`.\n\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example, `google.com` or `example.com`.",
+          "description": "Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@gmail.com` .\n\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`.\n\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example, `google.com` or `example.com`.",
           "items": {
             "type": "string"
           },
@@ -1952,6 +1952,28 @@
       },
       "type": "object"
     },
+    "GlobalSetPolicyRequest": {
+      "id": "GlobalSetPolicyRequest",
+      "properties": {
+        "bindings": {
+          "description": "Flatten Policy to create a backwacd compatible wire-format. Deprecated. Use 'policy' to specify bindings.",
+          "items": {
+            "$ref": "Binding"
+          },
+          "type": "array"
+        },
+        "etag": {
+          "description": "Flatten Policy to create a backward compatible wire-format. Deprecated. Use 'policy' to specify the etag.",
+          "format": "byte",
+          "type": "string"
+        },
+        "policy": {
+          "$ref": "Policy",
+          "description": "REQUIRED: The complete policy to be applied to the 'resource'. The size of the policy is limited to a few 10s of KB. An empty policy is in general a valid policy but certain services (like Projects) might reject them."
+        }
+      },
+      "type": "object"
+    },
     "ImportFile": {
       "description": "",
       "id": "ImportFile",
@@ -2116,7 +2138,7 @@
       "id": "Operation",
       "properties": {
         "clientOperationId": {
-          "description": "[Output Only] Reserved for future use.",
+          "description": "[Output Only] The value of `requestId` if you provided it in the request. Not present otherwise.",
           "type": "string"
         },
         "creationTimestamp": {
@@ -2316,7 +2338,7 @@
       "type": "object"
     },
     "Policy": {
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to specify access control policies for Cloud Platform resources.\n\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of `members` to a `role`, where the members can be user accounts, Google groups, Google domains, and service accounts. A `role` is a named list of permissions defined by IAM.\n\n**Example**\n\n{ \"bindings\": [ { \"role\": \"roles/owner\", \"members\": [ \"user:mike@example.com\", \"group:admins@example.com\", \"domain:google.com\", \"serviceAccount:my-other-app@appspot.gserviceaccount.com\", ] }, { \"role\": \"roles/viewer\", \"members\": [\"user:sean@example.com\"] } ] }\n\nFor a description of IAM and its features, see the [IAM developer's guide](https://cloud.google.com/iam/docs).",
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to specify access control policies for Cloud Platform resources.\n\n\n\nA `Policy` consists of a list of `bindings`. A `binding` binds a list of `members` to a `role`, where the members can be user accounts, Google groups, Google domains, and service accounts. A `role` is a named list of permissions defined by IAM.\n\n**JSON Example**\n\n{ \"bindings\": [ { \"role\": \"roles/owner\", \"members\": [ \"user:mike@example.com\", \"group:admins@example.com\", \"domain:google.com\", \"serviceAccount:my-other-app@appspot.gserviceaccount.com\" ] }, { \"role\": \"roles/viewer\", \"members\": [\"user:sean@example.com\"] } ] }\n\n**YAML Example**\n\nbindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-other-app@appspot.gserviceaccount.com role: roles/owner - members: - user:sean@example.com role: roles/viewer\n\n\n\nFor a description of IAM and its features, see the [IAM developer's guide](https://cloud.google.com/iam/docs).",
       "id": "Policy",
       "properties": {
         "auditConfigs": {
diff --git a/deploymentmanager/v2beta/deploymentmanager-gen.go b/deploymentmanager/v2beta/deploymentmanager-gen.go
index 61a3897..5e707ff 100644
--- a/deploymentmanager/v2beta/deploymentmanager-gen.go
+++ b/deploymentmanager/v2beta/deploymentmanager-gen.go
@@ -421,8 +421,7 @@
 	// account.
 	//
 	// * `user:{emailid}`: An email address that represents a specific
-	// Google account. For example, `alice@gmail.com` or
-	// `joe@example.com`.
+	// Google account. For example, `alice@gmail.com` .
 	//
 	//
 	//
@@ -1115,6 +1114,44 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type GlobalSetPolicyRequest struct {
+	// Bindings: Flatten Policy to create a backwacd compatible wire-format.
+	// Deprecated. Use 'policy' to specify bindings.
+	Bindings []*Binding `json:"bindings,omitempty"`
+
+	// Etag: Flatten Policy to create a backward compatible wire-format.
+	// Deprecated. Use 'policy' to specify the etag.
+	Etag string `json:"etag,omitempty"`
+
+	// Policy: REQUIRED: The complete policy to be applied to the
+	// 'resource'. The size of the policy is limited to a few 10s of KB. An
+	// empty policy is in general a valid policy but certain services (like
+	// Projects) might reject them.
+	Policy *Policy `json:"policy,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Bindings") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Bindings") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *GlobalSetPolicyRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod GlobalSetPolicyRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 type ImportFile struct {
 	// Content: The contents of the file.
 	Content string `json:"content,omitempty"`
@@ -1436,7 +1473,8 @@
 // (== resource_for beta.regionOperations ==) (== resource_for
 // v1.zoneOperations ==) (== resource_for beta.zoneOperations ==)
 type Operation struct {
-	// ClientOperationId: [Output Only] Reserved for future use.
+	// ClientOperationId: [Output Only] The value of `requestId` if you
+	// provided it in the request. Not present otherwise.
 	ClientOperationId string `json:"clientOperationId,omitempty"`
 
 	// CreationTimestamp: [Deprecated] This field is deprecated.
@@ -1790,20 +1828,30 @@
 //
 //
 //
-// A `Policy` consists of a list of `bindings`. A `Binding` binds a list
+// A `Policy` consists of a list of `bindings`. A `binding` binds a list
 // of `members` to a `role`, where the members can be user accounts,
 // Google groups, Google domains, and service accounts. A `role` is a
 // named list of permissions defined by IAM.
 //
-// **Example**
+// **JSON Example**
 //
 // { "bindings": [ { "role": "roles/owner", "members": [
 // "user:mike@example.com", "group:admins@example.com",
 // "domain:google.com",
-// "serviceAccount:my-other-app@appspot.gserviceaccount.com", ] }, {
+// "serviceAccount:my-other-app@appspot.gserviceaccount.com" ] }, {
 // "role": "roles/viewer", "members": ["user:sean@example.com"] } ]
 // }
 //
+// **YAML Example**
+//
+// bindings: - members: - user:mike@example.com -
+// group:admins@example.com - domain:google.com -
+// serviceAccount:my-other-app@appspot.gserviceaccount.com role:
+// roles/owner - members: - user:sean@example.com role:
+// roles/viewer
+//
+//
+//
 // For a description of IAM and its features, see the [IAM developer's
 // guide](https://cloud.google.com/iam/docs).
 type Policy struct {
@@ -5198,22 +5246,22 @@
 // method id "deploymentmanager.deployments.setIamPolicy":
 
 type DeploymentsSetIamPolicyCall struct {
-	s          *Service
-	project    string
-	resource   string
-	policy     *Policy
-	urlParams_ gensupport.URLParams
-	ctx_       context.Context
-	header_    http.Header
+	s                      *Service
+	project                string
+	resource               string
+	globalsetpolicyrequest *GlobalSetPolicyRequest
+	urlParams_             gensupport.URLParams
+	ctx_                   context.Context
+	header_                http.Header
 }
 
 // SetIamPolicy: Sets the access control policy on the specified
 // resource. Replaces any existing policy.
-func (r *DeploymentsService) SetIamPolicy(project string, resource string, policy *Policy) *DeploymentsSetIamPolicyCall {
+func (r *DeploymentsService) SetIamPolicy(project string, resource string, globalsetpolicyrequest *GlobalSetPolicyRequest) *DeploymentsSetIamPolicyCall {
 	c := &DeploymentsSetIamPolicyCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.project = project
 	c.resource = resource
-	c.policy = policy
+	c.globalsetpolicyrequest = globalsetpolicyrequest
 	return c
 }
 
@@ -5249,7 +5297,7 @@
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
 	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetpolicyrequest)
 	if err != nil {
 		return nil, err
 	}
@@ -5329,7 +5377,7 @@
 	//   },
 	//   "path": "{project}/global/deployments/{resource}/setIamPolicy",
 	//   "request": {
-	//     "$ref": "Policy"
+	//     "$ref": "GlobalSetPolicyRequest"
 	//   },
 	//   "response": {
 	//     "$ref": "Policy"
diff --git a/photoslibrary/v1/photoslibrary-api.json b/photoslibrary/v1/photoslibrary-api.json
new file mode 100644
index 0000000..cfdf2a2
--- /dev/null
+++ b/photoslibrary/v1/photoslibrary-api.json
@@ -0,0 +1,1230 @@
+{
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/drive.photos.readonly": {
+          "description": "View the photos, videos and albums in your Google Photos"
+        },
+        "https://www.googleapis.com/auth/photoslibrary": {
+          "description": "View and manage your Google Photos library"
+        },
+        "https://www.googleapis.com/auth/photoslibrary.appendonly": {
+          "description": "Add to your Google Photos library"
+        },
+        "https://www.googleapis.com/auth/photoslibrary.readonly": {
+          "description": "View your Google Photos library"
+        },
+        "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata": {
+          "description": "Manage photos added by this app"
+        },
+        "https://www.googleapis.com/auth/photoslibrary.sharing": {
+          "description": "Manage and add to shared albums on your behalf"
+        }
+      }
+    }
+  },
+  "basePath": "",
+  "baseUrl": "https://photoslibrary.googleapis.com/",
+  "batchPath": "batch",
+  "canonicalName": "Photos Library",
+  "description": "Manage photos, videos, and albums in Google Photos\n",
+  "discoveryVersion": "v1",
+  "documentationLink": "https://developers.google.com/photos/",
+  "fullyEncodeReservedExpansion": true,
+  "icons": {
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
+  },
+  "id": "photoslibrary:v1",
+  "kind": "discovery#restDescription",
+  "name": "photoslibrary",
+  "ownerDomain": "google.com",
+  "ownerName": "Google",
+  "parameters": {
+    "$.xgafv": {
+      "description": "V1 error format.",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "type": "string"
+    },
+    "access_token": {
+      "description": "OAuth access token.",
+      "location": "query",
+      "type": "string"
+    },
+    "alt": {
+      "default": "json",
+      "description": "Data format for response.",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "type": "string"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "location": "query",
+      "type": "string"
+    },
+    "callback": {
+      "description": "JSONP",
+      "location": "query",
+      "type": "string"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "location": "query",
+      "type": "string"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "location": "query",
+      "type": "string"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "location": "query",
+      "type": "string"
+    },
+    "pp": {
+      "default": "true",
+      "description": "Pretty-print response.",
+      "location": "query",
+      "type": "boolean"
+    },
+    "prettyPrint": {
+      "default": "true",
+      "description": "Returns response with indentations and line breaks.",
+      "location": "query",
+      "type": "boolean"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "location": "query",
+      "type": "string"
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "location": "query",
+      "type": "string"
+    },
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "location": "query",
+      "type": "string"
+    }
+  },
+  "protocol": "rest",
+  "resources": {
+    "albums": {
+      "methods": {
+        "addEnrichment": {
+          "description": "Adds an enrichment to a specified position in a defined album.",
+          "flatPath": "v1/albums/{albumsId}:addEnrichment",
+          "httpMethod": "POST",
+          "id": "photoslibrary.albums.addEnrichment",
+          "parameterOrder": [
+            "albumId"
+          ],
+          "parameters": {
+            "albumId": {
+              "description": "Identifier of the album where the enrichment will be added.",
+              "location": "path",
+              "pattern": "^[^/]+$",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/albums/{+albumId}:addEnrichment",
+          "request": {
+            "$ref": "AddEnrichmentToAlbumRequest"
+          },
+          "response": {
+            "$ref": "AddEnrichmentToAlbumResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/photoslibrary",
+            "https://www.googleapis.com/auth/photoslibrary.appendonly",
+            "https://www.googleapis.com/auth/photoslibrary.sharing"
+          ]
+        },
+        "create": {
+          "description": "Creates an album in a user's Google Photos library.",
+          "flatPath": "v1/albums",
+          "httpMethod": "POST",
+          "id": "photoslibrary.albums.create",
+          "parameterOrder": [],
+          "parameters": {},
+          "path": "v1/albums",
+          "request": {
+            "$ref": "CreateAlbumRequest"
+          },
+          "response": {
+            "$ref": "Album"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/photoslibrary",
+            "https://www.googleapis.com/auth/photoslibrary.appendonly",
+            "https://www.googleapis.com/auth/photoslibrary.sharing"
+          ]
+        },
+        "get": {
+          "description": "Returns the album specified by the given album id.",
+          "flatPath": "v1/albums/{albumsId}",
+          "httpMethod": "GET",
+          "id": "photoslibrary.albums.get",
+          "parameterOrder": [
+            "albumId"
+          ],
+          "parameters": {
+            "albumId": {
+              "description": "Identifier of the album to be requested.",
+              "location": "path",
+              "pattern": "^[^/]+$",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/albums/{+albumId}",
+          "response": {
+            "$ref": "Album"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/drive.photos.readonly",
+            "https://www.googleapis.com/auth/photoslibrary",
+            "https://www.googleapis.com/auth/photoslibrary.readonly",
+            "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"
+          ]
+        },
+        "list": {
+          "description": "Lists all albums shown to a user in the 'Albums' tab of the Google\nPhotos app.",
+          "flatPath": "v1/albums",
+          "httpMethod": "GET",
+          "id": "photoslibrary.albums.list",
+          "parameterOrder": [],
+          "parameters": {
+            "pageSize": {
+              "description": "Maximum number of albums to return in the response. The default number of\nalbums to return at a time is 20. The maximum page size is 50.",
+              "format": "int32",
+              "location": "query",
+              "type": "integer"
+            },
+            "pageToken": {
+              "description": "A continuation token to get the next page of the results. Adding this to\nthe request will return the rows after the pageToken. The pageToken should\nbe the value returned in the nextPageToken parameter in the response to the\nlistAlbums request.",
+              "location": "query",
+              "type": "string"
+            }
+          },
+          "path": "v1/albums",
+          "response": {
+            "$ref": "ListAlbumsResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/drive.photos.readonly",
+            "https://www.googleapis.com/auth/photoslibrary",
+            "https://www.googleapis.com/auth/photoslibrary.readonly",
+            "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"
+          ]
+        },
+        "share": {
+          "description": "Marks an album as 'shared' and accessible to other users. This action can\nonly be performed on albums which were created by the developer via the\nAPI.",
+          "flatPath": "v1/albums/{albumsId}:share",
+          "httpMethod": "POST",
+          "id": "photoslibrary.albums.share",
+          "parameterOrder": [
+            "albumId"
+          ],
+          "parameters": {
+            "albumId": {
+              "description": "Identifier of the album to be shared. This album id must belong to an album\ncreated by the developer.\n.",
+              "location": "path",
+              "pattern": "^[^/]+$",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/albums/{+albumId}:share",
+          "request": {
+            "$ref": "ShareAlbumRequest"
+          },
+          "response": {
+            "$ref": "ShareAlbumResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/photoslibrary.sharing"
+          ]
+        }
+      }
+    },
+    "mediaItems": {
+      "methods": {
+        "batchCreate": {
+          "description": "Creates one or more media items in a user's Google Photos library.\nIf an album id is specified, the media item(s) are also added to the album.\nBy default the media item(s) will be added to the end of the library or\nalbum.\n\nIf an album id and position are both defined, then the media items will\nbe added to the album at the specified position.\n\nIf multiple media items are given, they will be inserted at the specified\nposition.",
+          "flatPath": "v1/mediaItems:batchCreate",
+          "httpMethod": "POST",
+          "id": "photoslibrary.mediaItems.batchCreate",
+          "parameterOrder": [],
+          "parameters": {},
+          "path": "v1/mediaItems:batchCreate",
+          "request": {
+            "$ref": "BatchCreateMediaItemsRequest"
+          },
+          "response": {
+            "$ref": "BatchCreateMediaItemsResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/photoslibrary",
+            "https://www.googleapis.com/auth/photoslibrary.appendonly",
+            "https://www.googleapis.com/auth/photoslibrary.sharing"
+          ]
+        },
+        "get": {
+          "description": "Returns the media item specified based on a given media item id.",
+          "flatPath": "v1/mediaItems/{mediaItemsId}",
+          "httpMethod": "GET",
+          "id": "photoslibrary.mediaItems.get",
+          "parameterOrder": [
+            "mediaItemId"
+          ],
+          "parameters": {
+            "mediaItemId": {
+              "description": "Identifier of media item to be requested.",
+              "location": "path",
+              "pattern": "^[^/]+$",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/mediaItems/{+mediaItemId}",
+          "response": {
+            "$ref": "MediaItem"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/drive.photos.readonly",
+            "https://www.googleapis.com/auth/photoslibrary",
+            "https://www.googleapis.com/auth/photoslibrary.readonly",
+            "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"
+          ]
+        },
+        "search": {
+          "description": "Searches for media items in a user's Google Photos library.\nIf no filters are set, then all media items in the user's library will be\nreturned.\n\nIf an album is set, all media items in the specified album will be\nreturned.\n\nIf filters are specified, anything that matches the filters from the user's\nlibrary will be listed.\n\nIf an album and filters are set, then this will result in an error.",
+          "flatPath": "v1/mediaItems:search",
+          "httpMethod": "POST",
+          "id": "photoslibrary.mediaItems.search",
+          "parameterOrder": [],
+          "parameters": {},
+          "path": "v1/mediaItems:search",
+          "request": {
+            "$ref": "SearchMediaItemsRequest"
+          },
+          "response": {
+            "$ref": "SearchMediaItemsResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/drive.photos.readonly",
+            "https://www.googleapis.com/auth/photoslibrary",
+            "https://www.googleapis.com/auth/photoslibrary.readonly",
+            "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"
+          ]
+        }
+      }
+    },
+    "sharedAlbums": {
+      "methods": {
+        "join": {
+          "description": "Joins a shared album on behalf of the Google Photos user.",
+          "flatPath": "v1/sharedAlbums:join",
+          "httpMethod": "POST",
+          "id": "photoslibrary.sharedAlbums.join",
+          "parameterOrder": [],
+          "parameters": {},
+          "path": "v1/sharedAlbums:join",
+          "request": {
+            "$ref": "JoinSharedAlbumRequest"
+          },
+          "response": {
+            "$ref": "JoinSharedAlbumResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/photoslibrary.sharing"
+          ]
+        },
+        "list": {
+          "description": "Lists all shared albums shown to a user in the 'Sharing' tab of the\nGoogle Photos app.",
+          "flatPath": "v1/sharedAlbums",
+          "httpMethod": "GET",
+          "id": "photoslibrary.sharedAlbums.list",
+          "parameterOrder": [],
+          "parameters": {
+            "pageSize": {
+              "description": "Maximum number of albums to return in the response. The default number of\nalbums to return at a time is 20. The maximum page size is 50.",
+              "format": "int32",
+              "location": "query",
+              "type": "integer"
+            },
+            "pageToken": {
+              "description": "A continuation token to get the next page of the results. Adding this to\nthe request will return the rows after the pageToken. The pageToken should\nbe the value returned in the nextPageToken parameter in the response to the\nlistSharedAlbums request.",
+              "location": "query",
+              "type": "string"
+            }
+          },
+          "path": "v1/sharedAlbums",
+          "response": {
+            "$ref": "ListSharedAlbumsResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/drive.photos.readonly",
+            "https://www.googleapis.com/auth/photoslibrary",
+            "https://www.googleapis.com/auth/photoslibrary.readonly",
+            "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"
+          ]
+        }
+      }
+    }
+  },
+  "revision": "20180508",
+  "rootUrl": "https://photoslibrary.googleapis.com/",
+  "schemas": {
+    "AddEnrichmentToAlbumRequest": {
+      "description": "Request to add an enrichment to a specific album at a specific position.",
+      "id": "AddEnrichmentToAlbumRequest",
+      "properties": {
+        "albumPosition": {
+          "$ref": "AlbumPosition",
+          "description": "The position where the enrichment will be inserted."
+        },
+        "newEnrichmentItem": {
+          "$ref": "NewEnrichmentItem",
+          "description": "The enrichment to be added."
+        }
+      },
+      "type": "object"
+    },
+    "AddEnrichmentToAlbumResponse": {
+      "id": "AddEnrichmentToAlbumResponse",
+      "properties": {
+        "enrichmentItem": {
+          "$ref": "EnrichmentItem",
+          "description": "[Output only] Enrichment which was added."
+        }
+      },
+      "type": "object"
+    },
+    "Album": {
+      "description": "Representation of an album in Google Photos.\nAlbums are a container for media items. They contain an additional\nshareInfo property if they have been shared by the application.",
+      "id": "Album",
+      "properties": {
+        "coverPhotoBaseUrl": {
+          "description": "[Output only] A URL to the cover photo's bytes. This should not be used as\nis. Parameters should be appended to this URL before use. For example,\n'=w2048-h1024' will set the dimensions of the cover photo to have a width\nof 2048 px and height of 1024 px.",
+          "type": "string"
+        },
+        "id": {
+          "description": "[Ouput only] Identifier for the album. This is a persistent identifier that\ncan be used between sessions to identify this album.",
+          "type": "string"
+        },
+        "isWriteable": {
+          "description": "[Output only] True if media items can be created in the album.\nThis field is based on the scopes granted and permissions of the album. If\nthe scopes are changed or permissions of the album are changed, this field\nwill be updated.",
+          "type": "boolean"
+        },
+        "productUrl": {
+          "description": "[Output only] Google Photos URL for the album. The user needs to be signed\nin to their Google Photos account to access this link.",
+          "type": "string"
+        },
+        "shareInfo": {
+          "$ref": "ShareInfo",
+          "description": "[Output only] Information related to shared albums.\nThis field is only populated if the album is a shared album, the\ndeveloper created the album and the user has granted photoslibrary.sharing\nscope."
+        },
+        "title": {
+          "description": "Name of the album displayed to the user in their Google Photos account.\nThis string should not be more than 500 characters.",
+          "type": "string"
+        },
+        "totalMediaItems": {
+          "description": "[Output only] The number of media items in the album",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "AlbumPosition": {
+      "description": "Specifies a position in an album.",
+      "id": "AlbumPosition",
+      "properties": {
+        "position": {
+          "description": "Type of position, for a media or enrichment item.",
+          "enum": [
+            "POSITION_TYPE_UNSPECIFIED",
+            "FIRST_IN_ALBUM",
+            "LAST_IN_ALBUM",
+            "AFTER_MEDIA_ITEM",
+            "AFTER_ENRICHMENT_ITEM"
+          ],
+          "enumDescriptions": [
+            "Default value if this enum is not set.",
+            "At the beginning of the album.",
+            "At the end of the album.",
+            "After a media item.",
+            "After an enrichment item."
+          ],
+          "type": "string"
+        },
+        "relativeEnrichmentItemId": {
+          "description": "The enrichment item to which the position is relative to.\nOnly used when position type is AFTER_ENRICHMENT_ITEM.",
+          "type": "string"
+        },
+        "relativeMediaItemId": {
+          "description": "The media item to which the position is relative to.\nOnly used when position type is AFTER_MEDIA_ITEM.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "BatchCreateMediaItemsRequest": {
+      "description": "Request to create one or more media items in a user's Google Photos library.\nIf an \u003ccode\u003ealbumid\u003c/code\u003e is specified, the media items are also added to\nthat album. \u003ccode\u003ealbumPosition\u003c/code\u003e is optional and can only be specified\nif an \u003ccode\u003ealbumId\u003c/code\u003e is set.",
+      "id": "BatchCreateMediaItemsRequest",
+      "properties": {
+        "albumId": {
+          "description": "Identifier of the album where the media item(s) will be added. They will\nalso be added to the user's library. This is an optional field.",
+          "type": "string"
+        },
+        "albumPosition": {
+          "$ref": "AlbumPosition",
+          "description": "Position in the album where the media item(s) will be added. If not\nspecified, the media item(s) will be added to the end of the album (as per\nthe default value which is LAST_IN_ALBUM).\nThe request will fail if this field is present but no album_id is\nspecified."
+        },
+        "newMediaItems": {
+          "description": "List of media items to be created.",
+          "items": {
+            "$ref": "NewMediaItem"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "BatchCreateMediaItemsResponse": {
+      "id": "BatchCreateMediaItemsResponse",
+      "properties": {
+        "newMediaItemResults": {
+          "description": "[Output only] List of media items which were created.",
+          "items": {
+            "$ref": "NewMediaItemResult"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "ContentFilter": {
+      "description": "This filter is used to define which results to return based on the contents\nof the media item.\n\nIt is possible to specify a list of categories to include, and/or a list of\ncategories to exclude. Within each list, the categories are combined with an\nOR. For example, if the content filter looks like:\n\n    included_content_categories: [c1, c2, c3]\n\nIt would get media items that contain (c1 OR c2 OR c3).\n\nAnd if the content filter looks like:\n\n    excluded_content_categories: [c1, c2, c3]\n\nIt would get media items that contain NOT (c1 OR c2 OR c3).\nYou can also include some categories while excluding others, as in this\nproto:\n\n    included_content_categories: [c1, c2],\n    excluded_content_category: [c3, c4]\n\nIt would get media items that contain (c1 OR c2) AND NOT (c3 OR c4).\n\nA category that appears in \u003ccode\u003eincludedContentategories\u003c/code\u003e must not\nappear in \u003ccode\u003eexcludedContentCategories\u003c/code\u003e.",
+      "id": "ContentFilter",
+      "properties": {
+        "excludedContentCategories": {
+          "description": "The set of categories that must NOT be present in the media items in the\nresult. The items in the set are ORed. There is a maximum of 10\nexcludedContentCategories per request.",
+          "enumDescriptions": [
+            "Default content category. This category is ignored if any other category is\nalso listed.",
+            "Media items containing landscapes.",
+            "Media items containing receipts.",
+            "Media items containing cityscapes.",
+            "Media items containing landmarks.",
+            "Media items that are selfies.",
+            "Media items containing people.",
+            "Media items containing pets.",
+            "Media items from weddings.",
+            "Media items from birthdays.",
+            "Media items containing documents.",
+            "Media items taken during travel.",
+            "Media items containing animals.",
+            "Media items containing food.",
+            "Media items from sporting events.",
+            "Media items taken at night.",
+            "Media items from performances.",
+            "Media items containing whiteboards.",
+            "Media items that are screenshots.",
+            "Media items that are considered to be 'utility. Including, but not limited\nto documents, screenshots, whiteboards etc."
+          ],
+          "items": {
+            "enum": [
+              "NONE",
+              "LANDSCAPES",
+              "RECEIPTS",
+              "CITYSCAPES",
+              "LANDMARKS",
+              "SELFIES",
+              "PEOPLE",
+              "PETS",
+              "WEDDINGS",
+              "BIRTHDAYS",
+              "DOCUMENTS",
+              "TRAVEL",
+              "ANIMALS",
+              "FOOD",
+              "SPORT",
+              "NIGHT",
+              "PERFORMANCES",
+              "WHITEBOARDS",
+              "SCREENSHOTS",
+              "UTILITY"
+            ],
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "includedContentCategories": {
+          "description": "The set of categories that must be present in the media items in the\nresult. The items in the set are ORed. There is a maximum of 10\nincludedContentCategories per request.",
+          "enumDescriptions": [
+            "Default content category. This category is ignored if any other category is\nalso listed.",
+            "Media items containing landscapes.",
+            "Media items containing receipts.",
+            "Media items containing cityscapes.",
+            "Media items containing landmarks.",
+            "Media items that are selfies.",
+            "Media items containing people.",
+            "Media items containing pets.",
+            "Media items from weddings.",
+            "Media items from birthdays.",
+            "Media items containing documents.",
+            "Media items taken during travel.",
+            "Media items containing animals.",
+            "Media items containing food.",
+            "Media items from sporting events.",
+            "Media items taken at night.",
+            "Media items from performances.",
+            "Media items containing whiteboards.",
+            "Media items that are screenshots.",
+            "Media items that are considered to be 'utility. Including, but not limited\nto documents, screenshots, whiteboards etc."
+          ],
+          "items": {
+            "enum": [
+              "NONE",
+              "LANDSCAPES",
+              "RECEIPTS",
+              "CITYSCAPES",
+              "LANDMARKS",
+              "SELFIES",
+              "PEOPLE",
+              "PETS",
+              "WEDDINGS",
+              "BIRTHDAYS",
+              "DOCUMENTS",
+              "TRAVEL",
+              "ANIMALS",
+              "FOOD",
+              "SPORT",
+              "NIGHT",
+              "PERFORMANCES",
+              "WHITEBOARDS",
+              "SCREENSHOTS",
+              "UTILITY"
+            ],
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "ContributorInfo": {
+      "description": "Information about a user who contributed the media item. Note that this\ninformation is only included if the album containing the media item is\nshared, was created by you and you have the sharing scope.",
+      "id": "ContributorInfo",
+      "properties": {
+        "displayName": {
+          "description": "Display name of the contributor.",
+          "type": "string"
+        },
+        "profilePictureBaseUrl": {
+          "description": "URL to the profile picture of the contributor.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "CreateAlbumRequest": {
+      "description": "Request to create an album in Google Photos.",
+      "id": "CreateAlbumRequest",
+      "properties": {
+        "album": {
+          "$ref": "Album",
+          "description": "The album to be created."
+        }
+      },
+      "type": "object"
+    },
+    "Date": {
+      "description": "Represents a whole calendar date. The day may be 0 to represent a year and month where the day is not significant, e.g. a whole calendar month. The month may be 0 to represent a a day and a year where the month is not signficant, e.g. when you want to specify the same day in every month of a year or a specific year. The year may be 0 to represent a month and day independent of year, e.g. anniversary date.",
+      "id": "Date",
+      "properties": {
+        "day": {
+          "description": "Day of month. Must be from 1 to 31 and valid for the year and month, or 0\nif specifying a year/month where the day is not significant.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "month": {
+          "description": "Month of year. Must be from 1 to 12, or 0 if specifying a date without a\nmonth.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "year": {
+          "description": "Year of date. Must be from 1 to 9999, or 0 if specifying a date without\na year.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "DateFilter": {
+      "description": "This filter defines the allowed dates or date ranges for the media returned.\nIt is possible to pick a set of specific dates and a set of date ranges.",
+      "id": "DateFilter",
+      "properties": {
+        "dates": {
+          "description": "List of dates that the media items must have been created on. There is a\nmaximum of 5 dates that can be included per request.",
+          "items": {
+            "$ref": "Date"
+          },
+          "type": "array"
+        },
+        "ranges": {
+          "description": "List of dates ranges that the media items must have been created in. There\nis a maximum of 5 dates ranges that can be included per request.",
+          "items": {
+            "$ref": "DateRange"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "DateRange": {
+      "description": "Defines a range of dates. Both dates must be of the same format (see Date\ndefinition for more).",
+      "id": "DateRange",
+      "properties": {
+        "endDate": {
+          "$ref": "Date",
+          "description": "The end date (included as part of the range) in the same format as the\nstart date."
+        },
+        "startDate": {
+          "$ref": "Date",
+          "description": "The start date (included as part of the range) in one of the formats\ndescribed."
+        }
+      },
+      "type": "object"
+    },
+    "EnrichmentItem": {
+      "description": "An enrichment item.",
+      "id": "EnrichmentItem",
+      "properties": {
+        "id": {
+          "description": "Identifier of the enrichment item.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "Filters": {
+      "description": "Filters that can be applied to a media item search.\nIf multiple filter options are specified, they are treated as AND with each\nother.",
+      "id": "Filters",
+      "properties": {
+        "contentFilter": {
+          "$ref": "ContentFilter",
+          "description": "Filters the media items based on their content."
+        },
+        "dateFilter": {
+          "$ref": "DateFilter",
+          "description": "Filters the media items based on their creation date."
+        },
+        "includeArchivedMedia": {
+          "description": "If set, the results will include media items that the user has archived.\nDefaults to false (archived media items are not included).",
+          "type": "boolean"
+        },
+        "mediaTypeFilter": {
+          "$ref": "MediaTypeFilter",
+          "description": "Filters the media items based on the type of media."
+        }
+      },
+      "type": "object"
+    },
+    "JoinSharedAlbumRequest": {
+      "description": "Request to join a shared album on behalf of the user. This uses a shareToken\nwhich can be acquired via the shareAlbum or listSharedAlbums calls.",
+      "id": "JoinSharedAlbumRequest",
+      "properties": {
+        "shareToken": {
+          "description": "Token indicating the shared album to join on behalf of the user.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "JoinSharedAlbumResponse": {
+      "description": "Response to successfully joining the shared album on behalf of the user.",
+      "id": "JoinSharedAlbumResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "LatLng": {
+      "description": "An object representing a latitude/longitude pair. This is expressed as a pair\nof doubles representing degrees latitude and degrees longitude. Unless\nspecified otherwise, this must conform to the\n\u003ca href=\"http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf\"\u003eWGS84\nstandard\u003c/a\u003e. Values must be within normalized ranges.",
+      "id": "LatLng",
+      "properties": {
+        "latitude": {
+          "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
+          "format": "double",
+          "type": "number"
+        },
+        "longitude": {
+          "description": "The longitude in degrees. It must be in the range [-180.0, +180.0].",
+          "format": "double",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    },
+    "ListAlbumsResponse": {
+      "id": "ListAlbumsResponse",
+      "properties": {
+        "albums": {
+          "description": "[Output only] List of albums that were created by the user.",
+          "items": {
+            "$ref": "Album"
+          },
+          "type": "array"
+        },
+        "nextPageToken": {
+          "description": "[Output only] Token to use to get the next set of albums. Populated if\nthere are more albums to retrieve for this request.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "ListSharedAlbumsResponse": {
+      "id": "ListSharedAlbumsResponse",
+      "properties": {
+        "nextPageToken": {
+          "description": "[Output only] Token to use to get the next set of shared albums. Populated\nif there are more shared albums to retrieve for this request.",
+          "type": "string"
+        },
+        "sharedAlbums": {
+          "description": "[Output only] List of shared albums that were requested.",
+          "items": {
+            "$ref": "Album"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "Location": {
+      "description": "Represents a physical location.",
+      "id": "Location",
+      "properties": {
+        "latlng": {
+          "$ref": "LatLng",
+          "description": "Position of the location on the map."
+        },
+        "locationName": {
+          "description": "Name of the location to be displayed.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "LocationEnrichment": {
+      "description": "An enrichment containing a single location.",
+      "id": "LocationEnrichment",
+      "properties": {
+        "location": {
+          "$ref": "Location",
+          "description": "Location for this enrichment item."
+        }
+      },
+      "type": "object"
+    },
+    "MapEnrichment": {
+      "description": "An enrichment containing a map, showing origin and destination locations.",
+      "id": "MapEnrichment",
+      "properties": {
+        "destination": {
+          "$ref": "Location",
+          "description": "Destination location for this enrichemt item."
+        },
+        "origin": {
+          "$ref": "Location",
+          "description": "Origin location for this enrichment item."
+        }
+      },
+      "type": "object"
+    },
+    "MediaItem": {
+      "description": "Representation of a media item (e.g. photo, video etc.) in Google Photos.",
+      "id": "MediaItem",
+      "properties": {
+        "baseUrl": {
+          "description": "A URL to the media item's bytes. This should not be used as is.\nFor example, '=w2048-h1024' will set the dimensions of a media item of type\nphoto to have a width of 2048 px and height of 1024 px.",
+          "type": "string"
+        },
+        "contributorInfo": {
+          "$ref": "ContributorInfo",
+          "description": "Information about the user who created this media item."
+        },
+        "description": {
+          "description": "Description of the media item. This is shown to the user in the item's\ninfo section in the Google Photos app.",
+          "type": "string"
+        },
+        "id": {
+          "description": "Identifier for the media item. This is a persistent identifier that can be\nused between sessions to identify this media item.",
+          "type": "string"
+        },
+        "mediaMetadata": {
+          "$ref": "MediaMetadata",
+          "description": "Metadata related to the media item, for example the height, width or\ncreation time."
+        },
+        "mimeType": {
+          "description": "MIME type of the media item.",
+          "type": "string"
+        },
+        "productUrl": {
+          "description": "Google Photos URL for the media item. This link will only be available to\nthe user if they're signed in.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "MediaMetadata": {
+      "description": "Metadata for a media item.",
+      "id": "MediaMetadata",
+      "properties": {
+        "creationTime": {
+          "description": "Time when the media item was first created (not when it was uploaded to\nGoogle Photos).",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "height": {
+          "description": "Original height (in pixels) of the media item.",
+          "format": "int64",
+          "type": "string"
+        },
+        "photo": {
+          "$ref": "Photo",
+          "description": "Metadata for a photo media type."
+        },
+        "video": {
+          "$ref": "Video",
+          "description": "Metadata for a video media type."
+        },
+        "width": {
+          "description": "Original width (in pixels) of the media item.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "MediaTypeFilter": {
+      "description": "This filter defines the type of media items to be returned, for example\nvideos or photos. All the specified media types are treated as an OR with\neach other.",
+      "id": "MediaTypeFilter",
+      "properties": {
+        "mediaTypes": {
+          "description": "The types of media items to be included. This field should only be\npopulated with one media type, multiple media types will result in an error\nresponse.",
+          "enumDescriptions": [
+            "Treated as if no filters are applied. All media types are included.",
+            "All media items that are considered videos.\nThis also includes movies the user has created using the Google Photos app.",
+            "All media items that are considered photos. This includes .bmp, .gif, .ico,\n.jpg (and other spellings), .tiff, .webp as well as special photo types\nsuch as iOS live photos, Android motion photos, panoramas, photospheres."
+          ],
+          "items": {
+            "enum": [
+              "ALL_MEDIA",
+              "VIDEO",
+              "PHOTO"
+            ],
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "NewEnrichmentItem": {
+      "description": "A new enrichment item to be added to an album, used by the\nAddEnrichmentToAlbum call.",
+      "id": "NewEnrichmentItem",
+      "properties": {
+        "locationEnrichment": {
+          "$ref": "LocationEnrichment",
+          "description": "Location to be added to the album."
+        },
+        "mapEnrichment": {
+          "$ref": "MapEnrichment",
+          "description": "Map to be added to the album."
+        },
+        "textEnrichment": {
+          "$ref": "TextEnrichment",
+          "description": "Text to be added to the album."
+        }
+      },
+      "type": "object"
+    },
+    "NewMediaItem": {
+      "description": "New media item that will be created in a user's Google Photos account.",
+      "id": "NewMediaItem",
+      "properties": {
+        "description": {
+          "description": "Description of the media item. This will be shown to the user in the item's\ninfo section in the Google Photos app.\nThis string should not be more than 1000 characters.",
+          "type": "string"
+        },
+        "simpleMediaItem": {
+          "$ref": "SimpleMediaItem",
+          "description": "A new media item that has been uploaded via the included uploadToken."
+        }
+      },
+      "type": "object"
+    },
+    "NewMediaItemResult": {
+      "description": "Result of creating a new media item.",
+      "id": "NewMediaItemResult",
+      "properties": {
+        "mediaItem": {
+          "$ref": "MediaItem",
+          "description": "Media item created with the upload token. It is populated if no errors\noccurred and the media item was created successfully."
+        },
+        "status": {
+          "$ref": "Status",
+          "description": "If an error occurred during the creation of this media item, this field\nwill be populated with information related to the error. Details of this\nstatus can be found down below."
+        },
+        "uploadToken": {
+          "description": "The upload token used to create this new media item.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "Photo": {
+      "description": "Metadata that is specific to a photo, for example, ISO, focal length and\nexposure time. Some of these fields may be null or not included.",
+      "id": "Photo",
+      "properties": {
+        "apertureFNumber": {
+          "description": "Apeture f number of the photo.",
+          "format": "float",
+          "type": "number"
+        },
+        "cameraMake": {
+          "description": "Brand of the camera which took the photo.",
+          "type": "string"
+        },
+        "cameraModel": {
+          "description": "Model of the camera which took the photo.",
+          "type": "string"
+        },
+        "exposureTime": {
+          "description": "Exposure time of the photo.",
+          "format": "google-duration",
+          "type": "string"
+        },
+        "focalLength": {
+          "description": "Focal length of the photo.",
+          "format": "float",
+          "type": "number"
+        },
+        "isoEquivalent": {
+          "description": "ISO of the photo.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "SearchMediaItemsRequest": {
+      "description": "Request to search for media items in a user's library.\n\nIf the album id is specified, this call will return the list of media items\nin the album. If neither filters nor album id are\nspecified, this call will return all media items in a user's Google Photos\nlibrary.\n\nIf filters are specified, this call will return all media items in\nthe user's library which fulfills the criteria based upon the filters.\n\nFilters and album id must not both be set, as this will result in an\ninvalid request.",
+      "id": "SearchMediaItemsRequest",
+      "properties": {
+        "albumId": {
+          "description": "Identifier of an album. If populated will list all media items in\nspecified album. Cannot be set in conjunction with any filters.",
+          "type": "string"
+        },
+        "filters": {
+          "$ref": "Filters",
+          "description": "Filters to apply to the request. Cannot be set in conjuction with an\nalbumId."
+        },
+        "pageSize": {
+          "description": "Maximum number of media items to return in the response. The default number\nof media items to return at a time is 100. The maximum page size is 500.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "pageToken": {
+          "description": "A continuation token to get the next page of the results. Adding this to\nthe request will return the rows after the pageToken. The pageToken should\nbe the value returned in the nextPageToken parameter in the response to the\nsearchMediaItems request.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "SearchMediaItemsResponse": {
+      "id": "SearchMediaItemsResponse",
+      "properties": {
+        "mediaItems": {
+          "description": "[Output only] List of media items that match the search parameters.",
+          "items": {
+            "$ref": "MediaItem"
+          },
+          "type": "array"
+        },
+        "nextPageToken": {
+          "description": "[Output only] Token to use to get the next set of media items. Its presence\nis the only reliable indicator of more media items being available in the\nnext request.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "ShareAlbumRequest": {
+      "description": "Request to make an album shared in Google Photos.",
+      "id": "ShareAlbumRequest",
+      "properties": {
+        "sharedAlbumOptions": {
+          "$ref": "SharedAlbumOptions",
+          "description": "Options to be set when converting the album to a shared album."
+        }
+      },
+      "type": "object"
+    },
+    "ShareAlbumResponse": {
+      "id": "ShareAlbumResponse",
+      "properties": {
+        "shareInfo": {
+          "$ref": "ShareInfo",
+          "description": "[Output only] Information about the shared album."
+        }
+      },
+      "type": "object"
+    },
+    "ShareInfo": {
+      "description": "Information about albums that are shared. Note that this\ninformation is only included if the album was created by you and you have the\nsharing scope.",
+      "id": "ShareInfo",
+      "properties": {
+        "shareToken": {
+          "description": "A token which can be used to join this shared album on behalf of other\nusers via the API.",
+          "type": "string"
+        },
+        "shareableUrl": {
+          "description": "A link to the album that's now shared on the Google Photos website and app.\nAnyone with the link can access this shared album and see all of the items\npresent in the album.",
+          "type": "string"
+        },
+        "sharedAlbumOptions": {
+          "$ref": "SharedAlbumOptions",
+          "description": "Options set for the shared album."
+        }
+      },
+      "type": "object"
+    },
+    "SharedAlbumOptions": {
+      "description": "Options that control the sharing of an album.",
+      "id": "SharedAlbumOptions",
+      "properties": {
+        "isCollaborative": {
+          "description": "True if the shared album allows collaborators (users who have joined\nthe album) to add media items to it. Defaults to false.",
+          "type": "boolean"
+        },
+        "isCommentable": {
+          "description": "True if the shared album allows the owner and the collaborators (users\nwho have joined the album) to add comments to the album. Defaults to false.",
+          "type": "boolean"
+        }
+      },
+      "type": "object"
+    },
+    "SimpleMediaItem": {
+      "description": "A simple media item to be created in Google Photos via an upload token.",
+      "id": "SimpleMediaItem",
+      "properties": {
+        "uploadToken": {
+          "description": "Token identifying the media bytes which have been uploaded to Google.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "Status": {
+      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` that can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
+      "id": "Status",
+      "properties": {
+        "code": {
+          "description": "The status code, which should be an enum value of google.rpc.Code.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "details": {
+          "description": "A list of messages that carry the error details.  There is a common set of\nmessage types for APIs to use.",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            },
+            "type": "object"
+          },
+          "type": "array"
+        },
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "TextEnrichment": {
+      "description": "An enrichment containing text.",
+      "id": "TextEnrichment",
+      "properties": {
+        "text": {
+          "description": "Text for this text enrichment item.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "Video": {
+      "description": "Metadata that is specific to a video, for example, fps and processing status.\nSome of these fields may be null or not included.",
+      "id": "Video",
+      "properties": {
+        "cameraMake": {
+          "description": "Brand of the camera which took the video.",
+          "type": "string"
+        },
+        "cameraModel": {
+          "description": "Model of the camera which took the video.",
+          "type": "string"
+        },
+        "fps": {
+          "description": "Frame rate of the video.",
+          "format": "double",
+          "type": "number"
+        },
+        "status": {
+          "description": "Processing status of the video.",
+          "enum": [
+            "UNSPECIFIED",
+            "PROCESSING",
+            "READY",
+            "FAILED"
+          ],
+          "enumDescriptions": [
+            "Video processing status is unknown.",
+            "Video is currently being processed. The user will see an icon for this\nvideo in the Google Photos app, however, it will not be playable yet.",
+            "Video is now ready for viewing.",
+            "Something has gone wrong and the video has failed to process."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    }
+  },
+  "servicePath": "",
+  "title": "Photos Library API",
+  "version": "v1",
+  "version_module": true
+}
\ No newline at end of file
diff --git a/photoslibrary/v1/photoslibrary-gen.go b/photoslibrary/v1/photoslibrary-gen.go
new file mode 100644
index 0000000..29295ce
--- /dev/null
+++ b/photoslibrary/v1/photoslibrary-gen.go
@@ -0,0 +1,3309 @@
+// Package photoslibrary provides access to the Photos Library API.
+//
+// See https://developers.google.com/photos/
+//
+// Usage example:
+//
+//   import "google.golang.org/api/photoslibrary/v1"
+//   ...
+//   photoslibraryService, err := photoslibrary.New(oauthHttpClient)
+package photoslibrary // import "google.golang.org/api/photoslibrary/v1"
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	context "golang.org/x/net/context"
+	ctxhttp "golang.org/x/net/context/ctxhttp"
+	gensupport "google.golang.org/api/gensupport"
+	googleapi "google.golang.org/api/googleapi"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
+var _ = bytes.NewBuffer
+var _ = strconv.Itoa
+var _ = fmt.Sprintf
+var _ = json.NewDecoder
+var _ = io.Copy
+var _ = url.Parse
+var _ = gensupport.MarshalJSON
+var _ = googleapi.Version
+var _ = errors.New
+var _ = strings.Replace
+var _ = context.Canceled
+var _ = ctxhttp.Do
+
+const apiId = "photoslibrary:v1"
+const apiName = "photoslibrary"
+const apiVersion = "v1"
+const basePath = "https://photoslibrary.googleapis.com/"
+
+// OAuth2 scopes used by this API.
+const (
+	// View the photos, videos and albums in your Google Photos
+	DrivePhotosReadonlyScope = "https://www.googleapis.com/auth/drive.photos.readonly"
+
+	// View and manage your Google Photos library
+	PhotoslibraryScope = "https://www.googleapis.com/auth/photoslibrary"
+
+	// Add to your Google Photos library
+	PhotoslibraryAppendonlyScope = "https://www.googleapis.com/auth/photoslibrary.appendonly"
+
+	// View your Google Photos library
+	PhotoslibraryReadonlyScope = "https://www.googleapis.com/auth/photoslibrary.readonly"
+
+	// Manage photos added by this app
+	PhotoslibraryReadonlyAppcreateddataScope = "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"
+
+	// Manage and add to shared albums on your behalf
+	PhotoslibrarySharingScope = "https://www.googleapis.com/auth/photoslibrary.sharing"
+)
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client, BasePath: basePath}
+	s.Albums = NewAlbumsService(s)
+	s.MediaItems = NewMediaItemsService(s)
+	s.SharedAlbums = NewSharedAlbumsService(s)
+	return s, nil
+}
+
+type Service struct {
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+
+	Albums *AlbumsService
+
+	MediaItems *MediaItemsService
+
+	SharedAlbums *SharedAlbumsService
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
+func NewAlbumsService(s *Service) *AlbumsService {
+	rs := &AlbumsService{s: s}
+	return rs
+}
+
+type AlbumsService struct {
+	s *Service
+}
+
+func NewMediaItemsService(s *Service) *MediaItemsService {
+	rs := &MediaItemsService{s: s}
+	return rs
+}
+
+type MediaItemsService struct {
+	s *Service
+}
+
+func NewSharedAlbumsService(s *Service) *SharedAlbumsService {
+	rs := &SharedAlbumsService{s: s}
+	return rs
+}
+
+type SharedAlbumsService struct {
+	s *Service
+}
+
+// AddEnrichmentToAlbumRequest: Request to add an enrichment to a
+// specific album at a specific position.
+type AddEnrichmentToAlbumRequest struct {
+	// AlbumPosition: The position where the enrichment will be inserted.
+	AlbumPosition *AlbumPosition `json:"albumPosition,omitempty"`
+
+	// NewEnrichmentItem: The enrichment to be added.
+	NewEnrichmentItem *NewEnrichmentItem `json:"newEnrichmentItem,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "AlbumPosition") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AlbumPosition") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AddEnrichmentToAlbumRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod AddEnrichmentToAlbumRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type AddEnrichmentToAlbumResponse struct {
+	// EnrichmentItem: [Output only] Enrichment which was added.
+	EnrichmentItem *EnrichmentItem `json:"enrichmentItem,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "EnrichmentItem") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "EnrichmentItem") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AddEnrichmentToAlbumResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod AddEnrichmentToAlbumResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// Album: Representation of an album in Google Photos.
+// Albums are a container for media items. They contain an
+// additional
+// shareInfo property if they have been shared by the application.
+type Album struct {
+	// CoverPhotoBaseUrl: [Output only] A URL to the cover photo's bytes.
+	// This should not be used as
+	// is. Parameters should be appended to this URL before use. For
+	// example,
+	// '=w2048-h1024' will set the dimensions of the cover photo to have a
+	// width
+	// of 2048 px and height of 1024 px.
+	CoverPhotoBaseUrl string `json:"coverPhotoBaseUrl,omitempty"`
+
+	// Id: [Ouput only] Identifier for the album. This is a persistent
+	// identifier that
+	// can be used between sessions to identify this album.
+	Id string `json:"id,omitempty"`
+
+	// IsWriteable: [Output only] True if media items can be created in the
+	// album.
+	// This field is based on the scopes granted and permissions of the
+	// album. If
+	// the scopes are changed or permissions of the album are changed, this
+	// field
+	// will be updated.
+	IsWriteable bool `json:"isWriteable,omitempty"`
+
+	// ProductUrl: [Output only] Google Photos URL for the album. The user
+	// needs to be signed
+	// in to their Google Photos account to access this link.
+	ProductUrl string `json:"productUrl,omitempty"`
+
+	// ShareInfo: [Output only] Information related to shared albums.
+	// This field is only populated if the album is a shared album,
+	// the
+	// developer created the album and the user has granted
+	// photoslibrary.sharing
+	// scope.
+	ShareInfo *ShareInfo `json:"shareInfo,omitempty"`
+
+	// Title: Name of the album displayed to the user in their Google Photos
+	// account.
+	// This string should not be more than 500 characters.
+	Title string `json:"title,omitempty"`
+
+	// TotalMediaItems: [Output only] The number of media items in the album
+	TotalMediaItems int64 `json:"totalMediaItems,omitempty,string"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "CoverPhotoBaseUrl")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "CoverPhotoBaseUrl") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Album) MarshalJSON() ([]byte, error) {
+	type NoMethod Album
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// AlbumPosition: Specifies a position in an album.
+type AlbumPosition struct {
+	// Position: Type of position, for a media or enrichment item.
+	//
+	// Possible values:
+	//   "POSITION_TYPE_UNSPECIFIED" - Default value if this enum is not
+	// set.
+	//   "FIRST_IN_ALBUM" - At the beginning of the album.
+	//   "LAST_IN_ALBUM" - At the end of the album.
+	//   "AFTER_MEDIA_ITEM" - After a media item.
+	//   "AFTER_ENRICHMENT_ITEM" - After an enrichment item.
+	Position string `json:"position,omitempty"`
+
+	// RelativeEnrichmentItemId: The enrichment item to which the position
+	// is relative to.
+	// Only used when position type is AFTER_ENRICHMENT_ITEM.
+	RelativeEnrichmentItemId string `json:"relativeEnrichmentItemId,omitempty"`
+
+	// RelativeMediaItemId: The media item to which the position is relative
+	// to.
+	// Only used when position type is AFTER_MEDIA_ITEM.
+	RelativeMediaItemId string `json:"relativeMediaItemId,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Position") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Position") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AlbumPosition) MarshalJSON() ([]byte, error) {
+	type NoMethod AlbumPosition
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// BatchCreateMediaItemsRequest: Request to create one or more media
+// items in a user's Google Photos library.
+// If an <code>albumid</code> is specified, the media items are also
+// added to
+// that album. <code>albumPosition</code> is optional and can only be
+// specified
+// if an <code>albumId</code> is set.
+type BatchCreateMediaItemsRequest struct {
+	// AlbumId: Identifier of the album where the media item(s) will be
+	// added. They will
+	// also be added to the user's library. This is an optional field.
+	AlbumId string `json:"albumId,omitempty"`
+
+	// AlbumPosition: Position in the album where the media item(s) will be
+	// added. If not
+	// specified, the media item(s) will be added to the end of the album
+	// (as per
+	// the default value which is LAST_IN_ALBUM).
+	// The request will fail if this field is present but no album_id
+	// is
+	// specified.
+	AlbumPosition *AlbumPosition `json:"albumPosition,omitempty"`
+
+	// NewMediaItems: List of media items to be created.
+	NewMediaItems []*NewMediaItem `json:"newMediaItems,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "AlbumId") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AlbumId") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *BatchCreateMediaItemsRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod BatchCreateMediaItemsRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type BatchCreateMediaItemsResponse struct {
+	// NewMediaItemResults: [Output only] List of media items which were
+	// created.
+	NewMediaItemResults []*NewMediaItemResult `json:"newMediaItemResults,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "NewMediaItemResults")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "NewMediaItemResults") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *BatchCreateMediaItemsResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod BatchCreateMediaItemsResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// ContentFilter: This filter is used to define which results to return
+// based on the contents
+// of the media item.
+//
+// It is possible to specify a list of categories to include, and/or a
+// list of
+// categories to exclude. Within each list, the categories are combined
+// with an
+// OR. For example, if the content filter looks like:
+//
+//     included_content_categories: [c1, c2, c3]
+//
+// It would get media items that contain (c1 OR c2 OR c3).
+//
+// And if the content filter looks like:
+//
+//     excluded_content_categories: [c1, c2, c3]
+//
+// It would get media items that contain NOT (c1 OR c2 OR c3).
+// You can also include some categories while excluding others, as in
+// this
+// proto:
+//
+//     included_content_categories: [c1, c2],
+//     excluded_content_category: [c3, c4]
+//
+// It would get media items that contain (c1 OR c2) AND NOT (c3 OR
+// c4).
+//
+// A category that appears in <code>includedContentategories</code> must
+// not
+// appear in <code>excludedContentCategories</code>.
+type ContentFilter struct {
+	// ExcludedContentCategories: The set of categories that must NOT be
+	// present in the media items in the
+	// result. The items in the set are ORed. There is a maximum of
+	// 10
+	// excludedContentCategories per request.
+	//
+	// Possible values:
+	//   "NONE" - Default content category. This category is ignored if any
+	// other category is
+	// also listed.
+	//   "LANDSCAPES" - Media items containing landscapes.
+	//   "RECEIPTS" - Media items containing receipts.
+	//   "CITYSCAPES" - Media items containing cityscapes.
+	//   "LANDMARKS" - Media items containing landmarks.
+	//   "SELFIES" - Media items that are selfies.
+	//   "PEOPLE" - Media items containing people.
+	//   "PETS" - Media items containing pets.
+	//   "WEDDINGS" - Media items from weddings.
+	//   "BIRTHDAYS" - Media items from birthdays.
+	//   "DOCUMENTS" - Media items containing documents.
+	//   "TRAVEL" - Media items taken during travel.
+	//   "ANIMALS" - Media items containing animals.
+	//   "FOOD" - Media items containing food.
+	//   "SPORT" - Media items from sporting events.
+	//   "NIGHT" - Media items taken at night.
+	//   "PERFORMANCES" - Media items from performances.
+	//   "WHITEBOARDS" - Media items containing whiteboards.
+	//   "SCREENSHOTS" - Media items that are screenshots.
+	//   "UTILITY" - Media items that are considered to be 'utility.
+	// Including, but not limited
+	// to documents, screenshots, whiteboards etc.
+	ExcludedContentCategories []string `json:"excludedContentCategories,omitempty"`
+
+	// IncludedContentCategories: The set of categories that must be present
+	// in the media items in the
+	// result. The items in the set are ORed. There is a maximum of
+	// 10
+	// includedContentCategories per request.
+	//
+	// Possible values:
+	//   "NONE" - Default content category. This category is ignored if any
+	// other category is
+	// also listed.
+	//   "LANDSCAPES" - Media items containing landscapes.
+	//   "RECEIPTS" - Media items containing receipts.
+	//   "CITYSCAPES" - Media items containing cityscapes.
+	//   "LANDMARKS" - Media items containing landmarks.
+	//   "SELFIES" - Media items that are selfies.
+	//   "PEOPLE" - Media items containing people.
+	//   "PETS" - Media items containing pets.
+	//   "WEDDINGS" - Media items from weddings.
+	//   "BIRTHDAYS" - Media items from birthdays.
+	//   "DOCUMENTS" - Media items containing documents.
+	//   "TRAVEL" - Media items taken during travel.
+	//   "ANIMALS" - Media items containing animals.
+	//   "FOOD" - Media items containing food.
+	//   "SPORT" - Media items from sporting events.
+	//   "NIGHT" - Media items taken at night.
+	//   "PERFORMANCES" - Media items from performances.
+	//   "WHITEBOARDS" - Media items containing whiteboards.
+	//   "SCREENSHOTS" - Media items that are screenshots.
+	//   "UTILITY" - Media items that are considered to be 'utility.
+	// Including, but not limited
+	// to documents, screenshots, whiteboards etc.
+	IncludedContentCategories []string `json:"includedContentCategories,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g.
+	// "ExcludedContentCategories") to unconditionally include in API
+	// requests. By default, fields with empty values are omitted from API
+	// requests. However, any non-pointer, non-interface field appearing in
+	// ForceSendFields will be sent to the server regardless of whether the
+	// field is empty or not. This may be used to include empty fields in
+	// Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g.
+	// "ExcludedContentCategories") to include in API requests with the JSON
+	// null value. By default, fields with empty values are omitted from API
+	// requests. However, any field with an empty value appearing in
+	// NullFields will be sent to the server as null. It is an error if a
+	// field in this list has a non-empty value. This may be used to include
+	// null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ContentFilter) MarshalJSON() ([]byte, error) {
+	type NoMethod ContentFilter
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// ContributorInfo: Information about a user who contributed the media
+// item. Note that this
+// information is only included if the album containing the media item
+// is
+// shared, was created by you and you have the sharing scope.
+type ContributorInfo struct {
+	// DisplayName: Display name of the contributor.
+	DisplayName string `json:"displayName,omitempty"`
+
+	// ProfilePictureBaseUrl: URL to the profile picture of the contributor.
+	ProfilePictureBaseUrl string `json:"profilePictureBaseUrl,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "DisplayName") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "DisplayName") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ContributorInfo) MarshalJSON() ([]byte, error) {
+	type NoMethod ContributorInfo
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// CreateAlbumRequest: Request to create an album in Google Photos.
+type CreateAlbumRequest struct {
+	// Album: The album to be created.
+	Album *Album `json:"album,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Album") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Album") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *CreateAlbumRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod CreateAlbumRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// Date: Represents a whole calendar date. The day may be 0 to represent
+// a year and month where the day is not significant, e.g. a whole
+// calendar month. The month may be 0 to represent a a day and a year
+// where the month is not signficant, e.g. when you want to specify the
+// same day in every month of a year or a specific year. The year may be
+// 0 to represent a month and day independent of year, e.g. anniversary
+// date.
+type Date struct {
+	// Day: Day of month. Must be from 1 to 31 and valid for the year and
+	// month, or 0
+	// if specifying a year/month where the day is not significant.
+	Day int64 `json:"day,omitempty"`
+
+	// Month: Month of year. Must be from 1 to 12, or 0 if specifying a date
+	// without a
+	// month.
+	Month int64 `json:"month,omitempty"`
+
+	// Year: Year of date. Must be from 1 to 9999, or 0 if specifying a date
+	// without
+	// a year.
+	Year int64 `json:"year,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Day") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Day") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Date) MarshalJSON() ([]byte, error) {
+	type NoMethod Date
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// DateFilter: This filter defines the allowed dates or date ranges for
+// the media returned.
+// It is possible to pick a set of specific dates and a set of date
+// ranges.
+type DateFilter struct {
+	// Dates: List of dates that the media items must have been created on.
+	// There is a
+	// maximum of 5 dates that can be included per request.
+	Dates []*Date `json:"dates,omitempty"`
+
+	// Ranges: List of dates ranges that the media items must have been
+	// created in. There
+	// is a maximum of 5 dates ranges that can be included per request.
+	Ranges []*DateRange `json:"ranges,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Dates") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Dates") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *DateFilter) MarshalJSON() ([]byte, error) {
+	type NoMethod DateFilter
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// DateRange: Defines a range of dates. Both dates must be of the same
+// format (see Date
+// definition for more).
+type DateRange struct {
+	// EndDate: The end date (included as part of the range) in the same
+	// format as the
+	// start date.
+	EndDate *Date `json:"endDate,omitempty"`
+
+	// StartDate: The start date (included as part of the range) in one of
+	// the formats
+	// described.
+	StartDate *Date `json:"startDate,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "EndDate") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "EndDate") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *DateRange) MarshalJSON() ([]byte, error) {
+	type NoMethod DateRange
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// EnrichmentItem: An enrichment item.
+type EnrichmentItem struct {
+	// Id: Identifier of the enrichment item.
+	Id string `json:"id,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Id") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Id") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *EnrichmentItem) MarshalJSON() ([]byte, error) {
+	type NoMethod EnrichmentItem
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// Filters: Filters that can be applied to a media item search.
+// If multiple filter options are specified, they are treated as AND
+// with each
+// other.
+type Filters struct {
+	// ContentFilter: Filters the media items based on their content.
+	ContentFilter *ContentFilter `json:"contentFilter,omitempty"`
+
+	// DateFilter: Filters the media items based on their creation date.
+	DateFilter *DateFilter `json:"dateFilter,omitempty"`
+
+	// IncludeArchivedMedia: If set, the results will include media items
+	// that the user has archived.
+	// Defaults to false (archived media items are not included).
+	IncludeArchivedMedia bool `json:"includeArchivedMedia,omitempty"`
+
+	// MediaTypeFilter: Filters the media items based on the type of media.
+	MediaTypeFilter *MediaTypeFilter `json:"mediaTypeFilter,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "ContentFilter") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ContentFilter") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Filters) MarshalJSON() ([]byte, error) {
+	type NoMethod Filters
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// JoinSharedAlbumRequest: Request to join a shared album on behalf of
+// the user. This uses a shareToken
+// which can be acquired via the shareAlbum or listSharedAlbums calls.
+type JoinSharedAlbumRequest struct {
+	// ShareToken: Token indicating the shared album to join on behalf of
+	// the user.
+	ShareToken string `json:"shareToken,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "ShareToken") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ShareToken") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *JoinSharedAlbumRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod JoinSharedAlbumRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// JoinSharedAlbumResponse: Response to successfully joining the shared
+// album on behalf of the user.
+type JoinSharedAlbumResponse struct {
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+}
+
+// LatLng: An object representing a latitude/longitude pair. This is
+// expressed as a pair
+// of doubles representing degrees latitude and degrees longitude.
+// Unless
+// specified otherwise, this must conform to the
+// <a
+// href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
+// st
+// andard</a>. Values must be within normalized ranges.
+type LatLng struct {
+	// Latitude: The latitude in degrees. It must be in the range [-90.0,
+	// +90.0].
+	Latitude float64 `json:"latitude,omitempty"`
+
+	// Longitude: The longitude in degrees. It must be in the range [-180.0,
+	// +180.0].
+	Longitude float64 `json:"longitude,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Latitude") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Latitude") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *LatLng) MarshalJSON() ([]byte, error) {
+	type NoMethod LatLng
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+func (s *LatLng) UnmarshalJSON(data []byte) error {
+	type NoMethod LatLng
+	var s1 struct {
+		Latitude  gensupport.JSONFloat64 `json:"latitude"`
+		Longitude gensupport.JSONFloat64 `json:"longitude"`
+		*NoMethod
+	}
+	s1.NoMethod = (*NoMethod)(s)
+	if err := json.Unmarshal(data, &s1); err != nil {
+		return err
+	}
+	s.Latitude = float64(s1.Latitude)
+	s.Longitude = float64(s1.Longitude)
+	return nil
+}
+
+type ListAlbumsResponse struct {
+	// Albums: [Output only] List of albums that were created by the user.
+	Albums []*Album `json:"albums,omitempty"`
+
+	// NextPageToken: [Output only] Token to use to get the next set of
+	// albums. Populated if
+	// there are more albums to retrieve for this request.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Albums") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Albums") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ListAlbumsResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ListAlbumsResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ListSharedAlbumsResponse struct {
+	// NextPageToken: [Output only] Token to use to get the next set of
+	// shared albums. Populated
+	// if there are more shared albums to retrieve for this request.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SharedAlbums: [Output only] List of shared albums that were
+	// requested.
+	SharedAlbums []*Album `json:"sharedAlbums,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "NextPageToken") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "NextPageToken") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ListSharedAlbumsResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ListSharedAlbumsResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// Location: Represents a physical location.
+type Location struct {
+	// Latlng: Position of the location on the map.
+	Latlng *LatLng `json:"latlng,omitempty"`
+
+	// LocationName: Name of the location to be displayed.
+	LocationName string `json:"locationName,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Latlng") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Latlng") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Location) MarshalJSON() ([]byte, error) {
+	type NoMethod Location
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// LocationEnrichment: An enrichment containing a single location.
+type LocationEnrichment struct {
+	// Location: Location for this enrichment item.
+	Location *Location `json:"location,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Location") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Location") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *LocationEnrichment) MarshalJSON() ([]byte, error) {
+	type NoMethod LocationEnrichment
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// MapEnrichment: An enrichment containing a map, showing origin and
+// destination locations.
+type MapEnrichment struct {
+	// Destination: Destination location for this enrichemt item.
+	Destination *Location `json:"destination,omitempty"`
+
+	// Origin: Origin location for this enrichment item.
+	Origin *Location `json:"origin,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Destination") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Destination") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *MapEnrichment) MarshalJSON() ([]byte, error) {
+	type NoMethod MapEnrichment
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// MediaItem: Representation of a media item (e.g. photo, video etc.) in
+// Google Photos.
+type MediaItem struct {
+	// BaseUrl: A URL to the media item's bytes. This should not be used as
+	// is.
+	// For example, '=w2048-h1024' will set the dimensions of a media item
+	// of type
+	// photo to have a width of 2048 px and height of 1024 px.
+	BaseUrl string `json:"baseUrl,omitempty"`
+
+	// ContributorInfo: Information about the user who created this media
+	// item.
+	ContributorInfo *ContributorInfo `json:"contributorInfo,omitempty"`
+
+	// Description: Description of the media item. This is shown to the user
+	// in the item's
+	// info section in the Google Photos app.
+	Description string `json:"description,omitempty"`
+
+	// Id: Identifier for the media item. This is a persistent identifier
+	// that can be
+	// used between sessions to identify this media item.
+	Id string `json:"id,omitempty"`
+
+	// MediaMetadata: Metadata related to the media item, for example the
+	// height, width or
+	// creation time.
+	MediaMetadata *MediaMetadata `json:"mediaMetadata,omitempty"`
+
+	// MimeType: MIME type of the media item.
+	MimeType string `json:"mimeType,omitempty"`
+
+	// ProductUrl: Google Photos URL for the media item. This link will only
+	// be available to
+	// the user if they're signed in.
+	ProductUrl string `json:"productUrl,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "BaseUrl") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "BaseUrl") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *MediaItem) MarshalJSON() ([]byte, error) {
+	type NoMethod MediaItem
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// MediaMetadata: Metadata for a media item.
+type MediaMetadata struct {
+	// CreationTime: Time when the media item was first created (not when it
+	// was uploaded to
+	// Google Photos).
+	CreationTime string `json:"creationTime,omitempty"`
+
+	// Height: Original height (in pixels) of the media item.
+	Height int64 `json:"height,omitempty,string"`
+
+	// Photo: Metadata for a photo media type.
+	Photo *Photo `json:"photo,omitempty"`
+
+	// Video: Metadata for a video media type.
+	Video *Video `json:"video,omitempty"`
+
+	// Width: Original width (in pixels) of the media item.
+	Width int64 `json:"width,omitempty,string"`
+
+	// ForceSendFields is a list of field names (e.g. "CreationTime") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "CreationTime") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *MediaMetadata) MarshalJSON() ([]byte, error) {
+	type NoMethod MediaMetadata
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// MediaTypeFilter: This filter defines the type of media items to be
+// returned, for example
+// videos or photos. All the specified media types are treated as an OR
+// with
+// each other.
+type MediaTypeFilter struct {
+	// MediaTypes: The types of media items to be included. This field
+	// should only be
+	// populated with one media type, multiple media types will result in an
+	// error
+	// response.
+	//
+	// Possible values:
+	//   "ALL_MEDIA" - Treated as if no filters are applied. All media types
+	// are included.
+	//   "VIDEO" - All media items that are considered videos.
+	// This also includes movies the user has created using the Google
+	// Photos app.
+	//   "PHOTO" - All media items that are considered photos. This includes
+	// .bmp, .gif, .ico,
+	// .jpg (and other spellings), .tiff, .webp as well as special photo
+	// types
+	// such as iOS live photos, Android motion photos, panoramas,
+	// photospheres.
+	MediaTypes []string `json:"mediaTypes,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "MediaTypes") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "MediaTypes") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *MediaTypeFilter) MarshalJSON() ([]byte, error) {
+	type NoMethod MediaTypeFilter
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// NewEnrichmentItem: A new enrichment item to be added to an album,
+// used by the
+// AddEnrichmentToAlbum call.
+type NewEnrichmentItem struct {
+	// LocationEnrichment: Location to be added to the album.
+	LocationEnrichment *LocationEnrichment `json:"locationEnrichment,omitempty"`
+
+	// MapEnrichment: Map to be added to the album.
+	MapEnrichment *MapEnrichment `json:"mapEnrichment,omitempty"`
+
+	// TextEnrichment: Text to be added to the album.
+	TextEnrichment *TextEnrichment `json:"textEnrichment,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "LocationEnrichment")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "LocationEnrichment") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *NewEnrichmentItem) MarshalJSON() ([]byte, error) {
+	type NoMethod NewEnrichmentItem
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// NewMediaItem: New media item that will be created in a user's Google
+// Photos account.
+type NewMediaItem struct {
+	// Description: Description of the media item. This will be shown to the
+	// user in the item's
+	// info section in the Google Photos app.
+	// This string should not be more than 1000 characters.
+	Description string `json:"description,omitempty"`
+
+	// SimpleMediaItem: A new media item that has been uploaded via the
+	// included uploadToken.
+	SimpleMediaItem *SimpleMediaItem `json:"simpleMediaItem,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Description") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Description") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *NewMediaItem) MarshalJSON() ([]byte, error) {
+	type NoMethod NewMediaItem
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// NewMediaItemResult: Result of creating a new media item.
+type NewMediaItemResult struct {
+	// MediaItem: Media item created with the upload token. It is populated
+	// if no errors
+	// occurred and the media item was created successfully.
+	MediaItem *MediaItem `json:"mediaItem,omitempty"`
+
+	// Status: If an error occurred during the creation of this media item,
+	// this field
+	// will be populated with information related to the error. Details of
+	// this
+	// status can be found down below.
+	Status *Status `json:"status,omitempty"`
+
+	// UploadToken: The upload token used to create this new media item.
+	UploadToken string `json:"uploadToken,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "MediaItem") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "MediaItem") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *NewMediaItemResult) MarshalJSON() ([]byte, error) {
+	type NoMethod NewMediaItemResult
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// Photo: Metadata that is specific to a photo, for example, ISO, focal
+// length and
+// exposure time. Some of these fields may be null or not included.
+type Photo struct {
+	// ApertureFNumber: Apeture f number of the photo.
+	ApertureFNumber float64 `json:"apertureFNumber,omitempty"`
+
+	// CameraMake: Brand of the camera which took the photo.
+	CameraMake string `json:"cameraMake,omitempty"`
+
+	// CameraModel: Model of the camera which took the photo.
+	CameraModel string `json:"cameraModel,omitempty"`
+
+	// ExposureTime: Exposure time of the photo.
+	ExposureTime string `json:"exposureTime,omitempty"`
+
+	// FocalLength: Focal length of the photo.
+	FocalLength float64 `json:"focalLength,omitempty"`
+
+	// IsoEquivalent: ISO of the photo.
+	IsoEquivalent int64 `json:"isoEquivalent,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "ApertureFNumber") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ApertureFNumber") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Photo) MarshalJSON() ([]byte, error) {
+	type NoMethod Photo
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+func (s *Photo) UnmarshalJSON(data []byte) error {
+	type NoMethod Photo
+	var s1 struct {
+		ApertureFNumber gensupport.JSONFloat64 `json:"apertureFNumber"`
+		FocalLength     gensupport.JSONFloat64 `json:"focalLength"`
+		*NoMethod
+	}
+	s1.NoMethod = (*NoMethod)(s)
+	if err := json.Unmarshal(data, &s1); err != nil {
+		return err
+	}
+	s.ApertureFNumber = float64(s1.ApertureFNumber)
+	s.FocalLength = float64(s1.FocalLength)
+	return nil
+}
+
+// SearchMediaItemsRequest: Request to search for media items in a
+// user's library.
+//
+// If the album id is specified, this call will return the list of media
+// items
+// in the album. If neither filters nor album id are
+// specified, this call will return all media items in a user's Google
+// Photos
+// library.
+//
+// If filters are specified, this call will return all media items
+// in
+// the user's library which fulfills the criteria based upon the
+// filters.
+//
+// Filters and album id must not both be set, as this will result in
+// an
+// invalid request.
+type SearchMediaItemsRequest struct {
+	// AlbumId: Identifier of an album. If populated will list all media
+	// items in
+	// specified album. Cannot be set in conjunction with any filters.
+	AlbumId string `json:"albumId,omitempty"`
+
+	// Filters: Filters to apply to the request. Cannot be set in conjuction
+	// with an
+	// albumId.
+	Filters *Filters `json:"filters,omitempty"`
+
+	// PageSize: Maximum number of media items to return in the response.
+	// The default number
+	// of media items to return at a time is 100. The maximum page size is
+	// 500.
+	PageSize int64 `json:"pageSize,omitempty"`
+
+	// PageToken: A continuation token to get the next page of the results.
+	// Adding this to
+	// the request will return the rows after the pageToken. The pageToken
+	// should
+	// be the value returned in the nextPageToken parameter in the response
+	// to the
+	// searchMediaItems request.
+	PageToken string `json:"pageToken,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "AlbumId") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AlbumId") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SearchMediaItemsRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod SearchMediaItemsRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type SearchMediaItemsResponse struct {
+	// MediaItems: [Output only] List of media items that match the search
+	// parameters.
+	MediaItems []*MediaItem `json:"mediaItems,omitempty"`
+
+	// NextPageToken: [Output only] Token to use to get the next set of
+	// media items. Its presence
+	// is the only reliable indicator of more media items being available in
+	// the
+	// next request.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "MediaItems") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "MediaItems") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SearchMediaItemsResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod SearchMediaItemsResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// ShareAlbumRequest: Request to make an album shared in Google Photos.
+type ShareAlbumRequest struct {
+	// SharedAlbumOptions: Options to be set when converting the album to a
+	// shared album.
+	SharedAlbumOptions *SharedAlbumOptions `json:"sharedAlbumOptions,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "SharedAlbumOptions")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "SharedAlbumOptions") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ShareAlbumRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod ShareAlbumRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type ShareAlbumResponse struct {
+	// ShareInfo: [Output only] Information about the shared album.
+	ShareInfo *ShareInfo `json:"shareInfo,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "ShareInfo") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ShareInfo") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ShareAlbumResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod ShareAlbumResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// ShareInfo: Information about albums that are shared. Note that
+// this
+// information is only included if the album was created by you and you
+// have the
+// sharing scope.
+type ShareInfo struct {
+	// ShareToken: A token which can be used to join this shared album on
+	// behalf of other
+	// users via the API.
+	ShareToken string `json:"shareToken,omitempty"`
+
+	// ShareableUrl: A link to the album that's now shared on the Google
+	// Photos website and app.
+	// Anyone with the link can access this shared album and see all of the
+	// items
+	// present in the album.
+	ShareableUrl string `json:"shareableUrl,omitempty"`
+
+	// SharedAlbumOptions: Options set for the shared album.
+	SharedAlbumOptions *SharedAlbumOptions `json:"sharedAlbumOptions,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "ShareToken") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ShareToken") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ShareInfo) MarshalJSON() ([]byte, error) {
+	type NoMethod ShareInfo
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// SharedAlbumOptions: Options that control the sharing of an album.
+type SharedAlbumOptions struct {
+	// IsCollaborative: True if the shared album allows collaborators (users
+	// who have joined
+	// the album) to add media items to it. Defaults to false.
+	IsCollaborative bool `json:"isCollaborative,omitempty"`
+
+	// IsCommentable: True if the shared album allows the owner and the
+	// collaborators (users
+	// who have joined the album) to add comments to the album. Defaults to
+	// false.
+	IsCommentable bool `json:"isCommentable,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "IsCollaborative") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "IsCollaborative") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SharedAlbumOptions) MarshalJSON() ([]byte, error) {
+	type NoMethod SharedAlbumOptions
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// SimpleMediaItem: A simple media item to be created in Google Photos
+// via an upload token.
+type SimpleMediaItem struct {
+	// UploadToken: Token identifying the media bytes which have been
+	// uploaded to Google.
+	UploadToken string `json:"uploadToken,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "UploadToken") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "UploadToken") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SimpleMediaItem) MarshalJSON() ([]byte, error) {
+	type NoMethod SimpleMediaItem
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// Status: The `Status` type defines a logical error model that is
+// suitable for different
+// programming environments, including REST APIs and RPC APIs. It is
+// used by
+// [gRPC](https://github.com/grpc). The error model is designed to
+// be:
+//
+// - Simple to use and understand for most users
+// - Flexible enough to meet unexpected needs
+//
+// # Overview
+//
+// The `Status` message contains three pieces of data: error code, error
+// message,
+// and error details. The error code should be an enum value
+// of
+// google.rpc.Code, but it may accept additional error codes if needed.
+// The
+// error message should be a developer-facing English message that
+// helps
+// developers *understand* and *resolve* the error. If a localized
+// user-facing
+// error message is needed, put the localized message in the error
+// details or
+// localize it in the client. The optional error details may contain
+// arbitrary
+// information about the error. There is a predefined set of error
+// detail types
+// in the package `google.rpc` that can be used for common error
+// conditions.
+//
+// # Language mapping
+//
+// The `Status` message is the logical representation of the error
+// model, but it
+// is not necessarily the actual wire format. When the `Status` message
+// is
+// exposed in different client libraries and different wire protocols,
+// it can be
+// mapped differently. For example, it will likely be mapped to some
+// exceptions
+// in Java, but more likely mapped to some error codes in C.
+//
+// # Other uses
+//
+// The error model and the `Status` message can be used in a variety
+// of
+// environments, either with or without APIs, to provide a
+// consistent developer experience across different
+// environments.
+//
+// Example uses of this error model include:
+//
+// - Partial errors. If a service needs to return partial errors to the
+// client,
+//     it may embed the `Status` in the normal response to indicate the
+// partial
+//     errors.
+//
+// - Workflow errors. A typical workflow has multiple steps. Each step
+// may
+//     have a `Status` message for error reporting.
+//
+// - Batch operations. If a client uses batch request and batch
+// response, the
+//     `Status` message should be used directly inside batch response,
+// one for
+//     each error sub-response.
+//
+// - Asynchronous operations. If an API call embeds asynchronous
+// operation
+//     results in its response, the status of those operations should
+// be
+//     represented directly using the `Status` message.
+//
+// - Logging. If some API errors are stored in logs, the message
+// `Status` could
+//     be used directly after any stripping needed for security/privacy
+// reasons.
+type Status struct {
+	// Code: The status code, which should be an enum value of
+	// google.rpc.Code.
+	Code int64 `json:"code,omitempty"`
+
+	// Details: A list of messages that carry the error details.  There is a
+	// common set of
+	// message types for APIs to use.
+	Details []googleapi.RawMessage `json:"details,omitempty"`
+
+	// Message: A developer-facing error message, which should be in
+	// English. Any
+	// user-facing error message should be localized and sent in
+	// the
+	// google.rpc.Status.details field, or localized by the client.
+	Message string `json:"message,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Code") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Code") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Status) MarshalJSON() ([]byte, error) {
+	type NoMethod Status
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// TextEnrichment: An enrichment containing text.
+type TextEnrichment struct {
+	// Text: Text for this text enrichment item.
+	Text string `json:"text,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Text") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Text") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *TextEnrichment) MarshalJSON() ([]byte, error) {
+	type NoMethod TextEnrichment
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// Video: Metadata that is specific to a video, for example, fps and
+// processing status.
+// Some of these fields may be null or not included.
+type Video struct {
+	// CameraMake: Brand of the camera which took the video.
+	CameraMake string `json:"cameraMake,omitempty"`
+
+	// CameraModel: Model of the camera which took the video.
+	CameraModel string `json:"cameraModel,omitempty"`
+
+	// Fps: Frame rate of the video.
+	Fps float64 `json:"fps,omitempty"`
+
+	// Status: Processing status of the video.
+	//
+	// Possible values:
+	//   "UNSPECIFIED" - Video processing status is unknown.
+	//   "PROCESSING" - Video is currently being processed. The user will
+	// see an icon for this
+	// video in the Google Photos app, however, it will not be playable yet.
+	//   "READY" - Video is now ready for viewing.
+	//   "FAILED" - Something has gone wrong and the video has failed to
+	// process.
+	Status string `json:"status,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "CameraMake") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "CameraMake") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Video) MarshalJSON() ([]byte, error) {
+	type NoMethod Video
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+func (s *Video) UnmarshalJSON(data []byte) error {
+	type NoMethod Video
+	var s1 struct {
+		Fps gensupport.JSONFloat64 `json:"fps"`
+		*NoMethod
+	}
+	s1.NoMethod = (*NoMethod)(s)
+	if err := json.Unmarshal(data, &s1); err != nil {
+		return err
+	}
+	s.Fps = float64(s1.Fps)
+	return nil
+}
+
+// method id "photoslibrary.albums.addEnrichment":
+
+type AlbumsAddEnrichmentCall struct {
+	s                           *Service
+	albumId                     string
+	addenrichmenttoalbumrequest *AddEnrichmentToAlbumRequest
+	urlParams_                  gensupport.URLParams
+	ctx_                        context.Context
+	header_                     http.Header
+}
+
+// AddEnrichment: Adds an enrichment to a specified position in a
+// defined album.
+func (r *AlbumsService) AddEnrichment(albumId string, addenrichmenttoalbumrequest *AddEnrichmentToAlbumRequest) *AlbumsAddEnrichmentCall {
+	c := &AlbumsAddEnrichmentCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.albumId = albumId
+	c.addenrichmenttoalbumrequest = addenrichmenttoalbumrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AlbumsAddEnrichmentCall) Fields(s ...googleapi.Field) *AlbumsAddEnrichmentCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AlbumsAddEnrichmentCall) Context(ctx context.Context) *AlbumsAddEnrichmentCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AlbumsAddEnrichmentCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AlbumsAddEnrichmentCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.addenrichmenttoalbumrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/albums/{+albumId}:addEnrichment")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"albumId": c.albumId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "photoslibrary.albums.addEnrichment" call.
+// Exactly one of *AddEnrichmentToAlbumResponse or error will be
+// non-nil. Any non-2xx status code is an error. Response headers are in
+// either *AddEnrichmentToAlbumResponse.ServerResponse.Header or (if a
+// response was returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *AlbumsAddEnrichmentCall) Do(opts ...googleapi.CallOption) (*AddEnrichmentToAlbumResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AddEnrichmentToAlbumResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Adds an enrichment to a specified position in a defined album.",
+	//   "flatPath": "v1/albums/{albumsId}:addEnrichment",
+	//   "httpMethod": "POST",
+	//   "id": "photoslibrary.albums.addEnrichment",
+	//   "parameterOrder": [
+	//     "albumId"
+	//   ],
+	//   "parameters": {
+	//     "albumId": {
+	//       "description": "Identifier of the album where the enrichment will be added.",
+	//       "location": "path",
+	//       "pattern": "^[^/]+$",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/albums/{+albumId}:addEnrichment",
+	//   "request": {
+	//     "$ref": "AddEnrichmentToAlbumRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "AddEnrichmentToAlbumResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/photoslibrary",
+	//     "https://www.googleapis.com/auth/photoslibrary.appendonly",
+	//     "https://www.googleapis.com/auth/photoslibrary.sharing"
+	//   ]
+	// }
+
+}
+
+// method id "photoslibrary.albums.create":
+
+type AlbumsCreateCall struct {
+	s                  *Service
+	createalbumrequest *CreateAlbumRequest
+	urlParams_         gensupport.URLParams
+	ctx_               context.Context
+	header_            http.Header
+}
+
+// Create: Creates an album in a user's Google Photos library.
+func (r *AlbumsService) Create(createalbumrequest *CreateAlbumRequest) *AlbumsCreateCall {
+	c := &AlbumsCreateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.createalbumrequest = createalbumrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AlbumsCreateCall) Fields(s ...googleapi.Field) *AlbumsCreateCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AlbumsCreateCall) Context(ctx context.Context) *AlbumsCreateCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AlbumsCreateCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AlbumsCreateCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.createalbumrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/albums")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "photoslibrary.albums.create" call.
+// Exactly one of *Album or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Album.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *AlbumsCreateCall) Do(opts ...googleapi.CallOption) (*Album, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Album{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates an album in a user's Google Photos library.",
+	//   "flatPath": "v1/albums",
+	//   "httpMethod": "POST",
+	//   "id": "photoslibrary.albums.create",
+	//   "parameterOrder": [],
+	//   "parameters": {},
+	//   "path": "v1/albums",
+	//   "request": {
+	//     "$ref": "CreateAlbumRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "Album"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/photoslibrary",
+	//     "https://www.googleapis.com/auth/photoslibrary.appendonly",
+	//     "https://www.googleapis.com/auth/photoslibrary.sharing"
+	//   ]
+	// }
+
+}
+
+// method id "photoslibrary.albums.get":
+
+type AlbumsGetCall struct {
+	s            *Service
+	albumId      string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// Get: Returns the album specified by the given album id.
+func (r *AlbumsService) Get(albumId string) *AlbumsGetCall {
+	c := &AlbumsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.albumId = albumId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AlbumsGetCall) Fields(s ...googleapi.Field) *AlbumsGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *AlbumsGetCall) IfNoneMatch(entityTag string) *AlbumsGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AlbumsGetCall) Context(ctx context.Context) *AlbumsGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AlbumsGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AlbumsGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/albums/{+albumId}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"albumId": c.albumId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "photoslibrary.albums.get" call.
+// Exactly one of *Album or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *Album.ServerResponse.Header or (if a response was returned at all)
+// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
+// check whether the returned error was because http.StatusNotModified
+// was returned.
+func (c *AlbumsGetCall) Do(opts ...googleapi.CallOption) (*Album, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Album{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the album specified by the given album id.",
+	//   "flatPath": "v1/albums/{albumsId}",
+	//   "httpMethod": "GET",
+	//   "id": "photoslibrary.albums.get",
+	//   "parameterOrder": [
+	//     "albumId"
+	//   ],
+	//   "parameters": {
+	//     "albumId": {
+	//       "description": "Identifier of the album to be requested.",
+	//       "location": "path",
+	//       "pattern": "^[^/]+$",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/albums/{+albumId}",
+	//   "response": {
+	//     "$ref": "Album"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/drive.photos.readonly",
+	//     "https://www.googleapis.com/auth/photoslibrary",
+	//     "https://www.googleapis.com/auth/photoslibrary.readonly",
+	//     "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"
+	//   ]
+	// }
+
+}
+
+// method id "photoslibrary.albums.list":
+
+type AlbumsListCall struct {
+	s            *Service
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// List: Lists all albums shown to a user in the 'Albums' tab of the
+// Google
+// Photos app.
+func (r *AlbumsService) List() *AlbumsListCall {
+	c := &AlbumsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	return c
+}
+
+// PageSize sets the optional parameter "pageSize": Maximum number of
+// albums to return in the response. The default number of
+// albums to return at a time is 20. The maximum page size is 50.
+func (c *AlbumsListCall) PageSize(pageSize int64) *AlbumsListCall {
+	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token to get the next page of the results. Adding this to
+// the request will return the rows after the pageToken. The pageToken
+// should
+// be the value returned in the nextPageToken parameter in the response
+// to the
+// listAlbums request.
+func (c *AlbumsListCall) PageToken(pageToken string) *AlbumsListCall {
+	c.urlParams_.Set("pageToken", pageToken)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AlbumsListCall) Fields(s ...googleapi.Field) *AlbumsListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *AlbumsListCall) IfNoneMatch(entityTag string) *AlbumsListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AlbumsListCall) Context(ctx context.Context) *AlbumsListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AlbumsListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AlbumsListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/albums")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "photoslibrary.albums.list" call.
+// Exactly one of *ListAlbumsResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ListAlbumsResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *AlbumsListCall) Do(opts ...googleapi.CallOption) (*ListAlbumsResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ListAlbumsResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists all albums shown to a user in the 'Albums' tab of the Google\nPhotos app.",
+	//   "flatPath": "v1/albums",
+	//   "httpMethod": "GET",
+	//   "id": "photoslibrary.albums.list",
+	//   "parameterOrder": [],
+	//   "parameters": {
+	//     "pageSize": {
+	//       "description": "Maximum number of albums to return in the response. The default number of\nalbums to return at a time is 20. The maximum page size is 50.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token to get the next page of the results. Adding this to\nthe request will return the rows after the pageToken. The pageToken should\nbe the value returned in the nextPageToken parameter in the response to the\nlistAlbums request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/albums",
+	//   "response": {
+	//     "$ref": "ListAlbumsResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/drive.photos.readonly",
+	//     "https://www.googleapis.com/auth/photoslibrary",
+	//     "https://www.googleapis.com/auth/photoslibrary.readonly",
+	//     "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"
+	//   ]
+	// }
+
+}
+
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *AlbumsListCall) Pages(ctx context.Context, f func(*ListAlbumsResponse) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
+
+// method id "photoslibrary.albums.share":
+
+type AlbumsShareCall struct {
+	s                 *Service
+	albumId           string
+	sharealbumrequest *ShareAlbumRequest
+	urlParams_        gensupport.URLParams
+	ctx_              context.Context
+	header_           http.Header
+}
+
+// Share: Marks an album as 'shared' and accessible to other users. This
+// action can
+// only be performed on albums which were created by the developer via
+// the
+// API.
+func (r *AlbumsService) Share(albumId string, sharealbumrequest *ShareAlbumRequest) *AlbumsShareCall {
+	c := &AlbumsShareCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.albumId = albumId
+	c.sharealbumrequest = sharealbumrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AlbumsShareCall) Fields(s ...googleapi.Field) *AlbumsShareCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AlbumsShareCall) Context(ctx context.Context) *AlbumsShareCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AlbumsShareCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AlbumsShareCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.sharealbumrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/albums/{+albumId}:share")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"albumId": c.albumId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "photoslibrary.albums.share" call.
+// Exactly one of *ShareAlbumResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ShareAlbumResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *AlbumsShareCall) Do(opts ...googleapi.CallOption) (*ShareAlbumResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ShareAlbumResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Marks an album as 'shared' and accessible to other users. This action can\nonly be performed on albums which were created by the developer via the\nAPI.",
+	//   "flatPath": "v1/albums/{albumsId}:share",
+	//   "httpMethod": "POST",
+	//   "id": "photoslibrary.albums.share",
+	//   "parameterOrder": [
+	//     "albumId"
+	//   ],
+	//   "parameters": {
+	//     "albumId": {
+	//       "description": "Identifier of the album to be shared. This album id must belong to an album\ncreated by the developer.\n.",
+	//       "location": "path",
+	//       "pattern": "^[^/]+$",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/albums/{+albumId}:share",
+	//   "request": {
+	//     "$ref": "ShareAlbumRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "ShareAlbumResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/photoslibrary.sharing"
+	//   ]
+	// }
+
+}
+
+// method id "photoslibrary.mediaItems.batchCreate":
+
+type MediaItemsBatchCreateCall struct {
+	s                            *Service
+	batchcreatemediaitemsrequest *BatchCreateMediaItemsRequest
+	urlParams_                   gensupport.URLParams
+	ctx_                         context.Context
+	header_                      http.Header
+}
+
+// BatchCreate: Creates one or more media items in a user's Google
+// Photos library.
+// If an album id is specified, the media item(s) are also added to the
+// album.
+// By default the media item(s) will be added to the end of the library
+// or
+// album.
+//
+// If an album id and position are both defined, then the media items
+// will
+// be added to the album at the specified position.
+//
+// If multiple media items are given, they will be inserted at the
+// specified
+// position.
+func (r *MediaItemsService) BatchCreate(batchcreatemediaitemsrequest *BatchCreateMediaItemsRequest) *MediaItemsBatchCreateCall {
+	c := &MediaItemsBatchCreateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.batchcreatemediaitemsrequest = batchcreatemediaitemsrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *MediaItemsBatchCreateCall) Fields(s ...googleapi.Field) *MediaItemsBatchCreateCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *MediaItemsBatchCreateCall) Context(ctx context.Context) *MediaItemsBatchCreateCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *MediaItemsBatchCreateCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *MediaItemsBatchCreateCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchcreatemediaitemsrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/mediaItems:batchCreate")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "photoslibrary.mediaItems.batchCreate" call.
+// Exactly one of *BatchCreateMediaItemsResponse or error will be
+// non-nil. Any non-2xx status code is an error. Response headers are in
+// either *BatchCreateMediaItemsResponse.ServerResponse.Header or (if a
+// response was returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *MediaItemsBatchCreateCall) Do(opts ...googleapi.CallOption) (*BatchCreateMediaItemsResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &BatchCreateMediaItemsResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates one or more media items in a user's Google Photos library.\nIf an album id is specified, the media item(s) are also added to the album.\nBy default the media item(s) will be added to the end of the library or\nalbum.\n\nIf an album id and position are both defined, then the media items will\nbe added to the album at the specified position.\n\nIf multiple media items are given, they will be inserted at the specified\nposition.",
+	//   "flatPath": "v1/mediaItems:batchCreate",
+	//   "httpMethod": "POST",
+	//   "id": "photoslibrary.mediaItems.batchCreate",
+	//   "parameterOrder": [],
+	//   "parameters": {},
+	//   "path": "v1/mediaItems:batchCreate",
+	//   "request": {
+	//     "$ref": "BatchCreateMediaItemsRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "BatchCreateMediaItemsResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/photoslibrary",
+	//     "https://www.googleapis.com/auth/photoslibrary.appendonly",
+	//     "https://www.googleapis.com/auth/photoslibrary.sharing"
+	//   ]
+	// }
+
+}
+
+// method id "photoslibrary.mediaItems.get":
+
+type MediaItemsGetCall struct {
+	s            *Service
+	mediaItemId  string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// Get: Returns the media item specified based on a given media item id.
+func (r *MediaItemsService) Get(mediaItemId string) *MediaItemsGetCall {
+	c := &MediaItemsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.mediaItemId = mediaItemId
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *MediaItemsGetCall) Fields(s ...googleapi.Field) *MediaItemsGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *MediaItemsGetCall) IfNoneMatch(entityTag string) *MediaItemsGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *MediaItemsGetCall) Context(ctx context.Context) *MediaItemsGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *MediaItemsGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *MediaItemsGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/mediaItems/{+mediaItemId}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"mediaItemId": c.mediaItemId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "photoslibrary.mediaItems.get" call.
+// Exactly one of *MediaItem or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *MediaItem.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *MediaItemsGetCall) Do(opts ...googleapi.CallOption) (*MediaItem, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &MediaItem{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the media item specified based on a given media item id.",
+	//   "flatPath": "v1/mediaItems/{mediaItemsId}",
+	//   "httpMethod": "GET",
+	//   "id": "photoslibrary.mediaItems.get",
+	//   "parameterOrder": [
+	//     "mediaItemId"
+	//   ],
+	//   "parameters": {
+	//     "mediaItemId": {
+	//       "description": "Identifier of media item to be requested.",
+	//       "location": "path",
+	//       "pattern": "^[^/]+$",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/mediaItems/{+mediaItemId}",
+	//   "response": {
+	//     "$ref": "MediaItem"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/drive.photos.readonly",
+	//     "https://www.googleapis.com/auth/photoslibrary",
+	//     "https://www.googleapis.com/auth/photoslibrary.readonly",
+	//     "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"
+	//   ]
+	// }
+
+}
+
+// method id "photoslibrary.mediaItems.search":
+
+type MediaItemsSearchCall struct {
+	s                       *Service
+	searchmediaitemsrequest *SearchMediaItemsRequest
+	urlParams_              gensupport.URLParams
+	ctx_                    context.Context
+	header_                 http.Header
+}
+
+// Search: Searches for media items in a user's Google Photos
+// library.
+// If no filters are set, then all media items in the user's library
+// will be
+// returned.
+//
+// If an album is set, all media items in the specified album will
+// be
+// returned.
+//
+// If filters are specified, anything that matches the filters from the
+// user's
+// library will be listed.
+//
+// If an album and filters are set, then this will result in an error.
+func (r *MediaItemsService) Search(searchmediaitemsrequest *SearchMediaItemsRequest) *MediaItemsSearchCall {
+	c := &MediaItemsSearchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.searchmediaitemsrequest = searchmediaitemsrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *MediaItemsSearchCall) Fields(s ...googleapi.Field) *MediaItemsSearchCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *MediaItemsSearchCall) Context(ctx context.Context) *MediaItemsSearchCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *MediaItemsSearchCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *MediaItemsSearchCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchmediaitemsrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/mediaItems:search")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "photoslibrary.mediaItems.search" call.
+// Exactly one of *SearchMediaItemsResponse or error will be non-nil.
+// Any non-2xx status code is an error. Response headers are in either
+// *SearchMediaItemsResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *MediaItemsSearchCall) Do(opts ...googleapi.CallOption) (*SearchMediaItemsResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &SearchMediaItemsResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Searches for media items in a user's Google Photos library.\nIf no filters are set, then all media items in the user's library will be\nreturned.\n\nIf an album is set, all media items in the specified album will be\nreturned.\n\nIf filters are specified, anything that matches the filters from the user's\nlibrary will be listed.\n\nIf an album and filters are set, then this will result in an error.",
+	//   "flatPath": "v1/mediaItems:search",
+	//   "httpMethod": "POST",
+	//   "id": "photoslibrary.mediaItems.search",
+	//   "parameterOrder": [],
+	//   "parameters": {},
+	//   "path": "v1/mediaItems:search",
+	//   "request": {
+	//     "$ref": "SearchMediaItemsRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "SearchMediaItemsResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/drive.photos.readonly",
+	//     "https://www.googleapis.com/auth/photoslibrary",
+	//     "https://www.googleapis.com/auth/photoslibrary.readonly",
+	//     "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"
+	//   ]
+	// }
+
+}
+
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *MediaItemsSearchCall) Pages(ctx context.Context, f func(*SearchMediaItemsResponse) error) error {
+	c.ctx_ = ctx
+	defer func(pt string) { c.searchmediaitemsrequest.PageToken = pt }(c.searchmediaitemsrequest.PageToken) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.searchmediaitemsrequest.PageToken = x.NextPageToken
+	}
+}
+
+// method id "photoslibrary.sharedAlbums.join":
+
+type SharedAlbumsJoinCall struct {
+	s                      *Service
+	joinsharedalbumrequest *JoinSharedAlbumRequest
+	urlParams_             gensupport.URLParams
+	ctx_                   context.Context
+	header_                http.Header
+}
+
+// Join: Joins a shared album on behalf of the Google Photos user.
+func (r *SharedAlbumsService) Join(joinsharedalbumrequest *JoinSharedAlbumRequest) *SharedAlbumsJoinCall {
+	c := &SharedAlbumsJoinCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.joinsharedalbumrequest = joinsharedalbumrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *SharedAlbumsJoinCall) Fields(s ...googleapi.Field) *SharedAlbumsJoinCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *SharedAlbumsJoinCall) Context(ctx context.Context) *SharedAlbumsJoinCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *SharedAlbumsJoinCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *SharedAlbumsJoinCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.joinsharedalbumrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/sharedAlbums:join")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "photoslibrary.sharedAlbums.join" call.
+// Exactly one of *JoinSharedAlbumResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *JoinSharedAlbumResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *SharedAlbumsJoinCall) Do(opts ...googleapi.CallOption) (*JoinSharedAlbumResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &JoinSharedAlbumResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Joins a shared album on behalf of the Google Photos user.",
+	//   "flatPath": "v1/sharedAlbums:join",
+	//   "httpMethod": "POST",
+	//   "id": "photoslibrary.sharedAlbums.join",
+	//   "parameterOrder": [],
+	//   "parameters": {},
+	//   "path": "v1/sharedAlbums:join",
+	//   "request": {
+	//     "$ref": "JoinSharedAlbumRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "JoinSharedAlbumResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/photoslibrary.sharing"
+	//   ]
+	// }
+
+}
+
+// method id "photoslibrary.sharedAlbums.list":
+
+type SharedAlbumsListCall struct {
+	s            *Service
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// List: Lists all shared albums shown to a user in the 'Sharing' tab of
+// the
+// Google Photos app.
+func (r *SharedAlbumsService) List() *SharedAlbumsListCall {
+	c := &SharedAlbumsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	return c
+}
+
+// PageSize sets the optional parameter "pageSize": Maximum number of
+// albums to return in the response. The default number of
+// albums to return at a time is 20. The maximum page size is 50.
+func (c *SharedAlbumsListCall) PageSize(pageSize int64) *SharedAlbumsListCall {
+	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token to get the next page of the results. Adding this to
+// the request will return the rows after the pageToken. The pageToken
+// should
+// be the value returned in the nextPageToken parameter in the response
+// to the
+// listSharedAlbums request.
+func (c *SharedAlbumsListCall) PageToken(pageToken string) *SharedAlbumsListCall {
+	c.urlParams_.Set("pageToken", pageToken)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *SharedAlbumsListCall) Fields(s ...googleapi.Field) *SharedAlbumsListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *SharedAlbumsListCall) IfNoneMatch(entityTag string) *SharedAlbumsListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *SharedAlbumsListCall) Context(ctx context.Context) *SharedAlbumsListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *SharedAlbumsListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *SharedAlbumsListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/sharedAlbums")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "photoslibrary.sharedAlbums.list" call.
+// Exactly one of *ListSharedAlbumsResponse or error will be non-nil.
+// Any non-2xx status code is an error. Response headers are in either
+// *ListSharedAlbumsResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *SharedAlbumsListCall) Do(opts ...googleapi.CallOption) (*ListSharedAlbumsResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ListSharedAlbumsResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := gensupport.DecodeResponse(target, res); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists all shared albums shown to a user in the 'Sharing' tab of the\nGoogle Photos app.",
+	//   "flatPath": "v1/sharedAlbums",
+	//   "httpMethod": "GET",
+	//   "id": "photoslibrary.sharedAlbums.list",
+	//   "parameterOrder": [],
+	//   "parameters": {
+	//     "pageSize": {
+	//       "description": "Maximum number of albums to return in the response. The default number of\nalbums to return at a time is 20. The maximum page size is 50.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token to get the next page of the results. Adding this to\nthe request will return the rows after the pageToken. The pageToken should\nbe the value returned in the nextPageToken parameter in the response to the\nlistSharedAlbums request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/sharedAlbums",
+	//   "response": {
+	//     "$ref": "ListSharedAlbumsResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/drive.photos.readonly",
+	//     "https://www.googleapis.com/auth/photoslibrary",
+	//     "https://www.googleapis.com/auth/photoslibrary.readonly",
+	//     "https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata"
+	//   ]
+	// }
+
+}
+
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *SharedAlbumsListCall) Pages(ctx context.Context, f func(*ListSharedAlbumsResponse) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
diff --git a/pubsub/v1/pubsub-api.json b/pubsub/v1/pubsub-api.json
index 87d04f9..0c3299f 100644
--- a/pubsub/v1/pubsub-api.json
+++ b/pubsub/v1/pubsub-api.json
@@ -18,7 +18,6 @@
   "description": "Provides reliable, many-to-many, asynchronous messaging between applications.\n",
   "discoveryVersion": "v1",
   "documentationLink": "https://cloud.google.com/pubsub/docs",
-  "fullyEncodeReservedExpansion": true,
   "icons": {
     "x16": "http://www.google.com/images/icons/product/search-16.gif",
     "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -1057,7 +1056,7 @@
       }
     }
   },
-  "revision": "20180423",
+  "revision": "20180416",
   "rootUrl": "https://pubsub.googleapis.com/",
   "schemas": {
     "AcknowledgeRequest": {
@@ -1079,7 +1078,7 @@
       "id": "Binding",
       "properties": {
         "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` .\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
+          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
           "items": {
             "type": "string"
           },
diff --git a/pubsub/v1/pubsub-gen.go b/pubsub/v1/pubsub-gen.go
index f89e227..d5077a8 100644
--- a/pubsub/v1/pubsub-gen.go
+++ b/pubsub/v1/pubsub-gen.go
@@ -193,7 +193,7 @@
 	//
 	// * `user:{emailid}`: An email address that represents a specific
 	// Google
-	//    account. For example, `alice@gmail.com` .
+	//    account. For example, `alice@gmail.com` or `joe@example.com`.
 	//
 	//
 	// * `serviceAccount:{emailid}`: An email address that represents a
diff --git a/pubsub/v1beta1a/pubsub-api.json b/pubsub/v1beta1a/pubsub-api.json
index eadc6c8..ef739b4 100644
--- a/pubsub/v1beta1a/pubsub-api.json
+++ b/pubsub/v1beta1a/pubsub-api.json
@@ -18,7 +18,6 @@
   "description": "Provides reliable, many-to-many, asynchronous messaging between applications.\n",
   "discoveryVersion": "v1",
   "documentationLink": "https://cloud.google.com/pubsub/docs",
-  "fullyEncodeReservedExpansion": true,
   "icons": {
     "x16": "http://www.google.com/images/icons/product/search-16.gif",
     "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -468,7 +467,7 @@
       }
     }
   },
-  "revision": "20180423",
+  "revision": "20180416",
   "rootUrl": "https://pubsub.googleapis.com/",
   "schemas": {
     "AcknowledgeRequest": {
diff --git a/pubsub/v1beta2/pubsub-api.json b/pubsub/v1beta2/pubsub-api.json
index 7446566..625bb41 100644
--- a/pubsub/v1beta2/pubsub-api.json
+++ b/pubsub/v1beta2/pubsub-api.json
@@ -18,7 +18,6 @@
   "description": "Provides reliable, many-to-many, asynchronous messaging between applications.\n",
   "discoveryVersion": "v1",
   "documentationLink": "https://cloud.google.com/pubsub/docs",
-  "fullyEncodeReservedExpansion": true,
   "icons": {
     "x16": "http://www.google.com/images/icons/product/search-16.gif",
     "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -723,7 +722,7 @@
       }
     }
   },
-  "revision": "20180423",
+  "revision": "20180416",
   "rootUrl": "https://pubsub.googleapis.com/",
   "schemas": {
     "AcknowledgeRequest": {
@@ -745,7 +744,7 @@
       "id": "Binding",
       "properties": {
         "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` .\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
+          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
           "items": {
             "type": "string"
           },
diff --git a/pubsub/v1beta2/pubsub-gen.go b/pubsub/v1beta2/pubsub-gen.go
index bbc0986..2c33013 100644
--- a/pubsub/v1beta2/pubsub-gen.go
+++ b/pubsub/v1beta2/pubsub-gen.go
@@ -169,7 +169,7 @@
 	//
 	// * `user:{emailid}`: An email address that represents a specific
 	// Google
-	//    account. For example, `alice@gmail.com` .
+	//    account. For example, `alice@gmail.com` or `joe@example.com`.
 	//
 	//
 	// * `serviceAccount:{emailid}`: An email address that represents a
diff --git a/sheets/v4/sheets-api.json b/sheets/v4/sheets-api.json
index 3d7f6b5..bba74db 100644
--- a/sheets/v4/sheets-api.json
+++ b/sheets/v4/sheets-api.json
@@ -819,7 +819,7 @@
       }
     }
   },
-  "revision": "20180405",
+  "revision": "20180503",
   "rootUrl": "https://sheets.googleapis.com/",
   "schemas": {
     "AddBandingRequest": {
@@ -882,6 +882,31 @@
       },
       "type": "object"
     },
+    "AddDimensionGroupRequest": {
+      "description": "Creates a group over the specified range.\n\nIf the requested range is a superset of the range of an existing group G,\nthen the depth of G will be incremented and this new group G' will have the\ndepth of that group. For example, a group [C:D, depth 1] + [B:E] results in\ngroups [B:E, depth 1] and [C:D, depth 2].\nIf the requested range is a subset of the range of an existing group G,\nthen the depth of the new group G' will be one greater than the depth of G.\nFor example, a group [B:E, depth 1] + [C:D] results in groups [B:E, depth 1]\nand [C:D, depth 2].\nIf the requested range starts before and ends within, or starts within and\nends after, the range of an existing group G, then the range of the existing\ngroup G will become the union of the ranges, and the new group G' will have\ndepth one greater than the depth of G and range as the intersection of the\nranges. For example, a group [B:D, depth 1] + [C:E] results in groups [B:E,\ndepth 1] and [C:D, depth 2].",
+      "id": "AddDimensionGroupRequest",
+      "properties": {
+        "range": {
+          "$ref": "DimensionRange",
+          "description": "The range over which to create a group."
+        }
+      },
+      "type": "object"
+    },
+    "AddDimensionGroupResponse": {
+      "description": "The result of adding a group.",
+      "id": "AddDimensionGroupResponse",
+      "properties": {
+        "dimensionGroups": {
+          "description": "All groups of a dimension after adding a group to that dimension.",
+          "items": {
+            "$ref": "DimensionGroup"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "AddFilterViewRequest": {
       "description": "Adds a filter view.",
       "id": "AddFilterViewRequest",
@@ -1806,7 +1831,8 @@
             "ONE_OF_LIST",
             "BLANK",
             "NOT_BLANK",
-            "CUSTOM_FORMULA"
+            "CUSTOM_FORMULA",
+            "BOOLEAN"
           ],
           "enumDescriptions": [
             "The default value, do not use.",
@@ -1837,7 +1863,8 @@
             "The cell's value must be in the list of condition values.\nSupported by data validation.\nSupports any number of condition values,\none per item in the list.\nFormulas are not supported in the values.",
             "The cell's value must be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.",
             "The cell's value must not be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.",
-            "The condition's formula must evaluate to true.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue."
+            "The condition's formula must evaluate to true.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.",
+            "The cell's value must be TRUE/FALSE or in the list of condition values.\nSupported by data validation.\nRenders as a cell checkbox.\nSupports zero, one or two ConditionValue.  No\nvalues indicates the cell must be TRUE or FALSE, where TRUE renders as\nchecked and FALSE renders as unchecked.  One value indicates the cell\nwill render as checked when it contains that value and unchecked when it\nis blank.  Two values indicate that the cell will render as checked when\nit contains the first value and unchecked when it contains the second\nvalue.  For example, [\"Yes\",\"\"No\"] indicates that the cell will render a\nchecked box when it has the value \"Yes\" and an unchecked box when it has\nthe value \"No\"."
           ],
           "type": "string"
         },
@@ -2660,6 +2687,53 @@
       },
       "type": "object"
     },
+    "DateTimeRule": {
+      "description": "Allows you to organize the date-time values in a source data column into\nbuckets based on selected parts of their date or time values. For example,\nconsider a pivot table showing sales transactions by date:\n\n    +----------+--------------+\n    | Date     | SUM of Sales |\n    +----------+--------------+\n    | 1/1/2017 |      $621.14 |\n    | 2/3/2017 |      $708.84 |\n    | 5/8/2017 |      $326.84 |\n    ...\n    +----------+--------------+\nApplying a date-time group rule with a DateTimeRuleType of YEAR_MONTH\nresults in the following pivot table.\n\n    +--------------+--------------+\n    | Grouped Date | SUM of Sales |\n    +--------------+--------------+\n    | 2017-Jan     |   $53,731.78 |\n    | 2017-Feb     |   $83,475.32 |\n    | 2017-Mar     |   $94,385.05 |\n    ...\n    +--------------+--------------+",
+      "id": "DateTimeRule",
+      "properties": {
+        "type": {
+          "description": "The type of date-time grouping to apply.",
+          "enum": [
+            "DATE_TIME_RULE_TYPE_UNSPECIFIED",
+            "SECOND",
+            "MINUTE",
+            "HOUR",
+            "HOUR_MINUTE",
+            "HOUR_MINUTE_AMPM",
+            "DAY_OF_WEEK",
+            "DAY_OF_YEAR",
+            "DAY_OF_MONTH",
+            "DAY_MONTH",
+            "MONTH",
+            "QUARTER",
+            "YEAR",
+            "YEAR_MONTH",
+            "YEAR_QUARTER",
+            "YEAR_MONTH_DAY"
+          ],
+          "enumDescriptions": [
+            "The default type, do not use.",
+            "Group dates by second, from 0 to 59",
+            "Group dates by minute, from 0 to 59",
+            "Group dates by hour using a 24-hour system, from 0 to 23",
+            "Group dates by hour and minute using a 24-hour system, e.g. 19:45",
+            "Group dates by hour and minute using a 12-hour system, e.g. 7:45 PM. The\nAM/PM designation will be translated based on the spreadsheet locale.",
+            "Group dates by day of week, e.g. Sunday. The days of the week will be\ntranslated based on the spreadsheet locale.",
+            "Group dates by day of year, from 1 to 366. Note that dates after Feb. 29\nfall in different buckets in leap years than in non-leap years.",
+            "Group dates by day of month, from 1 to 31",
+            "Group dates by day and month, e.g. 22-Nov. The month will be translated\nbased on the spreadsheet locale.",
+            "Group dates by month, e.g. Nov. The month will be translated based on the\nspreadsheet locale.",
+            "Group dates by quarter, e.g. Q1 (which represents Jan-Mar)",
+            "Group dates by year, e.g. 2008",
+            "Group dates by year and month, e.g. 2008-Nov. The month will be\ntranslated based on the spreadsheet locale.",
+            "Group dates by year and quarter, e.g. 2008 Q4",
+            "Group dates by year, month, and day, e.g. 2008-11-22"
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "DeleteBandingRequest": {
       "description": "Removes the banded range with the given ID from the spreadsheet.",
       "id": "DeleteBandingRequest",
@@ -2725,6 +2799,31 @@
       },
       "type": "object"
     },
+    "DeleteDimensionGroupRequest": {
+      "description": "Deletes a group over the specified range by decrementing the depth of the\ndimensions in the range.\n\nFor example, assume the sheet has a depth-1 group over B:E and a depth-2\ngroup over C:D. Deleting a group over D:E would leave the sheet with a\ndepth-1 group over B:D and a depth-2 group over C:C.",
+      "id": "DeleteDimensionGroupRequest",
+      "properties": {
+        "range": {
+          "$ref": "DimensionRange",
+          "description": "The range of the group to be deleted."
+        }
+      },
+      "type": "object"
+    },
+    "DeleteDimensionGroupResponse": {
+      "description": "The result of deleting a group.",
+      "id": "DeleteDimensionGroupResponse",
+      "properties": {
+        "dimensionGroups": {
+          "description": "All groups of a dimension after deleting a group from that dimension.",
+          "items": {
+            "$ref": "DimensionGroup"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "DeleteDimensionRequest": {
       "description": "Deletes the dimensions from the sheet.",
       "id": "DeleteDimensionRequest",
@@ -2966,6 +3065,26 @@
       },
       "type": "object"
     },
+    "DimensionGroup": {
+      "description": "A group over an interval of rows or columns on a sheet, which can contain or\nbe contained within other groups. A group can be collapsed or expanded as a\nunit on the sheet.",
+      "id": "DimensionGroup",
+      "properties": {
+        "collapsed": {
+          "description": "True if this group is collapsed. A collapsed group will remain collapsed if\nan overlapping group at a shallower depth is expanded.\n\ncollapsed == true does not imply that all dimensions within the group are\nhidden, since a dimension's visibility can change independently from this\ngroup property. However, when this property is updated, all dimensions\nwithin it will be set to hidden if collapsed == true, or set to visible if\ncollapsed == false.",
+          "type": "boolean"
+        },
+        "depth": {
+          "description": "The depth of the group, representing how many groups have a range that\nwholly contains the range of this group.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "range": {
+          "$ref": "DimensionRange",
+          "description": "The range over which this group exists."
+        }
+      },
+      "type": "object"
+    },
     "DimensionProperties": {
       "description": "Properties about a dimension.",
       "id": "DimensionProperties",
@@ -3459,6 +3578,10 @@
           "format": "int32",
           "type": "integer"
         },
+        "columnGroupControlAfter": {
+          "description": "True if the column grouping control toggle is shown after the group.",
+          "type": "boolean"
+        },
         "frozenColumnCount": {
           "description": "The number of columns that are frozen in the grid.",
           "format": "int32",
@@ -3477,6 +3600,10 @@
           "description": "The number of rows in the grid.",
           "format": "int32",
           "type": "integer"
+        },
+        "rowGroupControlAfter": {
+          "description": "True if the row grouping control toggle is shown after the group.",
+          "type": "boolean"
         }
       },
       "type": "object"
@@ -4158,6 +4285,10 @@
       "description": "An optional setting on a PivotGroup that defines buckets for the values\nin the source data column rather than breaking out each individual value.\nOnly one PivotGroup with a group rule may be added for each column in\nthe source data, though on any given column you may add both a\nPivotGroup that has a rule and a PivotGroup that does not.",
       "id": "PivotGroupRule",
       "properties": {
+        "dateTimeRule": {
+          "$ref": "DateTimeRule",
+          "description": "A DateTimeRule."
+        },
         "histogramRule": {
           "$ref": "HistogramRule",
           "description": "A HistogramRule."
@@ -4418,6 +4549,10 @@
           "$ref": "AddConditionalFormatRuleRequest",
           "description": "Adds a new conditional format rule."
         },
+        "addDimensionGroup": {
+          "$ref": "AddDimensionGroupRequest",
+          "description": "Creates a group over the specified range."
+        },
         "addFilterView": {
           "$ref": "AddFilterViewRequest",
           "description": "Adds a filter view."
@@ -4482,6 +4617,10 @@
           "$ref": "DeleteDimensionRequest",
           "description": "Deletes rows or columns in a sheet."
         },
+        "deleteDimensionGroup": {
+          "$ref": "DeleteDimensionGroupRequest",
+          "description": "Deletes a group over the specified range."
+        },
         "deleteEmbeddedObject": {
           "$ref": "DeleteEmbeddedObjectRequest",
           "description": "Deletes an embedded object (e.g, chart, image) in a sheet."
@@ -4590,6 +4729,10 @@
           "$ref": "UpdateDeveloperMetadataRequest",
           "description": "Updates an existing developer metadata entry"
         },
+        "updateDimensionGroup": {
+          "$ref": "UpdateDimensionGroupRequest",
+          "description": "Updates the state of the specified group."
+        },
         "updateDimensionProperties": {
           "$ref": "UpdateDimensionPropertiesRequest",
           "description": "Updates dimensions' properties."
@@ -4633,6 +4776,10 @@
           "$ref": "AddChartResponse",
           "description": "A reply from adding a chart."
         },
+        "addDimensionGroup": {
+          "$ref": "AddDimensionGroupResponse",
+          "description": "A reply from adding a dimension group."
+        },
         "addFilterView": {
           "$ref": "AddFilterViewResponse",
           "description": "A reply from adding a filter view."
@@ -4661,6 +4808,10 @@
           "$ref": "DeleteDeveloperMetadataResponse",
           "description": "A reply from deleting a developer metadata entry."
         },
+        "deleteDimensionGroup": {
+          "$ref": "DeleteDimensionGroupResponse",
+          "description": "A reply from deleting a dimension group."
+        },
         "duplicateFilterView": {
           "$ref": "DuplicateFilterViewResponse",
           "description": "A reply from duplicating a filter view."
@@ -4778,6 +4929,13 @@
           },
           "type": "array"
         },
+        "columnGroups": {
+          "description": "All column groups on this sheet, ordered by increasing range start index,\nthen by group depth.",
+          "items": {
+            "$ref": "DimensionGroup"
+          },
+          "type": "array"
+        },
         "conditionalFormats": {
           "description": "The conditional format rules in this sheet.",
           "items": {
@@ -4823,6 +4981,13 @@
             "$ref": "ProtectedRange"
           },
           "type": "array"
+        },
+        "rowGroups": {
+          "description": "All row groups on this sheet, ordered by increasing range start index, then\nby group depth.",
+          "items": {
+            "$ref": "DimensionGroup"
+          },
+          "type": "array"
         }
       },
       "type": "object"
@@ -5438,6 +5603,22 @@
       },
       "type": "object"
     },
+    "UpdateDimensionGroupRequest": {
+      "description": "Updates the state of the specified group.",
+      "id": "UpdateDimensionGroupRequest",
+      "properties": {
+        "dimensionGroup": {
+          "$ref": "DimensionGroup",
+          "description": "The group whose state should be updated. The range and depth of the group\nshould specify a valid group on the sheet, and all other fields updated."
+        },
+        "fields": {
+          "description": "The fields that should be updated.  At least one field must be specified.\nThe root `dimensionGroup` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.",
+          "format": "google-fieldmask",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "UpdateDimensionPropertiesRequest": {
       "description": "Updates properties of dimensions within the specified range.",
       "id": "UpdateDimensionPropertiesRequest",
diff --git a/sheets/v4/sheets-gen.go b/sheets/v4/sheets-gen.go
index 437406c..f9a7a49 100644
--- a/sheets/v4/sheets-gen.go
+++ b/sheets/v4/sheets-gen.go
@@ -286,6 +286,91 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// AddDimensionGroupRequest: Creates a group over the specified
+// range.
+//
+// If the requested range is a superset of the range of an existing
+// group G,
+// then the depth of G will be incremented and this new group G' will
+// have the
+// depth of that group. For example, a group [C:D, depth 1] + [B:E]
+// results in
+// groups [B:E, depth 1] and [C:D, depth 2].
+// If the requested range is a subset of the range of an existing group
+// G,
+// then the depth of the new group G' will be one greater than the depth
+// of G.
+// For example, a group [B:E, depth 1] + [C:D] results in groups [B:E,
+// depth 1]
+// and [C:D, depth 2].
+// If the requested range starts before and ends within, or starts
+// within and
+// ends after, the range of an existing group G, then the range of the
+// existing
+// group G will become the union of the ranges, and the new group G'
+// will have
+// depth one greater than the depth of G and range as the intersection
+// of the
+// ranges. For example, a group [B:D, depth 1] + [C:E] results in groups
+// [B:E,
+// depth 1] and [C:D, depth 2].
+type AddDimensionGroupRequest struct {
+	// Range: The range over which to create a group.
+	Range *DimensionRange `json:"range,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Range") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Range") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AddDimensionGroupRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod AddDimensionGroupRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// AddDimensionGroupResponse: The result of adding a group.
+type AddDimensionGroupResponse struct {
+	// DimensionGroups: All groups of a dimension after adding a group to
+	// that dimension.
+	DimensionGroups []*DimensionGroup `json:"dimensionGroups,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "DimensionGroups") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "DimensionGroups") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AddDimensionGroupResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod AddDimensionGroupResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // AddFilterViewRequest: Adds a filter view.
 type AddFilterViewRequest struct {
 	// Filter: The filter to add. The filterViewId
@@ -2097,6 +2182,26 @@
 	// Supported by data validation, conditional formatting and
 	// filters.
 	// Requires a single ConditionValue.
+	//   "BOOLEAN" - The cell's value must be TRUE/FALSE or in the list of
+	// condition values.
+	// Supported by data validation.
+	// Renders as a cell checkbox.
+	// Supports zero, one or two ConditionValue.  No
+	// values indicates the cell must be TRUE or FALSE, where TRUE renders
+	// as
+	// checked and FALSE renders as unchecked.  One value indicates the
+	// cell
+	// will render as checked when it contains that value and unchecked when
+	// it
+	// is blank.  Two values indicate that the cell will render as checked
+	// when
+	// it contains the first value and unchecked when it contains the
+	// second
+	// value.  For example, ["Yes",""No"] indicates that the cell will
+	// render a
+	// checked box when it has the value "Yes" and an unchecked box when it
+	// has
+	// the value "No".
 	Type string `json:"type,omitempty"`
 
 	// Values: The values of the condition. The number of supported values
@@ -3616,6 +3721,92 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// DateTimeRule: Allows you to organize the date-time values in a source
+// data column into
+// buckets based on selected parts of their date or time values. For
+// example,
+// consider a pivot table showing sales transactions by date:
+//
+//     +----------+--------------+
+//     | Date     | SUM of Sales |
+//     +----------+--------------+
+//     | 1/1/2017 |      $621.14 |
+//     | 2/3/2017 |      $708.84 |
+//     | 5/8/2017 |      $326.84 |
+//     ...
+//     +----------+--------------+
+// Applying a date-time group rule with a DateTimeRuleType of
+// YEAR_MONTH
+// results in the following pivot table.
+//
+//     +--------------+--------------+
+//     | Grouped Date | SUM of Sales |
+//     +--------------+--------------+
+//     | 2017-Jan     |   $53,731.78 |
+//     | 2017-Feb     |   $83,475.32 |
+//     | 2017-Mar     |   $94,385.05 |
+//     ...
+//     +--------------+--------------+
+type DateTimeRule struct {
+	// Type: The type of date-time grouping to apply.
+	//
+	// Possible values:
+	//   "DATE_TIME_RULE_TYPE_UNSPECIFIED" - The default type, do not use.
+	//   "SECOND" - Group dates by second, from 0 to 59
+	//   "MINUTE" - Group dates by minute, from 0 to 59
+	//   "HOUR" - Group dates by hour using a 24-hour system, from 0 to 23
+	//   "HOUR_MINUTE" - Group dates by hour and minute using a 24-hour
+	// system, e.g. 19:45
+	//   "HOUR_MINUTE_AMPM" - Group dates by hour and minute using a 12-hour
+	// system, e.g. 7:45 PM. The
+	// AM/PM designation will be translated based on the spreadsheet locale.
+	//   "DAY_OF_WEEK" - Group dates by day of week, e.g. Sunday. The days
+	// of the week will be
+	// translated based on the spreadsheet locale.
+	//   "DAY_OF_YEAR" - Group dates by day of year, from 1 to 366. Note
+	// that dates after Feb. 29
+	// fall in different buckets in leap years than in non-leap years.
+	//   "DAY_OF_MONTH" - Group dates by day of month, from 1 to 31
+	//   "DAY_MONTH" - Group dates by day and month, e.g. 22-Nov. The month
+	// will be translated
+	// based on the spreadsheet locale.
+	//   "MONTH" - Group dates by month, e.g. Nov. The month will be
+	// translated based on the
+	// spreadsheet locale.
+	//   "QUARTER" - Group dates by quarter, e.g. Q1 (which represents
+	// Jan-Mar)
+	//   "YEAR" - Group dates by year, e.g. 2008
+	//   "YEAR_MONTH" - Group dates by year and month, e.g. 2008-Nov. The
+	// month will be
+	// translated based on the spreadsheet locale.
+	//   "YEAR_QUARTER" - Group dates by year and quarter, e.g. 2008 Q4
+	//   "YEAR_MONTH_DAY" - Group dates by year, month, and day, e.g.
+	// 2008-11-22
+	Type string `json:"type,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Type") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Type") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *DateTimeRule) MarshalJSON() ([]byte, error) {
+	type NoMethod DateTimeRule
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // DeleteBandingRequest: Removes the banded range with the given ID from
 // the spreadsheet.
 type DeleteBandingRequest struct {
@@ -3769,6 +3960,72 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// DeleteDimensionGroupRequest: Deletes a group over the specified range
+// by decrementing the depth of the
+// dimensions in the range.
+//
+// For example, assume the sheet has a depth-1 group over B:E and a
+// depth-2
+// group over C:D. Deleting a group over D:E would leave the sheet with
+// a
+// depth-1 group over B:D and a depth-2 group over C:C.
+type DeleteDimensionGroupRequest struct {
+	// Range: The range of the group to be deleted.
+	Range *DimensionRange `json:"range,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Range") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Range") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *DeleteDimensionGroupRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod DeleteDimensionGroupRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// DeleteDimensionGroupResponse: The result of deleting a group.
+type DeleteDimensionGroupResponse struct {
+	// DimensionGroups: All groups of a dimension after deleting a group
+	// from that dimension.
+	DimensionGroups []*DimensionGroup `json:"dimensionGroups,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "DimensionGroups") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "DimensionGroups") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *DeleteDimensionGroupResponse) MarshalJSON() ([]byte, error) {
+	type NoMethod DeleteDimensionGroupResponse
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // DeleteDimensionRequest: Deletes the dimensions from the sheet.
 type DeleteDimensionRequest struct {
 	// Range: The dimensions to delete from the sheet.
@@ -4264,6 +4521,58 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// DimensionGroup: A group over an interval of rows or columns on a
+// sheet, which can contain or
+// be contained within other groups. A group can be collapsed or
+// expanded as a
+// unit on the sheet.
+type DimensionGroup struct {
+	// Collapsed: True if this group is collapsed. A collapsed group will
+	// remain collapsed if
+	// an overlapping group at a shallower depth is expanded.
+	//
+	// collapsed == true does not imply that all dimensions within the group
+	// are
+	// hidden, since a dimension's visibility can change independently from
+	// this
+	// group property. However, when this property is updated, all
+	// dimensions
+	// within it will be set to hidden if collapsed == true, or set to
+	// visible if
+	// collapsed == false.
+	Collapsed bool `json:"collapsed,omitempty"`
+
+	// Depth: The depth of the group, representing how many groups have a
+	// range that
+	// wholly contains the range of this group.
+	Depth int64 `json:"depth,omitempty"`
+
+	// Range: The range over which this group exists.
+	Range *DimensionRange `json:"range,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Collapsed") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Collapsed") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *DimensionGroup) MarshalJSON() ([]byte, error) {
+	type NoMethod DimensionGroup
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // DimensionProperties: Properties about a dimension.
 type DimensionProperties struct {
 	// DeveloperMetadata: The developer metadata associated with a single
@@ -5065,6 +5374,10 @@
 	// ColumnCount: The number of columns in the grid.
 	ColumnCount int64 `json:"columnCount,omitempty"`
 
+	// ColumnGroupControlAfter: True if the column grouping control toggle
+	// is shown after the group.
+	ColumnGroupControlAfter bool `json:"columnGroupControlAfter,omitempty"`
+
 	// FrozenColumnCount: The number of columns that are frozen in the grid.
 	FrozenColumnCount int64 `json:"frozenColumnCount,omitempty"`
 
@@ -5077,6 +5390,10 @@
 	// RowCount: The number of rows in the grid.
 	RowCount int64 `json:"rowCount,omitempty"`
 
+	// RowGroupControlAfter: True if the row grouping control toggle is
+	// shown after the group.
+	RowGroupControlAfter bool `json:"rowGroupControlAfter,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "ColumnCount") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -6431,13 +6748,16 @@
 // a
 // PivotGroup that has a rule and a PivotGroup that does not.
 type PivotGroupRule struct {
+	// DateTimeRule: A DateTimeRule.
+	DateTimeRule *DateTimeRule `json:"dateTimeRule,omitempty"`
+
 	// HistogramRule: A HistogramRule.
 	HistogramRule *HistogramRule `json:"histogramRule,omitempty"`
 
 	// ManualRule: A ManualRule.
 	ManualRule *ManualRule `json:"manualRule,omitempty"`
 
-	// ForceSendFields is a list of field names (e.g. "HistogramRule") to
+	// ForceSendFields is a list of field names (e.g. "DateTimeRule") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
 	// non-interface field appearing in ForceSendFields will be sent to the
@@ -6445,7 +6765,7 @@
 	// used to include empty fields in Patch requests.
 	ForceSendFields []string `json:"-"`
 
-	// NullFields is a list of field names (e.g. "HistogramRule") to include
+	// NullFields is a list of field names (e.g. "DateTimeRule") to include
 	// in API requests with the JSON null value. By default, fields with
 	// empty values are omitted from API requests. However, any field with
 	// an empty value appearing in NullFields will be sent to the server as
@@ -6872,6 +7192,9 @@
 	// AddConditionalFormatRule: Adds a new conditional format rule.
 	AddConditionalFormatRule *AddConditionalFormatRuleRequest `json:"addConditionalFormatRule,omitempty"`
 
+	// AddDimensionGroup: Creates a group over the specified range.
+	AddDimensionGroup *AddDimensionGroupRequest `json:"addDimensionGroup,omitempty"`
+
 	// AddFilterView: Adds a filter view.
 	AddFilterView *AddFilterViewRequest `json:"addFilterView,omitempty"`
 
@@ -6923,6 +7246,9 @@
 	// DeleteDimension: Deletes rows or columns in a sheet.
 	DeleteDimension *DeleteDimensionRequest `json:"deleteDimension,omitempty"`
 
+	// DeleteDimensionGroup: Deletes a group over the specified range.
+	DeleteDimensionGroup *DeleteDimensionGroupRequest `json:"deleteDimensionGroup,omitempty"`
+
 	// DeleteEmbeddedObject: Deletes an embedded object (e.g, chart, image)
 	// in a sheet.
 	DeleteEmbeddedObject *DeleteEmbeddedObjectRequest `json:"deleteEmbeddedObject,omitempty"`
@@ -7009,6 +7335,9 @@
 	// UpdateDeveloperMetadata: Updates an existing developer metadata entry
 	UpdateDeveloperMetadata *UpdateDeveloperMetadataRequest `json:"updateDeveloperMetadata,omitempty"`
 
+	// UpdateDimensionGroup: Updates the state of the specified group.
+	UpdateDimensionGroup *UpdateDimensionGroupRequest `json:"updateDimensionGroup,omitempty"`
+
 	// UpdateDimensionProperties: Updates dimensions' properties.
 	UpdateDimensionProperties *UpdateDimensionPropertiesRequest `json:"updateDimensionProperties,omitempty"`
 
@@ -7062,6 +7391,9 @@
 	// AddChart: A reply from adding a chart.
 	AddChart *AddChartResponse `json:"addChart,omitempty"`
 
+	// AddDimensionGroup: A reply from adding a dimension group.
+	AddDimensionGroup *AddDimensionGroupResponse `json:"addDimensionGroup,omitempty"`
+
 	// AddFilterView: A reply from adding a filter view.
 	AddFilterView *AddFilterViewResponse `json:"addFilterView,omitempty"`
 
@@ -7086,6 +7418,9 @@
 	// entry.
 	DeleteDeveloperMetadata *DeleteDeveloperMetadataResponse `json:"deleteDeveloperMetadata,omitempty"`
 
+	// DeleteDimensionGroup: A reply from deleting a dimension group.
+	DeleteDimensionGroup *DeleteDimensionGroupResponse `json:"deleteDimensionGroup,omitempty"`
+
 	// DuplicateFilterView: A reply from duplicating a filter view.
 	DuplicateFilterView *DuplicateFilterViewResponse `json:"duplicateFilterView,omitempty"`
 
@@ -7302,6 +7637,11 @@
 	// Charts: The specifications of every chart on this sheet.
 	Charts []*EmbeddedChart `json:"charts,omitempty"`
 
+	// ColumnGroups: All column groups on this sheet, ordered by increasing
+	// range start index,
+	// then by group depth.
+	ColumnGroups []*DimensionGroup `json:"columnGroups,omitempty"`
+
 	// ConditionalFormats: The conditional format rules in this sheet.
 	ConditionalFormats []*ConditionalFormatRule `json:"conditionalFormats,omitempty"`
 
@@ -7334,6 +7674,11 @@
 	// ProtectedRanges: The protected ranges in this sheet.
 	ProtectedRanges []*ProtectedRange `json:"protectedRanges,omitempty"`
 
+	// RowGroups: All row groups on this sheet, ordered by increasing range
+	// start index, then
+	// by group depth.
+	RowGroups []*DimensionGroup `json:"rowGroups,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "BandedRanges") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -8444,6 +8789,45 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// UpdateDimensionGroupRequest: Updates the state of the specified
+// group.
+type UpdateDimensionGroupRequest struct {
+	// DimensionGroup: The group whose state should be updated. The range
+	// and depth of the group
+	// should specify a valid group on the sheet, and all other fields
+	// updated.
+	DimensionGroup *DimensionGroup `json:"dimensionGroup,omitempty"`
+
+	// Fields: The fields that should be updated.  At least one field must
+	// be specified.
+	// The root `dimensionGroup` is implied and should not be specified.
+	// A single "*" can be used as short-hand for listing every field.
+	Fields string `json:"fields,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "DimensionGroup") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "DimensionGroup") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *UpdateDimensionGroupRequest) MarshalJSON() ([]byte, error) {
+	type NoMethod UpdateDimensionGroupRequest
+	raw := NoMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // UpdateDimensionPropertiesRequest: Updates properties of dimensions
 // within the specified range.
 type UpdateDimensionPropertiesRequest struct {
diff --git a/spanner/v1/spanner-api.json b/spanner/v1/spanner-api.json
index 147f0c6..2d02675 100644
--- a/spanner/v1/spanner-api.json
+++ b/spanner/v1/spanner-api.json
@@ -1340,7 +1340,7 @@
       }
     }
   },
-  "revision": "20180410",
+  "revision": "20180417",
   "rootUrl": "https://spanner.googleapis.com/",
   "schemas": {
     "BeginTransactionRequest": {
@@ -2122,7 +2122,7 @@
       "type": "object"
     },
     "Policy": {
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam/docs).",
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**JSON Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\"\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\n**YAML Example**\n\n    bindings:\n    - members:\n      - user:mike@example.com\n      - group:admins@example.com\n      - domain:google.com\n      - serviceAccount:my-other-app@appspot.gserviceaccount.com\n      role: roles/owner\n    - members:\n      - user:sean@example.com\n      role: roles/viewer\n\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam/docs).",
       "id": "Policy",
       "properties": {
         "bindings": {
diff --git a/spanner/v1/spanner-gen.go b/spanner/v1/spanner-gen.go
index 10e287d..d2d503c 100644
--- a/spanner/v1/spanner-gen.go
+++ b/spanner/v1/spanner-gen.go
@@ -2032,7 +2032,7 @@
 // specify access control policies for Cloud Platform resources.
 //
 //
-// A `Policy` consists of a list of `bindings`. A `Binding` binds a list
+// A `Policy` consists of a list of `bindings`. A `binding` binds a list
 // of
 // `members` to a `role`, where the members can be user accounts, Google
 // groups,
@@ -2040,7 +2040,7 @@
 // permissions
 // defined by IAM.
 //
-// **Example**
+// **JSON Example**
 //
 //     {
 //       "bindings": [
@@ -2051,7 +2051,7 @@
 //             "group:admins@example.com",
 //             "domain:google.com",
 //
-// "serviceAccount:my-other-app@appspot.gserviceaccount.com",
+// "serviceAccount:my-other-app@appspot.gserviceaccount.com"
 //           ]
 //         },
 //         {
@@ -2061,6 +2061,20 @@
 //       ]
 //     }
 //
+// **YAML Example**
+//
+//     bindings:
+//     - members:
+//       - user:mike@example.com
+//       - group:admins@example.com
+//       - domain:google.com
+//       - serviceAccount:my-other-app@appspot.gserviceaccount.com
+//       role: roles/owner
+//     - members:
+//       - user:sean@example.com
+//       role: roles/viewer
+//
+//
 // For a description of IAM and its features, see the
 // [IAM developer's guide](https://cloud.google.com/iam/docs).
 type Policy struct {
diff --git a/storage/v1/storage-api.json b/storage/v1/storage-api.json
index 74b11c8..9155990 100644
--- a/storage/v1/storage-api.json
+++ b/storage/v1/storage-api.json
@@ -26,7 +26,7 @@
   "description": "Stores and retrieves potentially large, immutable data objects.",
   "discoveryVersion": "v1",
   "documentationLink": "https://developers.google.com/storage/docs/json_api/",
-  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/Q1HHztnl9IrxZzbtwYt8T3VlHFw\"",
+  "etag": "\"Zkyw9ACJZUvcYmlFaKGChzhmtnE/3-7T6UkO_NIPVO3b8h9Pjt9YiaU\"",
   "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"
@@ -2756,7 +2756,7 @@
       }
     }
   },
-  "revision": "20180404",
+  "revision": "20180430",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "Bucket": {
@@ -2832,10 +2832,10 @@
           "type": "array"
         },
         "encryption": {
-          "description": "Encryption configuration used by default for newly inserted objects, when no encryption config is specified.",
+          "description": "Encryption configuration for a bucket.",
           "properties": {
             "defaultKmsKeyName": {
-              "description": "A Cloud KMS key that will be used to encrypt objects inserted into this bucket, if no encryption method is specified. Limited availability; usable only by enabled projects.",
+              "description": "A Cloud KMS key that will be used to encrypt objects inserted into this bucket, if no encryption method is specified.",
               "type": "string"
             }
           },
diff --git a/storage/v1/storage-gen.go b/storage/v1/storage-gen.go
index 36846eb..d9374be 100644
--- a/storage/v1/storage-gen.go
+++ b/storage/v1/storage-gen.go
@@ -222,8 +222,7 @@
 	// when no ACL is provided.
 	DefaultObjectAcl []*ObjectAccessControl `json:"defaultObjectAcl,omitempty"`
 
-	// Encryption: Encryption configuration used by default for newly
-	// inserted objects, when no encryption config is specified.
+	// Encryption: Encryption configuration for a bucket.
 	Encryption *BucketEncryption `json:"encryption,omitempty"`
 
 	// Etag: HTTP 1.1 Entity tag for the bucket.
@@ -405,12 +404,11 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// BucketEncryption: Encryption configuration used by default for newly
-// inserted objects, when no encryption config is specified.
+// BucketEncryption: Encryption configuration for a bucket.
 type BucketEncryption struct {
 	// DefaultKmsKeyName: A Cloud KMS key that will be used to encrypt
 	// objects inserted into this bucket, if no encryption method is
-	// specified. Limited availability; usable only by enabled projects.
+	// specified.
 	DefaultKmsKeyName string `json:"defaultKmsKeyName,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "DefaultKmsKeyName")