Repository: boto/botocore
Pull request #1214 (2017-06-03 19:16:33)

Bump six
This PR bumps the vendored six version to 1.10.0. Pretty much a duplicate of #904, but for different reasons.

I ran into https://github.com/benjaminp/six/issues/98 while using botocore in some multithreaded code. That was fixed in six==1.9.0. Bumped to 1.10.0 because why not? Includes a regression test.


Patch:
diff --git a/.changes/1.5.60.json b/.changes/1.5.60.json
deleted file mode 100644
index 349efa108..000000000
--- a/.changes/1.5.60.json
+++ /dev/null
@@ -1,12 +0,0 @@
-[
-  {
-    "category": "``workdocs``", 
-    "description": "Update workdocs client to latest version", 
-    "type": "api-change"
-  }, 
-  {
-    "category": "``kinesisanalytics``", 
-    "description": "Update kinesisanalytics client to latest version", 
-    "type": "api-change"
-  }
-]
\ No newline at end of file
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 202b804f0..c1448ed01 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,13 +2,6 @@
 CHANGELOG
 =========
 
-1.5.60
-======
-
-* api-change:``workdocs``: Update workdocs client to latest version
-* api-change:``kinesisanalytics``: Update kinesisanalytics client to latest version
-
-
 1.5.59
 ======
 
diff --git a/botocore/__init__.py b/botocore/__init__.py
index f4b453b3b..f533131a9 100644
--- a/botocore/__init__.py
+++ b/botocore/__init__.py
@@ -16,7 +16,7 @@ import os
 import re
 import logging
 
-__version__ = '1.5.60'
+__version__ = '1.5.59'
 
 
 class NullHandler(logging.Handler):
diff --git a/botocore/data/kinesisanalytics/2015-08-14/paginators-1.json b/botocore/data/kinesisanalytics/2015-08-14/paginators-1.json
deleted file mode 100644
index ea142457a..000000000
--- a/botocore/data/kinesisanalytics/2015-08-14/paginators-1.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "pagination": {}
-}
diff --git a/botocore/data/kinesisanalytics/2015-08-14/service-2.json b/botocore/data/kinesisanalytics/2015-08-14/service-2.json
index 9863f3233..2b835063d 100644
--- a/botocore/data/kinesisanalytics/2015-08-14/service-2.json
+++ b/botocore/data/kinesisanalytics/2015-08-14/service-2.json
@@ -1,6 +1,7 @@
 {
   "version":"2.0",
   "metadata":{
+    "uid":"kinesisanalytics-2015-08-14",
     "apiVersion":"2015-08-14",
     "endpointPrefix":"kinesisanalytics",
     "jsonVersion":"1.1",
@@ -9,26 +10,9 @@
     "serviceFullName":"Amazon Kinesis Analytics",
     "signatureVersion":"v4",
     "targetPrefix":"KinesisAnalytics_20150814",
-    "timestampFormat":"unixTimestamp",
-    "uid":"kinesisanalytics-2015-08-14"
+    "timestampFormat":"unixTimestamp"
   },
   "operations":{
-    "AddApplicationCloudWatchLoggingOption":{
-      "name":"AddApplicationCloudWatchLoggingOption",
-      "http":{
-        "method":"POST",
-        "requestUri":"/"
-      },
-      "input":{"shape":"AddApplicationCloudWatchLoggingOptionRequest"},
-      "output":{"shape":"AddApplicationCloudWatchLoggingOptionResponse"},
-      "errors":[
-        {"shape":"ResourceNotFoundException"},
-        {"shape":"ResourceInUseException"},
-        {"shape":"InvalidArgumentException"},
-        {"shape":"ConcurrentModificationException"}
-      ],
-      "documentation":"<p>Adds a CloudWatch log stream to monitor application configuration errors. For more information about using CloudWatch log streams with Amazon Kinesis Analytics applications, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/cloudwatch-monitor-configuration.html\">Monitoring Configuration Errors</a>.</p>"
-    },
     "AddApplicationInput":{
       "name":"AddApplicationInput",
       "http":{
@@ -91,7 +75,7 @@
         {"shape":"LimitExceededException"},
         {"shape":"InvalidArgumentException"}
       ],
-      "documentation":"<p> Creates an Amazon Kinesis Analytics application. You can configure each application with one streaming source as input, application code to process the input, and up to five streaming destinations where you want Amazon Kinesis Analytics to write the output data from your application. For an overview, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works.html\">How it Works</a>. </p> <p>In the input configuration, you map the streaming source to an in-application stream, which you can think of as a constantly updating table. In the mapping, you must provide a schema for the in-application stream and map each data column in the in-application stream to a data element in the streaming source.</p> <p>Your application code is one or more SQL statements that read input data, transform it, and generate output. Your application code can create one or more SQL artifacts like SQL streams or pumps.</p> <p>In the output configuration, you can configure the application to write data from in-application streams created in your applications to up to five streaming destinations.</p> <p> To read data from your source stream or write data to destination streams, Amazon Kinesis Analytics needs your permissions. You grant these permissions by creating IAM roles. This operation requires permissions to perform the <code>kinesisanalytics:CreateApplication</code> action. </p> <p> For introductory exercises to create an Amazon Kinesis Analytics application, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/getting-started.html\">Getting Started</a>. </p>"
+      "documentation":"<p> Creates an Amazon Kinesis Analytics application. You can configure each application with one streaming source as input, application code to process the input, and up to five streaming destinations where you want Amazon Kinesis Analytics to write the output data from your application. For an overview, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works.html\">How it Works</a>. </p> <p>In the input configuration, you map the streaming source to an in-application stream, which you can think of as a constantly updating table. In the mapping, you must provide a schema for the in-application stream and map each data column in the in-application stream to a data element in the streaming source, with the option of renaming, casting and dropping columns as desired.</p> <p>Your application code is one or more SQL statements that read input data, transform it, and generate output. Your application code can create one or more SQL artifacts like SQL streams or pumps.</p> <p>In the output configuration, you can configure the application to write data from in-application streams created in your applications to up to five streaming destinations.</p> <p> To read data from your source stream or write data to destination streams, Amazon Kinesis Analytics needs your permissions. You grant these permissions by creating IAM roles. This operation requires permissions to perform the <code>kinesisanalytics:CreateApplication</code> action. </p> <p> For introductory exercises to create an Amazon Kinesis Analytics application, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/getting-started.html\">Getting Started</a>. </p>"
     },
     "DeleteApplication":{
       "name":"DeleteApplication",
@@ -108,22 +92,6 @@
       ],
       "documentation":"<p>Deletes the specified application. Amazon Kinesis Analytics halts application execution and deletes the application, including any application artifacts (such as in-application streams, reference table, and application code).</p> <p>This operation requires permissions to perform the <code>kinesisanalytics:DeleteApplication</code> action.</p>"
     },
-    "DeleteApplicationCloudWatchLoggingOption":{
-      "name":"DeleteApplicationCloudWatchLoggingOption",
-      "http":{
-        "method":"POST",
-        "requestUri":"/"
-      },
-      "input":{"shape":"DeleteApplicationCloudWatchLoggingOptionRequest"},
-      "output":{"shape":"DeleteApplicationCloudWatchLoggingOptionResponse"},
-      "errors":[
-        {"shape":"ResourceNotFoundException"},
-        {"shape":"ResourceInUseException"},
-        {"shape":"InvalidArgumentException"},
-        {"shape":"ConcurrentModificationException"}
-      ],
-      "documentation":"<p>Deletes a CloudWatch log stream from an application. For more information about using CloudWatch log streams with Amazon Kinesis Analytics applications, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/cloudwatch-monitor-configuration.html\">Monitoring Configuration Errors</a>.</p>"
-    },
     "DeleteApplicationOutput":{
       "name":"DeleteApplicationOutput",
       "http":{
@@ -135,7 +103,6 @@
       "errors":[
         {"shape":"ResourceNotFoundException"},
         {"shape":"ResourceInUseException"},
-        {"shape":"InvalidArgumentException"},
         {"shape":"ConcurrentModificationException"}
       ],
       "documentation":"<p>Deletes output destination configuration from your application configuration. Amazon Kinesis Analytics will no longer write data from the corresponding in-application stream to the external output destination.</p> <p>This operation requires permissions to perform the <code>kinesisanalytics:DeleteApplicationOutput</code> action.</p>"
@@ -239,37 +206,10 @@
         {"shape":"InvalidArgumentException"},
         {"shape":"ConcurrentModificationException"}
       ],
-      "documentation":"<p>Updates an existing Amazon Kinesis Analytics application. Using this API, you can update application code, input configuration, and output configuration. </p> <p>Note that Amazon Kinesis Analytics updates the <code>CurrentApplicationVersionId</code> each time you update your application. </p> <p>This operation requires permission for the <code>kinesisanalytics:UpdateApplication</code> action.</p>"
+      "documentation":"<p>Updates an existing Kinesis Analytics application. Using this API, you can update application code, input configuration, and output configuration. </p> <p>Note that Kinesis Analytics updates the <code>CurrentApplicationVersionId</code> each time you update your application. </p> <p>This opeation requires permission for the <code>kinesisanalytics:UpdateApplication</code> action.</p>"
     }
   },
   "shapes":{
-    "AddApplicationCloudWatchLoggingOptionRequest":{
-      "type":"structure",
-      "required":[
-        "ApplicationName",
-        "CurrentApplicationVersionId",
-        "CloudWatchLoggingOption"
-      ],
-      "members":{
-        "ApplicationName":{
-          "shape":"ApplicationName",
-          "documentation":"<p>The Amazon Kinesis Analytics application name.</p>"
-        },
-        "CurrentApplicationVersionId":{
-          "shape":"ApplicationVersionId",
-          "documentation":"<p>The version ID of the Amazon Kinesis Analytics application.</p>"
-        },
-        "CloudWatchLoggingOption":{
-          "shape":"CloudWatchLoggingOption",
-          "documentation":"<p>Provide the CloudWatch log stream ARN and the IAM role ARN. Note: To write application messages to CloudWatch, the IAM role used must have the <code>PutLogEvents</code> policy action enabled. </p>"
-        }
-      }
-    },
-    "AddApplicationCloudWatchLoggingOptionResponse":{
-      "type":"structure",
-      "members":{
-      }
-    },
     "AddApplicationInputRequest":{
       "type":"structure",
       "required":[
@@ -286,10 +226,7 @@
           "shape":"ApplicationVersionId",
           "documentation":"<p>Current version of your Amazon Kinesis Analytics application. You can use the <a>DescribeApplication</a> operation to find the current application version.</p>"
         },
-        "Input":{
-          "shape":"Input",
-          "documentation":"<p/>"
-        }
+        "Input":{"shape":"Input"}
       },
       "documentation":"<p/>"
     },
@@ -412,10 +349,6 @@
           "shape":"ReferenceDataSourceDescriptions",
           "documentation":"<p>Describes reference data sources configured for the application. For more information, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-input.html\">Configuring Application Input</a>. </p>"
         },
-        "CloudWatchLoggingOptionDescriptions":{
-          "shape":"CloudWatchLoggingOptionDescriptions",
-          "documentation":"<p>Describes the CloudWatch log streams configured to receive application messages. For more information about using CloudWatch log streams with Amazon Kinesis Analytics applications, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/cloudwatch-monitor-configuration.html\">Monitoring Configuration Errors</a>. </p>"
-        },
         "ApplicationCode":{
           "shape":"ApplicationCode",
           "documentation":"<p>Returns the application code that you provided to perform data analysis on any of the in-application streams in your application.</p>"
@@ -489,13 +422,9 @@
         "ReferenceDataSourceUpdates":{
           "shape":"ReferenceDataSourceUpdates",
           "documentation":"<p>Describes application reference data source updates.</p>"
-        },
-        "CloudWatchLoggingOptionUpdates":{
-          "shape":"CloudWatchLoggingOptionUpdates",
-          "documentation":"<p>Describes application CloudWatch logging option updates.</p>"
         }
       },
-      "documentation":"<p>Describes updates to apply to an existing Amazon Kinesis Analytics application.</p>"
+      "documentation":"<p>Describes updates to apply to an existing Kinesis Analytics application.</p>"
     },
     "ApplicationVersionId":{
       "type":"long",
@@ -527,77 +456,6 @@
       },
       "documentation":"<p>Provides additional mapping information when the record format uses delimiters, such as CSV. For example, the following sample records use CSV format, where the records use the <i>'\\n'</i> as the row delimiter and a comma (\",\") as the column delimiter: </p> <p> <code>\"name1\", \"address1\" </code> </p> <p> <code>\"name2, \"address2\"</code> </p>"
     },
-    "CloudWatchLoggingOption":{
-      "type":"structure",
-      "required":[
-        "LogStreamARN",
-        "RoleARN"
-      ],
-      "members":{
-        "LogStreamARN":{
-          "shape":"LogStreamARN",
-          "documentation":"<p>ARN of the CloudWatch log to receive application messages.</p>"
-        },
-        "RoleARN":{
-          "shape":"RoleARN",
-          "documentation":"<p>IAM ARN of the role to use to send application messages. Note: To write application messages to CloudWatch, the IAM role used must have the <code>PutLogEvents</code> policy action enabled.</p>"
-        }
-      },
-      "documentation":"<p>Provides a description of CloudWatch logging options, including the log stream ARN and the role ARN.</p>"
-    },
-    "CloudWatchLoggingOptionDescription":{
-      "type":"structure",
-      "required":[
-        "LogStreamARN",
-        "RoleARN"
-      ],
-      "members":{
-        "CloudWatchLoggingOptionId":{
-          "shape":"Id",
-          "documentation":"<p>ID of the CloudWatch logging option description.</p>"
-        },
-        "LogStreamARN":{
-          "shape":"LogStreamARN",
-          "documentation":"<p>ARN of the CloudWatch log to receive application messages.</p>"
-        },
-        "RoleARN":{
-          "shape":"RoleARN",
-          "documentation":"<p>IAM ARN of the role to use to send application messages. Note: To write application messages to CloudWatch, the IAM role used must have the <code>PutLogEvents</code> policy action enabled.</p>"
-        }
-      },
-      "documentation":"<p>Description of the CloudWatch logging option.</p>"
-    },
-    "CloudWatchLoggingOptionDescriptions":{
-      "type":"list",
-      "member":{"shape":"CloudWatchLoggingOptionDescription"}
-    },
-    "CloudWatchLoggingOptionUpdate":{
-      "type":"structure",
-      "required":["CloudWatchLoggingOptionId"],
-      "members":{
-        "CloudWatchLoggingOptionId":{
-          "shape":"Id",
-          "documentation":"<p>ID of the CloudWatch logging option to update</p>"
-        },
-        "LogStreamARNUpdate":{
-          "shape":"LogStreamARN",
-          "documentation":"<p>ARN of the CloudWatch log to receive application messages.</p>"
-        },
-        "RoleARNUpdate":{
-          "shape":"RoleARN",
-          "documentation":"<p>IAM ARN of the role to use to send application messages. Note: To write application messages to CloudWatch, the IAM role used must have the <code>PutLogEvents</code> policy action enabled.</p>"
-        }
-      },
-      "documentation":"<p>Describes CloudWatch logging option updates.</p>"
-    },
-    "CloudWatchLoggingOptionUpdates":{
-      "type":"list",
-      "member":{"shape":"CloudWatchLoggingOptionUpdate"}
-    },
-    "CloudWatchLoggingOptions":{
-      "type":"list",
-      "member":{"shape":"CloudWatchLoggingOption"}
-    },
     "CodeValidationException":{
       "type":"structure",
       "members":{
@@ -640,13 +498,9 @@
           "shape":"Outputs",
           "documentation":"<p>You can configure application output to write data from any of the in-application streams to up to five destinations.</p> <p>These destinations can be Amazon Kinesis streams, Amazon Kinesis Firehose delivery streams, or both.</p> <p>In the configuration, you specify the in-application stream name, the destination stream Amazon Resource Name (ARN), and the format to use when writing data. You must also provide an IAM role that Amazon Kinesis Analytics can assume to write to the destination stream on your behalf.</p> <p>In the output configuration, you also provide the output stream Amazon Resource Name (ARN) and the format of data in the stream (for example, JSON, CSV). You also must provide an IAM role that Amazon Kinesis Analytics can assume to write to this stream on your behalf.</p>"
         },
-        "CloudWatchLoggingOptions":{
-          "shape":"CloudWatchLoggingOptions",
-          "documentation":"<p>Use this parameter to configure a CloudWatch log stream to monitor application configuration errors. For more information, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/cloudwatch-monitor-configuration.html\">Monitoring Configuration Errors</a>.</p>"
-        },
         "ApplicationCode":{
           "shape":"ApplicationCode",
-          "documentation":"<p>One or more SQL statements that read input data, transform it, and generate output. For example, you can write a SQL statement that reads data from one in-application stream, generates a running average of the number of advertisement clicks by vendor, and insert resulting rows in another in-application stream using pumps. For more inforamtion about the typical pattern, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-app-code.html\">Application Code</a>. </p> <p>You can provide such series of SQL statements, where output of one statement can be used as the input for the next statement. You store intermediate results by creating in-application streams and pumps.</p> <p>Note that the application code must create the streams with names specified in the <code>Outputs</code>. For example, if your <code>Outputs</code> defines output streams named <code>ExampleOutputStream1</code> and <code>ExampleOutputStream2</code>, then your application code must create these streams. </p>"
+          "documentation":"<p>One or more SQL statements that read input data, transform it, and generate output. For example, you can write a SQL statement that reads input data and generates a running average of the number of advertisement clicks by vendor.</p> <p>You can also provide a series of SQL statements, where output of one statement can be used as the input for the next statement.</p> <p>Note that the application code must create the streams with names specified in the <code>Outputs</code>. For example, if your <code>Outputs</code> defines output streams named <code>ExampleOutputStream1</code> and <code>ExampleOutputStream2</code>, then your application code must create these streams. </p>"
         }
       },
       "documentation":"<p>TBD</p>"
@@ -662,33 +516,6 @@
       },
       "documentation":"<p>TBD</p>"
     },
-    "DeleteApplicationCloudWatchLoggingOptionRequest":{
-      "type":"structure",
-      "required":[
-        "ApplicationName",
-        "CurrentApplicationVersionId",
-        "CloudWatchLoggingOptionId"
-      ],
-      "members":{
-        "ApplicationName":{
-          "shape":"ApplicationName",
-          "documentation":"<p>The Amazon Kinesis Analytics application name.</p>"
-        },
-        "CurrentApplicationVersionId":{
-          "shape":"ApplicationVersionId",
-          "documentation":"<p>The version ID of the Amazon Kinesis Analytics application.</p>"
-        },
-        "CloudWatchLoggingOptionId":{
-          "shape":"Id",
-          "documentation":"<p>The <code>CloudWatchLoggingOptionId</code> of the CloudWatch logging option to delete. You can use the <a>DescribeApplication</a> operation to get the <code>CloudWatchLoggingOptionId</code>. </p>"
-        }
-      }
-    },
-    "DeleteApplicationCloudWatchLoggingOptionResponse":{
-      "type":"structure",
-      "members":{
-      }
-    },
     "DeleteApplicationOutputRequest":{
       "type":"structure",
       "required":[
@@ -875,7 +702,7 @@
       "members":{
         "NamePrefix":{
           "shape":"InAppStreamName",
-          "documentation":"<p>Name prefix to use when creating in-application stream. Suppose you specify a prefix \"MyInApplicationStream\". Amazon Kinesis Analytics will then create one or more (as per the <code>InputParallelism</code> count you specified) in-application streams with names \"MyInApplicationStream_001\", \"MyInApplicationStream_002\" and so on. </p>"
+          "documentation":"<p>Name prefix to use when creating in-application stream. Suppose you specify a prefix \"MyInApplicationStream\". Kinesis Analytics will then create one or more (as per the <code>InputParallelism</code> count you specified) in-application streams with names \"MyInApplicationStream_001\", \"MyInApplicationStream_002\" and so on. </p>"
         },
         "KinesisStreamsInput":{
           "shape":"KinesisStreamsInput",
@@ -965,7 +792,7 @@
           "documentation":"<p>Number of in-application streams to create. For more information, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/limits.html\">Limits</a>. </p>"
         }
       },
-      "documentation":"<p>Describes the number of in-application streams to create for a given streaming source. For information about parallelism, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-input.html\">Configuring Application Input</a>. </p>"
+      "documentation":"<p>Describes the number of in-application streams to create for a given streaming source. For information about parallellism, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-input.html\">Configuring Application Input</a>. </p>"
     },
     "InputParallelismCount":{
       "type":"integer",
@@ -1013,7 +840,7 @@
       "members":{
         "InputStartingPosition":{
           "shape":"InputStartingPosition",
-          "documentation":"<p>The starting position on the stream.</p> <ul> <li> <p> <code>NOW</code> - Start reading just after the most recent record in the stream, start at the request timestamp that the customer issued.</p> </li> <li> <p> <code>TRIM_HORIZON</code> - Start reading at the last untrimmed record in the stream, which is the oldest record available in the stream. This option is not available for an Amazon Kinesis Firehose delivery stream.</p> </li> <li> <p> <code>LAST_STOPPED_POINT</code> - Resume reading from where the application last stopped reading.</p> </li> </ul>"
+          "documentation":"<p>The starting position on the stream.</p> <ul> <li> <p> <code>LATEST</code> - Start reading just after the most recent record in the stream.</p> </li> <li> <p> <code>TRIM_HORIZON</code> - Start reading at the last untrimmed record in the stream, which is the oldest record available in the stream. This option is not available for an Amazon Kinesis Firehose delivery stream.</p> </li> <li> <p> <code>LAST_STOPPED_POINT</code> - Resume reading from where the application last stopped reading.</p> </li> </ul>"
         }
       },
       "documentation":"<p>Describes the point at which the application reads from the streaming source.</p>"
@@ -1028,7 +855,7 @@
         },
         "NamePrefixUpdate":{
           "shape":"InAppStreamName",
-          "documentation":"<p>Name prefix for in-application streams that Amazon Kinesis Analytics creates for the specific streaming source.</p>"
+          "documentation":"<p>Name prefix for in-application stream(s) that Kinesis Analytics creates for the specific streaming source.</p>"
         },
         "KinesisStreamsInputUpdate":{
           "shape":"KinesisStreamsInputUpdate",
@@ -1044,7 +871,7 @@
         },
         "InputParallelismUpdate":{
           "shape":"InputParallelismUpdate",
-          "documentation":"<p>Describes the parallelism updates (the number in-application streams Amazon Kinesis Analytics creates for the specific streaming source).</p>"
+          "documentation":"<p>Describes the parallelism updates (the number in-application streams Kinesis Analytics creates for the specific streaming source).</p>"
         }
       },
       "documentation":"<p>Describes updates to a specific input configuration (identified by the <code>InputId</code> of an application). </p>"
@@ -1322,12 +1149,6 @@
       },
       "documentation":"<p/>"
     },
-    "LogStreamARN":{
-      "type":"string",
-      "max":2048,
-      "min":1,
-      "pattern":"arn:.*"
-    },
     "MappingParameters":{
       "type":"structure",
       "members":{
@@ -1363,7 +1184,7 @@
         },
         "DestinationSchema":{"shape":"DestinationSchema"}
       },
-      "documentation":"<p> Describes application output configuration in which you identify an in-application stream and a destination where you want the in-application stream data to be written. The destination can be an Amazon Kinesis stream or an Amazon Kinesis Firehose delivery stream. </p> <p/> <p>For limits on how many destinations an application can write and other limitations, see <a href=\"http://docs.aws.amazon.com/kinesisanalytics/latest/dev/limits.html\">Limits</a>. </p>"
+      "documentation":"<p> Describes application output configuration in which you identify an in-application stream and a destination where you want the in-application stream data to be written. The destination can be an Amazon Kinesis stream or an Amazon Kinesis Firehose delivery stream. </p> <p/> <p>You can configure your application to write output to up to five destinations.</p>"
     },
     "OutputDescription":{
       "type":"structure",
@@ -1463,10 +1284,7 @@
       },
       "documentation":"<p>Describes the mapping of each data element in the streaming source to the corresponding column in the in-application stream.</p> <p>Also used to describe the format of the reference data source.</p>"
     },
-    "RecordColumnDelimiter":{
-      "type":"string",
-      "min":1
-    },
+    "RecordColumnDelimiter":{"type":"string"},
     "RecordColumnMapping":{"type":"string"},
     "RecordColumnName":{
       "type":"string",
@@ -1502,10 +1320,7 @@
         "CSV"
       ]
     },
-    "RecordRowDelimiter":{
-      "type":"string",
-      "min":1
-    },
+    "RecordRowDelimiter":{"type":"string"},
     "RecordRowPath":{"type":"string"},
     "ReferenceDataSource":{
       "type":"structure",
@@ -1608,7 +1423,7 @@
       "members":{
         "message":{"shape":"ErrorMessage"}
       },
-      "documentation":"<p>Discovery failed to get a record from the streaming source because of the Amazon Kinesis Streams ProvisionedThroughputExceededException. For more information, see <a href=\"http://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html\">GetRecords</a> in the Amazon Kinesis Streams API Reference.</p>",
+      "documentation":"<p>Discovery failed to get a record from the streaming source because of the Kinesis Streams ProvisionedThroughputExceededException.</p>",
       "exception":true
     },
     "RoleARN":{
@@ -1751,7 +1566,7 @@
         "message":{"shape":"ErrorMessage"},
         "RawInputRecords":{"shape":"RawInputRecords"}
       },
-      "documentation":"<p>Data format is not valid, Amazon Kinesis Analytics is not able to detect schema for the given streaming source.</p>",
+      "documentation":"<p>Data format is not valid, Kinesis Analytics is not able to detect schema for the given streaming source.</p>",
       "exception":true
     },
     "UpdateApplicationRequest":{
@@ -1764,7 +1579,7 @@
       "members":{
         "ApplicationName":{
           "shape":"ApplicationName",
-          "documentation":"<p>Name of the Amazon Kinesis Analytics application to update.</p>"
+          "documentation":"<p>Name of the Kinesis Analytics application to update.</p>"
         },
         "CurrentApplicationVersionId":{
           "shape":"ApplicationVersionId",
diff --git a/botocore/data/workdocs/2016-05-01/service-2.json b/botocore/data/workdocs/2016-05-01/service-2.json
index 40b10696c..84e4ad1af 100644
--- a/botocore/data/workdocs/2016-05-01/service-2.json
+++ b/botocore/data/workdocs/2016-05-01/service-2.json
@@ -26,7 +26,7 @@
         {"shape":"FailedDependencyException"},
         {"shape":"ServiceUnavailableException"}
       ],
-      "documentation":"<p>Aborts the upload of the specified document version that was previously initiated by <a>InitiateDocumentVersionUpload</a>. The client should make this call only when it no longer intends to upload the document version, or fails to do so.</p>"
+      "documentation":"<p>Aborts the upload of the specified document version that was previously initiated by <a>InitiateDocumentVersionUpload</a>. The client should make this call only when it no longer intends or fails to upload the document version.</p>"
     },
     "ActivateUser":{
       "name":"ActivateUser",
@@ -63,46 +63,6 @@
       ],
       "documentation":"<p>Creates a set of permissions for the specified folder or document. The resource permissions are overwritten if the principals already have different permissions.</p>"
     },
-    "CreateComment":{
-      "name":"CreateComment",
-      "http":{
-        "method":"POST",
-        "requestUri":"/api/v1/documents/{DocumentId}/versions/{VersionId}/comment",
-        "responseCode":201
-      },
-      "input":{"shape":"CreateCommentRequest"},
-      "output":{"shape":"CreateCommentResponse"},
-      "errors":[
-        {"shape":"EntityNotExistsException"},
-        {"shape":"ProhibitedStateException"},
-        {"shape":"UnauthorizedOperationException"},
-        {"shape":"UnauthorizedResourceAccessException"},
-        {"shape":"FailedDependencyException"},
-        {"shape":"ServiceUnavailableException"},
-        {"shape":"DocumentLockedForCommentsException"}
-      ],
-      "documentation":"<p>Adds a new comment to the specified document version.</p>"
-    },
-    "CreateCustomMetadata":{
-      "name":"CreateCustomMetadata",
-      "http":{
-        "method":"PUT",
-        "requestUri":"/api/v1/resources/{ResourceId}/customMetadata",
-        "responseCode":200
-      },
-      "input":{"shape":"CreateCustomMetadataRequest"},
-      "output":{"shape":"CreateCustomMetadataResponse"},
-      "errors":[
-        {"shape":"EntityNotExistsException"},
-        {"shape":"UnauthorizedOperationException"},
-        {"shape":"UnauthorizedResourceAccessException"},
-        {"shape":"ProhibitedStateException"},
-        {"shape":"CustomMetadataLimitExceededException"},
-        {"shape":"FailedDependencyException"},
-        {"shape":"ServiceUnavailableException"}
-      ],
-      "documentation":"<p>Adds one or more custom properties to the specified resource (a folder, document, or version).</p>"
-    },
     "CreateFolder":{
       "name":"CreateFolder",
       "http":{
@@ -124,25 +84,6 @@
       ],
       "documentation":"<p>Creates a folder with the specified name and parent folder.</p>"
     },
-    "CreateLabels":{
-      "name":"CreateLabels",
-      "http":{
-        "method":"PUT",
-        "requestUri":"/api/v1/resources/{ResourceId}/labels",
-        "responseCode":200
-      },
-      "input":{"shape":"CreateLabelsRequest"},
-      "output":{"shape":"CreateLabelsResponse"},
-      "errors":[
-        {"shape":"EntityNotExistsException"},
-        {"shape":"UnauthorizedOperationException"},
-        {"shape":"UnauthorizedResourceAccessException"},
-        {"shape":"FailedDependencyException"},
-        {"shape":"ServiceUnavailableException"},
-        {"shape":"TooManyLabelsException"}
-      ],
-      "documentation":"<p>Adds the specified list of labels to the given resource (a document or folder)</p>"
-    },
     "CreateNotificationSubscription":{
       "name":"CreateNotificationSubscription",
       "http":{
@@ -194,44 +135,6 @@
       ],
       "documentation":"<p>Deactivates the specified user, which revokes the user's access to Amazon WorkDocs.</p>"
     },
-    "DeleteComment":{
-      "name":"DeleteComment",
-      "http":{
-        "method":"DELETE",
-        "requestUri":"/api/v1/documents/{DocumentId}/versions/{VersionId}/comment/{CommentId}",
-        "responseCode":204
-      },
-      "input":{"shape":"DeleteCommentRequest"},
-      "errors":[
-        {"shape":"EntityNotExistsException"},
-        {"shape":"ProhibitedStateException"},
-        {"shape":"UnauthorizedOperationException"},
-        {"shape":"UnauthorizedResourceAccessException"},
-        {"shape":"FailedDependencyException"},
-        {"shape":"ServiceUnavailableException"},
-        {"shape":"DocumentLockedForCommentsException"}
-      ],
-      "documentation":"<p>Deletes the specified comment from the document version.</p>"
-    },
-    "DeleteCustomMetadata":{
-      "name":"DeleteCustomMetadata",
-      "http":{
-        "method":"DELETE",
-        "requestUri":"/api/v1/resources/{ResourceId}/customMetadata",
-        "responseCode":200
-      },
-      "input":{"shape":"DeleteCustomMetadataRequest"},
-      "output":{"shape":"DeleteCustomMetadataResponse"},
-      "errors":[
-        {"shape":"EntityNotExistsException"},
-        {"shape":"UnauthorizedOperationException"},
-        {"shape":"UnauthorizedResourceAccessException"},
-        {"shape":"ProhibitedStateException"},
-        {"shape":"FailedDependencyException"},
-        {"shape":"ServiceUnavailableException"}
-      ],
-      "documentation":"<p>Deletes custom metadata from the specified resource.</p>"
-    },
     "DeleteDocument":{
       "name":"DeleteDocument",
       "http":{
@@ -287,24 +190,6 @@
       ],
       "documentation":"<p>Deletes the contents of the specified folder.</p>"
     },
-    "DeleteLabels":{
-      "name":"DeleteLabels",
-      "http":{
-        "method":"DELETE",
-        "requestUri":"/api/v1/resources/{ResourceId}/labels",
-        "responseCode":200
-      },
-      "input":{"shape":"DeleteLabelsRequest"},
-      "output":{"shape":"DeleteLabelsResponse"},
-      "errors":[
-        {"shape":"EntityNotExistsException"},
-        {"shape":"UnauthorizedOperationException"},
-        {"shape":"UnauthorizedResourceAccessException"},
-        {"shape":"FailedDependencyException"},
-        {"shape":"ServiceUnavailableException"}
-      ],
-      "documentation":"<p>Deletes the specified list of labels from a resource.</p>"
-    },
     "DeleteNotificationSubscription":{
       "name":"DeleteNotificationSubscription",
       "http":{
@@ -338,25 +223,6 @@
       ],
       "documentation":"<p>Deletes the specified user from a Simple AD or Microsoft AD directory.</p>"
     },
-    "DescribeComments":{
-      "name":"DescribeComments",
-      "http":{
-        "method":"GET",
-        "requestUri":"/api/v1/documents/{DocumentId}/versions/{VersionId}/comments",
-        "responseCode":200
-      },
-      "input":{"shape":"DescribeCommentsRequest"},
-      "output":{"shape":"DescribeCommentsResponse"},
-      "errors":[
-        {"shape":"EntityNotExistsException"},
-        {"shape":"ProhibitedStateException"},
-        {"shape":"UnauthorizedOperationException"},
-        {"shape":"UnauthorizedResourceAccessException"},
-        {"shape":"FailedDependencyException"},
-        {"shape":"ServiceUnavailableException"}
-      ],
-      "documentation":"<p>List all the comments for the specified document version.</p>"
-    },
     "DescribeDocumentVersions":{
       "name":"DescribeDocumentVersions",
       "http":{
@@ -394,7 +260,7 @@
         {"shape":"ServiceUnavailableException"},
         {"shape":"ProhibitedStateException"}
       ],
-      "documentation":"<p>Describes the contents of the specified folder, including its documents and subfolders.</p> <p>By default, Amazon WorkDocs returns the first 100 active document and folder metadata items. If there are more results, the response includes a marker that you can use to request the next set of results. You can also request initialized documents.</p>"
+      "documentation":"<p>Describes the contents of the specified folder, including its documents and sub-folders.</p> <p>By default, Amazon WorkDocs returns the first 100 active document and folder metadata items. If there are more results, the response includes a marker that you can use to request the next set of results. You can also request initialized documents.</p>"
     },
     "DescribeNotificationSubscriptions":{
       "name":"DescribeNotificationSubscriptions",
@@ -464,7 +330,7 @@
         {"shape":"FailedDependencyException"},
         {"shape":"ServiceUnavailableException"}
       ],
-      "documentation":"<p>Retrieves details of a document.</p>"
+      "documentation":"<p>Retrieves the specified document object.</p>"
     },
     "GetDocumentPath":{
       "name":"GetDocumentPath",
@@ -559,9 +425,7 @@
         {"shape":"UnauthorizedOperationException"},
         {"shape":"UnauthorizedResourceAccessException"},
         {"shape":"FailedDependencyException"},
-        {"shape":"ServiceUnavailableException"},
-        {"shape":"DraftUploadOutOfSyncException"},
-        {"shape":"ResourceAlreadyCheckedOutException"}
+        {"shape":"ServiceUnavailableException"}
       ],
       "documentation":"<p>Creates a new document object and version object.</p> <p>The client specifies the parent folder ID and name of the document to upload. The ID is optionally specified when creating a new version of an existing document. This is the first step to upload a document. Next, upload the document to the URL returned from the call, and then call <a>UpdateDocumentVersion</a>.</p> <p>To cancel the document upload, call <a>AbortDocumentVersionUpload</a>.</p>"
     },
@@ -616,7 +480,7 @@
         {"shape":"FailedDependencyException"},
         {"shape":"ServiceUnavailableException"}
       ],
-      "documentation":"<p>Updates the specified attributes of a document. The user must have access to both the document and its parent folder, if applicable.</p>"
+      "documentation":"<p>Updates the specified attributes of the specified document. The user must have access to both the document and its parent folder, if applicable.</p>"
     },
     "UpdateDocumentVersion":{
       "name":"UpdateDocumentVersion",
@@ -688,12 +552,6 @@
         "VersionId"
       ],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "DocumentId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the document.</p>",
@@ -717,12 +575,6 @@
           "documentation":"<p>The ID of the user.</p>",
           "location":"uri",
           "locationName":"UserId"
-        },
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
         }
       }
     },
@@ -742,12 +594,6 @@
         "Principals"
       ],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "ResourceId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the resource.</p>",
@@ -769,87 +615,6 @@
         }
       }
     },
-    "AuthenticationHeaderType":{
-      "type":"string",
-      "max":8199,
-      "min":1,
-      "sensitive":true
-    },
-    "BooleanType":{"type":"boolean"},
-    "Comment":{
-      "type":"structure",
-      "required":["CommentId"],
-      "members":{
-        "CommentId":{
-          "shape":"CommentIdType",
-          "documentation":"<p>The ID of the comment.</p>"
-        },
-        "ParentId":{
-          "shape":"CommentIdType",
-          "documentation":"<p>The ID of the parent comment.</p>"
-        },
-        "ThreadId":{
-          "shape":"CommentIdType",
-          "documentation":"<p>The ID of the root comment in the thread.</p>"
-        },
-        "Text":{
-          "shape":"CommentTextType",
-          "documentation":"<p>The text of the comment.</p>"
-        },
-        "Contributor":{
-          "shape":"User",
-          "documentation":"<p>The details of the user who made the comment.</p>"
-        },
-        "CreatedTimestamp":{
-          "shape":"TimestampType",
-          "documentation":"<p>The time that the comment was created.</p>"
-        },
-        "Status":{
-          "shape":"CommentStatusType",
-          "documentation":"<p>The status of the comment.</p>"
-        },
-        "Visibility":{
-          "shape":"CommentVisibilityType",
-          "documentation":"<p>The visibility of the comment. Options are either PRIVATE, where the comment is visible only to the comment author and document owner and co-owners, or PUBLIC, where the comment is visible to document owners, co-owners, and contributors.</p>"
-        },
-        "RecipientId":{
-          "shape":"IdType",
-          "documentation":"<p>If the comment is a reply to another user's comment, this field contains the user ID of the user being replied to.</p>"
-        }
-      },
-      "documentation":"<p>Describes a comment.</p>"
-    },
-    "CommentIdType":{
-      "type":"string",
-      "max":128,
-      "min":1,
-      "pattern":"[\\w+-.@]+"
-    },
-    "CommentList":{
-      "type":"list",
-      "member":{"shape":"Comment"}
-    },
-    "CommentStatusType":{
-      "type":"string",
-      "enum":[
-        "DRAFT",
-        "PUBLISHED",
-        "DELETED"
-      ]
-    },
-    "CommentTextType":{
-      "type":"string",
-      "max":2048,
-      "min":1,
-      "sensitive":true
-    },
-    "CommentVisibilityType":{
-      "type":"string",
-      "enum":[
-        "PUBLIC",
-        "PRIVATE"
-      ]
-    },
     "ConcurrentModificationException":{
       "type":"structure",
       "members":{
@@ -859,109 +624,10 @@
       "error":{"httpStatusCode":409},
       "exception":true
     },
-    "CreateCommentRequest":{
-      "type":"structure",
-      "required":[
-        "DocumentId",
-        "VersionId",
-        "Text"
-      ],
-      "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
-        "DocumentId":{
-          "shape":"ResourceIdType",
-          "documentation":"<p>The ID of the document.</p>",
-          "location":"uri",
-          "locationName":"DocumentId"
-        },
-        "VersionId":{
-          "shape":"DocumentVersionIdType",
-          "documentation":"<p>The ID of the document version.</p>",
-          "location":"uri",
-          "locationName":"VersionId"
-        },
-        "ParentId":{
-          "shape":"CommentIdType",
-          "documentation":"<p>The ID of the parent comment.</p>"
-        },
-        "ThreadId":{
-          "shape":"CommentIdType",
-          "documentation":"<p>The ID of the root comment in the thread.</p>"
-        },
-        "Text":{
-          "shape":"CommentTextType",
-          "documentation":"<p>The text of the comment.</p>"
-        },
-        "Visibility":{
-          "shape":"CommentVisibilityType",
-          "documentation":"<p>The visibility of the comment. Options are either PRIVATE, where the comment is visible only to the comment author and document owner and co-owners, or PUBLIC, where the comment is visible to document owners, co-owners, and contributors.</p>"
-        },
-        "NotifyCollaborators":{
-          "shape":"BooleanType",
-          "documentation":"<p>Set this parameter to TRUE to send an email out to the document collaborators after the comment is created.</p>"
-        }
-      }
-    },
-    "CreateCommentResponse":{
-      "type":"structure",
-      "members":{
-        "Comment":{
-          "shape":"Comment",
-          "documentation":"<p>The comment that has been created.</p>"
-        }
-      }
-    },
-    "CreateCustomMetadataRequest":{
-      "type":"structure",
-      "required":[
-        "ResourceId",
-        "CustomMetadata"
-      ],
-      "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
-        "ResourceId":{
-          "shape":"ResourceIdType",
-          "documentation":"<p>The ID of the resource.</p>",
-          "location":"uri",
-          "locationName":"ResourceId"
-        },
-        "VersionId":{
-          "shape":"DocumentVersionIdType",
-          "documentation":"<p>The ID of the version, if the custom metadata is being added to a document version.</p>",
-          "location":"querystring",
-          "locationName":"versionid"
-        },
-        "CustomMetadata":{
-          "shape":"CustomMetadataMap",
-          "documentation":"<p>Custom metadata in the form of name-value pairs.</p>"
-        }
-      }
-    },
-    "CreateCustomMetadataResponse":{
-      "type":"structure",
-      "members":{
-      }
-    },
     "CreateFolderRequest":{
       "type":"structure",
       "required":["ParentFolderId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "Name":{
           "shape":"ResourceNameType",
           "documentation":"<p>The name of the new folder.</p>"
@@ -981,36 +647,6 @@
         }
       }
     },
-    "CreateLabelsRequest":{
-      "type":"structure",
-      "required":[
-        "ResourceId",
-        "Labels"
-      ],
-      "members":{
-        "ResourceId":{
-          "shape":"ResourceIdType",
-          "documentation":"<p>The ID of the resource.</p>",
-          "location":"uri",
-          "locationName":"ResourceId"
-        },
-        "Labels":{
-          "shape":"Labels",
-          "documentation":"<p>List of labels to add to the resource.</p>"
-        },
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        }
-      }
-    },
-    "CreateLabelsResponse":{
-      "type":"structure",
-      "members":{
-      }
-    },
     "CreateNotificationSubscriptionRequest":{
       "type":"structure",
       "required":[
@@ -1066,10 +702,6 @@
           "shape":"UsernameType",
           "documentation":"<p>The login name of the user.</p>"
         },
-        "EmailAddress":{
-          "shape":"EmailAddressType",
-          "documentation":"<p>The email address of the user.</p>"
-        },
         "GivenName":{
           "shape":"UserAttributeValueType",
           "documentation":"<p>The given name of the user.</p>"
@@ -1089,12 +721,6 @@
         "StorageRule":{
           "shape":"StorageRuleType",
           "documentation":"<p>The amount of storage for the user.</p>"
-        },
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
         }
       }
     },
@@ -1107,39 +733,6 @@
         }
       }
     },
-    "CustomMetadataKeyList":{
-      "type":"list",
-      "member":{"shape":"CustomMetadataKeyType"},
-      "max":8
-    },
-    "CustomMetadataKeyType":{
-      "type":"string",
-      "max":56,
-      "min":1,
-      "pattern":"[a-zA-Z0-9_-][a-zA-Z0-9 _-]*"
-    },
-    "CustomMetadataLimitExceededException":{
-      "type":"structure",
-      "members":{
-        "Message":{"shape":"ErrorMessageType"}
-      },
-      "documentation":"<p>The limit has been reached on the number of custom properties for the specified resource.</p>",
-      "error":{"httpStatusCode":429},
-      "exception":true
-    },
-    "CustomMetadataMap":{
-      "type":"map",
-      "key":{"shape":"CustomMetadataKeyType"},
-      "value":{"shape":"CustomMetadataValueType"},
-      "max":8,
-      "min":1
-    },
-    "CustomMetadataValueType":{
-      "type":"string",
-      "max":56,
-      "min":1,
-      "pattern":"[a-zA-Z0-9_-][a-zA-Z0-9 _-]*"
-    },
     "DeactivateUserRequest":{
       "type":"structure",
       "required":["UserId"],
@@ -1149,12 +742,6 @@
           "documentation":"<p>The ID of the user.</p>",
           "location":"uri",
           "locationName":"UserId"
-        },
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
         }
       }
     },
@@ -1166,91 +753,10 @@
       "error":{"httpStatusCode":409},
       "exception":true
     },
-    "DeleteCommentRequest":{
-      "type":"structure",
-      "required":[
-        "DocumentId",
-        "VersionId",
-        "CommentId"
-      ],
-      "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
-        "DocumentId":{
-          "shape":"ResourceIdType",
-          "documentation":"<p>The ID of the document.</p>",
-          "location":"uri",
-          "locationName":"DocumentId"
-        },
-        "VersionId":{
-          "shape":"DocumentVersionIdType",
-          "documentation":"<p>The ID of the document version.</p>",
-          "location":"uri",
-          "locationName":"VersionId"
-        },
-        "CommentId":{
-          "shape":"CommentIdType",
-          "documentation":"<p>The ID of the comment.</p>",
-          "location":"uri",
-          "locationName":"CommentId"
-        }
-      }
-    },
-    "DeleteCustomMetadataRequest":{
-      "type":"structure",
-      "required":["ResourceId"],
-      "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
-        "ResourceId":{
-          "shape":"ResourceIdType",
-          "documentation":"<p>The ID of the resource, either a document or folder.</p>",
-          "location":"uri",
-          "locationName":"ResourceId"
-        },
-        "VersionId":{
-          "shape":"DocumentVersionIdType",
-          "documentation":"<p>The ID of the version, if the custom metadata is being deleted from a document version.</p>",
-          "location":"querystring",
-          "locationName":"versionId"
-        },
-        "Keys":{
-          "shape":"CustomMetadataKeyList",
-          "documentation":"<p>List of properties to remove.</p>",
-          "location":"querystring",
-          "locationName":"keys"
-        },
-        "DeleteAll":{
-          "shape":"BooleanType",
-          "documentation":"<p>Flag to indicate removal of all custom metadata properties from the specified resource.</p>",
-          "location":"querystring",
-          "locationName":"deleteAll"
-        }
-      }
-    },
-    "DeleteCustomMetadataResponse":{
-      "type":"structure",
-      "members":{
-      }
-    },
     "DeleteDocumentRequest":{
       "type":"structure",
       "required":["DocumentId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "DocumentId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the document.</p>",
@@ -1263,12 +769,6 @@
       "type":"structure",
       "required":["FolderId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "FolderId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the folder.</p>",
@@ -1281,12 +781,6 @@
       "type":"structure",
       "required":["FolderId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "FolderId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the folder.</p>",
@@ -1295,41 +789,6 @@
         }
       }
     },
-    "DeleteLabelsRequest":{
-      "type":"structure",
-      "required":["ResourceId"],
-      "members":{
-        "ResourceId":{
-          "shape":"ResourceIdType",
-          "documentation":"<p>The ID of the resource.</p>",
-          "location":"uri",
-          "locationName":"ResourceId"
-        },
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
-        "Labels":{
-          "shape":"Labels",
-          "documentation":"<p>List of labels to delete from the resource.</p>",
-          "location":"querystring",
-          "locationName":"labels"
-        },
-        "DeleteAll":{
-          "shape":"BooleanType",
-          "documentation":"<p>Flag to request removal of all labels from the specified resource.</p>",
-          "location":"querystring",
-          "locationName":"deleteAll"
-        }
-      }
-    },
-    "DeleteLabelsResponse":{
-      "type":"structure",
-      "members":{
-      }
-    },
     "DeleteNotificationSubscriptionRequest":{
       "type":"structure",
       "required":[
@@ -1355,12 +814,6 @@
       "type":"structure",
       "required":["UserId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "UserId":{
           "shape":"IdType",
           "documentation":"<p>The ID of the user.</p>",
@@ -1369,68 +822,10 @@
         }
       }
     },
-    "DescribeCommentsRequest":{
-      "type":"structure",
-      "required":[
-        "DocumentId",
-        "VersionId"
-      ],
-      "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
-        "DocumentId":{
-          "shape":"ResourceIdType",
-          "documentation":"<p>The ID of the document.</p>",
-          "location":"uri",
-          "locationName":"DocumentId"
-        },
-        "VersionId":{
-          "shape":"DocumentVersionIdType",
-          "documentation":"<p>The ID of the document version.</p>",
-          "location":"uri",
-          "locationName":"VersionId"
-        },
-        "Limit":{
-          "shape":"LimitType",
-          "documentation":"<p>The maximum number of items to return.</p>",
-          "location":"querystring",
-          "locationName":"limit"
-        },
-        "Marker":{
-          "shape":"MarkerType",
-          "documentation":"<p>The marker for the next set of results. This marker was received from a previous call.</p>",
-          "location":"querystring",
-          "locationName":"marker"
-        }
-      }
-    },
-    "DescribeCommentsResponse":{
-      "type":"structure",
-      "members":{
-        "Comments":{
-          "shape":"CommentList",
-          "documentation":"<p>The list of comments for the specified document version.</p>"
-        },
-        "Marker":{
-          "shape":"MarkerType",
-          "documentation":"<p>The marker for the next set of results. This marker was received from a previous call.</p>"
-        }
-      }
-    },
     "DescribeDocumentVersionsRequest":{
       "type":"structure",
       "required":["DocumentId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "DocumentId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the document.</p>",
@@ -1480,12 +875,6 @@
       "type":"structure",
       "required":["FolderId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "FolderId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the folder.</p>",
@@ -1512,7 +901,7 @@
         },
         "Marker":{
           "shape":"PageMarkerType",
-          "documentation":"<p>The marker for the next set of results. This marker was received from a previous call.</p>",
+          "documentation":"<p>The marker for the next set of results. (You received this marker from a previous call.)</p>",
           "location":"querystring",
           "locationName":"marker"
         },
@@ -1535,7 +924,7 @@
       "members":{
         "Folders":{
           "shape":"FolderMetadataList",
-          "documentation":"<p>The subfolders in the specified folder.</p>"
+          "documentation":"<p>The sub-folders in the specified folder.</p>"
         },
         "Documents":{
           "shape":"DocumentMetadataList",
@@ -1588,12 +977,6 @@
       "type":"structure",
       "required":["ResourceId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "ResourceId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the resource.</p>",
@@ -1630,12 +1013,6 @@
     "DescribeUsersRequest":{
       "type":"structure",
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "OrganizationId":{
           "shape":"IdType",
           "documentation":"<p>The ID of the organization.</p>",
@@ -1714,15 +1091,6 @@
       "max":128,
       "min":1
     },
-    "DocumentLockedForCommentsException":{
-      "type":"structure",
-      "members":{
-        "Message":{"shape":"ErrorMessageType"}
-      },
-      "documentation":"<p>This exception is thrown when the document is locked for comments and user tries to create or delete a comment on that document.</p>",
-      "error":{"httpStatusCode":409},
-      "exception":true
-    },
     "DocumentMetadata":{
       "type":"structure",
       "members":{
@@ -1753,10 +1121,6 @@
         "ResourceState":{
           "shape":"ResourceStateType",
           "documentation":"<p>The resource state.</p>"
-        },
-        "Labels":{
-          "shape":"Labels",
-          "documentation":"<p>List of labels on the document.</p>"
         }
       },
       "documentation":"<p>Describes the document.</p>"
@@ -1869,15 +1233,6 @@
       "type":"string",
       "enum":["ACTIVE"]
     },
-    "DraftUploadOutOfSyncException":{
-      "type":"structure",
-      "members":{
-        "Message":{"shape":"ErrorMessageType"}
-      },
-      "documentation":"<p>This exception is thrown when a valid checkout ID is not presented on document version upload calls for a document that has been checked out from Web client.</p>",
-      "error":{"httpStatusCode":409},
-      "exception":true
-    },
     "EmailAddressType":{
       "type":"string",
       "max":256,
@@ -1965,13 +1320,7 @@
         "Signature":{
           "shape":"HashType",
           "documentation":"<p>The unique identifier created from the subfolders and documents of the folder.</p>"
-        },
-        "Labels":{
-          "shape":"Labels",
-          "documentation":"<p>List of labels on the folder.</p>"
-        },
-        "Size":{"shape":"SizeType"},
-        "LatestVersionSize":{"shape":"SizeType"}
+        }
       },
       "documentation":"<p>Describes a folder.</p>"
     },
@@ -1983,12 +1332,6 @@
       "type":"structure",
       "required":["DocumentId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "DocumentId":{
           "shape":"IdType",
           "documentation":"<p>The ID of the document.</p>",
@@ -2003,7 +1346,7 @@
         },
         "Fields":{
           "shape":"FieldNamesType",
-          "documentation":"<p>A comma-separated list of values. Specify <code>NAME</code> to include the names of the parent folders.</p>",
+          "documentation":"<p>A comma-separated list of values. Specify \"NAME\" to include the names of the parent folders.</p>",
           "location":"querystring",
           "locationName":"fields"
         },
@@ -2028,23 +1371,11 @@
       "type":"structure",
       "required":["DocumentId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "DocumentId":{
           "shape":"ResourceIdType",
-          "documentation":"<p>The ID of the document.</p>",
+          "documentation":"<p>The ID of the document object.</p>",
           "location":"uri",
           "locationName":"DocumentId"
-        },
-        "IncludeCustomMetadata":{
-          "shape":"BooleanType",
-          "documentation":"<p>Set this to <code>TRUE</code> to include custom metadata in the response.</p>",
-          "location":"querystring",
-          "locationName":"includeCustomMetadata"
         }
       }
     },
@@ -2053,11 +1384,7 @@
       "members":{
         "Metadata":{
           "shape":"DocumentMetadata",
-          "documentation":"<p>The metadata details of the document.</p>"
-        },
-        "CustomMetadata":{
-          "shape":"CustomMetadataMap",
-          "documentation":"<p>The custom metadata on the document.</p>"
+          "documentation":"<p>The document object.</p>"
         }
       }
     },
@@ -2068,12 +1395,6 @@
         "VersionId"
       ],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "DocumentId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the document.</p>",
@@ -2091,12 +1412,6 @@
           "documentation":"<p>A comma-separated list of values. Specify \"SOURCE\" to include a URL for the source document.</p>",
           "location":"querystring",
           "locationName":"fields"
-        },
-        "IncludeCustomMetadata":{
-          "shape":"BooleanType",
-          "documentation":"<p>Set this to TRUE to include custom metadata in the response.</p>",
-          "location":"querystring",
-          "locationName":"includeCustomMetadata"
         }
       }
     },
@@ -2106,10 +1421,6 @@
         "Metadata":{
           "shape":"DocumentVersionMetadata",
           "documentation":"<p>The version metadata.</p>"
-        },
-        "CustomMetadata":{
-          "shape":"CustomMetadataMap",
-          "documentation":"<p>The custom metadata on the document version.</p>"
         }
       }
     },
@@ -2117,12 +1428,6 @@
       "type":"structure",
       "required":["FolderId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "FolderId":{
           "shape":"IdType",
           "documentation":"<p>The ID of the folder.</p>",
@@ -2162,23 +1467,11 @@
       "type":"structure",
       "required":["FolderId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "FolderId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the folder.</p>",
           "location":"uri",
           "locationName":"FolderId"
-        },
-        "IncludeCustomMetadata":{
-          "shape":"BooleanType",
-          "documentation":"<p>Set to TRUE to include custom metadata in the response.</p>",
-          "location":"querystring",
-          "locationName":"includeCustomMetadata"
         }
       }
     },
@@ -2188,10 +1481,6 @@
         "Metadata":{
           "shape":"FolderMetadata",
           "documentation":"<p>The metadata of the folder.</p>"
-        },
-        "CustomMetadata":{
-          "shape":"CustomMetadataMap",
-          "documentation":"<p>The custom metadata on the folder.</p>"
         }
       }
     },
@@ -2231,12 +1520,6 @@
       "type":"structure",
       "required":["ParentFolderId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "Id":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the document.</p>"
@@ -2298,23 +1581,12 @@
       "error":{"httpStatusCode":405},
       "exception":true
     },
-    "Label":{
-      "type":"string",
-      "max":20,
-      "min":1,
-      "pattern":"[a-zA-Z0-9_-][a-zA-Z0-9 _-]*"
-    },
-    "Labels":{
-      "type":"list",
-      "member":{"shape":"Label"},
-      "max":20
-    },
     "LimitExceededException":{
       "type":"structure",
       "members":{
         "Message":{"shape":"ErrorMessageType"}
       },
-      "documentation":"<p>The maximum of 100,000 folders under the parent folder has been exceeded.</p>",
+      "documentation":"<p>You've exceeded the maximum of 100,000 folders under the parent folder.</p>",
       "error":{"httpStatusCode":409},
       "exception":true
     },
@@ -2339,12 +1611,6 @@
         "default"
       ]
     },
-    "MarkerType":{
-      "type":"string",
-      "max":2048,
-      "min":1,
-      "pattern":"[\\u0000-\\u00FF]+"
-    },
     "MessageType":{
       "type":"string",
       "max":2048,
@@ -2441,12 +1707,6 @@
       "type":"structure",
       "required":["ResourceId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "ResourceId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the resource.</p>",
@@ -2462,12 +1722,6 @@
         "PrincipalId"
       ],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "ResourceId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the resource.</p>",
@@ -2488,14 +1742,6 @@
         }
       }
     },
-    "ResourceAlreadyCheckedOutException":{
-      "type":"structure",
-      "members":{
-        "Message":{"shape":"ErrorMessageType"}
-      },
-      "error":{"httpStatusCode":409},
-      "exception":true
-    },
     "ResourceIdType":{
       "type":"string",
       "max":128,
@@ -2736,15 +1982,6 @@
       "min":1
     },
     "TimestampType":{"type":"timestamp"},
-    "TooManyLabelsException":{
-      "type":"structure",
-      "members":{
-        "Message":{"shape":"ErrorMessageType"}
-      },
-      "documentation":"<p>The limit has been reached on the number of labels for the specified resource.</p>",
-      "error":{"httpStatusCode":429},
-      "exception":true
-    },
     "TooManySubscriptionsException":{
       "type":"structure",
       "members":{
@@ -2775,12 +2012,6 @@
       "type":"structure",
       "required":["DocumentId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "DocumentId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the document.</p>",
@@ -2808,12 +2039,6 @@
         "VersionId"
       ],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "DocumentId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the document.</p>",
@@ -2836,12 +2061,6 @@
       "type":"structure",
       "required":["FolderId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "FolderId":{
           "shape":"ResourceIdType",
           "documentation":"<p>The ID of the folder.</p>",
@@ -2866,12 +2085,6 @@
       "type":"structure",
       "required":["UserId"],
       "members":{
-        "AuthenticationToken":{
-          "shape":"AuthenticationHeaderType",
-          "documentation":"<p>Amazon WorkDocs authentication token. This field should not be set when using administrative API actions, as in accessing the API using AWS credentials.</p>",
-          "location":"header",
-          "locationName":"Authentication"
-        },
         "UserId":{
           "shape":"IdType",
           "documentation":"<p>The ID of the user.</p>",
@@ -3060,7 +2273,7 @@
       "type":"string",
       "max":256,
       "min":1,
-      "pattern":"[\\w\\-+.]+(@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]+)?"
+      "pattern":"[\\w\\-.]+(@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]+)?"
     }
   },
   "documentation":"<p>The WorkDocs API is designed for the following use cases:</p> <ul> <li> <p>File Migration: File migration applications are supported for users who want to migrate their files from an on-premise or off-premise file system or service. Users can insert files into a user directory structure, as well as allow for basic metadata changes, such as modifications to the permissions of files.</p> </li> <li> <p>Security: Support security applications are supported for users who have additional security needs, such as anti-virus or data loss prevention. The APIs, in conjunction with Amazon CloudTrail, allow these applications to detect when changes occur in Amazon WorkDocs, so the application can take the necessary actions and replace the target file. The application can also choose to email the user if the target file violates the policy.</p> </li> <li> <p>eDiscovery/Analytics: General administrative applications are supported, such as eDiscovery and analytics. These applications can choose to mimic and/or record the actions in an Amazon WorkDocs site, in conjunction with Amazon CloudTrails, to replicate data for eDiscovery, backup, or analytical applications.</p> </li> </ul> <p>All Amazon WorkDocs APIs are Amazon authenticated, certificate-signed APIs. They not only require the use of the AWS SDK, but also allow for the exclusive use of IAM users and roles to help facilitate access, trust, and permission policies. By creating a role and allowing an IAM user to access the Amazon WorkDocs site, the IAM user gains full administrative visibility into the entire Amazon WorkDocs site (or as set in the IAM policy). This includes, but is not limited to, the ability to modify file permissions and upload any file to any user. This allows developers to perform the three use cases above, as well as give users the ability to grant access on a selective basis using the IAM model.</p>"
diff --git a/botocore/vendored/six.py b/botocore/vendored/six.py
index 21b0e8032..190c0239c 100644
--- a/botocore/vendored/six.py
+++ b/botocore/vendored/six.py
@@ -1,6 +1,6 @@
 """Utilities for writing code that runs on Python 2 and 3"""
 
-# Copyright (c) 2010-2014 Benjamin Peterson
+# Copyright (c) 2010-2015 Benjamin Peterson
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
@@ -23,17 +23,19 @@
 from __future__ import absolute_import
 
 import functools
+import itertools
 import operator
 import sys
 import types
 
 __author__ = "Benjamin Peterson <benjamin@python.org>"
-__version__ = "1.8.0"
+__version__ = "1.10.0"
 
 
 # Useful for very coarse version differentiation.
 PY2 = sys.version_info[0] == 2
 PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
 
 if PY3:
     string_types = str,
@@ -56,6 +58,7 @@ else:
     else:
         # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
         class X(object):
+
             def __len__(self):
                 return 1 << 31
         try:
@@ -87,9 +90,13 @@ class _LazyDescr(object):
 
     def __get__(self, obj, tp):
         result = self._resolve()
-        setattr(obj, self.name, result) # Invokes __set__.
-        # This is a bit ugly, but it avoids running this again.
-        delattr(obj.__class__, self.name)
+        setattr(obj, self.name, result)  # Invokes __set__.
+        try:
+            # This is a bit ugly, but it avoids running this again by
+            # removing this descriptor.
+            delattr(obj.__class__, self.name)
+        except AttributeError:
+            pass
         return result
 
 
@@ -155,12 +162,14 @@ class MovedAttribute(_LazyDescr):
 
 
 class _SixMetaPathImporter(object):
+
     """
     A meta path importer to import six.moves and its submodules.
 
     This class implements a PEP302 finder and loader. It should be compatible
     with Python 2.5 and all existing versions of Python3
     """
+
     def __init__(self, six_module_name):
         self.name = six_module_name
         self.known_modules = {}
@@ -218,6 +227,7 @@ _importer = _SixMetaPathImporter(__name__)
 
 
 class _MovedItems(_LazyModule):
+
     """Lazy loading of moved objects"""
     __path__ = []  # mark as package
 
@@ -229,8 +239,10 @@ _moved_attributes = [
     MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
     MovedAttribute("intern", "__builtin__", "sys"),
     MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
     MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
-    MovedAttribute("reload_module", "__builtin__", "imp", "reload"),
+    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
     MovedAttribute("reduce", "__builtin__", "functools"),
     MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
     MovedAttribute("StringIO", "StringIO", "io"),
@@ -240,7 +252,6 @@ _moved_attributes = [
     MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
     MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
     MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
-
     MovedModule("builtins", "__builtin__"),
     MovedModule("configparser", "ConfigParser"),
     MovedModule("copyreg", "copy_reg"),
@@ -287,8 +298,13 @@ _moved_attributes = [
     MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
     MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
     MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
-    MovedModule("winreg", "_winreg"),
 ]
+# Add windows specific modules.
+if sys.platform == "win32":
+    _moved_attributes += [
+        MovedModule("winreg", "_winreg"),
+    ]
+
 for attr in _moved_attributes:
     setattr(_MovedItems, attr.name, attr)
     if isinstance(attr, MovedModule):
@@ -302,6 +318,7 @@ _importer._add_module(moves, "moves")
 
 
 class Module_six_moves_urllib_parse(_LazyModule):
+
     """Lazy loading of moved objects in six.moves.urllib_parse"""
 
 
@@ -341,6 +358,7 @@ _importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_pa
 
 
 class Module_six_moves_urllib_error(_LazyModule):
+
     """Lazy loading of moved objects in six.moves.urllib_error"""
 
 
@@ -360,6 +378,7 @@ _importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.er
 
 
 class Module_six_moves_urllib_request(_LazyModule):
+
     """Lazy loading of moved objects in six.moves.urllib_request"""
 
 
@@ -409,6 +428,7 @@ _importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.
 
 
 class Module_six_moves_urllib_response(_LazyModule):
+
     """Lazy loading of moved objects in six.moves.urllib_response"""
 
 
@@ -429,6 +449,7 @@ _importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib
 
 
 class Module_six_moves_urllib_robotparser(_LazyModule):
+
     """Lazy loading of moved objects in six.moves.urllib_robotparser"""
 
 
@@ -446,6 +467,7 @@ _importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.url
 
 
 class Module_six_moves_urllib(types.ModuleType):
+
     """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
     __path__ = []  # mark as package
     parse = _importer._get_module("moves.urllib_parse")
@@ -516,6 +538,9 @@ if PY3:
 
     create_bound_method = types.MethodType
 
+    def create_unbound_method(func, cls):
+        return func
+
     Iterator = object
 else:
     def get_unbound_function(unbound):
@@ -524,6 +549,9 @@ else:
     def create_bound_method(func, obj):
         return types.MethodType(func, obj, obj.__class__)
 
+    def create_unbound_method(func, cls):
+        return types.MethodType(func, None, cls)
+
     class Iterator(object):
 
         def next(self):
@@ -554,18 +582,30 @@ if PY3:
 
     def iterlists(d, **kw):
         return iter(d.lists(**kw))
+
+    viewkeys = operator.methodcaller("keys")
+
+    viewvalues = operator.methodcaller("values")
+
+    viewitems = operator.methodcaller("items")
 else:
     def iterkeys(d, **kw):
-        return iter(d.iterkeys(**kw))
+        return d.iterkeys(**kw)
 
     def itervalues(d, **kw):
-        return iter(d.itervalues(**kw))
+        return d.itervalues(**kw)
 
     def iteritems(d, **kw):
-        return iter(d.iteritems(**kw))
+        return d.iteritems(**kw)
 
     def iterlists(d, **kw):
-        return iter(d.iterlists(**kw))
+        return d.iterlists(**kw)
+
+    viewkeys = operator.methodcaller("viewkeys")
+
+    viewvalues = operator.methodcaller("viewvalues")
+
+    viewitems = operator.methodcaller("viewitems")
 
 _add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
 _add_doc(itervalues, "Return an iterator over the values of a dictionary.")
@@ -578,45 +618,66 @@ _add_doc(iterlists,
 if PY3:
     def b(s):
         return s.encode("latin-1")
+
     def u(s):
         return s
     unichr = chr
-    if sys.version_info[1] <= 1:
-        def int2byte(i):
-            return bytes((i,))
-    else:
-        # This is about 2x faster than the implementation above on 3.2+
-        int2byte = operator.methodcaller("to_bytes", 1, "big")
+    import struct
+    int2byte = struct.Struct(">B").pack
+    del struct
     byte2int = operator.itemgetter(0)
     indexbytes = operator.getitem
     iterbytes = iter
     import io
     StringIO = io.StringIO
     BytesIO = io.BytesIO
+    _assertCountEqual = "assertCountEqual"
+    if sys.version_info[1] <= 1:
+        _assertRaisesRegex = "assertRaisesRegexp"
+        _assertRegex = "assertRegexpMatches"
+    else:
+        _assertRaisesRegex = "assertRaisesRegex"
+        _assertRegex = "assertRegex"
 else:
     def b(s):
         return s
     # Workaround for standalone backslash
+
     def u(s):
         return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
     unichr = unichr
     int2byte = chr
+
     def byte2int(bs):
         return ord(bs[0])
+
     def indexbytes(buf, i):
         return ord(buf[i])
-    def iterbytes(buf):
-        return (ord(byte) for byte in buf)
+    iterbytes = functools.partial(itertools.imap, ord)
     import StringIO
     StringIO = BytesIO = StringIO.StringIO
+    _assertCountEqual = "assertItemsEqual"
+    _assertRaisesRegex = "assertRaisesRegexp"
+    _assertRegex = "assertRegexpMatches"
 _add_doc(b, """Byte literal""")
 _add_doc(u, """Text literal""")
 
 
+def assertCountEqual(self, *args, **kwargs):
+    return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+    return getattr(self, _assertRegex)(*args, **kwargs)
+
+
 if PY3:
     exec_ = getattr(moves.builtins, "exec")
 
-
     def reraise(tp, value, tb=None):
         if value is None:
             value = tp()
@@ -637,12 +698,26 @@ else:
             _locs_ = _globs_
         exec("""exec _code_ in _globs_, _locs_""")
 
-
     exec_("""def reraise(tp, value, tb=None):
     raise tp, value, tb
 """)
 
 
+if sys.version_info[:2] == (3, 2):
+    exec_("""def raise_from(value, from_value):
+    if from_value is None:
+        raise value
+    raise value from from_value
+""")
+elif sys.version_info[:2] > (3, 2):
+    exec_("""def raise_from(value, from_value):
+    raise value from from_value
+""")
+else:
+    def raise_from(value, from_value):
+        raise value
+
+
 print_ = getattr(moves.builtins, "print", None)
 if print_ is None:
     def print_(*args, **kwargs):
@@ -650,13 +725,14 @@ if print_ is None:
         fp = kwargs.pop("file", sys.stdout)
         if fp is None:
             return
+
         def write(data):
             if not isinstance(data, basestring):
                 data = str(data)
             # If the file has an encoding, encode unicode with it.
             if (isinstance(fp, file) and
-                isinstance(data, unicode) and
-                fp.encoding is not None):
+                    isinstance(data, unicode) and
+                    fp.encoding is not None):
                 errors = getattr(fp, "errors", None)
                 if errors is None:
                     errors = "strict"
@@ -697,6 +773,15 @@ if print_ is None:
                 write(sep)
             write(arg)
         write(end)
+if sys.version_info[:2] < (3, 3):
+    _print = print_
+
+    def print_(*args, **kwargs):
+        fp = kwargs.get("file", sys.stdout)
+        flush = kwargs.pop("flush", False)
+        _print(*args, **kwargs)
+        if flush and fp is not None:
+            fp.flush()
 
 _add_doc(reraise, """Reraise an exception.""")
 
@@ -704,19 +789,21 @@ if sys.version_info[0:2] < (3, 4):
     def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
               updated=functools.WRAPPER_UPDATES):
         def wrapper(f):
-            f = functools.wraps(wrapped)(f)
+            f = functools.wraps(wrapped, assigned, updated)(f)
             f.__wrapped__ = wrapped
             return f
         return wrapper
 else:
     wraps = functools.wraps
 
+
 def with_metaclass(meta, *bases):
     """Create a base class with a metaclass."""
     # This requires a bit of explanation: the basic idea is to make a dummy
     # metaclass for one level of class instantiation that replaces itself with
     # the actual metaclass.
     class metaclass(meta):
+
         def __new__(cls, name, this_bases, d):
             return meta(name, bases, d)
     return type.__new__(metaclass, 'temporary_class', (), {})
@@ -737,6 +824,25 @@ def add_metaclass(metaclass):
         return metaclass(cls.__name__, cls.__bases__, orig_vars)
     return wrapper
 
+
+def python_2_unicode_compatible(klass):
+    """
+    A decorator that defines __unicode__ and __str__ methods under Python 2.
+    Under Python 3 it does nothing.
+
+    To support Python 2 and 3 with a single code base, define a __str__ method
+    returning text and apply this decorator to the class.
+    """
+    if PY2:
+        if '__str__' not in klass.__dict__:
+            raise ValueError("@python_2_unicode_compatible cannot be applied "
+                             "to %s because it doesn't define __str__()." %
+                             klass.__name__)
+        klass.__unicode__ = klass.__str__
+        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+    return klass
+
+
 # Complete the moves implementation.
 # This code is at the end of this module to speed up module loading.
 # Turn this module into a package.
@@ -754,7 +860,7 @@ if sys.meta_path:
         # the six meta path importer, since the other six instance will have
         # inserted an importer with different class.
         if (type(importer).__name__ == "_SixMetaPathImporter" and
-            importer.name == __name__):
+                importer.name == __name__):
             del sys.meta_path[i]
             break
     del i, importer
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 37529bac6..dd7018a85 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -54,7 +54,7 @@ copyright = u'2013, Mitch Garnaat'
 # The short X.Y version.
 version = '1.5.'
 # The full version, including alpha/beta/rc tags.
-release = '1.5.60'
+release = '1.5.59'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/setup.cfg b/setup.cfg
index b2f92484d..66f9fb1a8 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,4 +1,4 @@
-[bdist_wheel]
+[wheel]
 universal = 1
 
 [metadata]


Test patch:
diff --git a/tests/functional/test_six_threading.py b/tests/functional/test_six_threading.py
new file mode 100644
index 000000000..5ef9bc371
--- /dev/null
+++ b/tests/functional/test_six_threading.py
@@ -0,0 +1,65 @@
+"""
+Regression test for six issue #98 (https://github.com/benjaminp/six/issues/98)
+"""
+from mock import patch
+import sys
+import threading
+import time
+
+from botocore.vendored import six
+
+
+_original_setattr = six.moves.__class__.__setattr__
+
+
+def _wrapped_setattr(key, value):
+    # Monkey patch six.moves.__setattr__ to simulate
+    # a poorly-timed thread context switch
+    time.sleep(0.1)
+    return _original_setattr(six.moves, key, value)
+
+
+def _reload_six():
+    # Issue #98 is caused by a race condition in six._LazyDescr.__get__
+    # which is only called once per moved module. Reload six so all the
+    # moved modules are reset.
+    if sys.version_info < (3, 0):
+        reload(six)
+    elif sys.version_info < (3, 4):
+        import imp
+        imp.reload(six)
+    else:
+        import importlib
+        importlib.reload(six)
+
+
+class _ExampleThread(threading.Thread):
+    def __init__(self):
+        super(_ExampleThread, self).__init__()
+        self.daemon = False
+        self.exc_info = None
+
+    def run(self):
+        try:
+            # Simulate use of six by
+            # botocore.configloader.raw_config_parse()
+            # Should raise AttributeError if six < 1.9.0
+            six.moves.configparser.RawConfigParser()
+        except Exception:
+            self.exc_info = sys.exc_info()
+
+
+def test_six_thread_safety():
+    _reload_six()
+    with patch('botocore.vendored.six.moves.__class__.__setattr__',
+               wraps=_wrapped_setattr):
+        threads = []
+        for i in range(2):
+            t = _ExampleThread()
+            threads.append(t)
+            t.start()
+        while threads:
+            t = threads.pop()
+            t.join()
+            if t.exc_info:
+                six.reraise(*t.exc_info)