prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Elasticsearch Domain DomainName shouldn't be required
  According to the CF documentation, `DomainName` isn't required: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html
  
  
  </issue>
  <code>
  [start of troposphere/elasticsearch.py]
  1 # Copyright (c) 2012-2015, Mark Peek <mark@peek.org>
  2 # All rights reserved.
  3 #
  4 # See LICENSE file for full license.
  5 
  6 from . import AWSProperty, AWSObject
  7 from .validators import boolean, integer, integer_range, positive_integer
  8 
  9 VALID_VOLUME_TYPES = ('standard', 'gp2', 'io1')
  10 
  11 try:
  12     from awacs.aws import Policy
  13     policytypes = (dict, Policy)
  14 except ImportError:
  15     policytypes = dict,
  16 
  17 
  18 def validate_volume_type(volume_type):
  19     """Validate VolumeType for ElasticsearchDomain"""
  20     if volume_type not in VALID_VOLUME_TYPES:
  21         raise ValueError("Elasticsearch Domain VolumeType must be one of: %s" %
  22                          ", ".join(VALID_VOLUME_TYPES))
  23     return volume_type
  24 
  25 
  26 class EBSOptions(AWSProperty):
  27     props = {
  28         'EBSEnabled': (boolean, False),
  29         'Iops': (positive_integer, False),
  30         'VolumeSize': (integer, False),
  31         'VolumeType': (validate_volume_type, False)
  32     }
  33 
  34     def validate(self):
  35         volume_type = self.properties.get('VolumeType')
  36         iops = self.properties.get('Iops')
  37         if volume_type == 'io1' and not iops:
  38             raise ValueError("Must specify Iops if VolumeType is 'io1'.")
  39 
  40 
  41 class ElasticsearchClusterConfig(AWSProperty):
  42     props = {
  43         'DedicatedMasterCount': (integer, False),
  44         'DedicatedMasterEnabled': (boolean, False),
  45         'DedicatedMasterType': (basestring, False),
  46         'InstanceCount': (integer, False),
  47         'InstanceType': (basestring, False),
  48         'ZoneAwarenessEnabled': (boolean, False)
  49     }
  50 
  51 
  52 class SnapshotOptions(AWSProperty):
  53     props = {
  54         'AutomatedSnapshotStartHour': (integer_range(0, 23), False)
  55     }
  56 
  57 
  58 class ElasticsearchDomain(AWSObject):
  59     resource_type = "AWS::Elasticsearch::Domain"
  60 
  61     props = {
  62         'AccessPolicies': (policytypes, False),
  63         'AdvancedOptions': (dict, False),
  64         'DomainName': (basestring, True),
  65         'EBSOptions': (EBSOptions, False),
  66         'ElasticsearchClusterConfig': (ElasticsearchClusterConfig, False),
  67         'SnapshotOptions': (SnapshotOptions, False),
  68         'Tags': (list, False)
  69     }
  70
  [end of troposphere/elasticsearch.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/troposphere/elasticsearch.py b/troposphere/elasticsearch.py
  --- a/troposphere/elasticsearch.py
  +++ b/troposphere/elasticsearch.py
  @@ -61,7 +61,7 @@
       props = {
           'AccessPolicies': (policytypes, False),
           'AdvancedOptions': (dict, False),
  -        'DomainName': (basestring, True),
  +        'DomainName': (basestring, False),
           'EBSOptions': (EBSOptions, False),
           'ElasticsearchClusterConfig': (ElasticsearchClusterConfig, False),
           'SnapshotOptions': (SnapshotOptions, False),
  
verification_info: {"golden_diff": "diff --git a/troposphere/elasticsearch.py b/troposphere/elasticsearch.py\n--- a/troposphere/elasticsearch.py\n+++ b/troposphere/elasticsearch.py\n@@ -61,7 +61,7 @@\n     props = {\n         'AccessPolicies': (policytypes, False),\n         'AdvancedOptions': (dict, False),\n-        'DomainName': (basestring, True),\n+        'DomainName': (basestring, False),\n         'EBSOptions': (EBSOptions, False),\n         'ElasticsearchClusterConfig': (ElasticsearchClusterConfig, False),\n         'SnapshotOptions': (SnapshotOptions, False),\n", "issue": "Elasticsearch Domain DomainName shouldn't be required\nAccording to the CF documentation, `DomainName` isn't required: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html\n\n", "before_files": [{"content": "# Copyright (c) 2012-2015, Mark Peek <mark@peek.org>\n# All rights reserved.\n#\n# See LICENSE file for full license.\n\nfrom . import AWSProperty, AWSObject\nfrom .validators import boolean, integer, integer_range, positive_integer\n\nVALID_VOLUME_TYPES = ('standard', 'gp2', 'io1')\n\ntry:\n    from awacs.aws import Policy\n    policytypes = (dict, Policy)\nexcept ImportError:\n    policytypes = dict,\n\n\ndef validate_volume_type(volume_type):\n    \"\"\"Validate VolumeType for ElasticsearchDomain\"\"\"\n    if volume_type not in VALID_VOLUME_TYPES:\n        raise ValueError(\"Elasticsearch Domain VolumeType must be one of: %s\" %\n                         \", \".join(VALID_VOLUME_TYPES))\n    return volume_type\n\n\nclass EBSOptions(AWSProperty):\n    props = {\n        'EBSEnabled': (boolean, False),\n        'Iops': (positive_integer, False),\n        'VolumeSize': (integer, False),\n        'VolumeType': (validate_volume_type, False)\n    }\n\n    def validate(self):\n        volume_type = self.properties.get('VolumeType')\n        iops = self.properties.get('Iops')\n        if volume_type == 'io1' and not iops:\n            raise ValueError(\"Must specify Iops if VolumeType is 'io1'.\")\n\n\nclass ElasticsearchClusterConfig(AWSProperty):\n    props = {\n        'DedicatedMasterCount': (integer, False),\n        'DedicatedMasterEnabled': (boolean, False),\n        'DedicatedMasterType': (basestring, False),\n        'InstanceCount': (integer, False),\n        'InstanceType': (basestring, False),\n        'ZoneAwarenessEnabled': (boolean, False)\n    }\n\n\nclass SnapshotOptions(AWSProperty):\n    props = {\n        'AutomatedSnapshotStartHour': (integer_range(0, 23), False)\n    }\n\n\nclass ElasticsearchDomain(AWSObject):\n    resource_type = \"AWS::Elasticsearch::Domain\"\n\n    props = {\n        'AccessPolicies': (policytypes, False),\n        'AdvancedOptions': (dict, False),\n        'DomainName': (basestring, True),\n        'EBSOptions': (EBSOptions, False),\n        'ElasticsearchClusterConfig': (ElasticsearchClusterConfig, False),\n        'SnapshotOptions': (SnapshotOptions, False),\n        'Tags': (list, False)\n    }\n", "path": "troposphere/elasticsearch.py"}]}