]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/assets/iD/iD.js
Update to iD v1.8.2
[rails.git] / vendor / assets / iD / iD.js
index 25bc49f8975a1580b3084931f72facfc2ebcaa17..14dafc8f5300ea787552707c88a9631473e5e03d 100644 (file)
@@ -6407,7 +6407,7 @@ d3.combobox = function() {
 
             for (var i = 0; i < suggestions.length; i++) {
                 if (suggestions[i].value.toLowerCase().indexOf(v.toLowerCase()) === 0) {
 
             for (var i = 0; i < suggestions.length; i++) {
                 if (suggestions[i].value.toLowerCase().indexOf(v.toLowerCase()) === 0) {
-                    var completion = v + suggestions[i].value.substr(v.length);
+                    var completion = suggestions[i].value;
                     idx = i;
                     input.property('value', completion);
                     input.node().setSelectionRange(v.length, completion.length);
                     idx = i;
                     input.property('value', completion);
                     input.node().setSelectionRange(v.length, completion.length);
@@ -14045,7 +14045,8 @@ module.exports = function(o) {
 
         // ## Getting a request token
         var params = timenonce(getAuth(o)),
 
         // ## Getting a request token
         var params = timenonce(getAuth(o)),
-            url = o.url + '/oauth/request_token';
+            url = o.url + '/oauth/request_token',
+            timer;
 
         params.oauth_signature = ohauth.signature(
             o.oauth_secret, '',
 
         params.oauth_signature = ohauth.signature(
             o.oauth_secret, '',
@@ -14061,6 +14062,15 @@ module.exports = function(o) {
                         return x.join('=');
                     }).join(','),
                 popup = window.open('about:blank', 'oauth_window', settings);
                         return x.join('=');
                     }).join(','),
                 popup = window.open('about:blank', 'oauth_window', settings);
+
+
+            timer = setInterval(function() {
+                if (popup.closed) {
+                    o.done();
+                    clearInterval(timer);
+                    callback('not authenticated', null);
+                }
+            }, 100);
         }
 
         // Request a request token. When this is complete, the popup
         }
 
         // Request a request token. When this is complete, the popup
@@ -14070,7 +14080,10 @@ module.exports = function(o) {
 
         function reqTokenDone(err, xhr) {
             o.done();
 
         function reqTokenDone(err, xhr) {
             o.done();
-            if (err) return callback(err);
+            if (err) {
+                if (timer) clearInterval(timer);
+                return callback(err);
+            }
             var resp = ohauth.stringQs(xhr.response);
             token('oauth_request_token_secret', resp.oauth_token_secret);
             var authorize_url = o.url + '/oauth/authorize?' + ohauth.qsString({
             var resp = ohauth.stringQs(xhr.response);
             token('oauth_request_token_secret', resp.oauth_token_secret);
             var authorize_url = o.url + '/oauth/authorize?' + ohauth.qsString({
@@ -14089,6 +14102,7 @@ module.exports = function(o) {
         // Called by a function in a landing page, in the popup window. The
         // window closes itself.
         window.authComplete = function(token) {
         // Called by a function in a landing page, in the popup window. The
         // window closes itself.
         window.authComplete = function(token) {
+            if (timer) clearInterval(timer);
             var oauth_token = ohauth.stringQs(token.split('?')[1]);
             get_access_token(oauth_token.oauth_token);
             delete window.authComplete;
             var oauth_token = ohauth.stringQs(token.split('?')[1]);
             get_access_token(oauth_token.oauth_token);
             delete window.authComplete;
@@ -14118,6 +14132,7 @@ module.exports = function(o) {
 
         function accessTokenDone(err, xhr) {
             o.done();
 
         function accessTokenDone(err, xhr) {
             o.done();
+            if (timer) clearInterval(timer);
             if (err) return callback(err);
             var access_token = ohauth.stringQs(xhr.response);
             token('oauth_token', access_token.oauth_token);
             if (err) return callback(err);
             var access_token = ohauth.stringQs(xhr.response);
             token('oauth_token', access_token.oauth_token);
@@ -14427,11 +14442,11 @@ module.exports = function(o) {
                store.disabled = true
        }
        store.enabled = !store.disabled
                store.disabled = true
        }
        store.enabled = !store.disabled
-       
+
        if (typeof module != 'undefined' && module.exports) { module.exports = store }
        else if (typeof define === 'function' && define.amd) { define(store) }
        else { win.store = store }
        if (typeof module != 'undefined' && module.exports) { module.exports = store }
        else if (typeof define === 'function' && define.amd) { define(store) }
        else { win.store = store }
-       
+
 })(this.window || global);
 
 })(window)
 })(this.window || global);
 
 })(window)
@@ -14474,7 +14489,7 @@ function extend() {
 },{"./has-keys":5,"object-keys":6}],7:[function(require,module,exports){
 (function(global){/**
  * jsHashes - A fast and independent hashing library pure JavaScript implemented (ES3 compliant) for both server and client side
 },{"./has-keys":5,"object-keys":6}],7:[function(require,module,exports){
 (function(global){/**
  * jsHashes - A fast and independent hashing library pure JavaScript implemented (ES3 compliant) for both server and client side
- * 
+ *
  * @class Hashes
  * @author Tomas Aparicio <tomas@rijndael-project.com>
  * @license New BSD (see LICENSE file)
  * @class Hashes
  * @author Tomas Aparicio <tomas@rijndael-project.com>
  * @license New BSD (see LICENSE file)
@@ -14492,11 +14507,11 @@ function extend() {
  */
 (function(){
   var Hashes;
  */
 (function(){
   var Hashes;
-  
+
   // private helper methods
   function utf8Encode(str) {
     var  x, y, output = '', i = -1, l;
   // private helper methods
   function utf8Encode(str) {
     var  x, y, output = '', i = -1, l;
-    
+
     if (str && str.length) {
       l = str.length;
       while ((i+=1) < l) {
     if (str && str.length) {
       l = str.length;
       while ((i+=1) < l) {
@@ -14527,15 +14542,15 @@ function extend() {
     }
     return output;
   }
     }
     return output;
   }
-  
+
   function utf8Decode(str) {
     var i, ac, c1, c2, c3, arr = [], l;
     i = ac = c1 = c2 = c3 = 0;
   function utf8Decode(str) {
     var i, ac, c1, c2, c3, arr = [], l;
     i = ac = c1 = c2 = c3 = 0;
-    
+
     if (str && str.length) {
       l = str.length;
       str += '';
     if (str && str.length) {
       l = str.length;
       str += '';
-    
+
       while (i < l) {
           c1 = str.charCodeAt(i);
           ac += 1;
       while (i < l) {
           c1 = str.charCodeAt(i);
           ac += 1;
@@ -14642,9 +14657,9 @@ function extend() {
     }
     return output;
   }
     }
     return output;
   }
-  
+
   /**
   /**
-   * Convert a raw string to an array of big-endian words 
+   * Convert a raw string to an array of big-endian words
    * Characters >255 have their high-byte silently ignored.
    */
    function rstr2binb(input) {
    * Characters >255 have their high-byte silently ignored.
    */
    function rstr2binb(input) {
@@ -14665,14 +14680,14 @@ function extend() {
     var divisor = encoding.length,
         remainders = Array(),
         i, q, x, ld, quotient, dividend, output, full_length;
     var divisor = encoding.length,
         remainders = Array(),
         i, q, x, ld, quotient, dividend, output, full_length;
-  
+
     /* Convert to an array of 16-bit big-endian values, forming the dividend */
     dividend = Array(Math.ceil(input.length / 2));
     ld = dividend.length;
     for (i = 0; i < ld; i+=1) {
       dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
     }
     /* Convert to an array of 16-bit big-endian values, forming the dividend */
     dividend = Array(Math.ceil(input.length / 2));
     ld = dividend.length;
     for (i = 0; i < ld; i+=1) {
       dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
     }
-  
+
     /**
      * Repeatedly perform a long division. The binary array forms the dividend,
      * the length of the encoding is the divisor. Once computed, the quotient
     /**
      * Repeatedly perform a long division. The binary array forms the dividend,
      * the length of the encoding is the divisor. Once computed, the quotient
@@ -14693,13 +14708,13 @@ function extend() {
       remainders[remainders.length] = x;
       dividend = quotient;
     }
       remainders[remainders.length] = x;
       dividend = quotient;
     }
-  
+
     /* Convert the remainders to the output string */
     output = '';
     for (i = remainders.length - 1; i >= 0; i--) {
       output += encoding.charAt(remainders[i]);
     }
     /* Convert the remainders to the output string */
     output = '';
     for (i = remainders.length - 1; i >= 0; i--) {
       output += encoding.charAt(remainders[i]);
     }
-  
+
     /* Append leading zero equivalents */
     full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
     for (i = output.length; i < full_length; i+=1) {
     /* Append leading zero equivalents */
     full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
     for (i = output.length; i < full_length; i+=1) {
@@ -14721,10 +14736,10 @@ function extend() {
             | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
             | (i + 2 < len ? input.charCodeAt(i+2)      : 0);
       for (j = 0; j < 4; j+=1) {
             | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
             | (i + 2 < len ? input.charCodeAt(i+2)      : 0);
       for (j = 0; j < 4; j+=1) {
-        if (i * 8 + j * 6 > input.length * 8) { 
-          output += b64pad; 
-        } else { 
-          output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F); 
+        if (i * 8 + j * 6 > input.length * 8) {
+          output += b64pad;
+        } else {
+          output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
         }
        }
     }
         }
        }
     }
@@ -14732,7 +14747,7 @@ function extend() {
   }
 
   Hashes = {
   }
 
   Hashes = {
-  /**  
+  /**
    * @property {String} version
    * @readonly
    */
    * @property {String} version
    * @readonly
    */
@@ -14752,7 +14767,7 @@ function extend() {
     // public method for encoding
     this.encode = function (input) {
       var i, j, triplet,
     // public method for encoding
     this.encode = function (input) {
       var i, j, triplet,
-          output = '', 
+          output = '',
           len = input.length;
 
       pad = pad || '=';
           len = input.length;
 
       pad = pad || '=';
@@ -14770,7 +14785,7 @@ function extend() {
           }
         }
       }
           }
         }
       }
-      return output;    
+      return output;
     };
 
     // public method for decoding
     };
 
     // public method for decoding
@@ -14842,8 +14857,8 @@ function extend() {
   CRC32 : function (str) {
     var crc = 0, x = 0, y = 0, table, i, iTop;
     str = utf8Encode(str);
   CRC32 : function (str) {
     var crc = 0, x = 0, y = 0, table, i, iTop;
     str = utf8Encode(str);
-        
-    table = [ 
+
+    table = [
         '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
         '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
         '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
         '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
         '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
         '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
@@ -14861,7 +14876,7 @@ function extend() {
         '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
         '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
         '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
         '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
         '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
         '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
-        'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ', 
+        'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
         '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
         'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
         '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
         '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
         'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
         '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
@@ -14886,14 +14901,14 @@ function extend() {
    * @class MD5
    * @constructor
    * @param {Object} [config]
    * @class MD5
    * @constructor
    * @param {Object} [config]
-   * 
+   *
    * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
    * Digest Algorithm, as defined in RFC 1321.
    * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
    * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
    * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
    */
    * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
    * Digest Algorithm, as defined in RFC 1321.
    * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
    * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
    * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
    */
-  MD5 : function (options) {  
+  MD5 : function (options) {
     /**
      * Private config properties. You may need to tweak these to be compatible with
      * the server-side, but the defaults work in most cases.
     /**
      * Private config properties. You may need to tweak these to be compatible with
      * the server-side, but the defaults work in most cases.
@@ -14903,24 +14918,24 @@ function extend() {
         b64pad = (options && typeof options.pad === 'string') ? options.pda : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
 
         b64pad = (options && typeof options.pad === 'string') ? options.pda : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
 
-    // privileged (public) methods 
-    this.hex = function (s) { 
+    // privileged (public) methods
+    this.hex = function (s) {
       return rstr2hex(rstr(s, utf8), hexcase);
     };
       return rstr2hex(rstr(s, utf8), hexcase);
     };
-    this.b64 = function (s) { 
+    this.b64 = function (s) {
       return rstr2b64(rstr(s), b64pad);
     };
       return rstr2b64(rstr(s), b64pad);
     };
-    this.any = function(s, e) { 
-      return rstr2any(rstr(s, utf8), e); 
+    this.any = function(s, e) {
+      return rstr2any(rstr(s, utf8), e);
     };
     };
-    this.hex_hmac = function (k, d) { 
-      return rstr2hex(rstr_hmac(k, d), hexcase); 
+    this.hex_hmac = function (k, d) {
+      return rstr2hex(rstr_hmac(k, d), hexcase);
     };
     };
-    this.b64_hmac = function (k, d) { 
-      return rstr2b64(rstr_hmac(k,d), b64pad); 
+    this.b64_hmac = function (k, d) {
+      return rstr2b64(rstr_hmac(k,d), b64pad);
     };
     };
-    this.any_hmac = function (k, d, e) { 
-      return rstr2any(rstr_hmac(k, d), e); 
+    this.any_hmac = function (k, d, e) {
+      return rstr2any(rstr_hmac(k, d), e);
     };
     /**
      * Perform a simple self-test to see if the VM is working
     };
     /**
      * Perform a simple self-test to see if the VM is working
@@ -14929,33 +14944,33 @@ function extend() {
     this.vm_test = function () {
       return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
     };
     this.vm_test = function () {
       return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
     };
-    /** 
-     * Enable/disable uppercase hexadecimal returned string 
-     * @param {Boolean} 
+    /**
+     * Enable/disable uppercase hexadecimal returned string
+     * @param {Boolean}
      * @return {Object} this
      * @return {Object} this
-     */ 
+     */
     this.setUpperCase = function (a) {
       if (typeof a === 'boolean' ) {
         hexcase = a;
       }
       return this;
     };
     this.setUpperCase = function (a) {
       if (typeof a === 'boolean' ) {
         hexcase = a;
       }
       return this;
     };
-    /** 
-     * Defines a base64 pad string 
+    /**
+     * Defines a base64 pad string
      * @param {String} Pad
      * @return {Object} this
      * @param {String} Pad
      * @return {Object} this
-     */ 
+     */
     this.setPad = function (a) {
       b64pad = a || b64pad;
       return this;
     };
     this.setPad = function (a) {
       b64pad = a || b64pad;
       return this;
     };
-    /** 
-     * Defines a base64 pad string 
-     * @param {Boolean} 
+    /**
+     * Defines a base64 pad string
+     * @param {Boolean}
      * @return {Object} [this]
      * @return {Object} [this]
-     */ 
+     */
     this.setUTF8 = function (a) {
     this.setUTF8 = function (a) {
-      if (typeof a === 'boolean') { 
+      if (typeof a === 'boolean') {
         utf8 = a;
       }
       return this;
         utf8 = a;
       }
       return this;
@@ -14970,7 +14985,7 @@ function extend() {
       s = (utf8) ? utf8Encode(s): s;
       return binl2rstr(binl(rstr2binl(s), s.length * 8));
     }
       s = (utf8) ? utf8Encode(s): s;
       return binl2rstr(binl(rstr2binl(s), s.length * 8));
     }
-    
+
     /**
      * Calculate the HMAC-MD5, of a key and some data (raw strings)
      */
     /**
      * Calculate the HMAC-MD5, of a key and some data (raw strings)
      */
@@ -14980,11 +14995,11 @@ function extend() {
       key = (utf8) ? utf8Encode(key) : key;
       data = (utf8) ? utf8Encode(data) : data;
       bkey = rstr2binl(key);
       key = (utf8) ? utf8Encode(key) : key;
       data = (utf8) ? utf8Encode(data) : data;
       bkey = rstr2binl(key);
-      if (bkey.length > 16) { 
-        bkey = binl(bkey, key.length * 8); 
+      if (bkey.length > 16) {
+        bkey = binl(bkey, key.length * 8);
       }
 
       }
 
-      ipad = Array(16), opad = Array(16); 
+      ipad = Array(16), opad = Array(16);
       for (i = 0; i < 16; i+=1) {
           ipad[i] = bkey[i] ^ 0x36363636;
           opad[i] = bkey[i] ^ 0x5C5C5C5C;
       for (i = 0; i < 16; i+=1) {
           ipad[i] = bkey[i] ^ 0x36363636;
           opad[i] = bkey[i] ^ 0x5C5C5C5C;
@@ -15002,7 +15017,7 @@ function extend() {
           b = -271733879,
           c = -1732584194,
           d =  271733878;
           b = -271733879,
           c = -1732584194,
           d =  271733878;
-        
+
       /* append padding */
       x[len >> 5] |= 0x80 << ((len) % 32);
       x[(((len + 64) >>> 9) << 4) + 14] = len;
       /* append padding */
       x[len >> 5] |= 0x80 << ((len) % 32);
       x[(((len + 64) >>> 9) << 4) + 14] = len;
@@ -15113,7 +15128,7 @@ function extend() {
    * @class Hashes.SHA1
    * @param {Object} [config]
    * @constructor
    * @class Hashes.SHA1
    * @param {Object} [config]
    * @constructor
-   * 
+   *
    * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
    * Version 2.2 Copyright Paul Johnston 2000 - 2009.
    * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
    * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
    * Version 2.2 Copyright Paul Johnston 2000 - 2009.
    * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
@@ -15130,22 +15145,22 @@ function extend() {
         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
 
     // public methods
         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
 
     // public methods
-    this.hex = function (s) { 
-       return rstr2hex(rstr(s, utf8), hexcase); 
+    this.hex = function (s) {
+       return rstr2hex(rstr(s, utf8), hexcase);
     };
     };
-    this.b64 = function (s) { 
+    this.b64 = function (s) {
        return rstr2b64(rstr(s, utf8), b64pad);
     };
        return rstr2b64(rstr(s, utf8), b64pad);
     };
-    this.any = function (s, e) { 
+    this.any = function (s, e) {
        return rstr2any(rstr(s, utf8), e);
     };
     this.hex_hmac = function (k, d) {
        return rstr2hex(rstr_hmac(k, d));
     };
        return rstr2any(rstr(s, utf8), e);
     };
     this.hex_hmac = function (k, d) {
        return rstr2hex(rstr_hmac(k, d));
     };
-    this.b64_hmac = function (k, d) { 
-       return rstr2b64(rstr_hmac(k, d), b64pad); 
+    this.b64_hmac = function (k, d) {
+       return rstr2b64(rstr_hmac(k, d), b64pad);
     };
     };
-    this.any_hmac = function (k, d, e) { 
+    this.any_hmac = function (k, d, e) {
        return rstr2any(rstr_hmac(k, d), e);
     };
     /**
        return rstr2any(rstr_hmac(k, d), e);
     };
     /**
@@ -15156,34 +15171,34 @@ function extend() {
     this.vm_test = function () {
       return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
     };
     this.vm_test = function () {
       return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
     };
-    /** 
-     * @description Enable/disable uppercase hexadecimal returned string 
-     * @param {boolean} 
+    /**
+     * @description Enable/disable uppercase hexadecimal returned string
+     * @param {boolean}
      * @return {Object} this
      * @public
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setUpperCase = function (a) {
        if (typeof a === 'boolean') {
         hexcase = a;
       }
        return this;
     };
     this.setUpperCase = function (a) {
        if (typeof a === 'boolean') {
         hexcase = a;
       }
        return this;
     };
-    /** 
-     * @description Defines a base64 pad string 
+    /**
+     * @description Defines a base64 pad string
      * @param {string} Pad
      * @return {Object} this
      * @public
      * @param {string} Pad
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setPad = function (a) {
       b64pad = a || b64pad;
        return this;
     };
     this.setPad = function (a) {
       b64pad = a || b64pad;
        return this;
     };
-    /** 
-     * @description Defines a base64 pad string 
-     * @param {boolean} 
+    /**
+     * @description Defines a base64 pad string
+     * @param {boolean}
      * @return {Object} this
      * @public
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setUTF8 = function (a) {
        if (typeof a === 'boolean') {
         utf8 = a;
     this.setUTF8 = function (a) {
        if (typeof a === 'boolean') {
         utf8 = a;
@@ -15244,12 +15259,12 @@ function extend() {
         oldc = c;
         oldd = d;
         olde = e;
         oldc = c;
         oldd = d;
         olde = e;
-      
+
        for (j = 0; j < 80; j+=1)       {
        for (j = 0; j < 80; j+=1)       {
-         if (j < 16) { 
-            w[j] = x[i + j]; 
-          } else { 
-            w[j] = bit_rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); 
+         if (j < 16) {
+            w[j] = x[i + j];
+          } else {
+            w[j] = bit_rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
           }
          t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
                                           safe_add(safe_add(e, w[j]), sha1_kt(j)));
           }
          t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
                                           safe_add(safe_add(e, w[j]), sha1_kt(j)));
@@ -15291,7 +15306,7 @@ function extend() {
   /**
    * @class Hashes.SHA256
    * @param {config}
   /**
    * @class Hashes.SHA256
    * @param {config}
-   * 
+   *
    * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
    * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
    * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
    * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
    * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
    * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
@@ -15311,23 +15326,23 @@ function extend() {
               sha256_K;
 
     /* privileged (public) methods */
               sha256_K;
 
     /* privileged (public) methods */
-    this.hex = function (s) { 
-      return rstr2hex(rstr(s, utf8)); 
+    this.hex = function (s) {
+      return rstr2hex(rstr(s, utf8));
     };
     };
-    this.b64 = function (s) { 
+    this.b64 = function (s) {
       return rstr2b64(rstr(s, utf8), b64pad);
     };
       return rstr2b64(rstr(s, utf8), b64pad);
     };
-    this.any = function (s, e) { 
-      return rstr2any(rstr(s, utf8), e); 
+    this.any = function (s, e) {
+      return rstr2any(rstr(s, utf8), e);
     };
     };
-    this.hex_hmac = function (k, d) { 
-      return rstr2hex(rstr_hmac(k, d)); 
+    this.hex_hmac = function (k, d) {
+      return rstr2hex(rstr_hmac(k, d));
     };
     };
-    this.b64_hmac = function (k, d) { 
+    this.b64_hmac = function (k, d) {
       return rstr2b64(rstr_hmac(k, d), b64pad);
     };
       return rstr2b64(rstr_hmac(k, d), b64pad);
     };
-    this.any_hmac = function (k, d, e) { 
-      return rstr2any(rstr_hmac(k, d), e); 
+    this.any_hmac = function (k, d, e) {
+      return rstr2any(rstr_hmac(k, d), e);
     };
     /**
      * Perform a simple self-test to see if the VM is working
     };
     /**
      * Perform a simple self-test to see if the VM is working
@@ -15337,41 +15352,41 @@ function extend() {
     this.vm_test = function () {
       return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
     };
     this.vm_test = function () {
       return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
     };
-    /** 
-     * Enable/disable uppercase hexadecimal returned string 
-     * @param {boolean} 
+    /**
+     * Enable/disable uppercase hexadecimal returned string
+     * @param {boolean}
      * @return {Object} this
      * @public
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setUpperCase = function (a) {
     this.setUpperCase = function (a) {
-      if (typeof a === 'boolean') { 
+      if (typeof a === 'boolean') {
         hexcase = a;
       }
       return this;
     };
         hexcase = a;
       }
       return this;
     };
-    /** 
-     * @description Defines a base64 pad string 
+    /**
+     * @description Defines a base64 pad string
      * @param {string} Pad
      * @return {Object} this
      * @public
      * @param {string} Pad
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setPad = function (a) {
       b64pad = a || b64pad;
       return this;
     };
     this.setPad = function (a) {
       b64pad = a || b64pad;
       return this;
     };
-    /** 
-     * Defines a base64 pad string 
-     * @param {boolean} 
+    /**
+     * Defines a base64 pad string
+     * @param {boolean}
      * @return {Object} this
      * @public
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setUTF8 = function (a) {
       if (typeof a === 'boolean') {
         utf8 = a;
       }
       return this;
     };
     this.setUTF8 = function (a) {
       if (typeof a === 'boolean') {
         utf8 = a;
       }
       return this;
     };
-    
+
     // private methods
 
     /**
     // private methods
 
     /**
@@ -15389,21 +15404,21 @@ function extend() {
       key = (utf8) ? utf8Encode(key) : key;
       data = (utf8) ? utf8Encode(data) : data;
       var hash, i = 0,
       key = (utf8) ? utf8Encode(key) : key;
       data = (utf8) ? utf8Encode(data) : data;
       var hash, i = 0,
-          bkey = rstr2binb(key), 
-          ipad = Array(16), 
+          bkey = rstr2binb(key),
+          ipad = Array(16),
           opad = Array(16);
 
       if (bkey.length > 16) { bkey = binb(bkey, key.length * 8); }
           opad = Array(16);
 
       if (bkey.length > 16) { bkey = binb(bkey, key.length * 8); }
-      
+
       for (; i < 16; i+=1) {
         ipad[i] = bkey[i] ^ 0x36363636;
         opad[i] = bkey[i] ^ 0x5C5C5C5C;
       }
       for (; i < 16; i+=1) {
         ipad[i] = bkey[i] ^ 0x36363636;
         opad[i] = bkey[i] ^ 0x5C5C5C5C;
       }
-      
+
       hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
       return binb2rstr(binb(opad.concat(hash), 512 + 256));
     }
       hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
       return binb2rstr(binb(opad.concat(hash), 512 + 256));
     }
-    
+
     /*
      * Main sha256 function, with its support functions
      */
     /*
      * Main sha256 function, with its support functions
      */
@@ -15419,7 +15434,7 @@ function extend() {
     function sha256_Sigma1512(x) {return (sha256_S(x, 14) ^ sha256_S(x, 18) ^ sha256_S(x, 41));}
     function sha256_Gamma0512(x) {return (sha256_S(x, 1)  ^ sha256_S(x, 8) ^ sha256_R(x, 7));}
     function sha256_Gamma1512(x) {return (sha256_S(x, 19) ^ sha256_S(x, 61) ^ sha256_R(x, 6));}
     function sha256_Sigma1512(x) {return (sha256_S(x, 14) ^ sha256_S(x, 18) ^ sha256_S(x, 41));}
     function sha256_Gamma0512(x) {return (sha256_S(x, 1)  ^ sha256_S(x, 8) ^ sha256_R(x, 7));}
     function sha256_Gamma1512(x) {return (sha256_S(x, 19) ^ sha256_S(x, 61) ^ sha256_R(x, 6));}
-    
+
     sha256_K = [
       1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993,
       -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
     sha256_K = [
       1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993,
       -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
@@ -15433,18 +15448,18 @@ function extend() {
       1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872,
       -1866530822, -1538233109, -1090935817, -965641998
     ];
       1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872,
       -1866530822, -1538233109, -1090935817, -965641998
     ];
-    
+
     function binb(m, l) {
       var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
                  1359893119, -1694144372, 528734635, 1541459225];
       var W = new Array(64);
       var a, b, c, d, e, f, g, h;
       var i, j, T1, T2;
     function binb(m, l) {
       var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
                  1359893119, -1694144372, 528734635, 1541459225];
       var W = new Array(64);
       var a, b, c, d, e, f, g, h;
       var i, j, T1, T2;
-    
+
       /* append padding */
       m[l >> 5] |= 0x80 << (24 - l % 32);
       m[((l + 64 >> 9) << 4) + 15] = l;
       /* append padding */
       m[l >> 5] |= 0x80 << (24 - l % 32);
       m[((l + 64 >> 9) << 4) + 15] = l;
-    
+
       for (i = 0; i < m.length; i += 16)
       {
       a = HASH[0];
       for (i = 0; i < m.length; i += 16)
       {
       a = HASH[0];
@@ -15455,16 +15470,16 @@ function extend() {
       f = HASH[5];
       g = HASH[6];
       h = HASH[7];
       f = HASH[5];
       g = HASH[6];
       h = HASH[7];
-    
+
       for (j = 0; j < 64; j+=1)
       {
       for (j = 0; j < 64; j+=1)
       {
-        if (j < 16) { 
+        if (j < 16) {
           W[j] = m[j + i];
           W[j] = m[j + i];
-        } else { 
+        } else {
           W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
                           sha256_Gamma0256(W[j - 15])), W[j - 16]);
         }
           W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
                           sha256_Gamma0256(W[j - 15])), W[j - 16]);
         }
-    
+
         T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
                                   sha256_K[j]), W[j]);
         T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
         T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
                                   sha256_K[j]), W[j]);
         T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
@@ -15477,7 +15492,7 @@ function extend() {
         b = a;
         a = safe_add(T1, T2);
       }
         b = a;
         a = safe_add(T1, T2);
       }
-    
+
       HASH[0] = safe_add(a, HASH[0]);
       HASH[1] = safe_add(b, HASH[1]);
       HASH[2] = safe_add(c, HASH[2]);
       HASH[0] = safe_add(a, HASH[0]);
       HASH[1] = safe_add(b, HASH[1]);
       HASH[2] = safe_add(c, HASH[2]);
@@ -15495,11 +15510,11 @@ function extend() {
   /**
    * @class Hashes.SHA512
    * @param {config}
   /**
    * @class Hashes.SHA512
    * @param {config}
-   * 
+   *
    * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
    * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
    * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
    * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
    * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
    * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
-   * See http://pajhome.org.uk/crypt/md5 for details. 
+   * See http://pajhome.org.uk/crypt/md5 for details.
    */
   SHA512 : function (options) {
     /**
    */
   SHA512 : function (options) {
     /**
@@ -15514,22 +15529,22 @@ function extend() {
         sha512_k;
 
     /* privileged (public) methods */
         sha512_k;
 
     /* privileged (public) methods */
-    this.hex = function (s) { 
-      return rstr2hex(rstr(s)); 
+    this.hex = function (s) {
+      return rstr2hex(rstr(s));
     };
     };
-    this.b64 = function (s) { 
-      return rstr2b64(rstr(s), b64pad);  
+    this.b64 = function (s) {
+      return rstr2b64(rstr(s), b64pad);
     };
     };
-    this.any = function (s, e) { 
+    this.any = function (s, e) {
       return rstr2any(rstr(s), e);
     };
     this.hex_hmac = function (k, d) {
       return rstr2hex(rstr_hmac(k, d));
     };
       return rstr2any(rstr(s), e);
     };
     this.hex_hmac = function (k, d) {
       return rstr2hex(rstr_hmac(k, d));
     };
-    this.b64_hmac = function (k, d) { 
+    this.b64_hmac = function (k, d) {
       return rstr2b64(rstr_hmac(k, d), b64pad);
     };
       return rstr2b64(rstr_hmac(k, d), b64pad);
     };
-    this.any_hmac = function (k, d, e) { 
+    this.any_hmac = function (k, d, e) {
       return rstr2any(rstr_hmac(k, d), e);
     };
     /**
       return rstr2any(rstr_hmac(k, d), e);
     };
     /**
@@ -15540,34 +15555,34 @@ function extend() {
     this.vm_test = function () {
       return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
     };
     this.vm_test = function () {
       return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
     };
-    /** 
-     * @description Enable/disable uppercase hexadecimal returned string 
-     * @param {boolean} 
+    /**
+     * @description Enable/disable uppercase hexadecimal returned string
+     * @param {boolean}
      * @return {Object} this
      * @public
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setUpperCase = function (a) {
       if (typeof a === 'boolean') {
         hexcase = a;
       }
       return this;
     };
     this.setUpperCase = function (a) {
       if (typeof a === 'boolean') {
         hexcase = a;
       }
       return this;
     };
-    /** 
-     * @description Defines a base64 pad string 
+    /**
+     * @description Defines a base64 pad string
      * @param {string} Pad
      * @return {Object} this
      * @public
      * @param {string} Pad
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setPad = function (a) {
       b64pad = a || b64pad;
       return this;
     };
     this.setPad = function (a) {
       b64pad = a || b64pad;
       return this;
     };
-    /** 
-     * @description Defines a base64 pad string 
-     * @param {boolean} 
+    /**
+     * @description Defines a base64 pad string
+     * @param {boolean}
      * @return {Object} this
      * @public
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setUTF8 = function (a) {
       if (typeof a === 'boolean') {
         utf8 = a;
     this.setUTF8 = function (a) {
       if (typeof a === 'boolean') {
         utf8 = a;
@@ -15576,7 +15591,7 @@ function extend() {
     };
 
     /* private methods */
     };
 
     /* private methods */
-    
+
     /**
      * Calculate the SHA-512 of a raw string
      */
     /**
      * Calculate the SHA-512 of a raw string
      */
@@ -15590,22 +15605,22 @@ function extend() {
     function rstr_hmac(key, data) {
       key = (utf8) ? utf8Encode(key) : key;
       data = (utf8) ? utf8Encode(data) : data;
     function rstr_hmac(key, data) {
       key = (utf8) ? utf8Encode(key) : key;
       data = (utf8) ? utf8Encode(data) : data;
-      
-      var hash, i = 0, 
+
+      var hash, i = 0,
           bkey = rstr2binb(key),
           ipad = Array(32), opad = Array(32);
 
       if (bkey.length > 32) { bkey = binb(bkey, key.length * 8); }
           bkey = rstr2binb(key),
           ipad = Array(32), opad = Array(32);
 
       if (bkey.length > 32) { bkey = binb(bkey, key.length * 8); }
-      
+
       for (; i < 32; i+=1) {
         ipad[i] = bkey[i] ^ 0x36363636;
         opad[i] = bkey[i] ^ 0x5C5C5C5C;
       }
       for (; i < 32; i+=1) {
         ipad[i] = bkey[i] ^ 0x36363636;
         opad[i] = bkey[i] ^ 0x5C5C5C5C;
       }
-      
+
       hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
       return binb2rstr(binb(opad.concat(hash), 1024 + 512));
     }
       hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
       return binb2rstr(binb(opad.concat(hash), 1024 + 512));
     }
-            
+
     /**
      * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
      */
     /**
      * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
      */
@@ -15688,11 +15703,11 @@ function extend() {
             new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
           ];
       }
             new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
           ];
       }
-  
+
       for (i=0; i<80; i+=1) {
         W[i] = new int64(0, 0);
       }
       for (i=0; i<80; i+=1) {
         W[i] = new int64(0, 0);
       }
-    
+
       // append padding to the source string. The format is described in the FIPS.
       x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
       x[((len + 128 >> 10)<< 5) + 31] = len;
       // append padding to the source string. The format is described in the FIPS.
       x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
       x[((len + 128 >> 10)<< 5) + 31] = len;
@@ -15706,12 +15721,12 @@ function extend() {
         int64copy(f, H[5]);
         int64copy(g, H[6]);
         int64copy(h, H[7]);
         int64copy(f, H[5]);
         int64copy(g, H[6]);
         int64copy(h, H[7]);
-      
+
         for (j=0; j<16; j+=1) {
           W[j].h = x[i + 2*j];
           W[j].l = x[i + 2*j + 1];
         }
         for (j=0; j<16; j+=1) {
           W[j].h = x[i + 2*j];
           W[j].l = x[i + 2*j + 1];
         }
-      
+
         for (j=16; j<80; j+=1) {
           //sigma1
           int64rrot(r1, W[j-2], 19);
         for (j=16; j<80; j+=1) {
           //sigma1
           int64rrot(r1, W[j-2], 19);
@@ -15725,36 +15740,36 @@ function extend() {
           int64shr(r3, W[j-15], 7);
           s0.l = r1.l ^ r2.l ^ r3.l;
           s0.h = r1.h ^ r2.h ^ r3.h;
           int64shr(r3, W[j-15], 7);
           s0.l = r1.l ^ r2.l ^ r3.l;
           s0.h = r1.h ^ r2.h ^ r3.h;
-      
+
           int64add4(W[j], s1, W[j-7], s0, W[j-16]);
         }
           int64add4(W[j], s1, W[j-7], s0, W[j-16]);
         }
-      
+
         for (j = 0; j < 80; j+=1) {
           //Ch
           Ch.l = (e.l & f.l) ^ (~e.l & g.l);
           Ch.h = (e.h & f.h) ^ (~e.h & g.h);
         for (j = 0; j < 80; j+=1) {
           //Ch
           Ch.l = (e.l & f.l) ^ (~e.l & g.l);
           Ch.h = (e.h & f.h) ^ (~e.h & g.h);
-      
+
           //Sigma1
           int64rrot(r1, e, 14);
           int64rrot(r2, e, 18);
           int64revrrot(r3, e, 9);
           s1.l = r1.l ^ r2.l ^ r3.l;
           s1.h = r1.h ^ r2.h ^ r3.h;
           //Sigma1
           int64rrot(r1, e, 14);
           int64rrot(r2, e, 18);
           int64revrrot(r3, e, 9);
           s1.l = r1.l ^ r2.l ^ r3.l;
           s1.h = r1.h ^ r2.h ^ r3.h;
-      
+
           //Sigma0
           int64rrot(r1, a, 28);
           int64revrrot(r2, a, 2);
           int64revrrot(r3, a, 7);
           s0.l = r1.l ^ r2.l ^ r3.l;
           s0.h = r1.h ^ r2.h ^ r3.h;
           //Sigma0
           int64rrot(r1, a, 28);
           int64revrrot(r2, a, 2);
           int64revrrot(r3, a, 7);
           s0.l = r1.l ^ r2.l ^ r3.l;
           s0.h = r1.h ^ r2.h ^ r3.h;
-      
+
           //Maj
           Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
           Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
           //Maj
           Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
           Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
-      
+
           int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
           int64add(T2, s0, Maj);
           int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
           int64add(T2, s0, Maj);
-      
+
           int64copy(h, g);
           int64copy(g, f);
           int64copy(f, e);
           int64copy(h, g);
           int64copy(g, f);
           int64copy(f, e);
@@ -15773,7 +15788,7 @@ function extend() {
         int64add(H[6], H[6], g);
         int64add(H[7], H[7], h);
       }
         int64add(H[6], H[6], g);
         int64add(H[7], H[7], h);
       }
-    
+
       //represent the hash as an array of 32-bit dwords
       for (i=0; i<8; i+=1) {
         hash[2*i] = H[i].h;
       //represent the hash as an array of 32-bit dwords
       for (i=0; i<8; i+=1) {
         hash[2*i] = H[i].h;
@@ -15781,20 +15796,20 @@ function extend() {
       }
       return hash;
     }
       }
       return hash;
     }
-    
+
     //A constructor for 64-bit numbers
     function int64(h, l) {
       this.h = h;
       this.l = l;
       //this.toString = int64toString;
     }
     //A constructor for 64-bit numbers
     function int64(h, l) {
       this.h = h;
       this.l = l;
       //this.toString = int64toString;
     }
-    
+
     //Copies src into dst, assuming both are 64-bit numbers
     function int64copy(dst, src) {
       dst.h = src.h;
       dst.l = src.l;
     }
     //Copies src into dst, assuming both are 64-bit numbers
     function int64copy(dst, src) {
       dst.h = src.h;
       dst.l = src.l;
     }
-    
+
     //Right-rotates a 64-bit number by shift
     //Won't handle cases of shift>=32
     //The function revrrot() is for that
     //Right-rotates a 64-bit number by shift
     //Won't handle cases of shift>=32
     //The function revrrot() is for that
@@ -15802,21 +15817,21 @@ function extend() {
       dst.l = (x.l >>> shift) | (x.h << (32-shift));
       dst.h = (x.h >>> shift) | (x.l << (32-shift));
     }
       dst.l = (x.l >>> shift) | (x.h << (32-shift));
       dst.h = (x.h >>> shift) | (x.l << (32-shift));
     }
-    
+
     //Reverses the dwords of the source and then rotates right by shift.
     //This is equivalent to rotation by 32+shift
     function int64revrrot(dst, x, shift) {
       dst.l = (x.h >>> shift) | (x.l << (32-shift));
       dst.h = (x.l >>> shift) | (x.h << (32-shift));
     }
     //Reverses the dwords of the source and then rotates right by shift.
     //This is equivalent to rotation by 32+shift
     function int64revrrot(dst, x, shift) {
       dst.l = (x.h >>> shift) | (x.l << (32-shift));
       dst.h = (x.l >>> shift) | (x.h << (32-shift));
     }
-    
+
     //Bitwise-shifts right a 64-bit number by shift
     //Won't handle shift>=32, but it's never needed in SHA512
     function int64shr(dst, x, shift) {
       dst.l = (x.l >>> shift) | (x.h << (32-shift));
       dst.h = (x.h >>> shift);
     }
     //Bitwise-shifts right a 64-bit number by shift
     //Won't handle shift>=32, but it's never needed in SHA512
     function int64shr(dst, x, shift) {
       dst.l = (x.l >>> shift) | (x.h << (32-shift));
       dst.h = (x.h >>> shift);
     }
-    
+
     //Adds two 64-bit numbers
     //Like the original implementation, does not rely on 32-bit operations
     function int64add(dst, x, y) {
     //Adds two 64-bit numbers
     //Like the original implementation, does not rely on 32-bit operations
     function int64add(dst, x, y) {
@@ -15827,7 +15842,7 @@ function extend() {
        dst.l = (w0 & 0xffff) | (w1 << 16);
        dst.h = (w2 & 0xffff) | (w3 << 16);
     }
        dst.l = (w0 & 0xffff) | (w1 << 16);
        dst.h = (w2 & 0xffff) | (w3 << 16);
     }
-    
+
     //Same, except with 4 addends. Works faster than adding them one by one.
     function int64add4(dst, a, b, c, d) {
        var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
     //Same, except with 4 addends. Works faster than adding them one by one.
     function int64add4(dst, a, b, c, d) {
        var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
@@ -15837,7 +15852,7 @@ function extend() {
        dst.l = (w0 & 0xffff) | (w1 << 16);
        dst.h = (w2 & 0xffff) | (w3 << 16);
     }
        dst.l = (w0 & 0xffff) | (w1 << 16);
        dst.h = (w2 & 0xffff) | (w3 << 16);
     }
-    
+
     //Same, except with 5 addends
     function int64add5(dst, a, b, c, d, e) {
       var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
     //Same, except with 5 addends
     function int64add5(dst, a, b, c, d, e) {
       var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
@@ -15852,7 +15867,7 @@ function extend() {
    * @class Hashes.RMD160
    * @constructor
    * @param {Object} [config]
    * @class Hashes.RMD160
    * @constructor
    * @param {Object} [config]
-   * 
+   *
    * A JavaScript implementation of the RIPEMD-160 Algorithm
    * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
    * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
    * A JavaScript implementation of the RIPEMD-160 Algorithm
    * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
    * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
@@ -15900,22 +15915,22 @@ function extend() {
 
     /* privileged (public) methods */
     this.hex = function (s) {
 
     /* privileged (public) methods */
     this.hex = function (s) {
-      return rstr2hex(rstr(s, utf8)); 
+      return rstr2hex(rstr(s, utf8));
     };
     this.b64 = function (s) {
       return rstr2b64(rstr(s, utf8), b64pad);
     };
     };
     this.b64 = function (s) {
       return rstr2b64(rstr(s, utf8), b64pad);
     };
-    this.any = function (s, e) { 
+    this.any = function (s, e) {
       return rstr2any(rstr(s, utf8), e);
     };
       return rstr2any(rstr(s, utf8), e);
     };
-    this.hex_hmac = function (k, d) { 
+    this.hex_hmac = function (k, d) {
       return rstr2hex(rstr_hmac(k, d));
     };
       return rstr2hex(rstr_hmac(k, d));
     };
-    this.b64_hmac = function (k, d) { 
+    this.b64_hmac = function (k, d) {
       return rstr2b64(rstr_hmac(k, d), b64pad);
     };
       return rstr2b64(rstr_hmac(k, d), b64pad);
     };
-    this.any_hmac = function (k, d, e) { 
-      return rstr2any(rstr_hmac(k, d), e); 
+    this.any_hmac = function (k, d, e) {
+      return rstr2any(rstr_hmac(k, d), e);
     };
     /**
      * Perform a simple self-test to see if the VM is working
     };
     /**
      * Perform a simple self-test to see if the VM is working
@@ -15925,32 +15940,32 @@ function extend() {
     this.vm_test = function () {
       return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
     };
     this.vm_test = function () {
       return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
     };
-    /** 
-     * @description Enable/disable uppercase hexadecimal returned string 
-     * @param {boolean} 
+    /**
+     * @description Enable/disable uppercase hexadecimal returned string
+     * @param {boolean}
      * @return {Object} this
      * @public
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setUpperCase = function (a) {
       if (typeof a === 'boolean' ) { hexcase = a; }
       return this;
     };
     this.setUpperCase = function (a) {
       if (typeof a === 'boolean' ) { hexcase = a; }
       return this;
     };
-    /** 
-     * @description Defines a base64 pad string 
+    /**
+     * @description Defines a base64 pad string
      * @param {string} Pad
      * @return {Object} this
      * @public
      * @param {string} Pad
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setPad = function (a) {
       if (typeof a !== 'undefined' ) { b64pad = a; }
       return this;
     };
     this.setPad = function (a) {
       if (typeof a !== 'undefined' ) { b64pad = a; }
       return this;
     };
-    /** 
-     * @description Defines a base64 pad string 
-     * @param {boolean} 
+    /**
+     * @description Defines a base64 pad string
+     * @param {boolean}
      * @return {Object} this
      * @public
      * @return {Object} this
      * @public
-     */ 
+     */
     this.setUTF8 = function (a) {
       if (typeof a === 'boolean') { utf8 = a; }
       return this;
     this.setUTF8 = function (a) {
       if (typeof a === 'boolean') { utf8 = a; }
       return this;
@@ -15976,10 +15991,10 @@ function extend() {
           bkey = rstr2binl(key),
           ipad = Array(16), opad = Array(16);
 
           bkey = rstr2binl(key),
           ipad = Array(16), opad = Array(16);
 
-      if (bkey.length > 16) { 
-        bkey = binl(bkey, key.length * 8); 
+      if (bkey.length > 16) {
+        bkey = binl(bkey, key.length * 8);
       }
       }
-      
+
       for (i = 0; i < 16; i+=1) {
         ipad[i] = bkey[i] ^ 0x36363636;
         opad[i] = bkey[i] ^ 0x5C5C5C5C;
       for (i = 0; i < 16; i+=1) {
         ipad[i] = bkey[i] ^ 0x36363636;
         opad[i] = bkey[i] ^ 0x5C5C5C5C;
@@ -16016,7 +16031,7 @@ function extend() {
       x[len >> 5] |= 0x80 << (len % 32);
       x[(((len + 64) >>> 9) << 4) + 14] = len;
       l = x.length;
       x[len >> 5] |= 0x80 << (len % 32);
       x[(((len + 64) >>> 9) << 4) + 14] = len;
       l = x.length;
-      
+
       for (i = 0; i < l; i+=16) {
         A1 = A2 = h0; B1 = B2 = h1; C1 = C2 = h2; D1 = D2 = h3; E1 = E2 = h4;
         for (j = 0; j <= 79; j+=1) {
       for (i = 0; i < l; i+=16) {
         A1 = A2 = h0; B1 = B2 = h1; C1 = C2 = h2; D1 = D2 = h3; E1 = E2 = h4;
         for (j = 0; j <= 79; j+=1) {
@@ -16042,7 +16057,7 @@ function extend() {
       return [h0, h1, h2, h3, h4];
     }
 
       return [h0, h1, h2, h3, h4];
     }
 
-    // specific algorithm methods 
+    // specific algorithm methods
     function rmd160_f(j, x, y, z) {
       return ( 0 <= j && j <= 15) ? (x ^ y ^ z) :
          (16 <= j && j <= 31) ? (x & y) | (~x & z) :
     function rmd160_f(j, x, y, z) {
       return ( 0 <= j && j <= 15) ? (x ^ y ^ z) :
          (16 <= j && j <= 31) ? (x & y) | (~x & z) :
@@ -16296,7 +16311,7 @@ module.exports = Object.keys || require('./shim');
 /**!
  * is
  * the definitive JavaScript type testing library
 /**!
  * is
  * the definitive JavaScript type testing library
- * 
+ *
  * @copyright 2013 Enrico Marino
  * @license MIT
  */
  * @copyright 2013 Enrico Marino
  * @license MIT
  */
@@ -17021,7 +17036,8 @@ module.exports = function forEach (obj, fn, ctx) {
 
 },{}]},{},[1])(1)
 });
 
 },{}]},{},[1])(1)
 });
-;/*
+;
+/*
  (c) 2013, Vladimir Agafonkin
  RBush, a JavaScript library for high-performance 2D spatial indexing of points and rectangles.
  https://github.com/mourner/rbush
  (c) 2013, Vladimir Agafonkin
  RBush, a JavaScript library for high-performance 2D spatial indexing of points and rectangles.
  https://github.com/mourner/rbush
@@ -19333,7 +19349,7 @@ window.iD = function () {
     return d3.rebind(context, dispatch, 'on');
 };
 
     return d3.rebind(context, dispatch, 'on');
 };
 
-iD.version = '1.7.4';
+iD.version = '1.8.2';
 
 (function() {
     var detected = {};
 
 (function() {
     var detected = {};
@@ -19341,10 +19357,17 @@ iD.version = '1.7.4';
     var ua = navigator.userAgent,
         m = null;
 
     var ua = navigator.userAgent,
         m = null;
 
-    m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11+
+    m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
     if (m !== null) {
     if (m !== null) {
-        detected.browser = 'msie';
-        detected.version = m[1];
+        detected.browser = m[1];
+        detected.version = m[2];
+    }
+    if (!detected.browser) {
+        m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
+        if (m !== null) {
+            detected.browser = 'msie';
+            detected.version = m[1];
+        }
     }
     if (!detected.browser) {
         m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
     }
     if (!detected.browser) {
         m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
@@ -19371,16 +19394,19 @@ iD.version = '1.7.4';
     detected.version = detected.version.split(/\W/).slice(0,2).join('.');
 
     if (detected.browser.toLowerCase() === 'msie') {
     detected.version = detected.version.split(/\W/).slice(0,2).join('.');
 
     if (detected.browser.toLowerCase() === 'msie') {
+        detected.ie = true;
         detected.browser = 'Internet Explorer';
         detected.browser = 'Internet Explorer';
-        detected.support = parseFloat(detected.version) > 9;
+        detected.support = parseFloat(detected.version) >= 11;
     } else {
     } else {
+        detected.ie = false;
         detected.support = true;
     }
 
     // Added due to incomplete svg style support. See #715
     detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
 
         detected.support = true;
     }
 
     // Added due to incomplete svg style support. See #715
     detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
 
-    detected.locale = navigator.language || navigator.userLanguage || 'en-US';
+    detected.locale = (navigator.languages && navigator.languages.length)
+        ? navigator.languages[0] : (navigator.language || navigator.userLanguage || 'en-US');
 
     detected.filedrop = (window.FileReader && 'ondrop' in window);
 
 
     detected.filedrop = (window.FileReader && 'ondrop' in window);
 
@@ -19486,19 +19512,10 @@ iD.taginfo = function() {
         return _.omit(parameters, 'geometry', 'debounce');
     }
 
         return _.omit(parameters, 'geometry', 'debounce');
     }
 
-    function shorten(parameters) {
-        if (!parameters.query) {
-            delete parameters.query;
-        } else {
-            parameters.query = parameters.query.slice(0, 3);
-        }
-        return parameters;
-    }
-
     function popularKeys(parameters) {
         var pop_field = 'count_all';
         if (parameters.filter) pop_field = 'count_' + parameters.filter;
     function popularKeys(parameters) {
         var pop_field = 'count_all';
         if (parameters.filter) pop_field = 'count_' + parameters.filter;
-        return function(d) { return parseFloat(d[pop_field]) > 10000; };
+        return function(d) { return parseFloat(d[pop_field]) > 5000 || d.in_wiki; };
     }
 
     function popularValues() {
     }
 
     function popularValues() {
@@ -19533,7 +19550,7 @@ iD.taginfo = function() {
 
     taginfo.keys = function(parameters, callback) {
         var debounce = parameters.debounce;
 
     taginfo.keys = function(parameters, callback) {
         var debounce = parameters.debounce;
-        parameters = clean(shorten(setSort(parameters)));
+        parameters = clean(setSort(parameters));
         request(endpoint + 'keys/all?' +
             iD.util.qsString(_.extend({
                 rp: 10,
         request(endpoint + 'keys/all?' +
             iD.util.qsString(_.extend({
                 rp: 10,
@@ -19548,7 +19565,7 @@ iD.taginfo = function() {
 
     taginfo.values = function(parameters, callback) {
         var debounce = parameters.debounce;
 
     taginfo.values = function(parameters, callback) {
         var debounce = parameters.debounce;
-        parameters = clean(shorten(setSort(setFilter(parameters))));
+        parameters = clean(setSort(setFilter(parameters)));
         request(endpoint + 'key/values?' +
             iD.util.qsString(_.extend({
                 rp: 25,
         request(endpoint + 'key/values?' +
             iD.util.qsString(_.extend({
                 rp: 25,
@@ -19569,21 +19586,10 @@ iD.taginfo = function() {
         if (parameters.value) path = 'tag/wiki_pages?';
         else if (parameters.rtype) path = 'relation/wiki_pages?';
 
         if (parameters.value) path = 'tag/wiki_pages?';
         else if (parameters.rtype) path = 'relation/wiki_pages?';
 
-        var decoratedCallback;
-        if (parameters.value) {
-            decoratedCallback = function(err, data) {
-                // The third argument to callback is the softfail flag, to
-                // make the callback function not show a message to the end
-                // user when no docs are found but just return false.
-                var docsFound = callback(err, data, true);
-                if (!docsFound) {
-                    taginfo.docs(_.omit(parameters, 'value'), callback);
-                }
-            };
-        }
-
-        request(endpoint + path +
-            iD.util.qsString(parameters), debounce, decoratedCallback || callback);
+        request(endpoint + path + iD.util.qsString(parameters), debounce, function(err, d) {
+            if (err) return callback(err);
+            callback(null, d.data);
+        });
     };
 
     taginfo.endpoint = function(_) {
     };
 
     taginfo.endpoint = function(_) {
@@ -20236,43 +20242,82 @@ iD.geo.Turn = function(turn) {
 
 iD.geo.Intersection = function(graph, vertexId) {
     var vertex = graph.entity(vertexId),
 
 iD.geo.Intersection = function(graph, vertexId) {
     var vertex = graph.entity(vertexId),
-        highways = [];
+        parentWays = graph.parentWays(vertex),
+        coincident = [],
+        highways = {};
+
+    function addHighway(way, adjacentNodeId) {
+        if (highways[adjacentNodeId]) {
+            coincident.push(adjacentNodeId);
+        } else {
+            highways[adjacentNodeId] = way;
+        }
+    }
 
     // Pre-split ways that would need to be split in
     // order to add a restriction. The real split will
     // happen when the restriction is added.
 
     // Pre-split ways that would need to be split in
     // order to add a restriction. The real split will
     // happen when the restriction is added.
-    graph.parentWays(vertex).forEach(function(way) {
+    parentWays.forEach(function(way) {
         if (!way.tags.highway || way.isArea() || way.isDegenerate())
             return;
 
         if (!way.tags.highway || way.isArea() || way.isDegenerate())
             return;
 
-        if (way.affix(vertexId)) {
-            highways.push(way);
-        } else {
-            var idx = _.indexOf(way.nodes, vertex.id, 1),
-                wayA = iD.Way({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, idx + 1)}),
-                wayB = iD.Way({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(idx)});
+        var isFirst = (vertexId === way.first()),
+            isLast = (vertexId === way.last()),
+            isAffix = (isFirst || isLast),
+            isClosingNode = (isFirst && isLast);
 
 
-            graph = graph.replace(wayA);
-            graph = graph.replace(wayB);
+        if (isAffix && !isClosingNode) {
+            var index = (isFirst ? 1 : way.nodes.length - 2);
+            addHighway(way, way.nodes[index]);
 
 
-            highways.push(wayA);
-            highways.push(wayB);
+        } else {
+            var splitIndex, wayA, wayB, indexA, indexB;
+            if (isClosingNode) {
+                splitIndex = Math.ceil(way.nodes.length / 2);  // split at midpoint
+                wayA = iD.Way({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex)});
+                wayB = iD.Way({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)});
+                indexA = 1;
+                indexB = way.nodes.length - 2;
+            } else {
+                splitIndex = _.indexOf(way.nodes, vertex.id, 1);  // split at vertexid
+                wayA = iD.Way({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex + 1)});
+                wayB = iD.Way({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)});
+                indexA = splitIndex - 1;
+                indexB = splitIndex + 1;
+            }
+            graph = graph.replace(wayA).replace(wayB);
+            addHighway(wayA, way.nodes[indexA]);
+            addHighway(wayB, way.nodes[indexB]);
         }
     });
 
         }
     });
 
+    // remove any ways from this intersection that are coincident
+    // (i.e. any adjacent node used by more than one intersecting way)
+    coincident.forEach(function (n) {
+        delete highways[n];
+    });
+
+
     var intersection = {
         highways: highways,
     var intersection = {
         highways: highways,
+        ways: _.values(highways),
         graph: graph
     };
 
         graph: graph
     };
 
-    intersection.turns = function(fromNodeID) {
-        if (!fromNodeID)
+    intersection.adjacentNodeId = function(fromWayId) {
+        return _.find(_.keys(highways), function(k) {
+            return highways[k].id === fromWayId;
+        });
+    };
+
+    intersection.turns = function(fromNodeId) {
+        var start = highways[fromNodeId];
+        if (!start)
             return [];
 
             return [];
 
-        var way = _.find(highways, function(way) { return way.contains(fromNodeID); });
-        if (way.first() === vertex.id && way.tags.oneway === 'yes')
+        if (start.first() === vertex.id && start.tags.oneway === 'yes')
             return [];
             return [];
-        if (way.last() === vertex.id && way.tags.oneway === '-1')
+        if (start.last() === vertex.id && start.tags.oneway === '-1')
             return [];
 
         function withRestriction(turn) {
             return [];
 
         function withRestriction(turn) {
@@ -20301,39 +20346,44 @@ iD.geo.Intersection = function(graph, vertexId) {
         }
 
         var from = {
         }
 
         var from = {
-                node: way.nodes[way.first() === vertex.id ? 1 : way.nodes.length - 2],
-                way: way.id.split(/-(a|b)/)[0]
+                node: fromNodeId,
+                way: start.id.split(/-(a|b)/)[0]
             },
             },
-            via = {node: vertex.id},
+            via = { node: vertex.id },
             turns = [];
 
             turns = [];
 
-        highways.forEach(function(parent) {
-            if (parent === way)
+        _.each(highways, function(end, adjacentNodeId) {
+            if (end === start)
                 return;
 
                 return;
 
-            var index = parent.nodes.indexOf(vertex.id);
-
             // backward
             // backward
-            if (parent.first() !== vertex.id && parent.tags.oneway !== 'yes') {
+            if (end.first() !== vertex.id && end.tags.oneway !== 'yes') {
                 turns.push(withRestriction({
                     from: from,
                     via: via,
                 turns.push(withRestriction({
                     from: from,
                     via: via,
-                    to: {node: parent.nodes[index - 1], way: parent.id.split(/-(a|b)/)[0]}
+                    to: {
+                        node: adjacentNodeId,
+                        way: end.id.split(/-(a|b)/)[0]
+                    }
                 }));
             }
 
             // forward
                 }));
             }
 
             // forward
-            if (parent.last() !== vertex.id && parent.tags.oneway !== '-1') {
+            if (end.last() !== vertex.id && end.tags.oneway !== '-1') {
                 turns.push(withRestriction({
                     from: from,
                     via: via,
                 turns.push(withRestriction({
                     from: from,
                     via: via,
-                    to: {node: parent.nodes[index + 1], way: parent.id.split(/-(a|b)/)[0]}
+                    to: {
+                        node: adjacentNodeId,
+                        way: end.id.split(/-(a|b)/)[0]
+                    }
                 }));
             }
                 }));
             }
+
         });
 
         // U-turn
         });
 
         // U-turn
-        if (way.tags.oneway !== 'yes' && way.tags.oneway !== '-1') {
+        if (start.tags.oneway !== 'yes' && start.tags.oneway !== '-1') {
             turns.push(withRestriction({
                 from: from,
                 via: via,
             turns.push(withRestriction({
                 from: from,
                 via: via,
@@ -20461,7 +20511,7 @@ iD.geo.joinWays = function(array, graph) {
     }
 
     function reverse(member) {
     }
 
     function reverse(member) {
-        return member.tags ? iD.actions.Reverse(member.id)(graph).entity(member.id) : member;
+        return member.tags ? iD.actions.Reverse(member.id, {reverseOneway: true})(graph).entity(member.id) : member;
     }
 
     while (array.length) {
     }
 
     while (array.length) {
@@ -21251,7 +21301,9 @@ iD.actions.Join = function(ids) {
             return 'not_adjacent';
 
         var nodeIds = _.pluck(joined[0].nodes, 'id').slice(1, -1),
             return 'not_adjacent';
 
         var nodeIds = _.pluck(joined[0].nodes, 'id').slice(1, -1),
-            relation;
+            relation,
+            tags = {},
+            conflicting = false;
 
         joined[0].forEach(function(way) {
             var parents = graph.parentRelations(way);
 
         joined[0].forEach(function(way) {
             var parents = graph.parentRelations(way);
@@ -21259,10 +21311,21 @@ iD.actions.Join = function(ids) {
                 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
                     relation = parent;
             });
                 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
                     relation = parent;
             });
+
+            for (var k in way.tags) {
+                if (!(k in tags)) {
+                    tags[k] = way.tags[k];
+                } else if (tags[k] && iD.interestingTag(k) && tags[k] !== way.tags[k]) {
+                    conflicting = true;
+                }
+            }
         });
 
         if (relation)
             return 'restriction';
         });
 
         if (relation)
             return 'restriction';
+
+        if (conflicting)
+            return 'conflicting_tags';
     };
 
     return action;
     };
 
     return action;
@@ -22167,6 +22230,10 @@ iD.actions.RestrictTurn = function(turn, projection, restrictionId) {
             via  = graph.entity(turn.via.node),
             to   = graph.entity(turn.to.way);
 
             via  = graph.entity(turn.via.node),
             to   = graph.entity(turn.to.way);
 
+        function isClosingNode(way, nodeId) {
+            return nodeId === way.first() && nodeId === way.last();
+        }
+
         function split(toOrFrom) {
             var newID = toOrFrom.newID || iD.Way().id;
             graph = iD.actions.Split(via.id, [newID])
         function split(toOrFrom) {
             var newID = toOrFrom.newID || iD.Way().id;
             graph = iD.actions.Split(via.id, [newID])
@@ -22182,12 +22249,12 @@ iD.actions.RestrictTurn = function(turn, projection, restrictionId) {
             }
         }
 
             }
         }
 
-        if (!from.affix(via.id)) {
+        if (!from.affix(via.id) || isClosingNode(from, via.id)) {
             if (turn.from.node === turn.to.node) {
                 // U-turn
                 from = to = split(turn.from)[0];
             } else if (turn.from.way === turn.to.way) {
             if (turn.from.node === turn.to.node) {
                 // U-turn
                 from = to = split(turn.from)[0];
             } else if (turn.from.way === turn.to.way) {
-                // Straight-on
+                // Straight-on or circular
                 var s = split(turn.from);
                 from = s[0];
                 to   = s[1];
                 var s = split(turn.from);
                 from = s[0];
                 to   = s[1];
@@ -22197,7 +22264,7 @@ iD.actions.RestrictTurn = function(turn, projection, restrictionId) {
             }
         }
 
             }
         }
 
-        if (!to.affix(via.id)) {
+        if (!to.affix(via.id) || isClosingNode(to, via.id)) {
             to = split(turn.to)[0];
         }
 
             to = split(turn.to)[0];
         }
 
@@ -22252,7 +22319,7 @@ iD.actions.RestrictTurn = function(turn, projection, restrictionId) {
       http://wiki.openstreetmap.org/wiki/Route#Members
       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
  */
       http://wiki.openstreetmap.org/wiki/Route#Members
       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
  */
-iD.actions.Reverse = function(wayId) {
+iD.actions.Reverse = function(wayId, options) {
     var replacements = [
             [/:right$/, ':left'], [/:left$/, ':right'],
             [/:forward$/, ':backward'], [/:backward$/, ':forward']
     var replacements = [
             [/:right$/, ':left'], [/:left$/, ':right'],
             [/:forward$/, ':backward'], [/:backward$/, ':forward']
@@ -22282,6 +22349,8 @@ iD.actions.Reverse = function(wayId) {
             return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
         } else if (key === 'incline' || key === 'direction') {
             return {up: 'down', down: 'up'}[value] || value;
             return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
         } else if (key === 'incline' || key === 'direction') {
             return {up: 'down', down: 'up'}[value] || value;
+        } else if (options && options.reverseOneway && key === 'oneway') {
+            return {yes: '-1', '1': '-1', '-1': 'yes'}[value] || value;
         } else {
             return {left: 'right', right: 'left'}[value] || value;
         }
         } else {
             return {left: 'right', right: 'left'}[value] || value;
         }
@@ -22971,7 +23040,7 @@ iD.behavior.drag = function() {
 };
 iD.behavior.Draw = function(context) {
     var event = d3.dispatch('move', 'click', 'clickWay',
 };
 iD.behavior.Draw = function(context) {
     var event = d3.dispatch('move', 'click', 'clickWay',
-        'clickNode', 'undo', 'cancel', 'finish'),
+            'clickNode', 'undo', 'cancel', 'finish'),
         keybinding = d3.keybinding('draw'),
         hover = iD.behavior.Hover(context)
             .altDisables(true)
         keybinding = d3.keybinding('draw'),
         hover = iD.behavior.Hover(context)
             .altDisables(true)
@@ -22989,7 +23058,7 @@ iD.behavior.Draw = function(context) {
     function mousedown() {
 
         function point() {
     function mousedown() {
 
         function point() {
-            var p = element.node().parentNode;
+            var p = context.container().node();
             return touchId !== null ? d3.touches(p).filter(function(p) {
                 return p.identifier === touchId;
             })[0] : d3.mouse(p);
             return touchId !== null ? d3.touches(p).filter(function(p) {
                 return p.identifier === touchId;
             })[0] : d3.mouse(p);
@@ -22997,17 +23066,20 @@ iD.behavior.Draw = function(context) {
 
         var element = d3.select(this),
             touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null,
 
         var element = d3.select(this),
             touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null,
-            time = +new Date(),
-            pos = point();
+            t1 = +new Date(),
+            p1 = point();
 
         element.on('mousemove.draw', null);
 
         d3.select(window).on('mouseup.draw', function() {
 
         element.on('mousemove.draw', null);
 
         d3.select(window).on('mouseup.draw', function() {
+            var t2 = +new Date(),
+                p2 = point(),
+                dist = iD.geo.euclideanDistance(p1, p2);
+
             element.on('mousemove.draw', mousemove);
             element.on('mousemove.draw', mousemove);
-            if (iD.geo.euclideanDistance(pos, point()) < closeTolerance ||
-                (iD.geo.euclideanDistance(pos, point()) < tolerance &&
-                (+new Date() - time) < 500)) {
+            d3.select(window).on('mouseup.draw', null);
 
 
+            if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
                 // Prevent a quick second click
                 d3.select(window).on('click.draw-block', function() {
                     d3.event.stopPropagation();
                 // Prevent a quick second click
                 d3.select(window).on('click.draw-block', function() {
                     d3.event.stopPropagation();
@@ -23366,6 +23438,7 @@ iD.behavior.Hash = function(context) {
     };
 
     function update() {
     };
 
     function update() {
+        if (context.inIntro()) return;
         var s1 = formatter(context.map());
         if (s0 !== s1) location.replace(s0 = s1); // don't recenter the map!
     }
         var s1 = formatter(context.map());
         if (s0 !== s1) location.replace(s0 = s1); // don't recenter the map!
     }
@@ -24866,8 +24939,12 @@ iD.modes.Save = function(context) {
     };
 
     mode.enter = function() {
     };
 
     mode.enter = function() {
-        context.connection().authenticate(function() {
-            context.ui().sidebar.show(ui);
+        context.connection().authenticate(function(err) {
+            if (err) {
+                cancel();
+            } else {
+                context.ui().sidebar.show(ui);
+            }
         });
     };
 
         });
     };
 
@@ -26370,13 +26447,7 @@ iD.Entity.prototype = {
     },
 
     hasInterestingTags: function() {
     },
 
     hasInterestingTags: function() {
-        return _.keys(this.tags).some(function(key) {
-            return key !== 'attribution' &&
-                key !== 'created_by' &&
-                key !== 'source' &&
-                key !== 'odbl' &&
-                key.indexOf('tiger:') !== 0;
-        });
+        return _.keys(this.tags).some(iD.interestingTag);
     },
 
     isHighwayIntersection: function() {
     },
 
     isHighwayIntersection: function() {
@@ -27149,37 +27220,6 @@ _.extend(iD.Node.prototype, {
         };
     }
 });
         };
     }
 });
-iD.oneWayTags = {
-    'aerialway': {
-        'chair_lift': true,
-        'mixed_lift': true,
-        't-bar': true,
-        'j-bar': true,
-        'platter': true,
-        'rope_tow': true,
-        'magic_carpet': true,
-        'yes': true
-    },
-    'highway': {
-        'motorway': true,
-        'motorway_link': true
-    },
-    'junction': {
-        'roundabout': true
-    },
-    'man_made': {
-        'piste:halfpipe': true
-    },
-    'piste:type': {
-        'downhill': true,
-        'sled': true,
-        'yes': true
-    },
-    'waterway': {
-        'river': true,
-        'stream': true
-    }
-};
 iD.Relation = iD.Entity.relation = function iD_Relation() {
     if (!(this instanceof iD_Relation)) {
         return (new iD_Relation()).initialize(arguments);
 iD.Relation = iD.Entity.relation = function iD_Relation() {
     if (!(this instanceof iD_Relation)) {
         return (new iD_Relation()).initialize(arguments);
@@ -27460,6 +27500,57 @@ _.extend(iD.Relation.prototype, {
         return result;
     }
 });
         return result;
     }
 });
+iD.oneWayTags = {
+    'aerialway': {
+        'chair_lift': true,
+        'mixed_lift': true,
+        't-bar': true,
+        'j-bar': true,
+        'platter': true,
+        'rope_tow': true,
+        'magic_carpet': true,
+        'yes': true
+    },
+    'highway': {
+        'motorway': true,
+        'motorway_link': true
+    },
+    'junction': {
+        'roundabout': true
+    },
+    'man_made': {
+        'piste:halfpipe': true
+    },
+    'piste:type': {
+        'downhill': true,
+        'sled': true,
+        'yes': true
+    },
+    'waterway': {
+        'river': true,
+        'stream': true
+    }
+};
+
+iD.pavedTags = {
+    'surface': {
+        'paved': true,
+        'asphalt': true,
+        'concrete': true
+    },
+    'tracktype': {
+        'grade1': true
+    }
+};
+
+iD.interestingTag = function (key) {
+    return key !== 'attribution' &&
+        key !== 'created_by' &&
+        key !== 'source' &&
+        key !== 'odbl' &&
+        key.indexOf('tiger:') !== 0;
+
+};
 iD.Tree = function(head) {
     var rtree = rbush(),
         rectangles = {};
 iD.Tree = function(head) {
     var rtree = rbush(),
         rectangles = {};
@@ -28057,6 +28148,18 @@ iD.Background = function(context) {
     };
 
     background.load = function(imagery) {
     };
 
     background.load = function(imagery) {
+        function parseMap(qmap) {
+            if (!qmap) return false;
+            var args = qmap.split('/').map(Number);
+            if (args.length < 3 || args.some(isNaN)) return false;
+            return iD.geo.Extent([args[1], args[2]]);
+        }
+
+        var q = iD.util.stringQs(location.hash.substring(1)),
+            chosen = q.background || q.layer,
+            extent = parseMap(q.map),
+            best;
+
         backgroundSources = imagery.map(function(source) {
             if (source.type === 'bing') {
                 return iD.BackgroundSource.Bing(source, dispatch);
         backgroundSources = imagery.map(function(source) {
             if (source.type === 'bing') {
                 return iD.BackgroundSource.Bing(source, dispatch);
@@ -28067,13 +28170,14 @@ iD.Background = function(context) {
 
         backgroundSources.unshift(iD.BackgroundSource.None());
 
 
         backgroundSources.unshift(iD.BackgroundSource.None());
 
-        var q = iD.util.stringQs(location.hash.substring(1)),
-            chosen = q.background || q.layer;
+        if (!chosen && extent) {
+            best = this.sources(extent).find(function(s) { return s.best(); });
+        }
 
         if (chosen && chosen.indexOf('custom:') === 0) {
             background.baseLayerSource(iD.BackgroundSource.Custom(chosen.replace(/^custom:/, '')));
         } else {
 
         if (chosen && chosen.indexOf('custom:') === 0) {
             background.baseLayerSource(iD.BackgroundSource.Custom(chosen.replace(/^custom:/, '')));
         } else {
-            background.baseLayerSource(findSource(chosen) || findSource('Bing') || backgroundSources[1]);
+            background.baseLayerSource(findSource(chosen) || best || findSource('Bing') || backgroundSources[1]);
         }
 
         var locator = _.find(backgroundSources, function(d) {
         }
 
         var locator = _.find(backgroundSources, function(d) {
@@ -28107,7 +28211,8 @@ iD.Background = function(context) {
 iD.BackgroundSource = function(data) {
     var source = _.clone(data),
         offset = [0, 0],
 iD.BackgroundSource = function(data) {
     var source = _.clone(data),
         offset = [0, 0],
-        name = source.name;
+        name = source.name,
+        best = !!source.best;
 
     source.scaleExtent = data.scaleExtent || [0, 20];
     source.overzoom = data.overzoom !== false;
 
     source.scaleExtent = data.scaleExtent || [0, 20];
     source.overzoom = data.overzoom !== false;
@@ -28128,6 +28233,10 @@ iD.BackgroundSource = function(data) {
         return name;
     };
 
         return name;
     };
 
+    source.best = function() {
+        return best;
+    };
+
     source.imageryUsed = function() {
         return source.id || name;
     };
     source.imageryUsed = function() {
         return source.id || name;
     };
@@ -28777,7 +28886,6 @@ iD.Map = function(context) {
     var dimensions = [1, 1],
         dispatch = d3.dispatch('move', 'drawn'),
         projection = context.projection,
     var dimensions = [1, 1],
         dispatch = d3.dispatch('move', 'drawn'),
         projection = context.projection,
-        roundedProjection = iD.svg.RoundProjection(projection),
         zoom = d3.behavior.zoom()
             .translate(projection.translate())
             .scale(projection.scale() * 2 * Math.PI)
         zoom = d3.behavior.zoom()
             .translate(projection.translate())
             .scale(projection.scale() * 2 * Math.PI)
@@ -28787,11 +28895,11 @@ iD.Map = function(context) {
         transformStart,
         transformed = false,
         minzoom = 0,
         transformStart,
         transformed = false,
         minzoom = 0,
-        points = iD.svg.Points(roundedProjection, context),
-        vertices = iD.svg.Vertices(roundedProjection, context),
+        points = iD.svg.Points(projection, context),
+        vertices = iD.svg.Vertices(projection, context),
         lines = iD.svg.Lines(projection),
         areas = iD.svg.Areas(projection),
         lines = iD.svg.Lines(projection),
         areas = iD.svg.Areas(projection),
-        midpoints = iD.svg.Midpoints(roundedProjection, context),
+        midpoints = iD.svg.Midpoints(projection, context),
         labels = iD.svg.Labels(projection, context),
         supersurface, surface,
         mouse,
         labels = iD.svg.Labels(projection, context),
         supersurface, surface,
         mouse,
@@ -28944,8 +29052,8 @@ iD.Map = function(context) {
             .scale(d3.event.scale / (2 * Math.PI));
 
         var scale = d3.event.scale / transformStart[0],
             .scale(d3.event.scale / (2 * Math.PI));
 
         var scale = d3.event.scale / transformStart[0],
-            tX = Math.round((d3.event.translate[0] / scale - transformStart[1][0]) * scale),
-            tY = Math.round((d3.event.translate[1] / scale - transformStart[1][1]) * scale);
+            tX = (d3.event.translate[0] / scale - transformStart[1][0]) * scale,
+            tY = (d3.event.translate[1] / scale - transformStart[1][1]) * scale;
 
         transformed = true;
         iD.util.setTransform(supersurface, tX, tY, scale);
 
         transformed = true;
         iD.util.setTransform(supersurface, tX, tY, scale);
@@ -28962,7 +29070,6 @@ iD.Map = function(context) {
     }
 
     function redraw(difference, extent) {
     }
 
     function redraw(difference, extent) {
-
         if (!surface) return;
 
         clearTimeout(timeoutId);
         if (!surface) return;
 
         clearTimeout(timeoutId);
@@ -29314,18 +29421,16 @@ iD.MapillaryLayer = function (context) {
         enter.append('button')
             .on('click', hide)
             .append('div')
         enter.append('button')
             .on('click', hide)
             .append('div')
-            .attr('class', 'icon close');
+            .call(iD.svg.Icon('#icon-close'));
 
         enter.append('img');
 
 
         enter.append('img');
 
-        var link = enter.append('a')
+        enter
+            .append('a')
             .attr('class', 'link')
             .attr('class', 'link')
-            .attr('target', '_blank');
-
-        link.append('span')
-            .attr('class', 'icon icon-pre-text out-link');
-
-        link.append('span')
+            .attr('target', '_blank')
+            .call(iD.svg.Icon('#icon-out-link', 'inline'))
+            .append('span')
             .text(t('mapillary.view_on_mapillary'));
 
         if (!enable) {
             .text(t('mapillary.view_on_mapillary'));
 
         if (!enable) {
@@ -29414,7 +29519,7 @@ iD.TileLayer = function() {
         source = d3.functor('');
 
     function tileSizeAtZoom(d, z) {
         source = d3.functor('');
 
     function tileSizeAtZoom(d, z) {
-        return Math.ceil(tileSize * Math.pow(2, z - d[2])) / tileSize;
+        return (tileSize * Math.pow(2, z - d[2])) / tileSize;
     }
 
     function atZoom(t, distance) {
     }
 
     function atZoom(t, distance) {
@@ -29488,8 +29593,8 @@ iD.TileLayer = function() {
         }
 
         var pixelOffset = [
         }
 
         var pixelOffset = [
-            Math.round(source.offset()[0] * Math.pow(2, z)),
-            Math.round(source.offset()[1] * Math.pow(2, z))
+            source.offset()[0] * Math.pow(2, z),
+            source.offset()[1] * Math.pow(2, z)
         ];
 
         function load(d) {
         ];
 
         function load(d) {
@@ -29514,8 +29619,8 @@ iD.TileLayer = function() {
             var _ts = tileSize * Math.pow(2, z - d[2]);
             var scale = tileSizeAtZoom(d, z);
             return 'translate(' +
             var _ts = tileSize * Math.pow(2, z - d[2]);
             var scale = tileSizeAtZoom(d, z);
             return 'translate(' +
-                (Math.round((d[0] * _ts) - tileOrigin[0]) + pixelOffset[0]) + 'px,' +
-                (Math.round((d[1] * _ts) - tileOrigin[1]) + pixelOffset[1]) + 'px)' +
+                ((d[0] * _ts) - tileOrigin[0] + pixelOffset[0]) + 'px,' +
+                ((d[1] * _ts) - tileOrigin[1] + pixelOffset[1]) + 'px)' +
                 'scale(' + scale + ',' + scale + ')';
         }
 
                 'scale(' + scale + ',' + scale + ')';
         }
 
@@ -29569,12 +29674,6 @@ iD.TileLayer = function() {
     return background;
 };
 iD.svg = {
     return background;
 };
 iD.svg = {
-    RoundProjection: function(projection) {
-        return function(d) {
-            return iD.geo.roundCoords(projection(d));
-        };
-    },
-
     PointTransform: function(projection) {
         return function(entity) {
             // http://jsperf.com/short-array-join
     PointTransform: function(projection) {
         return function(entity) {
             // http://jsperf.com/short-array-join
@@ -29583,19 +29682,12 @@ iD.svg = {
         };
     },
 
         };
     },
 
-    Round: function () {
-        return d3.geo.transform({
-            point: function(x, y) { return this.stream.point(Math.floor(x), Math.floor(y)); }
-        });
-    },
-
     Path: function(projection, graph, polygon) {
         var cache = {},
     Path: function(projection, graph, polygon) {
         var cache = {},
-            round = iD.svg.Round().stream,
             clip = d3.geo.clipExtent().extent(projection.clipExtent()).stream,
             project = projection.stream,
             path = d3.geo.path()
             clip = d3.geo.clipExtent().extent(projection.clipExtent()).stream,
             project = projection.stream,
             path = d3.geo.path()
-                .projection({stream: function(output) { return polygon ? project(round(output)) : project(clip(round(output))); }});
+                .projection({stream: function(output) { return polygon ? project(output) : project(clip(output)); }});
 
         return function(entity) {
             if (entity.id in cache) {
 
         return function(entity) {
             if (entity.id in cache) {
@@ -29815,36 +29907,22 @@ iD.svg.Areas = function(projection) {
     used once globally, since defs IDs must be unique within a document.
 */
 iD.svg.Defs = function(context) {
     used once globally, since defs IDs must be unique within a document.
 */
 iD.svg.Defs = function(context) {
-    function autosize(image) {
-        var img = document.createElement('img');
-        img.src = image.attr('xlink:href');
-        img.onload = function() {
-            image.attr({
-                width: img.width,
-                height: img.height
-            });
-        };
-    }
 
 
-    function SpriteDefinition(id, href, data) {
+    function SVGSpriteDefinition(id, href) {
         return function(defs) {
         return function(defs) {
-            defs.append('image')
-                .attr('id', id)
-                .attr('xlink:href', href)
-                .call(autosize);
-
-            defs.selectAll()
-                .data(data)
-                .enter().append('use')
-                .attr('id', function(d) { return d.key; })
-                .attr('transform', function(d) { return 'translate(-' + d.value[0] + ',-' + d.value[1] + ')'; })
-                .attr('xlink:href', '#' + id);
+            d3.xml(href, 'image/svg+xml', function(err, svg) {
+                if (err) return;
+                defs.node().appendChild(
+                    d3.select(svg.documentElement).attr('id', id).node()
+                );
+            });
         };
     }
 
     return function (selection) {
         var defs = selection.append('defs');
 
         };
     }
 
     return function (selection) {
         var defs = selection.append('defs');
 
+        // marker
         defs.append('marker')
             .attr({
                 id: 'oneway-marker',
         defs.append('marker')
             .attr({
                 id: 'oneway-marker',
@@ -29853,11 +29931,17 @@ iD.svg.Defs = function(context) {
                 refX: 5,
                 markerWidth: 2,
                 markerHeight: 2,
                 refX: 5,
                 markerWidth: 2,
                 markerHeight: 2,
+                markerUnits: 'strokeWidth',
                 orient: 'auto'
             })
             .append('path')
                 orient: 'auto'
             })
             .append('path')
-            .attr('d', 'M 5 3 L 0 3 L 0 2 L 5 2 L 5 0 L 10 2.5 L 5 5 z');
+            .attr('class', 'oneway')
+            .attr('d', 'M 5 3 L 0 3 L 0 2 L 5 2 L 5 0 L 10 2.5 L 5 5 z')
+            .attr('stroke', 'none')
+            .attr('fill', '#000')
+            .attr('opacity', '0.5');
 
 
+        // patterns
         var patterns = defs.selectAll('pattern')
             .data([
                 // pattern name, pattern image name
         var patterns = defs.selectAll('pattern')
             .data([
                 // pattern name, pattern image name
@@ -29903,6 +29987,7 @@ iD.svg.Defs = function(context) {
                 return context.imagePath('pattern/' + d[1] + '.png');
             });
 
                 return context.imagePath('pattern/' + d[1] + '.png');
             });
 
+        // clip paths
         defs.selectAll()
             .data([12, 18, 20, 32, 45])
             .enter().append('clipPath')
         defs.selectAll()
             .data([12, 18, 20, 32, 45])
             .enter().append('clipPath')
@@ -29919,24 +30004,25 @@ iD.svg.Defs = function(context) {
                 return d;
             });
 
                 return d;
             });
 
-        var maki = [];
-        _.forEach(iD.data.featureIcons, function (dimensions, name) {
-            if (dimensions['12'] && dimensions['18'] && dimensions['24']) {
-                maki.push({key: 'maki-' + name + '-12', value: dimensions['12']});
-                maki.push({key: 'maki-' + name + '-18', value: dimensions['18']});
-                maki.push({key: 'maki-' + name + '-24', value: dimensions['24']});
-            }
-        });
+        defs.call(SVGSpriteDefinition(
+            'iD-sprite',
+            context.imagePath('iD-sprite.svg')));
 
 
-        defs.call(SpriteDefinition(
-            'sprite',
-            context.imagePath('sprite.svg'),
-            d3.entries(iD.data.operations)));
-
-        defs.call(SpriteDefinition(
+        defs.call(SVGSpriteDefinition(
             'maki-sprite',
             'maki-sprite',
-            context.imagePath('maki-sprite.png'),
-            maki));
+            context.imagePath('maki-sprite.svg')));
+    };
+};
+iD.svg.Icon = function(name, svgklass, useklass) {
+    return function (selection) {
+        selection.selectAll('svg')
+            .data([0])
+            .enter()
+            .append('svg')
+            .attr('class', 'icon ' + (svgklass || ''))
+            .append('use')
+            .attr('xlink:href', name)
+            .attr('class', useklass);
     };
 };
 iD.svg.Labels = function(projection, context) {
     };
 };
 iD.svg.Labels = function(projection, context) {
@@ -30102,19 +30188,20 @@ iD.svg.Labels = function(projection, context) {
     }
 
     function drawAreaIcons(group, entities, filter, classes, labels) {
     }
 
     function drawAreaIcons(group, entities, filter, classes, labels) {
-
         var icons = group.selectAll('use')
             .filter(filter)
             .data(entities, iD.Entity.key);
 
         icons.enter()
             .append('use')
         var icons = group.selectAll('use')
             .filter(filter)
             .data(entities, iD.Entity.key);
 
         icons.enter()
             .append('use')
-            .attr('clip-path', 'url(#clip-square-18)')
-            .attr('class', 'icon');
+            .attr('class', 'icon areaicon')
+            .attr('width', '18px')
+            .attr('height', '18px');
 
         icons.attr('transform', get(labels, 'transform'))
             .attr('xlink:href', function(d) {
 
         icons.attr('transform', get(labels, 'transform'))
             .attr('xlink:href', function(d) {
-                return '#maki-' + context.presets().match(d, context.graph()).icon + '-18';
+                var icon = context.presets().match(d, context.graph()).icon;
+                return '#' + icon + (icon === 'hairdresser' ? '-24': '-18');    // workaround: maki hairdresser-18 broken?
             });
 
 
             });
 
 
@@ -30499,6 +30586,10 @@ iD.svg.Lines = function(projection) {
         oneways
             .attr('d', function(d) { return d.d; });
 
         oneways
             .attr('d', function(d) { return d.d; });
 
+        if (iD.detect().ie) {
+            oneways.each(function() { this.parentNode.insertBefore(this, this); });
+        }
+
         oneways.exit()
             .remove();
 
         oneways.exit()
             .remove();
 
@@ -30646,9 +30737,10 @@ iD.svg.Points = function(projection, context) {
             .call(markerPath, 'stroke');
 
         group.append('use')
             .call(markerPath, 'stroke');
 
         group.append('use')
-            .attr('class', 'icon')
             .attr('transform', 'translate(-6, -20)')
             .attr('transform', 'translate(-6, -20)')
-            .attr('clip-path', 'url(#clip-square-12)');
+            .attr('class', 'icon')
+            .attr('width', '12px')
+            .attr('height', '12px');
 
         groups.attr('transform', iD.svg.PointTransform(projection))
             .call(iD.svg.TagClasses());
 
         groups.attr('transform', iD.svg.PointTransform(projection))
             .call(iD.svg.TagClasses());
@@ -30660,7 +30752,7 @@ iD.svg.Points = function(projection, context) {
         groups.select('.icon')
             .attr('xlink:href', function(entity) {
                 var preset = context.presets().match(entity, context.graph());
         groups.select('.icon')
             .attr('xlink:href', function(entity) {
                 var preset = context.presets().match(entity, context.graph());
-                return preset.icon ? '#maki-' + preset.icon + '-12' : '';
+                return preset.icon ? '#' + preset.icon + '-12' : '';
             });
 
         groups.exit()
             });
 
         groups.exit()
@@ -30692,7 +30784,8 @@ iD.svg.TagClasses = function() {
             'razed', 'demolished', 'obliterated'
         ],
         secondaries = [
             'razed', 'demolished', 'obliterated'
         ],
         secondaries = [
-            'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier'
+            'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
+            'surface', 'tracktype'
         ],
         tagClassRe = /^tag-/,
         tags = function(entity) { return entity.tags; };
         ],
         tagClassRe = /^tag-/,
         tags = function(entity) { return entity.tags; };
@@ -30728,7 +30821,7 @@ iD.svg.TagClasses = function() {
                 break;
             }
 
                 break;
             }
 
-            // add at most one ephemeral status tag, only if relates to primary tag..
+            // add at most one status tag, only if relates to primary tag..
             if (!status) {
                 for (i = 0; i < statuses.length; i++) {
                     k = statuses[i];
             if (!status) {
                 for (i = 0; i < statuses.length; i++) {
                     k = statuses[i];
@@ -30751,7 +30844,7 @@ iD.svg.TagClasses = function() {
             }
 
             if (status) {
             }
 
             if (status) {
-                classes += ' tag-ephemeral';
+                classes += ' tag-status tag-status-' + status;
             }
 
             // add any secondary (structure) tags
             }
 
             // add any secondary (structure) tags
@@ -30762,6 +30855,21 @@ iD.svg.TagClasses = function() {
                 classes += ' tag-' + k + ' tag-' + k + '-' + v;
             }
 
                 classes += ' tag-' + k + ' tag-' + k + '-' + v;
             }
 
+            // For highways, look for surface tagging..
+            if (primary === 'highway') {
+                var paved = (t.highway !== 'track');
+                for (k in t) {
+                    v = t[k];
+                    if (k in iD.pavedTags) {
+                        paved = !!iD.pavedTags[k][v];
+                        break;
+                    }
+                }
+                if (!paved) {
+                    classes += ' tag-unpaved';
+                }
+            }
+
             classes = classes.trim();
 
             if (classes !== value) {
             classes = classes.trim();
 
             if (classes !== value) {
@@ -30787,9 +30895,9 @@ iD.svg.Turns = function(projection) {
         function icon(turn) {
             var u = turn.u ? '-u' : '';
             if (!turn.restriction)
         function icon(turn) {
             var u = turn.u ? '-u' : '';
             if (!turn.restriction)
-                return '#icon-restriction-yes' + u;
+                return '#turn-yes' + u;
             var restriction = graph.entity(turn.restriction).tags.restriction;
             var restriction = graph.entity(turn.restriction).tags.restriction;
-            return '#icon-restriction-' +
+            return '#turn-' +
                 (!turn.indirect_restriction && /^only_/.test(restriction) ? 'only' : 'no') + u;
         }
 
                 (!turn.indirect_restriction && /^only_/.test(restriction) ? 'only' : 'no') + u;
         }
 
@@ -30797,20 +30905,21 @@ iD.svg.Turns = function(projection) {
             .data(turns, key);
 
         // Enter
             .data(turns, key);
 
         // Enter
-
         var enter = groups.enter().append('g')
             .attr('class', 'turn');
 
         var nEnter = enter.filter(function (turn) { return !turn.u; });
 
         nEnter.append('rect')
         var enter = groups.enter().append('g')
             .attr('class', 'turn');
 
         var nEnter = enter.filter(function (turn) { return !turn.u; });
 
         nEnter.append('rect')
-            .attr('transform', 'translate(-12, -12)')
-            .attr('width', '45')
-            .attr('height', '25');
+            .attr('transform', 'translate(-22, -12)')
+            .attr('width', '44')
+            .attr('height', '24');
 
         nEnter.append('use')
 
         nEnter.append('use')
-            .attr('transform', 'translate(-12, -12)')
-            .attr('clip-path', 'url(#clip-square-45)');
+            .attr('transform', 'translate(-22, -12)')
+            .attr('width', '44')
+            .attr('height', '24');
+
 
         var uEnter = enter.filter(function (turn) { return turn.u; });
 
 
         var uEnter = enter.filter(function (turn) { return turn.u; });
 
@@ -30819,10 +30928,11 @@ iD.svg.Turns = function(projection) {
 
         uEnter.append('use')
             .attr('transform', 'translate(-16, -16)')
 
         uEnter.append('use')
             .attr('transform', 'translate(-16, -16)')
-            .attr('clip-path', 'url(#clip-square-32)');
+            .attr('width', '32')
+            .attr('height', '32');
 
 
-        // Update
 
 
+        // Update
         groups
             .attr('transform', function (turn) {
                 var v = graph.entity(turn.via.node),
         groups
             .attr('transform', function (turn) {
                 var v = graph.entity(turn.via.node),
@@ -30831,7 +30941,7 @@ iD.svg.Turns = function(projection) {
                     p = projection(v.loc),
                     r = turn.u ? 0 : 60;
 
                     p = projection(v.loc),
                     r = turn.u ? 0 : 60;
 
-                return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ')' +
+                return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ') ' +
                     'rotate(' + a * 180 / Math.PI + ')';
             });
 
                     'rotate(' + a * 180 / Math.PI + ')';
             });
 
@@ -30841,8 +30951,8 @@ iD.svg.Turns = function(projection) {
         groups.select('rect');
         groups.select('circle');
 
         groups.select('rect');
         groups.select('circle');
 
-        // Exit
 
 
+        // Exit
         groups.exit()
             .remove();
 
         groups.exit()
             .remove();
 
@@ -30921,7 +31031,7 @@ iD.svg.Vertices = function(projection, context) {
             return icons[entity.id];
         }
 
             return icons[entity.id];
         }
 
-        function classCircle(klass) {
+        function setClass(klass) {
             return function(entity) {
                 this.setAttribute('class', 'node vertex ' + klass + ' ' + entity.id);
             };
             return function(entity) {
                 this.setAttribute('class', 'node vertex ' + klass + ' ' + entity.id);
             };
@@ -30961,22 +31071,24 @@ iD.svg.Vertices = function(projection, context) {
             .attr('class', function(d) { return 'node vertex ' + klass + ' ' + d.id; });
 
         enter.append('circle')
             .attr('class', function(d) { return 'node vertex ' + klass + ' ' + d.id; });
 
         enter.append('circle')
-            .each(classCircle('shadow'));
+            .each(setClass('shadow'));
 
         enter.append('circle')
 
         enter.append('circle')
-            .each(classCircle('stroke'));
+            .each(setClass('stroke'));
 
         // Vertices with icons get a `use`.
         enter.filter(function(d) { return icon(d); })
             .append('use')
             .attr('transform', 'translate(-6, -6)')
 
         // Vertices with icons get a `use`.
         enter.filter(function(d) { return icon(d); })
             .append('use')
             .attr('transform', 'translate(-6, -6)')
-            .attr('clip-path', 'url(#clip-square-12)')
-            .attr('xlink:href', function(d) { return '#maki-' + icon(d) + '-12'; });
+            .attr('xlink:href', function(d) { return '#' + icon(d) + '-12'; })
+            .attr('width', '12px')
+            .attr('height', '12px')
+            .each(setClass('icon'));
 
         // Vertices with tags get a fill.
         enter.filter(function(d) { return d.hasInterestingTags(); })
             .append('circle')
 
         // Vertices with tags get a fill.
         enter.filter(function(d) { return d.hasInterestingTags(); })
             .append('circle')
-            .each(classCircle('fill'));
+            .each(setClass('fill'));
 
         groups
             .attr('transform', iD.svg.PointTransform(projection))
 
         groups
             .attr('transform', iD.svg.PointTransform(projection))
@@ -31045,7 +31157,7 @@ iD.ui = function(context) {
         hash();
 
         if (!hash.hadHash) {
         hash();
 
         if (!hash.hadHash) {
-            map.centerZoom([-77.02271, 38.90085], 20);
+            map.centerZoom([0, 0], 2);
         }
 
         container.append('svg')
         }
 
         container.append('svg')
@@ -31162,20 +31274,28 @@ iD.ui = function(context) {
             .attr('href', 'http://github.com/openstreetmap/iD')
             .text(iD.version);
 
             .attr('href', 'http://github.com/openstreetmap/iD')
             .text(iD.version);
 
-        var bugReport = aboutList.append('li')
-            .append('a')
+        var issueLinks = aboutList.append('li');
+
+        issueLinks.append('a')
             .attr('target', '_blank')
             .attr('tabindex', -1)
             .attr('target', '_blank')
             .attr('tabindex', -1)
-            .attr('href', 'https://github.com/openstreetmap/iD/issues');
-
-        bugReport.append('span')
-            .attr('class','icon bug light');
-
-        bugReport.call(bootstrap.tooltip()
+            .attr('href', 'https://github.com/openstreetmap/iD/issues')
+            .call(iD.svg.Icon('#icon-bug', 'light'))
+            .call(bootstrap.tooltip()
                 .title(t('report_a_bug'))
                 .placement('top')
             );
 
                 .title(t('report_a_bug'))
                 .placement('top')
             );
 
+        issueLinks.append('a')
+            .attr('target', '_blank')
+            .attr('tabindex', -1)
+            .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
+            .call(iD.svg.Icon('#icon-translate', 'light'))
+            .call(bootstrap.tooltip()
+                .title(t('help_translate'))
+                .placement('top')
+            );
+
         aboutList.append('li')
             .attr('class', 'feature-warning')
             .attr('tabindex', -1)
         aboutList.append('li')
             .attr('class', 'feature-warning')
             .attr('tabindex', -1)
@@ -31299,11 +31419,11 @@ iD.ui.Account = function(context) {
             // Add thumbnail or dont
             if (details.image_url) {
                 userLink.append('img')
             // Add thumbnail or dont
             if (details.image_url) {
                 userLink.append('img')
-                    .attr('class', 'icon icon-pre-text user-icon')
+                    .attr('class', 'icon pre-text user-icon')
                     .attr('src', details.image_url);
             } else {
                     .attr('src', details.image_url);
             } else {
-                userLink.append('span')
-                    .attr('class', 'icon avatar light icon-pre-text');
+                userLink
+                    .call(iD.svg.Icon('#icon-avatar', 'pre-text light'));
             }
 
             // Add user name
             }
 
             // Add user name
@@ -31424,14 +31544,22 @@ iD.ui.Background = function(context) {
             ['right', [-1, 0]],
             ['bottom', [0, 1]]],
         opacityDefault = (context.storage('background-opacity') !== null) ?
             ['right', [-1, 0]],
             ['bottom', [0, 1]]],
         opacityDefault = (context.storage('background-opacity') !== null) ?
-            (+context.storage('background-opacity')) : 0.5,
+            (+context.storage('background-opacity')) : 1.0,
         customTemplate = context.storage('background-custom-template') || '';
 
     // Can be 0 from <1.3.0 use or due to issue #1923.
         customTemplate = context.storage('background-custom-template') || '';
 
     // Can be 0 from <1.3.0 use or due to issue #1923.
-    if (opacityDefault === 0) opacityDefault = 0.5;
+    if (opacityDefault === 0) opacityDefault = 1.0;
 
     function background(selection) {
 
 
     function background(selection) {
 
+        function sortSources(a, b) {
+            return a.best() ? -1
+                : b.best() ? 1
+                : a.id === 'none' ? 1
+                : b.id === 'none' ? -1
+                : d3.ascending(a, b);
+        }
+
         function setOpacity(d) {
             var bg = context.container().selectAll('.background-layer')
                 .transition()
         function setOpacity(d) {
             var bg = context.container().selectAll('.background-layer')
                 .transition()
@@ -31496,7 +31624,8 @@ iD.ui.Background = function(context) {
                 .filter(filter);
 
             var layerLinks = layerList.selectAll('li.layer')
                 .filter(filter);
 
             var layerLinks = layerList.selectAll('li.layer')
-                .data(sources, function(d) { return d.name(); });
+                .data(sources, function(d) { return d.name(); })
+                .sort(sortSources);
 
             var enter = layerLinks.enter()
                 .insert('li', '.custom_layer')
 
             var enter = layerLinks.enter()
                 .insert('li', '.custom_layer')
@@ -31537,7 +31666,6 @@ iD.ui.Background = function(context) {
         }
 
         function clickNudge(d) {
         }
 
         function clickNudge(d) {
-
             var timeout = window.setTimeout(function() {
                     interval = window.setInterval(nudge, 100);
                 }, 500),
             var timeout = window.setTimeout(function() {
                     interval = window.setInterval(nudge, 100);
                 }, 500),
@@ -31603,13 +31731,10 @@ iD.ui.Background = function(context) {
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', toggle)
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', toggle)
+                .call(iD.svg.Icon('#icon-layers', 'light'))
                 .call(tooltip),
             shown = false;
 
                 .call(tooltip),
             shown = false;
 
-        button.append('span')
-            .attr('class', 'icon layers light');
-
-
         var opa = content.append('div')
                 .attr('class', 'opacity-options-wrapper');
 
         var opa = content.append('div')
                 .attr('class', 'opacity-options-wrapper');
 
@@ -31647,8 +31772,7 @@ iD.ui.Background = function(context) {
                 .title(t('background.custom_button'))
                 .placement('left'))
             .on('click', editCustom)
                 .title(t('background.custom_button'))
                 .placement('left'))
             .on('click', editCustom)
-            .append('span')
-            .attr('class', 'icon geocode');
+            .call(iD.svg.Icon('#icon-search'));
 
         var label = custom.append('label');
 
 
         var label = custom.append('label');
 
@@ -31716,15 +31840,14 @@ iD.ui.Background = function(context) {
             .attr('class', function(d) { return d[0] + ' nudge'; })
             .on('mousedown', clickNudge);
 
             .attr('class', function(d) { return d[0] + ' nudge'; })
             .on('mousedown', clickNudge);
 
-        var resetButton = nudgeContainer.append('button')
+        var resetButton = nudgeContainer
+            .append('button')
             .attr('class', 'reset disabled')
             .on('click', function () {
                 context.background().offset([0, 0]);
                 resetButton.classed('disabled', true);
             .attr('class', 'reset disabled')
             .on('click', function () {
                 context.background().offset([0, 0]);
                 resetButton.classed('disabled', true);
-            });
-
-        resetButton.append('div')
-            .attr('class', 'icon undo');
+            })
+            .call(iD.svg.Icon('#icon-undo'));
 
         context.map()
             .on('move.background-update', _.debounce(update, 1000));
 
         context.map()
             .on('move.background-update', _.debounce(update, 1000));
@@ -31752,30 +31875,32 @@ iD.ui.Background = function(context) {
 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
 // For example, ⌘Z -> Ctrl+Z
 iD.ui.cmd = function(code) {
 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
 // For example, ⌘Z -> Ctrl+Z
 iD.ui.cmd = function(code) {
-    if (iD.detect().os === 'mac')
+    if (iD.detect().os === 'mac') {
         return code;
         return code;
-
-    var replacements = {
-        '⌘': 'Ctrl',
-        '⇧': 'Shift',
-        '⌥': 'Alt',
-        '⌫': 'Backspace',
-        '⌦': 'Delete'
-    }, keys = [];
+    }
 
     if (iD.detect().os === 'win') {
         if (code === '⌘⇧Z') return 'Ctrl+Y';
     }
 
 
     if (iD.detect().os === 'win') {
         if (code === '⌘⇧Z') return 'Ctrl+Y';
     }
 
+    var result = '',
+        replacements = {
+            '⌘': 'Ctrl',
+            '⇧': 'Shift',
+            '⌥': 'Alt',
+            '⌫': 'Backspace',
+            '⌦': 'Delete'
+        };
+
     for (var i = 0; i < code.length; i++) {
         if (code[i] in replacements) {
     for (var i = 0; i < code.length; i++) {
         if (code[i] in replacements) {
-            keys.push(replacements[code[i]]);
+            result += replacements[code[i]] + '+';
         } else {
         } else {
-            keys.push(code[i]);
+            result += code[i];
         }
     }
 
         }
     }
 
-    return keys.join('+');
+    return result;
 };
 iD.ui.Commit = function(context) {
     var dispatch = d3.dispatch('cancel', 'save');
 };
 iD.ui.Commit = function(context) {
     var dispatch = d3.dispatch('cancel', 'save');
@@ -31817,7 +31942,11 @@ iD.ui.Commit = function(context) {
             .attr('placeholder', t('commit.description_placeholder'))
             .attr('maxlength', 255)
             .property('value', context.storage('comment') || '')
             .attr('placeholder', t('commit.description_placeholder'))
             .attr('maxlength', 255)
             .property('value', context.storage('comment') || '')
-            .on('blur.save', function () {
+            .on('input.save', function() {
+                d3.selectAll('.save-section .save-button')
+                    .attr('disabled', (this.value.length ? null : true));
+            })
+            .on('blur.save', function() {
                 context.storage('comment', this.value);
             });
 
                 context.storage('comment', this.value);
             });
 
@@ -31847,12 +31976,13 @@ iD.ui.Commit = function(context) {
             .on('mouseout', mouseout)
             .on('click', warningClick);
 
             .on('mouseout', mouseout)
             .on('click', warningClick);
 
-        warningLi.append('span')
-            .attr('class', 'alert icon icon-pre-text');
+        warningLi
+            .call(iD.svg.Icon('#icon-alert', 'pre-text'));
 
 
-        warningLi.append('strong').text(function(d) {
-            return d.message;
-        });
+        warningLi
+            .append('strong').text(function(d) {
+                return d.message;
+            });
 
         warningLi.filter(function(d) { return d.tooltip; })
             .call(bootstrap.tooltip()
 
         warningLi.filter(function(d) { return d.tooltip; })
             .call(bootstrap.tooltip()
@@ -31877,7 +32007,7 @@ iD.ui.Commit = function(context) {
             if (user.image_url) {
                 userLink.append('img')
                     .attr('src', user.image_url)
             if (user.image_url) {
                 userLink.append('img')
                     .attr('src', user.image_url)
-                    .attr('class', 'icon icon-pre-text user-icon');
+                    .attr('class', 'icon pre-text user-icon');
             }
 
             userLink.append('a')
             }
 
             userLink.append('a')
@@ -31896,7 +32026,11 @@ iD.ui.Commit = function(context) {
             .attr('class','buttons fillL cf');
 
         var saveButton = buttonSection.append('button')
             .attr('class','buttons fillL cf');
 
         var saveButton = buttonSection.append('button')
-            .attr('class', 'action col5 button')
+            .attr('class', 'action col5 button save-button')
+            .attr('disabled', function() {
+                var n = d3.select('.commit-form textarea').node();
+                return (n && n.value.length) ? null : true;
+            })
             .on('click.save', function() {
                 dispatch.save({
                     comment: commentField.node().value
             .on('click.save', function() {
                 dispatch.save({
                     comment: commentField.node().value
@@ -31908,7 +32042,7 @@ iD.ui.Commit = function(context) {
             .text(t('commit.save'));
 
         var cancelButton = buttonSection.append('button')
             .text(t('commit.save'));
 
         var cancelButton = buttonSection.append('button')
-            .attr('class', 'action col5 button')
+            .attr('class', 'action col5 button cancel-button')
             .on('click.cancel', function() { dispatch.cancel(); });
 
         cancelButton.append('span')
             .on('click.cancel', function() { dispatch.cancel(); });
 
         cancelButton.append('span')
@@ -31936,10 +32070,10 @@ iD.ui.Commit = function(context) {
             .on('mouseout', mouseout)
             .on('click', zoomToEntity);
 
             .on('mouseout', mouseout)
             .on('click', zoomToEntity);
 
-        li.append('span')
-            .attr('class', function(d) {
-                return d.entity.geometry(d.graph) + ' ' + d.changeType + ' icon icon-pre-text';
-            });
+        li.each(function(d) {
+            d3.select(this)
+                .call(iD.svg.Icon('#icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
+        });
 
         li.append('span')
             .attr('class', 'change-type')
 
         li.append('span')
             .attr('class', 'change-type')
@@ -32039,8 +32173,7 @@ iD.ui.Conflicts = function(context) {
             .append('button')
             .attr('class', 'fr')
             .on('click', function() { dispatch.cancel(); })
             .append('button')
             .attr('class', 'fr')
             .on('click', function() { dispatch.cancel(); })
-            .append('span')
-            .attr('class', 'icon close');
+            .call(iD.svg.Icon('#icon-close'));
 
         header
             .append('h3')
 
         header
             .append('h3')
@@ -32291,8 +32424,7 @@ iD.ui.Contributors = function(context) {
             subset = u.slice(0, u.length > limit ? limit - 1 : limit);
 
         selection.html('')
             subset = u.slice(0, u.length > limit ? limit - 1 : limit);
 
         selection.html('')
-            .append('span')
-            .attr('class', 'icon nearby light icon-pre-text');
+            .call(iD.svg.Icon('#icon-nearby', 'pre-text light'));
 
         var userList = d3.select(document.createElement('span'));
 
 
         var userList = d3.select(document.createElement('span'));
 
@@ -32423,8 +32555,7 @@ iD.ui.EntityEditor = function(context) {
 
         $enter.append('button')
             .attr('class', 'fr preset-close')
 
         $enter.append('button')
             .attr('class', 'fr preset-close')
-            .append('span')
-            .attr('class', 'icon close');
+            .call(iD.svg.Icon('#icon-close'));
 
         $enter.append('h3');
 
 
         $enter.append('h3');
 
@@ -32689,8 +32820,8 @@ iD.ui.FeatureList = function(context) {
             .on('keypress', keypress)
             .on('input', inputevent);
 
             .on('keypress', keypress)
             .on('input', inputevent);
 
-        searchWrap.append('span')
-            .attr('class', 'icon search');
+        searchWrap
+            .call(iD.svg.Icon('#icon-search', 'pre-text'));
 
         var listWrap = selection.append('div')
             .attr('class', 'inspector-body');
 
         var listWrap = selection.append('div')
             .attr('class', 'inspector-body');
@@ -32797,10 +32928,8 @@ iD.ui.FeatureList = function(context) {
                 .data([0])
                 .enter().append('button')
                 .property('disabled', true)
                 .data([0])
                 .enter().append('button')
                 .property('disabled', true)
-                .attr('class', 'no-results-item');
-
-            resultsIndicator.append('span')
-                .attr('class', 'icon alert');
+                .attr('class', 'no-results-item')
+                .call(iD.svg.Icon('#icon-alert', 'pre-text'));
 
             resultsIndicator.append('span')
                 .attr('class', 'entity-name');
 
             resultsIndicator.append('span')
                 .attr('class', 'entity-name');
@@ -32832,17 +32961,21 @@ iD.ui.FeatureList = function(context) {
             var items = list.selectAll('.feature-list-item')
                 .data(results, function(d) { return d.id; });
 
             var items = list.selectAll('.feature-list-item')
                 .data(results, function(d) { return d.id; });
 
-            var enter = items.enter().insert('button', '.geocode-item')
+            var enter = items.enter()
+                .insert('button', '.geocode-item')
                 .attr('class', 'feature-list-item')
                 .on('mouseover', mouseover)
                 .on('mouseout', mouseout)
                 .on('click', click);
 
                 .attr('class', 'feature-list-item')
                 .on('mouseover', mouseover)
                 .on('mouseout', mouseout)
                 .on('click', click);
 
-            var label = enter.append('div')
+            var label = enter
+                .append('div')
                 .attr('class', 'label');
 
                 .attr('class', 'label');
 
-            label.append('span')
-                .attr('class', function(d) { return d.geometry + ' icon icon-pre-text'; });
+            label.each(function(d) {
+                d3.select(this)
+                    .call(iD.svg.Icon('#icon-' + d.geometry, 'pre-text'));
+            });
 
             label.append('span')
                 .attr('class', 'entity-type')
 
             label.append('span')
                 .attr('class', 'entity-type')
@@ -32982,7 +33115,7 @@ iD.ui.FullScreen = function(context) {
         //     .attr('class', 'icon full-screen');
 
         keybinding
         //     .attr('class', 'icon full-screen');
 
         keybinding
-            .on(iD.ui.cmd('f11'), fullScreen)
+            .on('f11', fullScreen)
             .on(iD.ui.cmd('⌘⇧F'), fullScreen);
 
         d3.select(document)
             .on(iD.ui.cmd('⌘⇧F'), fullScreen);
 
         d3.select(document)
@@ -33007,15 +33140,13 @@ iD.ui.Geolocate = function(map) {
     return function(selection) {
         if (!navigator.geolocation) return;
 
     return function(selection) {
         if (!navigator.geolocation) return;
 
-        var button = selection.append('button')
+        selection.append('button')
             .attr('tabindex', -1)
             .attr('title', t('geolocate.title'))
             .on('click', click)
             .attr('tabindex', -1)
             .attr('title', t('geolocate.title'))
             .on('click', click)
+            .call(iD.svg.Icon('#icon-geolocate', 'light'))
             .call(bootstrap.tooltip()
                 .placement('left'));
             .call(bootstrap.tooltip()
                 .placement('left'));
-
-         button.append('span')
-             .attr('class', 'icon geolocate light');
     };
 };
 iD.ui.Help = function(context) {
     };
 };
 iD.ui.Help = function(context) {
@@ -33097,8 +33228,7 @@ iD.ui.Help = function(context) {
                     .on('click', function() {
                         clickHelp(docs[i - 1], i - 1);
                     });
                     .on('click', function() {
                         clickHelp(docs[i - 1], i - 1);
                     });
-                prevLink.append('span').attr('class', 'icon back blue');
-                prevLink.append('span').html(docs[i - 1].title);
+                prevLink.append('span').html('&#9668; ' + docs[i - 1].title);
             }
             if (i < docs.length - 1) {
                 var nextLink = nav.append('a')
             }
             if (i < docs.length - 1) {
                 var nextLink = nav.append('a')
@@ -33106,8 +33236,7 @@ iD.ui.Help = function(context) {
                     .on('click', function() {
                         clickHelp(docs[i + 1], i + 1);
                     });
                     .on('click', function() {
                         clickHelp(docs[i + 1], i + 1);
                     });
-                nextLink.append('span').html(docs[i + 1].title);
-                nextLink.append('span').attr('class', 'icon forward blue');
+                nextLink.append('span').html(docs[i + 1].title + ' &#9658;');
             }
         }
 
             }
         }
 
@@ -33126,12 +33255,10 @@ iD.ui.Help = function(context) {
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', toggle)
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', toggle)
+                .call(iD.svg.Icon('#icon-help', 'light'))
                 .call(tooltip),
             shown = false;
 
                 .call(tooltip),
             shown = false;
 
-        button.append('span')
-            .attr('class', 'icon help light');
-
 
         var toc = pane.append('ul')
             .attr('class', 'toc');
 
         var toc = pane.append('ul')
             .attr('class', 'toc');
@@ -33193,6 +33320,19 @@ iD.ui.Info = function(context) {
             return r / 12.56637 * 510065621724000;
         }
 
             return r / 12.56637 * 510065621724000;
         }
 
+        function toLineString(feature) {
+            if (feature.type === 'LineString') return feature;
+
+            var result = { type: 'LineString', coordinates: [] };
+            if (feature.type === 'Polygon') {
+                result.coordinates = feature.coordinates[0];
+            } else if (feature.type === 'MultiPolygon') {
+                result.coordinates = feature.coordinates[0][0];
+            }
+
+            return result;
+        }
+
         function displayLength(m) {
             var d = m * (imperial ? 3.28084 : 1),
                 p, unit;
         function displayLength(m) {
             var d = m * (imperial ? 3.28084 : 1),
                 p, unit;
@@ -33265,7 +33405,7 @@ iD.ui.Info = function(context) {
             if (hidden()) return;
 
             var resolver = context.graph(),
             if (hidden()) return;
 
             var resolver = context.graph(),
-                selected = context.selectedIDs(),
+                selected = _.filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
                 singular = selected.length === 1 ? selected[0] : null,
                 extent = iD.geo.Extent(),
                 entity;
                 singular = selected.length === 1 ? selected[0] : null,
                 extent = iD.geo.Extent(),
                 entity;
@@ -33301,7 +33441,7 @@ iD.ui.Info = function(context) {
             if (geometry === 'line' || geometry === 'area') {
                 var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
                     feature = entity.asGeoJSON(resolver),
             if (geometry === 'line' || geometry === 'area') {
                 var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
                     feature = entity.asGeoJSON(resolver),
-                    length = radiansToMeters(d3.geo.length(feature)),
+                    length = radiansToMeters(d3.geo.length(toLineString(feature))),
                     lengthLabel = t('infobox.' + (closed ? 'perimeter' : 'length')),
                     centroid = d3.geo.centroid(feature);
 
                     lengthLabel = t('infobox.' + (closed ? 'perimeter' : 'length')),
                     centroid = d3.geo.centroid(feature);
 
@@ -33497,6 +33637,8 @@ iD.ui.intro = function(context) {
         // Save current map state
         var history = context.history().toJSON(),
             hash = window.location.hash,
         // Save current map state
         var history = context.history().toJSON(),
             hash = window.location.hash,
+            center = context.map().center(),
+            zoom = context.map().zoom(),
             background = context.background().baseLayerSource(),
             opacity = d3.select('.background-layer').style('opacity'),
             loadedTiles = context.connection().loadedTiles(),
             background = context.background().baseLayerSource(),
             opacity = d3.select('.background-layer').style('opacity'),
             loadedTiles = context.connection().loadedTiles(),
@@ -33550,6 +33692,7 @@ iD.ui.intro = function(context) {
             context.history().reset().merge(d3.values(baseEntities));
             context.background().baseLayerSource(background);
             if (history) context.history().fromJSON(history, false);
             context.history().reset().merge(d3.values(baseEntities));
             context.background().baseLayerSource(background);
             if (history) context.history().fromJSON(history, false);
+            context.map().centerZoom(center, zoom);
             window.location.replace(hash);
             context.inIntro(false);
             d3.select('#bar button.save').on('click', save);
             window.location.replace(hash);
             context.inIntro(false);
             d3.select('#bar button.save').on('click', save);
@@ -33561,20 +33704,24 @@ iD.ui.intro = function(context) {
             .attr('class', 'joined')
             .selectAll('button.step');
 
             .attr('class', 'joined')
             .selectAll('button.step');
 
-        var entered = buttonwrap.data(steps)
-            .enter().append('button')
-                .attr('class', 'step')
-                .on('click', enter);
+        var entered = buttonwrap
+            .data(steps)
+            .enter()
+            .append('button')
+            .attr('class', 'step')
+            .on('click', enter);
+
+        entered
+            .call(iD.svg.Icon('#icon-apply', 'pre-text'));
+
+        entered
+            .append('label')
+            .text(function(d) { return t(d.title); });
 
 
-        entered.append('div').attr('class','icon icon-pre-text apply');
-        entered.append('label').text(function(d) { return t(d.title); });
         enter(steps[0]);
 
         function enter (newStep) {
         enter(steps[0]);
 
         function enter (newStep) {
-
-            if (step) {
-                step.exit();
-            }
+            if (step) { step.exit(); }
 
             context.enter(iD.modes.Browse(context));
 
 
             context.enter(iD.modes.Browse(context));
 
@@ -33893,12 +34040,10 @@ iD.ui.MapData = function(context) {
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', togglePanel)
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', togglePanel)
+                .call(iD.svg.Icon('#icon-data', 'light'))
                 .call(tooltip),
             shown = false;
 
                 .call(tooltip),
             shown = false;
 
-        button.append('span')
-            .attr('class', 'icon data light');
-
         content.append('h4')
             .text(t('map_data.title'));
 
         content.append('h4')
             .text(t('map_data.title'));
 
@@ -33954,8 +34099,7 @@ iD.ui.MapData = function(context) {
                 d3.event.stopPropagation();
                 context.background().zoomToGpxLayer();
             })
                 d3.event.stopPropagation();
                 context.background().zoomToGpxLayer();
             })
-            .append('span')
-            .attr('class', 'icon geolocate');
+            .call(iD.svg.Icon('#icon-search'));
 
         gpxLayerItem.append('button')
             .attr('class', 'layer-browse')
 
         gpxLayerItem.append('button')
             .attr('class', 'layer-browse')
@@ -33970,8 +34114,7 @@ iD.ui.MapData = function(context) {
                     })
                     .node().click();
             })
                     })
                     .node().click();
             })
-            .append('span')
-            .attr('class', 'icon geocode');
+            .call(iD.svg.Icon('#icon-geolocate'));
 
         label = gpxLayerItem.append('label')
             .call(bootstrap.tooltip()
 
         label = gpxLayerItem.append('label')
             .call(bootstrap.tooltip()
@@ -34055,9 +34198,9 @@ iD.ui.MapInMap = function(context) {
     function map_in_map(selection) {
 
         var backgroundLayer = iD.TileLayer(),
     function map_in_map(selection) {
 
         var backgroundLayer = iD.TileLayer(),
+            overlayLayers = {},
             dispatch = d3.dispatch('change'),
             gpxLayer = iD.GpxLayer(context, dispatch),
             dispatch = d3.dispatch('change'),
             gpxLayer = iD.GpxLayer(context, dispatch),
-            overlayLayer = iD.TileLayer(),
             projection = iD.geo.RawMercator(),
             zoom = d3.behavior.zoom()
                 .scaleExtent([ztok(0.5), ztok(24)])
             projection = iD.geo.RawMercator(),
             zoom = d3.behavior.zoom()
                 .scaleExtent([ztok(0.5), ztok(24)])
@@ -34101,12 +34244,11 @@ iD.ui.MapInMap = function(context) {
             zDiff = zMain - zMini;
 
             var scale = kCurr / kLast,
             zDiff = zMain - zMini;
 
             var scale = kCurr / kLast,
-                tX = Math.round((tCurr[0] / scale - tLast[0]) * scale),
-                tY = Math.round((tCurr[1] / scale - tLast[1]) * scale);
+                tX = (tCurr[0] / scale - tLast[0]) * scale,
+                tY = (tCurr[1] / scale - tLast[1]) * scale;
 
             iD.util.setTransform(tiles, tX, tY, scale);
             iD.util.setTransform(svg, 0, 0, scale);
 
             iD.util.setTransform(tiles, tX, tY, scale);
             iD.util.setTransform(svg, 0, 0, scale);
-            iD.util.setTransform(gpx, 0, 0, scale);
             transformed = true;
 
             queueRedraw();
             transformed = true;
 
             queueRedraw();
@@ -34168,7 +34310,6 @@ iD.ui.MapInMap = function(context) {
             if (transformed) {
                 iD.util.setTransform(tiles, 0, 0);
                 iD.util.setTransform(svg, 0, 0);
             if (transformed) {
                 iD.util.setTransform(tiles, 0, 0);
                 iD.util.setTransform(svg, 0, 0);
-                iD.util.setTransform(gpx, 0, 0);
                 transformed = false;
             }
         }
                 transformed = false;
             }
         }
@@ -34210,37 +34351,39 @@ iD.ui.MapInMap = function(context) {
                 .call(backgroundLayer);
 
             // redraw overlay
                 .call(backgroundLayer);
 
             // redraw overlay
-            var overlaySources = context.background().overlayLayerSources(),
-                hasOverlay = false;
-
+            var overlaySources = context.background().overlayLayerSources();
+            var activeOverlayLayers = [];
             for (var i = 0; i < overlaySources.length; i++) {
                 if (overlaySources[i].validZoom(zMini)) {
             for (var i = 0; i < overlaySources.length; i++) {
                 if (overlaySources[i].validZoom(zMini)) {
-                    overlayLayer
+                    if (!overlayLayers[i]) overlayLayers[i] = iD.TileLayer();
+                    activeOverlayLayers.push(overlayLayers[i]
                         .source(overlaySources[i])
                         .projection(projection)
                         .source(overlaySources[i])
                         .projection(projection)
-                        .dimensions(dMini);
-
-                    hasOverlay = true;
-                    break;
+                        .dimensions(dMini));
                 }
             }
 
             var overlay = tiles
                 .selectAll('.map-in-map-overlay')
                 }
             }
 
             var overlay = tiles
                 .selectAll('.map-in-map-overlay')
-                .data(hasOverlay ? [0] : []);
+                .data([0]);
 
             overlay.enter()
                 .append('div')
                 .attr('class', 'map-in-map-overlay');
 
 
             overlay.enter()
                 .append('div')
                 .attr('class', 'map-in-map-overlay');
 
-            overlay.exit()
-                .remove();
+            var overlays = overlay
+                .selectAll('div')
+                .data(activeOverlayLayers, function(d) { return d.source().name(); });
 
 
-            if (hasOverlay) {
-                overlay
-                    .call(overlayLayer);
-            }
+            overlays.enter().append('div');
+            overlays.each(function(layer) {
+                d3.select(this).call(layer);
+            });
+
+            overlays.exit()
+                .remove();
 
 
+            // redraw gpx overlay
             gpxLayer
                 .projection(projection);
 
             gpxLayer
                 .projection(projection);
 
@@ -34449,8 +34592,10 @@ iD.ui.Modes = function(context) {
         context
             .on('enter.modes', update);
 
         context
             .on('enter.modes', update);
 
-        buttons.append('span')
-            .attr('class', function(mode) { return mode.id + ' icon icon-pre-text'; });
+        buttons.each(function(d) {
+            d3.select(this)
+                .call(iD.svg.Icon('#icon-' + d.button, 'pre-text'));
+        });
 
         buttons.append('span')
             .attr('class', 'label')
 
         buttons.append('span')
             .attr('class', 'label')
@@ -34490,10 +34635,9 @@ iD.ui.Notice = function(context) {
             .attr('class', 'zoom-to notice')
             .on('click', function() { context.map().zoom(context.minEditableZoom()); });
 
             .attr('class', 'zoom-to notice')
             .on('click', function() { context.map().zoom(context.minEditableZoom()); });
 
-        button.append('span')
-            .attr('class', 'icon zoom-in-invert');
-
-        button.append('span')
+        button
+            .call(iD.svg.Icon('#icon-plus', 'pre-text'))
+            .append('span')
             .attr('class', 'label')
             .text(t('zoom_in_edit'));
 
             .attr('class', 'label')
             .text(t('zoom_in_edit'));
 
@@ -34622,13 +34766,12 @@ iD.ui.preset = function(context) {
 
         wrap.append('button')
             .attr('class', 'remove-icon')
 
         wrap.append('button')
             .attr('class', 'remove-icon')
-            .append('span').attr('class', 'icon delete');
+            .call(iD.svg.Icon('#operation-delete'));
 
         wrap.append('button')
             .attr('class', 'modified-icon')
             .attr('tabindex', -1)
 
         wrap.append('button')
             .attr('class', 'modified-icon')
             .attr('tabindex', -1)
-            .append('div')
-            .attr('class', 'icon undo');
+            .call(iD.svg.Icon('#icon-undo'));
 
         // Update
 
 
         // Update
 
@@ -34761,13 +34904,28 @@ iD.ui.PresetIcon = function() {
     var preset, geometry;
 
     function presetIcon(selection) {
     var preset, geometry;
 
     function presetIcon(selection) {
-        selection.each(setup);
+        selection.each(render);
     }
 
     }
 
-    function setup() {
+    function render() {
         var selection = d3.select(this),
             p = preset.apply(this, arguments),
         var selection = d3.select(this),
             p = preset.apply(this, arguments),
-            geom = geometry.apply(this, arguments);
+            geom = geometry.apply(this, arguments),
+            icon = p.icon || (geom === 'line' ? 'other-line' : 'marker-stroked'),
+            maki = iD.data.featureIcons.hasOwnProperty(icon + '-24');
+
+        if (icon === 'dentist') maki = true;  // workaround for dentist icon missing in `maki-sprite.json`
+
+        function tag_classes(p) {
+            var s = '';
+            for (var i in p.tags) {
+                s += ' tag-' + i;
+                if (p.tags[i] !== '*') {
+                    s += ' tag-' + i + '-' + p.tags[i];
+                }
+            }
+            return s;
+        }
 
         var $fill = selection.selectAll('.preset-icon-fill')
             .data([0]);
 
         var $fill = selection.selectAll('.preset-icon-fill')
             .data([0]);
@@ -34775,32 +34933,39 @@ iD.ui.PresetIcon = function() {
         $fill.enter().append('div');
 
         $fill.attr('class', function() {
         $fill.enter().append('div');
 
         $fill.attr('class', function() {
-            var s = 'preset-icon-fill preset-icon-fill-' + geom;
-            for (var i in p.tags) {
-                s += ' tag-' + i + ' tag-' + i + '-' + p.tags[i];
-            }
-            return s;
+            return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
+        });
+
+        var $frame = selection.selectAll('.preset-icon-frame')
+            .data([0]);
+
+        $frame.enter()
+            .append('div')
+            .call(iD.svg.Icon('#preset-icon-frame'));
+
+        $frame.attr('class', function() {
+            return 'preset-icon-frame ' + (geom === 'area' ? '' : 'hide');
         });
 
         });
 
+
         var $icon = selection.selectAll('.preset-icon')
             .data([0]);
 
         var $icon = selection.selectAll('.preset-icon')
             .data([0]);
 
-        $icon.enter().append('div');
+        $icon.enter()
+            .append('div')
+            .attr('class', 'preset-icon')
+            .call(iD.svg.Icon(''));
 
 
-        $icon.attr('class', function() {
-            var icon = p.icon || (geom === 'line' ? 'other-line' : 'marker-stroked'),
-                klass = 'feature-' + icon + ' preset-icon';
+        $icon
+            .attr('class', 'preset-icon preset-icon-' + (maki ? '32' : '60'));
 
 
-            var featureicon = iD.data.featureIcons[icon];
-            if (featureicon && featureicon[geom]) {
-                klass += ' preset-icon-' + geom;
-            } else if (icon === 'multipolygon') {
-                // Special case (geometry === 'area')
-                klass += ' preset-icon-relation';
-            }
+        $icon.selectAll('svg')
+            .attr('class', function() {
+                return 'icon ' + icon + tag_classes(p);
+            });
 
 
-            return klass;
-        });
+        $icon.selectAll('use')       // workaround: maki parking-24 broken?
+            .attr('href', '#' + icon + (maki ? ( icon === 'parking' ? '-18' : '-24') : ''));
     }
 
     presetIcon.preset = function(_) {
     }
 
     presetIcon.preset = function(_) {
@@ -34840,15 +35005,14 @@ iD.ui.PresetList = function(context) {
                 .attr('class', 'preset-choose')
                 .on('click', function() { event.choose(currentPreset); })
                 .append('span')
                 .attr('class', 'preset-choose')
                 .on('click', function() { event.choose(currentPreset); })
                 .append('span')
-                .attr('class', 'icon forward');
+                .html('&#9658;');
         } else {
             messagewrap.append('button')
                 .attr('class', 'close')
                 .on('click', function() {
                     context.enter(iD.modes.Browse(context));
                 })
         } else {
             messagewrap.append('button')
                 .attr('class', 'close')
                 .on('click', function() {
                     context.enter(iD.modes.Browse(context));
                 })
-                .append('span')
-                .attr('class', 'icon close');
+                .call(iD.svg.Icon('#icon-close'));
         }
 
         function keydown() {
         }
 
         function keydown() {
@@ -34905,8 +35069,8 @@ iD.ui.PresetList = function(context) {
             .on('keypress', keypress)
             .on('input', inputevent);
 
             .on('keypress', keypress)
             .on('input', inputevent);
 
-        searchWrap.append('span')
-            .attr('class', 'icon search');
+        searchWrap
+            .call(iD.svg.Icon('#icon-search', 'pre-text'));
 
         if (autofocus) {
             search.node().focus();
 
         if (autofocus) {
             search.node().focus();
@@ -35102,25 +35266,28 @@ iD.ui.RadialMenu = function(context, operations) {
 
         var button = menu.selectAll()
             .data(operations)
 
         var button = menu.selectAll()
             .data(operations)
-            .enter().append('g')
+            .enter()
+            .append('g')
+            .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
+            .classed('disabled', function(d) { return d.disabled(); })
             .attr('transform', function(d, i) {
             .attr('transform', function(d, i) {
-                return 'translate(' + r * Math.sin(a0 + i * a) + ',' +
-                                      r * Math.cos(a0 + i * a) + ')';
+                return 'translate(' + iD.geo.roundCoords([
+                        r * Math.sin(a0 + i * a),
+                        r * Math.cos(a0 + i * a)]).join(',') + ')';
             });
 
         button.append('circle')
             });
 
         button.append('circle')
-            .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
             .attr('r', 15)
             .attr('r', 15)
-            .classed('disabled', function(d) { return d.disabled(); })
             .on('click', click)
             .on('mousedown', mousedown)
             .on('mouseover', mouseover)
             .on('mouseout', mouseout);
 
         button.append('use')
             .on('click', click)
             .on('mousedown', mousedown)
             .on('mouseover', mouseover)
             .on('mouseout', mouseout);
 
         button.append('use')
-            .attr('transform', 'translate(-10, -10)')
-            .attr('clip-path', 'url(#clip-square-20)')
-            .attr('xlink:href', function(d) { return '#icon-operation-' + (d.disabled() ? 'disabled-' : '') + d.id; });
+            .attr('transform', 'translate(-10,-10)')
+            .attr('width', '20')
+            .attr('height', '20')
+            .attr('xlink:href', function(d) { return '#operation-' + d.id; });
 
         tooltip = d3.select(document.body)
             .append('div')
 
         tooltip = d3.select(document.body)
             .append('div')
@@ -35291,8 +35458,7 @@ iD.ui.RawMemberEditor = function(context) {
                 .attr('tabindex', -1)
                 .attr('class', 'remove button-input-action member-delete minor')
                 .on('click', deleteMember)
                 .attr('tabindex', -1)
                 .attr('class', 'remove button-input-action member-delete minor')
                 .on('click', deleteMember)
-                .append('span')
-                .attr('class', 'icon delete');
+                .call(iD.svg.Icon('#operation-delete'));
 
             $items.exit()
                 .remove();
 
             $items.exit()
                 .remove();
@@ -35444,8 +35610,7 @@ iD.ui.RawMembershipEditor = function(context) {
                 .attr('tabindex', -1)
                 .attr('class', 'remove button-input-action member-delete minor')
                 .on('click', deleteMembership)
                 .attr('tabindex', -1)
                 .attr('class', 'remove button-input-action member-delete minor')
                 .on('click', deleteMembership)
-                .append('span')
-                .attr('class', 'icon delete');
+                .call(iD.svg.Icon('#operation-delete'));
 
             $items.exit()
                 .remove();
 
             $items.exit()
                 .remove();
@@ -35480,8 +35645,7 @@ iD.ui.RawMembershipEditor = function(context) {
                     .attr('tabindex', -1)
                     .attr('class', 'remove button-input-action member-delete minor')
                     .on('click', deleteMembership)
                     .attr('tabindex', -1)
                     .attr('class', 'remove button-input-action member-delete minor')
                     .on('click', deleteMembership)
-                    .append('span')
-                    .attr('class', 'icon delete');
+                    .call(iD.svg.Icon('#operation-delete'));
 
             } else {
                 $list.selectAll('.member-row-new')
 
             } else {
                 $list.selectAll('.member-row-new')
@@ -35491,10 +35655,10 @@ iD.ui.RawMembershipEditor = function(context) {
             var $add = $wrap.selectAll('.add-relation')
                 .data([0]);
 
             var $add = $wrap.selectAll('.add-relation')
                 .data([0]);
 
-            $add.enter().append('button')
+            $add.enter()
+                .append('button')
                 .attr('class', 'add-relation')
                 .attr('class', 'add-relation')
-                .append('span')
-                .attr('class', 'icon plus light');
+                .call(iD.svg.Icon('#icon-plus', 'light'));
 
             $wrap.selectAll('.add-relation')
                 .on('click', function() {
 
             $wrap.selectAll('.add-relation')
                 .on('click', function() {
@@ -35555,11 +35719,10 @@ iD.ui.RawTagEditor = function(context) {
         var $newTag = $wrap.selectAll('.add-tag')
             .data([0]);
 
         var $newTag = $wrap.selectAll('.add-tag')
             .data([0]);
 
-        var $enter = $newTag.enter().append('button')
-            .attr('class', 'add-tag');
-
-        $enter.append('span')
-            .attr('class', 'icon plus light');
+        $newTag.enter()
+            .append('button')
+            .attr('class', 'add-tag')
+            .call(iD.svg.Icon('#icon-plus', 'light'));
 
         $newTag.on('click', addTag);
 
 
         $newTag.on('click', addTag);
 
@@ -35568,7 +35731,7 @@ iD.ui.RawTagEditor = function(context) {
 
         // Enter
 
 
         // Enter
 
-        $enter = $items.enter().append('li')
+        var $enter = $items.enter().append('li')
             .attr('class', 'tag-row cf');
 
         $enter.append('div')
             .attr('class', 'tag-row cf');
 
         $enter.append('div')
@@ -35588,8 +35751,7 @@ iD.ui.RawTagEditor = function(context) {
         $enter.append('button')
             .attr('tabindex', -1)
             .attr('class', 'remove minor')
         $enter.append('button')
             .attr('tabindex', -1)
             .attr('class', 'remove minor')
-            .append('span')
-            .attr('class', 'icon delete');
+            .call(iD.svg.Icon('#operation-delete'));
 
         if (context.taginfo()) {
             $enter.each(bindTypeahead);
 
         if (context.taginfo()) {
             $enter.each(bindTypeahead);
@@ -35600,7 +35762,12 @@ iD.ui.RawTagEditor = function(context) {
         $items.order();
 
         $items.each(function(tag) {
         $items.order();
 
         $items.each(function(tag) {
-            var reference = iD.ui.TagReference({key: tag.key, value: tag.value}, context);
+            var isRelation = (context.entity(id).type === 'relation'),
+                reference;
+            if (isRelation && tag.key === 'type')
+                reference = iD.ui.TagReference({rtype: tag.value}, context);
+            else
+                reference = iD.ui.TagReference({key: tag.key, value: tag.value}, context);
 
             if (state === 'hover') {
                 reference.showing(false);
 
             if (state === 'hover') {
                 reference.showing(false);
@@ -35980,12 +36147,9 @@ iD.ui.SelectionList = function(context, selectedIDs) {
                 .on('click', selectEntity);
 
             // Enter
                 .on('click', selectEntity);
 
             // Enter
-
             var label = enter.append('div')
             var label = enter.append('div')
-                .attr('class', 'label');
-
-            label.append('span')
-                .attr('class', 'icon icon-pre-text');
+                .attr('class', 'label')
+                .call(iD.svg.Icon('', 'pre-text'));
 
             label.append('span')
                 .attr('class', 'entity-type');
 
             label.append('span')
                 .attr('class', 'entity-type');
@@ -35994,9 +36158,11 @@ iD.ui.SelectionList = function(context, selectedIDs) {
                 .attr('class', 'entity-name');
 
             // Update
                 .attr('class', 'entity-name');
 
             // Update
-
-            items.selectAll('.icon')
-                .attr('class', function(entity) { return context.geometry(entity.id) + ' icon icon-pre-text'; });
+            items.selectAll('use')
+                .attr('href', function() {
+                    var entity = this.parentElement.parentElement.__data__;
+                    return '#icon-' + context.geometry(entity.id);
+                });
 
             items.selectAll('.entity-type')
                 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
 
             items.selectAll('.entity-type')
                 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
@@ -36005,7 +36171,6 @@ iD.ui.SelectionList = function(context, selectedIDs) {
                 .text(function(entity) { return iD.util.displayName(entity); });
 
             // Exit
                 .text(function(entity) { return iD.util.displayName(entity); });
 
             // Exit
-
             items.exit()
                 .remove();
         }
             items.exit()
                 .remove();
         }
@@ -36251,8 +36416,7 @@ iD.ui.Success = function(context) {
         header.append('button')
             .attr('class', 'fr')
             .on('click', function() { dispatch.cancel(); })
         header.append('button')
             .attr('class', 'fr')
             .on('click', function() { dispatch.cancel(); })
-            .append('span')
-            .attr('class', 'icon close');
+            .call(iD.svg.Icon('#icon-close'));
 
         header.append('h3')
             .text(t('success.just_edited'));
 
         header.append('h3')
             .text(t('success.just_edited'));
@@ -36279,13 +36443,15 @@ iD.ui.Success = function(context) {
 
         body.selectAll('.button.social')
             .data(d3.entries(sharing))
 
         body.selectAll('.button.social')
             .data(d3.entries(sharing))
-            .enter().append('a')
-            .attr('class', function(d) { return 'button social col4 ' + d.key; })
+            .enter()
+            .append('a')
+            .attr('class', 'button social col4')
             .attr('target', '_blank')
             .attr('href', function(d) { return d.value; })
             .call(bootstrap.tooltip()
                 .title(function(d) { return t('success.' + d.key); })
             .attr('target', '_blank')
             .attr('href', function(d) { return d.value; })
             .call(bootstrap.tooltip()
                 .title(function(d) { return t('success.' + d.key); })
-                .placement('bottom'));
+                .placement('bottom'))
+            .each(function(d) { d3.select(this).call(iD.svg.Icon('#logo-' + d.key, 'social')); });
     }
 
     success.changeset = function(_) {
     }
 
     success.changeset = function(_) {
@@ -36303,11 +36469,11 @@ iD.ui.TagReference = function(tag, context) {
         loaded,
         showing;
 
         loaded,
         showing;
 
-    function findLocal(docs) {
+    function findLocal(data) {
         var locale = iD.detect().locale.toLowerCase(),
             localized;
 
         var locale = iD.detect().locale.toLowerCase(),
             localized;
 
-        localized = _.find(docs, function(d) {
+        localized = _.find(data, function(d) {
             return d.lang.toLowerCase() === locale;
         });
         if (localized) return localized;
             return d.lang.toLowerCase() === locale;
         });
         if (localized) return localized;
@@ -36316,34 +36482,37 @@ iD.ui.TagReference = function(tag, context) {
         // 'en' if the language is 'en-US'
         if (locale.indexOf('-') !== -1) {
             var first = locale.split('-')[0];
         // 'en' if the language is 'en-US'
         if (locale.indexOf('-') !== -1) {
             var first = locale.split('-')[0];
-            localized = _.find(docs, function(d) {
+            localized = _.find(data, function(d) {
                 return d.lang.toLowerCase() === first;
             });
             if (localized) return localized;
         }
 
         // finally fall back to english
                 return d.lang.toLowerCase() === first;
             });
             if (localized) return localized;
         }
 
         // finally fall back to english
-        return _.find(docs, function(d) {
+        return _.find(data, function(d) {
             return d.lang.toLowerCase() === 'en';
         });
     }
 
             return d.lang.toLowerCase() === 'en';
         });
     }
 
-    function load() {
+    function load(param) {
         button.classed('tag-reference-loading', true);
 
         button.classed('tag-reference-loading', true);
 
-        context.taginfo().docs(tag, function(err, docs, softfail) {
-            if (!err && docs) {
-                docs = findLocal(docs);
+        context.taginfo().docs(param, function show(err, data) {
+            var docs;
+            if (!err && data) {
+                docs = findLocal(data);
             }
 
             body.html('');
 
             if (!docs || !docs.description) {
             }
 
             body.html('');
 
             if (!docs || !docs.description) {
-                if (!softfail) {
+                if (param.hasOwnProperty('value')) {
+                    load(_.omit(param, 'value'));   // retry with key only
+                } else {
                     body.append('p').text(t('inspector.no_documentation_key'));
                     body.append('p').text(t('inspector.no_documentation_key'));
-                    show();
+                    done();
                 }
                 }
-                return false;
+                return;
             }
 
             if (docs.image && docs.image.thumb_url_prefix) {
             }
 
             if (docs.image && docs.image.thumb_url_prefix) {
@@ -36351,32 +36520,27 @@ iD.ui.TagReference = function(tag, context) {
                     .append('img')
                     .attr('class', 'wiki-image')
                     .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
                     .append('img')
                     .attr('class', 'wiki-image')
                     .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
-                    .on('load', function() { show(); })
-                    .on('error', function() { d3.select(this).remove(); show(); });
+                    .on('load', function() { done(); })
+                    .on('error', function() { d3.select(this).remove(); done(); });
             } else {
             } else {
-                show();
+                done();
             }
 
             body
                 .append('p')
                 .text(docs.description);
 
             }
 
             body
                 .append('p')
                 .text(docs.description);
 
-            var wikiLink = body
+            body
                 .append('a')
                 .attr('target', '_blank')
                 .append('a')
                 .attr('target', '_blank')
-                .attr('href', 'http://wiki.openstreetmap.org/wiki/' + docs.title);
-
-            wikiLink.append('span')
-                .attr('class','icon icon-pre-text out-link');
-
-            wikiLink.append('span')
+                .attr('href', 'http://wiki.openstreetmap.org/wiki/' + docs.title)
+                .call(iD.svg.Icon('#icon-out-link', 'inline'))
+                .append('span')
                 .text(t('inspector.reference'));
                 .text(t('inspector.reference'));
-
-            return true;
         });
     }
 
         });
     }
 
-    function show() {
+    function done() {
         loaded = true;
 
         button.classed('tag-reference-loading', false);
         loaded = true;
 
         button.classed('tag-reference-loading', false);
@@ -36403,12 +36567,11 @@ iD.ui.TagReference = function(tag, context) {
         button = selection.selectAll('.tag-reference-button')
             .data([0]);
 
         button = selection.selectAll('.tag-reference-button')
             .data([0]);
 
-        var enter = button.enter().append('button')
+        button.enter()
+            .append('button')
+            .attr('class', 'tag-reference-button')
             .attr('tabindex', -1)
             .attr('tabindex', -1)
-            .attr('class', 'tag-reference-button');
-
-        enter.append('span')
-            .attr('class', 'icon inspect');
+            .call(iD.svg.Icon('#icon-inspect'));
 
         button.on('click', function () {
             d3.event.stopPropagation();
 
         button.on('click', function () {
             d3.event.stopPropagation();
@@ -36416,10 +36579,10 @@ iD.ui.TagReference = function(tag, context) {
             if (showing) {
                 hide();
             } else if (loaded) {
             if (showing) {
                 hide();
             } else if (loaded) {
-                show();
+                done();
             } else {
                 if (context.taginfo()) {
             } else {
                 if (context.taginfo()) {
-                    load();
+                    load(tag);
                 }
             }
         });
                 }
             }
         });
@@ -36446,7 +36609,8 @@ iD.ui.TagReference = function(tag, context) {
     };
 
     return tagReference;
     };
 
     return tagReference;
-};// toggles the visibility of ui elements, using a combination of the
+};
+// toggles the visibility of ui elements, using a combination of the
 // hide class, which sets display=none, and a d3 transition for opacity.
 // this will cause blinking when called repeatedly, so check that the
 // value actually changes between calls.
 // hide class, which sets display=none, and a d3 transition for opacity.
 // this will cause blinking when called repeatedly, so check that the
 // value actually changes between calls.
@@ -36497,8 +36661,10 @@ iD.ui.UndoRedo = function(context) {
             .on('click', function(d) { return d.action(); })
             .call(tooltip);
 
             .on('click', function(d) { return d.action(); })
             .call(tooltip);
 
-        buttons.append('span')
-            .attr('class', function(d) { return 'icon ' + d.id; });
+        buttons.each(function(d) {
+            d3.select(this)
+                .call(iD.svg.Icon('#icon-' + d.id));
+        });
 
         var keybinding = d3.keybinding('undo')
             .on(commands[0].cmd, function() { d3.event.preventDefault(); commands[0].action(); })
 
         var keybinding = d3.keybinding('undo')
             .on(commands[0].cmd, function() { d3.event.preventDefault(); commands[0].action(); })
@@ -36537,17 +36703,16 @@ iD.ui.ViewOnOSM = function(context) {
         var $link = selection.selectAll('.view-on-osm')
             .data([0]);
 
         var $link = selection.selectAll('.view-on-osm')
             .data([0]);
 
-        var $enter = $link.enter().append('a')
+        $link.enter()
+            .append('a')
             .attr('class', 'view-on-osm')
             .attr('class', 'view-on-osm')
-            .attr('target', '_blank');
-
-        $enter.append('span')
-            .attr('class', 'icon icon-pre-text out-link');
-
-        $enter.append('span')
+            .attr('target', '_blank')
+            .call(iD.svg.Icon('#icon-out-link', 'inline'))
+            .append('span')
             .text(t('inspector.view_on_osm'));
 
             .text(t('inspector.view_on_osm'));
 
-        $link.attr('href', context.connection().entityURL(entity));
+        $link
+            .attr('href', context.connection().entityURL(entity));
     }
 
     viewOnOSM.entityID = function(_) {
     }
 
     viewOnOSM.entityID = function(_) {
@@ -36561,11 +36726,13 @@ iD.ui.ViewOnOSM = function(context) {
 iD.ui.Zoom = function(context) {
     var zooms = [{
         id: 'zoom-in',
 iD.ui.Zoom = function(context) {
     var zooms = [{
         id: 'zoom-in',
+        icon: 'plus',
         title: t('zoom.in'),
         action: context.zoomIn,
         key: '+'
     }, {
         id: 'zoom-out',
         title: t('zoom.in'),
         action: context.zoomIn,
         key: '+'
     }, {
         id: 'zoom-out',
+        icon: 'minus',
         title: t('zoom.out'),
         action: context.zoomOut,
         key: '-'
         title: t('zoom.out'),
         action: context.zoomOut,
         key: '-'
@@ -36606,8 +36773,10 @@ iD.ui.Zoom = function(context) {
                     return iD.ui.tooltipHtml(d.title, d.key);
                 }));
 
                     return iD.ui.tooltipHtml(d.title, d.key);
                 }));
 
-        button.append('span')
-            .attr('class', function(d) { return d.id + ' icon'; });
+        button.each(function(d) {
+            d3.select(this)
+                .call(iD.svg.Icon('#icon-' + d.icon, 'light'));
+        });
 
         var keybinding = d3.keybinding('zoom');
 
 
         var keybinding = d3.keybinding('zoom');
 
@@ -37124,9 +37293,30 @@ iD.ui.preset.typeCombo = function(field, context) {
     var event = d3.dispatch('change'),
         optstrings = field.strings && field.strings.options,
         optarray = field.options,
     var event = d3.dispatch('change'),
         optstrings = field.strings && field.strings.options,
         optarray = field.options,
+        snake_case = (field.snake_case || (field.snake_case === undefined)),
         strings = {},
         input;
 
         strings = {},
         input;
 
+    function snake(s) {
+        return s.replace(/\s+/g, '_');
+    }
+
+    function unsnake(s) {
+        return s.replace(/_+/g, ' ');
+    }
+
+    function clean(s) {
+        return s.split(';')
+            .map(function(s) { return s.trim(); })
+            .join(';');
+    }
+
+    function optString() {
+        return _.find(_.keys(strings), function(k) {
+                return strings[k] === input.value();
+            });
+    }
+
     function combo(selection) {
         var combobox = d3.combobox();
 
     function combo(selection) {
         var combobox = d3.combobox();
 
@@ -37152,14 +37342,14 @@ iD.ui.preset.typeCombo = function(field, context) {
                     stringsLoaded();
                 } else if (optarray) {
                     _.each(optarray, function(k) {
                     stringsLoaded();
                 } else if (optarray) {
                     _.each(optarray, function(k) {
-                        strings[k] = k.replace(/_+/g, ' ');
+                        strings[k] = (snake_case ? unsnake(k) : k);
                     });
                     stringsLoaded();
                 } else if (context.taginfo()) {
                     context.taginfo().values({key: field.key}, function(err, data) {
                         if (!err) {
                             _.each(_.pluck(data, 'value'), function(k) {
                     });
                     stringsLoaded();
                 } else if (context.taginfo()) {
                     context.taginfo().values({key: field.key}, function(err, data) {
                         if (!err) {
                             _.each(_.pluck(data, 'value'), function(k) {
-                                strings[k] = k.replace(/_+/g, ' ');
+                                strings[k] = (snake_case ? unsnake(k) : k);
                             });
                             stringsLoaded();
                         }
                             });
                             stringsLoaded();
                         }
@@ -37187,14 +37377,14 @@ iD.ui.preset.typeCombo = function(field, context) {
     }
 
     function change() {
     }
 
     function change() {
-        var optstring = _.find(_.keys(strings), function(k) { return strings[k] === input.value(); }),
-            value = optstring || (input.value()
-                .split(';')
-                .map(function(s) { return s.trim(); })
-                .join(';')
-                .replace(/\s+/g, '_'));
+        var value = optString() || clean(input.value());
 
 
-        if (field.type === 'typeCombo' && !value) value = 'yes';
+        if (snake_case) {
+            value = snake(value);
+        }
+        if (field.type === 'typeCombo' && !value) {
+            value = 'yes';
+        }
 
         var t = {};
         t[field.key] = value || undefined;
 
         var t = {};
         t[field.key] = value || undefined;
@@ -37203,8 +37393,15 @@ iD.ui.preset.typeCombo = function(field, context) {
 
     combo.tags = function(tags) {
         var key = tags[field.key],
 
     combo.tags = function(tags) {
         var key = tags[field.key],
+            optstring = optString(),
             value = strings[key] || key || '';
             value = strings[key] || key || '';
-        if (field.type === 'typeCombo' && value.toLowerCase() === 'yes') value = '';
+
+        if (field.type === 'typeCombo' && value.toLowerCase() === 'yes') {
+            value = '';
+        }
+        if (!optstring && snake_case) {
+            value = unsnake(value);
+        }
         input.value(value);
     };
 
         input.value(value);
     };
 
@@ -37410,13 +37607,13 @@ iD.ui.preset.localized = function(field, context) {
         var translateButton = selection.selectAll('.localized-add')
             .data([0]);
 
         var translateButton = selection.selectAll('.localized-add')
             .data([0]);
 
-        translateButton.enter().append('button')
+        translateButton.enter()
+            .append('button')
             .attr('class', 'button-input-action localized-add minor')
             .attr('class', 'button-input-action localized-add minor')
+            .call(iD.svg.Icon('#icon-plus'))
             .call(bootstrap.tooltip()
                 .title(t('translate.translate'))
             .call(bootstrap.tooltip()
                 .title(t('translate.translate'))
-                .placement('left'))
-            .append('span')
-            .attr('class', 'icon plus');
+                .placement('left'));
 
         translateButton
             .on('click', addBlank);
 
         translateButton
             .on('click', addBlank);
@@ -37522,7 +37719,7 @@ iD.ui.preset.localized = function(field, context) {
                             .style('max-height','0px')
                             .remove();
                     })
                             .style('max-height','0px')
                             .remove();
                     })
-                    .append('span').attr('class', 'icon delete');
+                    .call(iD.svg.Icon('#operation-delete'));
 
                 wrap.append('input')
                     .attr('class', 'localized-lang')
 
                 wrap.append('input')
                     .attr('class', 'localized-lang')
@@ -37590,11 +37787,11 @@ iD.ui.preset.localized = function(field, context) {
 
         input.value(tags[field.key] || '');
 
 
         input.value(tags[field.key] || '');
 
-        var postfixed = [];
-        for (var i in tags) {
-            var m = i.match(new RegExp(field.key + ':([a-zA-Z_-]+)$'));
-            if (m && m[1]) {
-                postfixed.push({ lang: m[1], value: tags[i]});
+        var postfixed = [], k, m;
+        for (k in tags) {
+            m = k.match(/^(.*):([a-zA-Z_-]+)$/);
+            if (m && m[1] === field.key && m[2]) {
+                postfixed.push({ lang: m[2], value: tags[k] });
             }
         }
 
             }
         }
 
@@ -37843,7 +38040,7 @@ iD.ui.preset.restrictions = function(field, context) {
 
         surface
             .call(vertices, graph, [vertex], filter, extent, z)
 
         surface
             .call(vertices, graph, [vertex], filter, extent, z)
-            .call(lines, graph, intersection.highways, filter)
+            .call(lines, graph, intersection.ways, filter)
             .call(turns, graph, intersection.turns(fromNodeID));
 
         surface
             .call(turns, graph, intersection.turns(fromNodeID));
 
         surface
@@ -37857,7 +38054,7 @@ iD.ui.preset.restrictions = function(field, context) {
 
         if (fromNodeID) {
             surface
 
         if (fromNodeID) {
             surface
-                .selectAll('.' + _.find(intersection.highways, function(way) { return way.contains(fromNodeID); }).id)
+                .selectAll('.' + intersection.highways[fromNodeID].id)
                 .classed('selected', true);
         }
 
                 .classed('selected', true);
         }
 
@@ -37872,7 +38069,7 @@ iD.ui.preset.restrictions = function(field, context) {
         function click() {
             var datum = d3.event.target.__data__;
             if (datum instanceof iD.Entity) {
         function click() {
             var datum = d3.event.target.__data__;
             if (datum instanceof iD.Entity) {
-                fromNodeID = datum.nodes[(datum.first() === vertexID) ? 1 : datum.nodes.length - 2];
+                fromNodeID = intersection.adjacentNodeId(datum.id);
                 render();
             } else if (datum instanceof iD.geo.Turn) {
                 if (datum.restriction) {
                 render();
             } else if (datum instanceof iD.geo.Turn) {
                 if (datum.restriction) {
@@ -38039,17 +38236,19 @@ iD.ui.preset.wikipedia = function(field, context) {
         link.enter().append('a')
             .attr('class', 'wiki-link button-input-action minor')
             .attr('target', '_blank')
         link.enter().append('a')
             .attr('class', 'wiki-link button-input-action minor')
             .attr('target', '_blank')
-            .append('span')
-            .attr('class', 'icon out-link');
+            .call(iD.svg.Icon('#icon-out-link', 'inline'));
     }
 
     function language() {
         var value = lang.value().toLowerCase();
     }
 
     function language() {
         var value = lang.value().toLowerCase();
+        var locale = iD.detect().locale.toLowerCase();
+        var localeLanguage;
         return _.find(iD.data.wikipedia, function(d) {
         return _.find(iD.data.wikipedia, function(d) {
+            if (d[2] === locale) localeLanguage = d;
             return d[0].toLowerCase() === value ||
                 d[1].toLowerCase() === value ||
             return d[0].toLowerCase() === value ||
                 d[1].toLowerCase() === value ||
-                d[2].toLowerCase() === value;
-        }) || iD.data.wikipedia[0];
+                d[2] === value;
+        }) || localeLanguage || ['English', 'English', 'en'];
     }
 
     function changeLang() {
     }
 
     function changeLang() {
@@ -38849,6 +39048,11 @@ iD.presets.Collection = function(collection) {
                     return a.suggestion === true;
                 });
 
                     return a.suggestion === true;
                 });
 
+            function leading(a) {
+                var index = a.indexOf(value);
+                return index === 0 || a[index - 1] === ' ';
+            }
+
             // matches value to preset.name
             var leading_name = _.filter(searchable, function(a) {
                     return leading(a.name().toLowerCase());
             // matches value to preset.name
             var leading_name = _.filter(searchable, function(a) {
                     return leading(a.name().toLowerCase());
@@ -38868,10 +39072,6 @@ iD.presets.Collection = function(collection) {
                     return _.any(_.without(_.values(a.tags || {}), '*'), leading);
                 });
 
                     return _.any(_.without(_.values(a.tags || {}), '*'), leading);
                 });
 
-            function leading(a) {
-                var index = a.indexOf(value);
-                return index === 0 || a[index - 1] === ' ';
-            }
 
             // finds close matches to value in preset.name
             var levenstein_name = searchable.map(function(a) {
 
             // finds close matches to value in preset.name
             var levenstein_name = searchable.map(function(a) {
@@ -39016,7 +39216,7 @@ iD.presets.Preset = function(id, preset, fields) {
     };
 
     preset.terms = function() {
     };
 
     preset.terms = function() {
-        return preset.t('terms', {'default': ''}).toLowerCase().split(/\s*,+\s*/);
+        return preset.t('terms', {'default': ''}).toLowerCase().trim().split(/\s*,+\s*/);
     };
 
     preset.isFallback = function() {
     };
 
     preset.isFallback = function() {
@@ -39385,904 +39585,885 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
         "yh:STRUCTURE",
         "yh:TOTYUMONO",
         "yh:TYPE",
         "yh:STRUCTURE",
         "yh:TOTYUMONO",
         "yh:TYPE",
+        "yh:WIDTH",
         "yh:WIDTH_RANK",
         "SK53_bulk:load"
     ],
     "wikipedia": [
         [
         "yh:WIDTH_RANK",
         "SK53_bulk:load"
     ],
     "wikipedia": [
         [
-            "English",
-            "English",
-            "en"
+            "Abkhazian",
+            "Аҧсшәа",
+            "ab"
         ],
         [
         ],
         [
-            "German",
-            "Deutsch",
-            "de"
+            "Achinese",
+            "Acèh",
+            "ace"
         ],
         [
         ],
         [
-            "Dutch",
-            "Nederlands",
-            "nl"
+            "Afrikaans",
+            "Afrikaans",
+            "af"
         ],
         [
         ],
         [
-            "French",
-            "Français",
-            "fr"
+            "Akan",
+            "Akan",
+            "ak"
         ],
         [
         ],
         [
-            "Italian",
-            "Italiano",
-            "it"
+            "Alemannisch",
+            "Alemannisch",
+            "als"
         ],
         [
         ],
         [
-            "Russian",
-            "Русский",
-            "ru"
+            "Amharic",
+            "አማርኛ",
+            "am"
         ],
         [
         ],
         [
-            "Spanish",
-            "Español",
-            "es"
+            "Aragonese",
+            "aragonés",
+            "an"
         ],
         [
         ],
         [
-            "Polish",
-            "Polski",
-            "pl"
+            "Old English",
+            "Ænglisc",
+            "ang"
         ],
         [
         ],
         [
-            "Swedish",
-            "Svenska",
-            "sv"
+            "Arabic",
+            "العربية",
+            "ar"
         ],
         [
         ],
         [
-            "Japanese",
-            "日本語",
-            "ja"
+            "Aramaic",
+            "ܐܪܡܝܐ",
+            "arc"
         ],
         [
         ],
         [
-            "Portuguese",
-            "Português",
-            "pt"
+            "Egyptian Arabic",
+            "مصرى",
+            "arz"
         ],
         [
         ],
         [
-            "Chinese",
-            "中文",
-            "zh"
+            "Assamese",
+            "অসমীয়া",
+            "as"
         ],
         [
         ],
         [
-            "Vietnamese",
-            "Tiếng Việt",
-            "vi"
+            "Asturian",
+            "asturianu",
+            "ast"
         ],
         [
         ],
         [
-            "Ukrainian",
-            "УкÑ\80аÑ\97нÑ\81Ñ\8cка",
-            "uk"
+            "Avaric",
+            "аваÑ\80",
+            "av"
         ],
         [
         ],
         [
-            "Catalan",
-            "Català",
-            "ca"
+            "Aymara",
+            "Aymar aru",
+            "ay"
         ],
         [
         ],
         [
-            "Norwegian (Bokmål)",
-            "Norsk (Bokmål)",
-            "no"
+            "Azerbaijani",
+            "azərbaycanca",
+            "az"
         ],
         [
         ],
         [
-            "Waray-Waray",
-            "Winaray",
-            "war"
+            "South Azerbaijani",
+            "تۆرکجه",
+            "azb"
         ],
         [
         ],
         [
-            "Cebuano",
-            "Sinugboanong Binisaya",
-            "ceb"
+            "Bashkir",
+            "башҡортса",
+            "ba"
         ],
         [
         ],
         [
-            "Finnish",
-            "Suomi",
-            "fi"
+            "Bavarian",
+            "Boarisch",
+            "bar"
         ],
         [
         ],
         [
-            "Persian",
-            "فارسی",
-            "fa"
+            "Samogitian",
+            "žemaitėška",
+            "bat-smg"
         ],
         [
         ],
         [
-            "Czech",
-            "Čeština",
-            "cs"
+            "Bikol Central",
+            "Bikol Central",
+            "bcl"
         ],
         [
         ],
         [
-            "Hungarian",
-            "Magyar",
-            "hu"
+            "Belarusian",
+            "беларуская",
+            "be"
         ],
         [
         ],
         [
-            "Korean",
-            "한국어",
-            "ko"
+            "беларуская (тарашкевіца)‎",
+            "беларуская (тарашкевіца)‎",
+            "be-x-old"
         ],
         [
         ],
         [
-            "Romanian",
-            "Română",
-            "ro"
+            "Bulgarian",
+            "български",
+            "bg"
         ],
         [
         ],
         [
-            "Arabic",
-            "العربية",
-            "ar"
+            "भोजपुरी",
+            "भोजपुरी",
+            "bh"
         ],
         [
         ],
         [
-            "Turkish",
-            "Türkçe",
-            "tr"
+            "Bislama",
+            "Bislama",
+            "bi"
         ],
         [
         ],
         [
-            "Indonesian",
-            "Bahasa Indonesia",
-            "id"
+            "Banjar",
+            "Bahasa Banjar",
+            "bjn"
         ],
         [
         ],
         [
-            "Kazakh",
-            "Қазақша",
-            "kk"
+            "Bambara",
+            "bamanankan",
+            "bm"
         ],
         [
         ],
         [
-            "Malay",
-            "Bahasa Melayu",
-            "ms"
+            "Bengali",
+            "বাংলা",
+            "bn"
         ],
         [
         ],
         [
-            "Serbian",
-            "Српски / Srpski",
-            "sr"
+            "Tibetan",
+            "བོད་ཡིག",
+            "bo"
         ],
         [
         ],
         [
-            "Slovak",
-            "Slovenčina",
-            "sk"
+            "Bishnupriya",
+            "বিষ্ণুপ্রিয়া মণিপুরী",
+            "bpy"
         ],
         [
         ],
         [
-            "Esperanto",
-            "Esperanto",
-            "eo"
+            "Breton",
+            "brezhoneg",
+            "br"
         ],
         [
         ],
         [
-            "Danish",
-            "Dansk",
-            "da"
+            "Bosnian",
+            "bosanski",
+            "bs"
         ],
         [
         ],
         [
-            "Lithuanian",
-            "Lietuvių",
-            "lt"
+            "Buginese",
+            "ᨅᨔ ᨕᨘᨁᨗ",
+            "bug"
         ],
         [
         ],
         [
-            "Basque",
-            "Euskara",
-            "eu"
+            "буряад",
+            "буряад",
+            "bxr"
         ],
         [
         ],
         [
-            "Bulgarian",
-            "Български",
-            "bg"
+            "Catalan",
+            "català",
+            "ca"
         ],
         [
         ],
         [
-            "Hebrew",
-            "עברית",
-            "he"
+            "Chavacano de Zamboanga",
+            "Chavacano de Zamboanga",
+            "cbk-zam"
         ],
         [
         ],
         [
-            "Slovenian",
-            "Slovenščina",
-            "sl"
+            "Min Dong Chinese",
+            "Mìng-dĕ̤ng-ngṳ̄",
+            "cdo"
         ],
         [
         ],
         [
-            "Croatian",
-            "Hrvatski",
-            "hr"
+            "Chechen",
+            "нохчийн",
+            "ce"
         ],
         [
         ],
         [
-            "Volapük",
-            "Volapük",
-            "vo"
+            "Cebuano",
+            "Cebuano",
+            "ceb"
         ],
         [
         ],
         [
-            "Estonian",
-            "Eesti",
-            "et"
+            "Chamorro",
+            "Chamoru",
+            "ch"
         ],
         [
         ],
         [
-            "Hindi",
-            "हिन्दी",
-            "hi"
+            "Cherokee",
+            "ᏣᎳᎩ",
+            "chr"
         ],
         [
         ],
         [
-            "Uzbek",
-            "O‘zbek",
-            "uz"
+            "Cheyenne",
+            "Tsetsêhestâhese",
+            "chy"
         ],
         [
         ],
         [
-            "Galician",
-            "Galego",
-            "gl"
+            "Central Kurdish",
+            "کوردیی ناوەندی",
+            "ckb"
         ],
         [
         ],
         [
-            "Norwegian (Nynorsk)",
-            "Nynorsk",
-            "nn"
+            "Corsican",
+            "corsu",
+            "co"
         ],
         [
         ],
         [
-            "Simple English",
-            "Simple English",
-            "simple"
+            "Cree",
+            "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
+            "cr"
         ],
         [
         ],
         [
-            "Azerbaijani",
-            "Azərbaycanca",
-            "az"
+            "Crimean Turkish",
+            "qırımtatarca",
+            "crh"
         ],
         [
         ],
         [
-            "Latin",
-            "Latina",
-            "la"
+            "Czech",
+            "čeština",
+            "cs"
         ],
         [
         ],
         [
-            "Greek",
-            "Ελληνικά",
-            "el"
+            "Kashubian",
+            "kaszëbsczi",
+            "csb"
         ],
         [
         ],
         [
-            "Thai",
-            "ไทย",
-            "th"
+            "Church Slavic",
+            "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
+            "cu"
         ],
         [
         ],
         [
-            "Serbo-Croatian",
-            "Srpskohrvatski / Српскохрватски",
-            "sh"
+            "Chuvash",
+            "Чӑвашла",
+            "cv"
         ],
         [
         ],
         [
-            "Georgian",
-            "ქართული",
-            "ka"
+            "Welsh",
+            "Cymraeg",
+            "cy"
         ],
         [
         ],
         [
-            "Occitan",
-            "Occitan",
-            "oc"
+            "Danish",
+            "dansk",
+            "da"
         ],
         [
         ],
         [
-            "Macedonian",
-            "Македонски",
-            "mk"
+            "German",
+            "Deutsch",
+            "de"
         ],
         [
         ],
         [
-            "Newar / Nepal Bhasa",
-            "नेपाल भाषा",
-            "new"
+            "Zazaki",
+            "Zazaki",
+            "diq"
         ],
         [
         ],
         [
-            "Tagalog",
-            "Tagalog",
-            "tl"
+            "Lower Sorbian",
+            "dolnoserbski",
+            "dsb"
         ],
         [
         ],
         [
-            "Piedmontese",
-            "Piemontèis",
-            "pms"
+            "Divehi",
+            "ދިވެހިބަސް",
+            "dv"
         ],
         [
         ],
         [
-            "Belarusian",
-            "Беларуская",
-            "be"
+            "Dzongkha",
+            "ཇོང་ཁ",
+            "dz"
         ],
         [
         ],
         [
-            "Haitian",
-            "Krèyol ayisyen",
-            "ht"
-        ],
-        [
-            "Tamil",
-            "தமிழ்",
-            "ta"
+            "Ewe",
+            "eʋegbe",
+            "ee"
         ],
         [
         ],
         [
-            "Telugu",
-            "తెలుగు",
-            "te"
+            "Greek",
+            "Ελληνικά",
+            "el"
         ],
         [
         ],
         [
-            "Belarusian (Taraškievica)",
-            "Беларуская (тарашкевіца)",
-            "be-x-old"
+            "Emiliano-Romagnolo",
+            "emiliàn e rumagnòl",
+            "eml"
         ],
         [
         ],
         [
-            "Latvian",
-            "Latviešu",
-            "lv"
+            "English",
+            "English",
+            "en"
         ],
         [
         ],
         [
-            "Breton",
-            "Brezhoneg",
-            "br"
+            "Esperanto",
+            "Esperanto",
+            "eo"
         ],
         [
         ],
         [
-            "Malagasy",
-            "Malagasy",
-            "mg"
+            "Spanish",
+            "español",
+            "es"
         ],
         [
         ],
         [
-            "Albanian",
-            "Shqip",
-            "sq"
+            "Estonian",
+            "eesti",
+            "et"
         ],
         [
         ],
         [
-            "Armenian",
-            "Հայերեն",
-            "hy"
+            "Basque",
+            "euskara",
+            "eu"
         ],
         [
         ],
         [
-            "Tatar",
-            "Tatarça / Татарча",
-            "tt"
+            "Extremaduran",
+            "estremeñu",
+            "ext"
         ],
         [
         ],
         [
-            "Javanese",
-            "Basa Jawa",
-            "jv"
+            "Persian",
+            "فارسی",
+            "fa"
         ],
         [
         ],
         [
-            "Welsh",
-            "Cymraeg",
-            "cy"
+            "Fulah",
+            "Fulfulde",
+            "ff"
         ],
         [
         ],
         [
-            "Marathi",
-            "मराठी",
-            "mr"
+            "Finnish",
+            "suomi",
+            "fi"
         ],
         [
         ],
         [
-            "Luxembourgish",
-            "Lëtzebuergesch",
-            "lb"
+            "Võro",
+            "Võro",
+            "fiu-vro"
         ],
         [
         ],
         [
-            "Icelandic",
-            "Íslenska",
-            "is"
+            "Fijian",
+            "Na Vosa Vakaviti",
+            "fj"
         ],
         [
         ],
         [
-            "Bosnian",
-            "Bosanski",
-            "bs"
+            "Faroese",
+            "føroyskt",
+            "fo"
         ],
         [
         ],
         [
-            "Burmese",
-            "မြန်မာဘာသာ",
-            "my"
+            "French",
+            "français",
+            "fr"
         ],
         [
         ],
         [
-            "Yoruba",
-            "Yorùbá",
-            "yo"
+            "Arpitan",
+            "arpetan",
+            "frp"
         ],
         [
         ],
         [
-            "Bashkir",
-            "Башҡорт",
-            "ba"
+            "Northern Frisian",
+            "Nordfriisk",
+            "frr"
         ],
         [
         ],
         [
-            "Malayalam",
-            "മലയാളം",
-            "ml"
+            "Friulian",
+            "furlan",
+            "fur"
         ],
         [
         ],
         [
-            "Aragonese",
-            "Aragonés",
-            "an"
+            "Western Frisian",
+            "Frysk",
+            "fy"
         ],
         [
         ],
         [
-            "Lombard",
-            "Lumbaart",
-            "lmo"
+            "Irish",
+            "Gaeilge",
+            "ga"
         ],
         [
         ],
         [
-            "Afrikaans",
-            "Afrikaans",
-            "af"
+            "Gagauz",
+            "Gagauz",
+            "gag"
         ],
         [
         ],
         [
-            "West Frisian",
-            "Frysk",
-            "fy"
+            "Gan Chinese",
+            "贛語",
+            "gan"
         ],
         [
         ],
         [
-            "Western Panjabi",
-            "شاہ مکھی پنجابی (Shāhmukhī Pañjābī)",
-            "pnb"
+            "Scottish Gaelic",
+            "Gàidhlig",
+            "gd"
         ],
         [
         ],
         [
-            "Bengali",
-            "বাংলা",
-            "bn"
+            "Galician",
+            "galego",
+            "gl"
         ],
         [
         ],
         [
-            "Swahili",
-            "Kiswahili",
-            "sw"
+            "Gilaki",
+            "گیلکی",
+            "glk"
         ],
         [
         ],
         [
-            "Bishnupriya Manipuri",
-            "ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী",
-            "bpy"
+            "Guarani",
+            "Avañe'ẽ",
+            "gn"
         ],
         [
         ],
         [
-            "Ido",
-            "Ido",
-            "io"
+            "Goan Konkani",
+            "गोवा कोंकणी / Gova Konknni",
+            "gom"
         ],
         [
         ],
         [
-            "Kirghiz",
-            "Кыргызча",
-            "ky"
+            "Gothic",
+            "𐌲𐌿𐍄𐌹𐍃𐌺",
+            "got"
         ],
         [
         ],
         [
-            "Urdu",
-            "اردو",
-            "ur"
+            "Gujarati",
+            "ગુજરાતી",
+            "gu"
         ],
         [
         ],
         [
-            "Nepali",
-            "नेपाली",
-            "ne"
+            "Manx",
+            "Gaelg",
+            "gv"
         ],
         [
         ],
         [
-            "Sicilian",
-            "Sicilianu",
-            "scn"
+            "Hausa",
+            "Hausa",
+            "ha"
         ],
         [
         ],
         [
-            "Gujarati",
-            "ગુજરાતી",
-            "gu"
+            "Hakka Chinese",
+            "客家語/Hak-kâ-ngî",
+            "hak"
         ],
         [
         ],
         [
-            "Cantonese",
-            "粵語",
-            "zh-yue"
+            "Hawaiian",
+            "Hawai`i",
+            "haw"
         ],
         [
         ],
         [
-            "Low Saxon",
-            "Plattdüütsch",
-            "nds"
+            "Hebrew",
+            "עברית",
+            "he"
         ],
         [
         ],
         [
-            "Kurdish",
-            "Kurdî / كوردی",
-            "ku"
+            "Hindi",
+            "हिन्दी",
+            "hi"
         ],
         [
         ],
         [
-            "Irish",
-            "Gaeilge",
-            "ga"
+            "Fiji Hindi",
+            "Fiji Hindi",
+            "hif"
         ],
         [
         ],
         [
-            "Asturian",
-            "Asturianu",
-            "ast"
+            "Croatian",
+            "hrvatski",
+            "hr"
         ],
         [
         ],
         [
-            "Quechua",
-            "Runa Simi",
-            "qu"
+            "Upper Sorbian",
+            "hornjoserbsce",
+            "hsb"
         ],
         [
         ],
         [
-            "Sundanese",
-            "Basa Sunda",
-            "su"
+            "Haitian",
+            "Kreyòl ayisyen",
+            "ht"
         ],
         [
         ],
         [
-            "Chuvash",
-            "Чăваш",
-            "cv"
+            "Hungarian",
+            "magyar",
+            "hu"
         ],
         [
         ],
         [
-            "Scots",
-            "Scots",
-            "sco"
+            "Armenian",
+            "Հայերեն",
+            "hy"
         ],
         [
             "Interlingua",
         ],
         [
             "Interlingua",
-            "Interlingua",
+            "interlingua",
             "ia"
         ],
         [
             "ia"
         ],
         [
-            "Alemannic",
-            "Alemannisch",
-            "als"
+            "Indonesian",
+            "Bahasa Indonesia",
+            "id"
         ],
         [
         ],
         [
-            "Buginese",
-            "Basa Ugi",
-            "bug"
+            "Interlingue",
+            "Interlingue",
+            "ie"
         ],
         [
         ],
         [
-            "Neapolitan",
-            "Nnapulitano",
-            "nap"
+            "Igbo",
+            "Igbo",
+            "ig"
         ],
         [
         ],
         [
-            "Samogitian",
-            "Žemaitėška",
-            "bat-smg"
+            "Inupiaq",
+            "Iñupiak",
+            "ik"
         ],
         [
         ],
         [
-            "Kannada",
-            "ಕನ್ನಡ",
-            "kn"
+            "Iloko",
+            "Ilokano",
+            "ilo"
         ],
         [
         ],
         [
-            "Banyumasan",
-            "Basa Banyumasan",
-            "map-bms"
+            "Ido",
+            "Ido",
+            "io"
         ],
         [
         ],
         [
-            "Walloon",
-            "Walon",
-            "wa"
+            "Icelandic",
+            "íslenska",
+            "is"
         ],
         [
         ],
         [
-            "Amharic",
-            "አማርኛ",
-            "am"
+            "Italian",
+            "italiano",
+            "it"
         ],
         [
         ],
         [
-            "Sorani",
-            "Soranî / کوردی",
-            "ckb"
+            "Inuktitut",
+            "ᐃᓄᒃᑎᑐᑦ/inuktitut",
+            "iu"
         ],
         [
         ],
         [
-            "Scottish Gaelic",
-            "Gàidhlig",
-            "gd"
+            "Japanese",
+            "日本語",
+            "ja"
         ],
         [
         ],
         [
-            "Fiji Hindi",
-            "Fiji Hindi",
-            "hif"
+            "Lojban",
+            "Lojban",
+            "jbo"
         ],
         [
         ],
         [
-            "Min Nan",
-            "Bân-lâm-gú",
-            "zh-min-nan"
+            "Javanese",
+            "Basa Jawa",
+            "jv"
         ],
         [
         ],
         [
-            "Tajik",
-            "Тоҷикӣ",
-            "tg"
+            "Georgian",
+            "ქართული",
+            "ka"
         ],
         [
         ],
         [
-            "Mazandarani",
-            "مَزِروني",
-            "mzn"
+            "Kara-Kalpak",
+            "Qaraqalpaqsha",
+            "kaa"
         ],
         [
         ],
         [
-            "Egyptian Arabic",
-            "مصرى (Maṣrī)",
-            "arz"
+            "Kabyle",
+            "Taqbaylit",
+            "kab"
         ],
         [
         ],
         [
-            "Yiddish",
-            "ייִדיש",
-            "yi"
+            "Kabardian",
+            "Адыгэбзэ",
+            "kbd"
         ],
         [
         ],
         [
-            "Venetian",
-            "Vèneto",
-            "vec"
+            "Kongo",
+            "Kongo",
+            "kg"
         ],
         [
         ],
         [
-            "Mongolian",
-            "Монгол",
-            "mn"
+            "Kikuyu",
+            "Gĩkũyũ",
+            "ki"
         ],
         [
         ],
         [
-            "Tarantino",
-            "Tarandíne",
-            "roa-tara"
+            "Kazakh",
+            "қазақша",
+            "kk"
         ],
         [
         ],
         [
-            "Sanskrit",
-            "संस्कृतम्",
-            "sa"
+            "Kalaallisut",
+            "kalaallisut",
+            "kl"
         ],
         [
         ],
         [
-            "Nahuatl",
-            "Nāhuatl",
-            "nah"
+            "Khmer",
+            "ភាសាខ្មែរ",
+            "km"
         ],
         [
         ],
         [
-            "Ossetian",
-            "Иронау",
-            "os"
+            "Kannada",
+            "ಕನ್ನಡ",
+            "kn"
         ],
         [
         ],
         [
-            "Sakha",
-            "Саха тыла (Saxa Tyla)",
-            "sah"
+            "Korean",
+            "한국어",
+            "ko"
         ],
         [
         ],
         [
-            "Kapampangan",
-            "Kapampangan",
-            "pam"
+            "Komi-Permyak",
+            "Перем Коми",
+            "koi"
         ],
         [
         ],
         [
-            "Upper Sorbian",
-            "Hornjoserbsce",
-            "hsb"
+            "Karachay-Balkar",
+            "къарачай-малкъар",
+            "krc"
         ],
         [
         ],
         [
-            "Sinhalese",
-            "à·\83à·\92à¶\82à·\84ල",
-            "si"
+            "Kashmiri",
+            "à¤\95à¥\89शà¥\81र / Ú©Ù²Ø´Ù\8fر",
+            "ks"
         ],
         [
         ],
         [
-            "Northern Sami",
-            "Sámegiella",
-            "se"
+            "Colognian",
+            "Ripoarisch",
+            "ksh"
         ],
         [
         ],
         [
-            "Limburgish",
-            "Limburgs",
-            "li"
+            "Kurdish",
+            "Kurdî",
+            "ku"
         ],
         [
         ],
         [
-            "Maori",
-            "Māori",
-            "mi"
+            "Komi",
+            "коми",
+            "kv"
         ],
         [
         ],
         [
-            "Bavarian",
-            "Boarisch",
-            "bar"
+            "Cornish",
+            "kernowek",
+            "kw"
         ],
         [
         ],
         [
-            "Corsican",
-            "Corsu",
-            "co"
+            "Kyrgyz",
+            "Кыргызча",
+            "ky"
         ],
         [
         ],
         [
-            "Ilokano",
-            "Ilokano",
-            "ilo"
+            "Latin",
+            "Latina",
+            "la"
         ],
         [
         ],
         [
-            "Gan",
-            "贛語",
-            "gan"
+            "Ladino",
+            "Ladino",
+            "lad"
         ],
         [
         ],
         [
-            "Tibetan",
-            "བོད་སྐད",
-            "bo"
+            "Luxembourgish",
+            "Lëtzebuergesch",
+            "lb"
         ],
         [
         ],
         [
-            "Gilaki",
-            "گیلکی",
-            "glk"
+            "лакку",
+            "лакку",
+            "lbe"
         ],
         [
         ],
         [
-            "Faroese",
-            "Føroyskt",
-            "fo"
+            "Lezghian",
+            "лезги",
+            "lez"
         ],
         [
         ],
         [
-            "Rusyn",
-            "русиньскый язык",
-            "rue"
+            "Ganda",
+            "Luganda",
+            "lg"
         ],
         [
         ],
         [
-            "Punjabi",
-            "ਪੰਜਾਬੀ",
-            "pa"
+            "Limburgish",
+            "Limburgs",
+            "li"
         ],
         [
         ],
         [
-            "Central_Bicolano",
-            "Bikol",
-            "bcl"
+            "Ligurian",
+            "Ligure",
+            "lij"
         ],
         [
         ],
         [
-            "Hill Mari",
-            "Кырык Мары (Kyryk Mary) ",
-            "mrj"
+            "Lombard",
+            "lumbaart",
+            "lmo"
         ],
         [
         ],
         [
-            "Võro",
-            "Võro",
-            "fiu-vro"
+            "Lingala",
+            "lingála",
+            "ln"
         ],
         [
         ],
         [
-            "Dutch Low Saxon",
-            "Nedersaksisch",
-            "nds-nl"
+            "Lao",
+            "ລາວ",
+            "lo"
         ],
         [
         ],
         [
-            "Turkmen",
-            "تركمن / Туркмен",
-            "tk"
+            "Northern Luri",
+            "لۊری شومالی",
+            "lrc"
         ],
         [
         ],
         [
-            "Pashto",
-            "پښتو",
-            "ps"
+            "Lithuanian",
+            "lietuvių",
+            "lt"
         ],
         [
         ],
         [
-            "West Flemish",
-            "West-Vlams",
-            "vls"
+            "Latgalian",
+            "latgaļu",
+            "ltg"
         ],
         [
         ],
         [
-            "Mingrelian",
-            "მარგალური (Margaluri)",
-            "xmf"
+            "Latvian",
+            "latviešu",
+            "lv"
         ],
         [
         ],
         [
-            "Manx",
-            "Gaelg",
-            "gv"
+            "Maithili",
+            "मैथिली",
+            "mai"
         ],
         [
         ],
         [
-            "Zazaki",
-            "Zazaki",
-            "diq"
+            "Basa Banyumasan",
+            "Basa Banyumasan",
+            "map-bms"
         ],
         [
         ],
         [
-            "Pangasinan",
-            "Pangasinan",
-            "pag"
+            "Moksha",
+            "мокшень",
+            "mdf"
         ],
         [
         ],
         [
-            "Komi",
-            "Коми",
-            "kv"
+            "Malagasy",
+            "Malagasy",
+            "mg"
         ],
         [
         ],
         [
-            "Zeelandic",
-            "Zeêuws",
-            "zea"
+            "Eastern Mari",
+            "олык марий",
+            "mhr"
         ],
         [
         ],
         [
-            "Divehi",
-            "ދިވެހިބަސް",
-            "dv"
+            "Maori",
+            "Māori",
+            "mi"
         ],
         [
         ],
         [
-            "Oriya",
-            "ଓଡ଼ିଆ",
-            "or"
+            "Minangkabau",
+            "Baso Minangkabau",
+            "min"
         ],
         [
         ],
         [
-            "Khmer",
-            "ភាសាខ្មែរ",
-            "km"
+            "Macedonian",
+            "македонски",
+            "mk"
         ],
         [
         ],
         [
-            "Norman",
-            "Nouormand/Normaund",
-            "nrm"
+            "Malayalam",
+            "മലയാളം",
+            "ml"
         ],
         [
         ],
         [
-            "Romansh",
-            "Rumantsch",
-            "rm"
+            "Mongolian",
+            "монгол",
+            "mn"
         ],
         [
         ],
         [
-            "Komi-Permyak",
-            "Перем Коми (Perem Komi)",
-            "koi"
+            "Marathi",
+            "मराठी",
+            "mr"
         ],
         [
         ],
         [
-            "Udmurt",
-            "УдмÑ\83Ñ\80Ñ\82 ÐºÑ\8bл",
-            "udm"
+            "Western Mari",
+            "кÑ\8bÑ\80Ñ\8bк Ð¼Ð°Ñ\80Ñ\8b",
+            "mrj"
         ],
         [
         ],
         [
-            "Meadow Mari",
-            "Олык Марий (Olyk Marij)",
-            "mhr"
+            "Malay",
+            "Bahasa Melayu",
+            "ms"
         ],
         [
         ],
         [
-            "Ladino",
-            "Dzhudezmo",
-            "lad"
+            "Maltese",
+            "Malti",
+            "mt"
         ],
         [
         ],
         [
-            "North Frisian",
-            "Nordfriisk",
-            "frr"
+            "Mirandese",
+            "Mirandés",
+            "mwl"
         ],
         [
         ],
         [
-            "Kashubian",
-            "Kaszëbsczi",
-            "csb"
+            "Burmese",
+            "မြန်မာဘာသာ",
+            "my"
         ],
         [
         ],
         [
-            "Ligurian",
-            "Líguru",
-            "lij"
+            "Erzya",
+            "эрзянь",
+            "myv"
         ],
         [
         ],
         [
-            "Wu",
-            "吴语",
-            "wuu"
+            "Mazanderani",
+            "مازِرونی",
+            "mzn"
         ],
         [
         ],
         [
-            "Friulian",
-            "Furlan",
-            "fur"
+            "Nauru",
+            "Dorerin Naoero",
+            "na"
         ],
         [
         ],
         [
-            "Vepsian",
-            "Vepsän",
-            "vep"
+            "Nāhuatl",
+            "Nāhuatl",
+            "nah"
         ],
         [
         ],
         [
-            "Classical Chinese",
-            "古文 / 文言文",
-            "zh-classical"
+            "Neapolitan",
+            "Napulitano",
+            "nap"
         ],
         [
         ],
         [
-            "Uyghur",
-            "ئۇيغۇر تىلى",
-            "ug"
+            "Low German",
+            "Plattdüütsch",
+            "nds"
         ],
         [
         ],
         [
-            "Saterland Frisian",
-            "Seeltersk",
-            "stq"
+            "Low Saxon (Netherlands)",
+            "Nedersaksies",
+            "nds-nl"
         ],
         [
         ],
         [
-            "Sardinian",
-            "Sardu",
-            "sc"
-        ],
-        [
-            "Aromanian",
-            "Armãneashce",
-            "roa-rup"
-        ],
-        [
-            "Pali",
-            "पाऴि",
-            "pi"
-        ],
-        [
-            "Somali",
-            "Soomaaliga",
-            "so"
+            "Nepali",
+            "नेपाली",
+            "ne"
         ],
         [
         ],
         [
-            "Bihari",
-            "भà¥\8bà¤\9cपà¥\81रà¥\80",
-            "bh"
+            "Newari",
+            "नà¥\87पाल à¤­à¤¾à¤·à¤¾",
+            "new"
         ],
         [
         ],
         [
-            "Maltese",
-            "Malti",
-            "mt"
+            "Dutch",
+            "Nederlands",
+            "nl"
         ],
         [
         ],
         [
-            "Aymara",
-            "Aymar",
-            "ay"
+            "Norwegian Nynorsk",
+            "norsk nynorsk",
+            "nn"
         ],
         [
         ],
         [
-            "Ripuarian",
-            "Ripoarisch",
-            "ksh"
+            "Norwegian",
+            "norsk bokmål",
+            "no"
         ],
         [
             "Novial",
         ],
         [
             "Novial",
@@ -40290,14 +40471,14 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
             "nov"
         ],
         [
             "nov"
         ],
         [
-            "Anglo-Saxon",
-            "Englisc",
-            "ang"
+            "Nouormand",
+            "Nouormand",
+            "nrm"
         ],
         [
         ],
         [
-            "Cornish",
-            "Kernewek/Karnuack",
-            "kw"
+            "Northern Sotho",
+            "Sesotho sa Leboa",
+            "nso"
         ],
         [
             "Navajo",
         ],
         [
             "Navajo",
@@ -40305,459 +40486,454 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
             "nv"
         ],
         [
             "nv"
         ],
         [
-            "Picard",
-            "Picard",
-            "pcd"
-        ],
-        [
-            "Hakka",
-            "Hak-kâ-fa / 客家話",
-            "hak"
+            "Nyanja",
+            "Chi-Chewa",
+            "ny"
         ],
         [
         ],
         [
-            "Guarani",
-            "Avañe'ẽ",
-            "gn"
+            "Occitan",
+            "occitan",
+            "oc"
         ],
         [
         ],
         [
-            "Extremaduran",
-            "Estremeñu",
-            "ext"
+            "Oromo",
+            "Oromoo",
+            "om"
         ],
         [
         ],
         [
-            "Franco-Provençal/Arpitan",
-            "Arpitan",
-            "frp"
+            "Oriya",
+            "ଓଡ଼ିଆ",
+            "or"
         ],
         [
         ],
         [
-            "Assamese",
-            "অসমীয়া",
-            "as"
+            "Ossetic",
+            "Ирон",
+            "os"
         ],
         [
         ],
         [
-            "Silesian",
-            "Ślůnski",
-            "szl"
+            "Punjabi",
+            "ਪੰਜਾਬੀ",
+            "pa"
         ],
         [
         ],
         [
-            "Gagauz",
-            "Gagauz",
-            "gag"
+            "Pangasinan",
+            "Pangasinan",
+            "pag"
         ],
         [
         ],
         [
-            "Interlingue",
-            "Interlingue",
-            "ie"
+            "Pampanga",
+            "Kapampangan",
+            "pam"
         ],
         [
         ],
         [
-            "Lingala",
-            "Lingala",
-            "ln"
+            "Papiamento",
+            "Papiamentu",
+            "pap"
         ],
         [
         ],
         [
-            "Emilian-Romagnol",
-            "Emiliàn e rumagnòl",
-            "eml"
+            "Picard",
+            "Picard",
+            "pcd"
         ],
         [
         ],
         [
-            "Chechen",
-            "Нохчийн",
-            "ce"
+            "Pennsylvania German",
+            "Deitsch",
+            "pdc"
         ],
         [
         ],
         [
-            "Kalmyk",
-            "Хальмг",
-            "xal"
+            "Palatine German",
+            "Pälzisch",
+            "pfl"
         ],
         [
         ],
         [
-            "Palatinate German",
-            "Pfälzisch",
-            "pfl"
+            "Pali",
+            "पालि",
+            "pi"
         ],
         [
         ],
         [
-            "Hawaiian",
-            "Hawai`i",
-            "haw"
+            "Norfuk / Pitkern",
+            "Norfuk / Pitkern",
+            "pih"
         ],
         [
         ],
         [
-            "Karachay-Balkar",
-            "Къарачай-Малкъар (Qarachay-Malqar)",
-            "krc"
+            "Polish",
+            "polski",
+            "pl"
         ],
         [
         ],
         [
-            "Pennsylvania German",
-            "Deitsch",
-            "pdc"
+            "Piedmontese",
+            "Piemontèis",
+            "pms"
         ],
         [
         ],
         [
-            "Kinyarwanda",
-            "Ikinyarwanda",
-            "rw"
+            "Western Punjabi",
+            "پنجابی",
+            "pnb"
         ],
         [
         ],
         [
-            "Crimean Tatar",
-            "Qırımtatarca",
-            "crh"
+            "Pontic",
+            "Ποντιακά",
+            "pnt"
         ],
         [
         ],
         [
-            "Acehnese",
-            "Bahsa Acèh",
-            "ace"
+            "Pashto",
+            "پښتو",
+            "ps"
         ],
         [
         ],
         [
-            "Tongan",
-            "faka Tonga",
-            "to"
+            "Portuguese",
+            "português",
+            "pt"
         ],
         [
         ],
         [
-            "Greenlandic",
-            "Kalaallisut",
-            "kl"
+            "Quechua",
+            "Runa Simi",
+            "qu"
         ],
         [
         ],
         [
-            "Lower Sorbian",
-            "Dolnoserbski",
-            "dsb"
+            "Romansh",
+            "rumantsch",
+            "rm"
         ],
         [
         ],
         [
-            "Aramaic",
-            "ܐܪܡܝܐ",
-            "arc"
+            "Romani",
+            "Romani",
+            "rmy"
         ],
         [
         ],
         [
-            "Erzya",
-            "Эрзянь (Erzjanj Kelj)",
-            "myv"
+            "Rundi",
+            "Kirundi",
+            "rn"
         ],
         [
         ],
         [
-            "Lezgian",
-            "Лезги чІал (Lezgi č’al)",
-            "lez"
+            "Romanian",
+            "română",
+            "ro"
         ],
         [
         ],
         [
-            "Banjar",
-            "Bahasa Banjar",
-            "bjn"
+            "Aromanian",
+            "armãneashti",
+            "roa-rup"
         ],
         [
         ],
         [
-            "Shona",
-            "chiShona",
-            "sn"
+            "tarandíne",
+            "tarandíne",
+            "roa-tara"
         ],
         [
         ],
         [
-            "Papiamentu",
-            "Papiamentu",
-            "pap"
+            "Russian",
+            "русский",
+            "ru"
         ],
         [
         ],
         [
-            "Kabyle",
-            "Taqbaylit",
-            "kab"
+            "Rusyn",
+            "русиньскый",
+            "rue"
         ],
         [
         ],
         [
-            "Tok Pisin",
-            "Tok Pisin",
-            "tpi"
+            "Kinyarwanda",
+            "Kinyarwanda",
+            "rw"
         ],
         [
         ],
         [
-            "Lak",
-            "Лакку",
-            "lbe"
+            "Sanskrit",
+            "संस्कृतम्",
+            "sa"
         ],
         [
         ],
         [
-            "Buryat (Russia)",
-            "Буряад",
-            "bxr"
+            "Sakha",
+            "саха тыла",
+            "sah"
         ],
         [
         ],
         [
-            "Lojban",
-            "Lojban",
-            "jbo"
+            "Sardinian",
+            "sardu",
+            "sc"
         ],
         [
         ],
         [
-            "Wolof",
-            "Wolof",
-            "wo"
+            "Sicilian",
+            "sicilianu",
+            "scn"
         ],
         [
         ],
         [
-            "Moksha",
-            "Мокшень (Mokshanj Kälj)",
-            "mdf"
+            "Scots",
+            "Scots",
+            "sco"
         ],
         [
         ],
         [
-            "Zamboanga Chavacano",
-            "Chavacano de Zamboanga",
-            "cbk-zam"
+            "Sindhi",
+            "سنڌي",
+            "sd"
         ],
         [
         ],
         [
-            "Avar",
-            "Авар",
-            "av"
+            "Northern Sami",
+            "sámegiella",
+            "se"
         ],
         [
         ],
         [
-            "Sranan",
-            "Sranantongo",
-            "srn"
+            "Sango",
+            "Sängö",
+            "sg"
         ],
         [
         ],
         [
-            "Mirandese",
-            "Mirandés",
-            "mwl"
+            "Serbo-Croatian",
+            "srpskohrvatski / српскохрватски",
+            "sh"
         ],
         [
         ],
         [
-            "Kabardian Circassian",
-            "Адыгэбзэ (Adighabze)",
-            "kbd"
+            "Sinhala",
+            "සිංහල",
+            "si"
         ],
         [
         ],
         [
-            "Tahitian",
-            "Reo Mā`ohi",
-            "ty"
+            "Simple English",
+            "Simple English",
+            "simple"
         ],
         [
         ],
         [
-            "Lao",
-            "ລາວ",
-            "lo"
+            "Slovak",
+            "slovenčina",
+            "sk"
         ],
         [
         ],
         [
-            "Abkhazian",
-            "Аҧсуа",
-            "ab"
+            "Slovenian",
+            "slovenščina",
+            "sl"
         ],
         [
         ],
         [
-            "Tetum",
-            "Tetun",
-            "tet"
+            "Samoan",
+            "Gagana Samoa",
+            "sm"
         ],
         [
         ],
         [
-            "Latgalian",
-            "Latgaļu",
-            "ltg"
+            "Shona",
+            "chiShona",
+            "sn"
         ],
         [
         ],
         [
-            "Nauruan",
-            "dorerin Naoero",
-            "na"
+            "Somali",
+            "Soomaaliga",
+            "so"
         ],
         [
         ],
         [
-            "Kongo",
-            "KiKongo",
-            "kg"
+            "Albanian",
+            "shqip",
+            "sq"
         ],
         [
         ],
         [
-            "Igbo",
-            "Igbo",
-            "ig"
+            "Serbian",
+            "српски / srpski",
+            "sr"
         ],
         [
         ],
         [
-            "Northern Sotho",
-            "Sesotho sa Leboa",
-            "nso"
+            "Sranan Tongo",
+            "Sranantongo",
+            "srn"
         ],
         [
         ],
         [
-            "Zhuang",
-            "Cuengh",
-            "za"
+            "Swati",
+            "SiSwati",
+            "ss"
         ],
         [
         ],
         [
-            "Karakalpak",
-            "Qaraqalpaqsha",
-            "kaa"
+            "Southern Sotho",
+            "Sesotho",
+            "st"
         ],
         [
         ],
         [
-            "Zulu",
-            "isiZulu",
-            "zu"
+            "Saterland Frisian",
+            "Seeltersk",
+            "stq"
         ],
         [
         ],
         [
-            "Cheyenne",
-            "Tsetsêhestâhese",
-            "chy"
+            "Sundanese",
+            "Basa Sunda",
+            "su"
         ],
         [
         ],
         [
-            "Romani",
-            "romani - रोमानी",
-            "rmy"
+            "Swedish",
+            "svenska",
+            "sv"
         ],
         [
         ],
         [
-            "Old Church Slavonic",
-            "Словѣньскъ",
-            "cu"
+            "Swahili",
+            "Kiswahili",
+            "sw"
         ],
         [
         ],
         [
-            "Tswana",
-            "Setswana",
-            "tn"
+            "Silesian",
+            "ślůnski",
+            "szl"
         ],
         [
         ],
         [
-            "Cherokee",
-            "ᏣᎳᎩ",
-            "chr"
+            "Tamil",
+            "தமிழ்",
+            "ta"
         ],
         [
         ],
         [
-            "Bislama",
-            "Bislama",
-            "bi"
+            "Telugu",
+            "తెలుగు",
+            "te"
         ],
         [
         ],
         [
-            "Min Dong",
-            "Mìng-dĕ̤ng-ngṳ̄",
-            "cdo"
+            "Tetum",
+            "tetun",
+            "tet"
         ],
         [
         ],
         [
-            "Gothic",
-            "𐌲𐌿𐍄𐌹𐍃𐌺",
-            "got"
+            "Tajik",
+            "тоҷикӣ",
+            "tg"
         ],
         [
         ],
         [
-            "Samoan",
-            "Gagana Samoa",
-            "sm"
+            "Thai",
+            "ไทย",
+            "th"
         ],
         [
         ],
         [
-            "Moldovan",
-            "Молдовеняскэ",
-            "mo"
+            "Tigrinya",
+            "ትግርኛ",
+            "ti"
         ],
         [
         ],
         [
-            "Bambara",
-            "Bamanankan",
-            "bm"
+            "Turkmen",
+            "Türkmençe",
+            "tk"
         ],
         [
         ],
         [
-            "Inuktitut",
-            "ᐃᓄᒃᑎᑐᑦ",
-            "iu"
+            "Tagalog",
+            "Tagalog",
+            "tl"
         ],
         [
         ],
         [
-            "Norfolk",
-            "Norfuk",
-            "pih"
+            "Tswana",
+            "Setswana",
+            "tn"
         ],
         [
         ],
         [
-            "Pontic",
-            "Ποντιακά",
-            "pnt"
+            "Tongan",
+            "lea faka-Tonga",
+            "to"
         ],
         [
         ],
         [
-            "Sindhi",
-            "سنڌي، سندھی ، सिन्ध",
-            "sd"
+            "Tok Pisin",
+            "Tok Pisin",
+            "tpi"
         ],
         [
         ],
         [
-            "Swati",
-            "SiSwati",
-            "ss"
+            "Turkish",
+            "Türkçe",
+            "tr"
         ],
         [
         ],
         [
-            "Kikuyu",
-            "Gĩkũyũ",
-            "ki"
+            "Tsonga",
+            "Xitsonga",
+            "ts"
         ],
         [
         ],
         [
-            "Ewe",
-            "Eʋegbe",
-            "ee"
+            "Tatar",
+            "татарча/tatarça",
+            "tt"
         ],
         [
         ],
         [
-            "Hausa",
-            "هَوُسَ",
-            "ha"
+            "Tumbuka",
+            "chiTumbuka",
+            "tum"
         ],
         [
         ],
         [
-            "Oromo",
-            "Oromoo",
-            "om"
+            "Twi",
+            "Twi",
+            "tw"
         ],
         [
         ],
         [
-            "Fijian",
-            "Na Vosa Vakaviti",
-            "fj"
+            "Tahitian",
+            "reo tahiti",
+            "ty"
         ],
         [
         ],
         [
-            "Tigrinya",
-            "ትግርኛ",
-            "ti"
+            "Tuvinian",
+            "тыва дыл",
+            "tyv"
         ],
         [
         ],
         [
-            "Tsonga",
-            "Xitsonga",
-            "ts"
+            "Udmurt",
+            "удмурт",
+            "udm"
         ],
         [
         ],
         [
-            "Kashmiri",
-            "कश्मीरी / كشميري",
-            "ks"
+            "Uyghur",
+            "ئۇيغۇرچە / Uyghurche",
+            "ug"
         ],
         [
         ],
         [
-            "Venda",
-            "Tshivenda",
-            "ve"
+            "Ukrainian",
+            "українська",
+            "uk"
         ],
         [
         ],
         [
-            "Sango",
-            "Sängö",
-            "sg"
+            "Urdu",
+            "اردو",
+            "ur"
         ],
         [
         ],
         [
-            "Kirundi",
-            "Kirundi",
-            "rn"
+            "Uzbek",
+            "oʻzbekcha/ўзбекча",
+            "uz"
         ],
         [
         ],
         [
-            "Sesotho",
-            "Sesotho",
-            "st"
+            "Venda",
+            "Tshivenda",
+            "ve"
         ],
         [
         ],
         [
-            "Dzongkha",
-            "ཇོང་ཁ",
-            "dz"
+            "Venetian",
+            "vèneto",
+            "vec"
         ],
         [
         ],
         [
-            "Cree",
-            "Nehiyaw",
-            "cr"
+            "Veps",
+            "vepsän kel’",
+            "vep"
         ],
         [
         ],
         [
-            "Akan",
-            "Akana",
-            "ak"
+            "Vietnamese",
+            "Tiếng Việt",
+            "vi"
         ],
         [
         ],
         [
-            "Tumbuka",
-            "chiTumbuka",
-            "tum"
+            "West Flemish",
+            "West-Vlams",
+            "vls"
         ],
         [
         ],
         [
-            "Luganda",
-            "Luganda",
-            "lg"
+            "Volapük",
+            "Volapük",
+            "vo"
         ],
         [
         ],
         [
-            "Chichewa",
-            "Chi-Chewa",
-            "ny"
+            "Walloon",
+            "walon",
+            "wa"
         ],
         [
         ],
         [
-            "Fula",
-            "Fulfulde",
-            "ff"
+            "Waray",
+            "Winaray",
+            "war"
         ],
         [
         ],
         [
-            "Inupiak",
-            "Iñupiak",
-            "ik"
+            "Wolof",
+            "Wolof",
+            "wo"
         ],
         [
         ],
         [
-            "Chamorro",
-            "Chamoru",
-            "ch"
+            "Wu Chinese",
+            "吴语",
+            "wuu"
         ],
         [
         ],
         [
-            "Twi",
-            "Twi",
-            "tw"
+            "Kalmyk",
+            "хальмг",
+            "xal"
         ],
         [
             "Xhosa",
         ],
         [
             "Xhosa",
@@ -40765,54 +40941,54 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
             "xh"
         ],
         [
             "xh"
         ],
         [
-            "Ndonga",
-            "Oshiwambo",
-            "ng"
+            "Mingrelian",
+            "მარგალური",
+            "xmf"
         ],
         [
         ],
         [
-            "Sichuan Yi",
-            "ꆇꉙ",
-            "ii"
+            "Yiddish",
+            "ייִדיש",
+            "yi"
         ],
         [
         ],
         [
-            "Choctaw",
-            "Choctaw",
-            "cho"
+            "Yoruba",
+            "Yorùbá",
+            "yo"
         ],
         [
         ],
         [
-            "Marshallese",
-            "Ebon",
-            "mh"
+            "Zhuang",
+            "Vahcuengh",
+            "za"
         ],
         [
         ],
         [
-            "Afar",
-            "Afar",
-            "aa"
+            "Zeelandic",
+            "Zeêuws",
+            "zea"
         ],
         [
         ],
         [
-            "Kuanyama",
-            "Kuanyama",
-            "kj"
+            "Chinese",
+            "中文",
+            "zh"
         ],
         [
         ],
         [
-            "Hiri Motu",
-            "Hiri Motu",
-            "ho"
+            "Classical Chinese",
+            "文言",
+            "zh-classical"
         ],
         [
         ],
         [
-            "Muscogee",
-            "Muskogee",
-            "mus"
+            "Chinese (Min Nan)",
+            "Bân-lâm-gú",
+            "zh-min-nan"
         ],
         [
         ],
         [
-            "Kanuri",
-            "Kanuri",
-            "kr"
+            "Cantonese",
+            "粵語",
+            "zh-yue"
         ],
         [
         ],
         [
-            "Herero",
-            "Otsiherero",
-            "hz"
+            "Zulu",
+            "isiZulu",
+            "zu"
         ]
     ],
     "imperial": {
         ]
     ],
     "imperial": {
@@ -50211,2599 +50387,2571 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                                     -132.230994,
                                     57.19682
                                 ],
                                     -132.230994,
                                     57.19682
                                 ],
-                                [
-                                    -132.276366,
-                                    57.14889
-                                ],
-                                [
-                                    -132.34122,
-                                    57.080393
-                                ],
-                                [
-                                    -132.16229,
-                                    57.050317
-                                ],
-                                [
-                                    -132.031859,
-                                    57.028406
-                                ],
-                                [
-                                    -132.107384,
-                                    56.858753
-                                ],
-                                [
-                                    -131.871558,
-                                    56.79346
-                                ],
-                                [
-                                    -131.865874,
-                                    56.785708
-                                ],
-                                [
-                                    -131.872411,
-                                    56.77297
-                                ],
-                                [
-                                    -131.882617,
-                                    56.759146
-                                ],
-                                [
-                                    -131.887966,
-                                    56.747958
-                                ],
-                                [
-                                    -131.886028,
-                                    56.737055
-                                ],
-                                [
-                                    -131.880705,
-                                    56.728838
-                                ],
-                                [
-                                    -131.864789,
-                                    56.71349
-                                ],
-                                [
-                                    -131.838976,
-                                    56.682278
-                                ],
-                                [
-                                    -131.830424,
-                                    56.664759
-                                ],
-                                [
-                                    -131.826574,
-                                    56.644606
-                                ],
-                                [
-                                    -131.832103,
-                                    56.603368
-                                ],
-                                [
-                                    -131.825592,
-                                    56.593343
-                                ],
-                                [
-                                    -131.799108,
-                                    56.587658
-                                ],
-                                [
-                                    -131.692293,
-                                    56.585074
-                                ],
-                                [
-                                    -131.585891,
-                                    56.595048
-                                ],
-                                [
-                                    -131.560363,
-                                    56.594066
-                                ],
-                                [
-                                    -131.536437,
-                                    56.585229
-                                ],
-                                [
-                                    -131.491659,
-                                    56.560166
-                                ],
-                                [
-                                    -131.345699,
-                                    56.503271
-                                ],
-                                [
-                                    -131.215604,
-                                    56.45255
-                                ],
-                                [
-                                    -131.100546,
-                                    56.407669
-                                ],
-                                [
-                                    -131.016934,
-                                    56.38705
-                                ],
-                                [
-                                    -130.839089,
-                                    56.372452
-                                ],
-                                [
-                                    -130.760334,
-                                    56.345192
-                                ],
-                                [
-                                    -130.645768,
-                                    56.261942
-                                ],
-                                [
-                                    -130.602256,
-                                    56.247059
-                                ],
-                                [
-                                    -130.495518,
-                                    56.232434
-                                ],
-                                [
-                                    -130.47229,
-                                    56.22489
-                                ],
-                                [
-                                    -130.458053,
-                                    56.210653
-                                ],
-                                [
-                                    -130.427926,
-                                    56.143964
-                                ],
-                                [
-                                    -130.418159,
-                                    56.129702
-                                ],
-                                [
-                                    -130.403974,
-                                    56.121898
-                                ],
-                                [
-                                    -130.290311,
-                                    56.10097
-                                ],
-                                [
-                                    -130.243156,
-                                    56.092391
-                                ],
-                                [
-                                    -130.211246,
-                                    56.089962
-                                ],
-                                [
-                                    -130.116756,
-                                    56.105646
-                                ],
-                                [
-                                    -130.094328,
-                                    56.101486
-                                ],
-                                [
-                                    -130.071539,
-                                    56.084123
-                                ],
-                                [
-                                    -130.039319,
-                                    56.045521
-                                ],
-                                [
-                                    -130.026632,
-                                    56.024101
-                                ],
-                                [
-                                    -130.01901,
-                                    56.002216
-                                ],
-                                [
-                                    -130.014695,
-                                    55.963252
-                                ],
-                                [
-                                    -130.016788,
-                                    55.918913
-                                ],
-                                [
-                                    -130.019612,
-                                    55.907978
-                                ],
-                                [
-                                    -130.019618,
-                                    55.907952
-                                ],
-                                [
-                                    -130.022817,
-                                    55.901353
-                                ],
-                                [
-                                    -130.049387,
-                                    55.871405
-                                ],
-                                [
-                                    -130.104726,
-                                    55.825263
-                                ],
-                                [
-                                    -130.136627,
-                                    55.806464
-                                ],
-                                [
-                                    -130.148834,
-                                    55.795356
-                                ],
-                                [
-                                    -130.163482,
-                                    55.771145
-                                ],
-                                [
-                                    -130.167307,
-                                    55.766262
-                                ],
-                                [
-                                    -130.170806,
-                                    55.759833
-                                ],
-                                [
-                                    -130.173655,
-                                    55.749498
-                                ],
-                                [
-                                    -130.170806,
-                                    55.740953
-                                ],
-                                [
-                                    -130.163808,
-                                    55.734565
-                                ],
-                                [
-                                    -130.160064,
-                                    55.727118
-                                ],
-                                [
-                                    -130.167388,
-                                    55.715399
-                                ],
-                                [
-                                    -130.155914,
-                                    55.700141
-                                ],
-                                [
-                                    -130.142893,
-                                    55.689521
-                                ],
-                                [
-                                    -130.131825,
-                                    55.676581
-                                ],
-                                [
-                                    -130.126454,
-                                    55.653998
-                                ],
-                                [
-                                    -130.12857,
-                                    55.63642
-                                ],
-                                [
-                                    -130.135121,
-                                    55.619127
-                                ],
-                                [
-                                    -130.153147,
-                                    55.58511
-                                ],
-                                [
-                                    -130.148671,
-                                    55.578192
-                                ],
-                                [
-                                    -130.146881,
-                                    55.569322
-                                ],
-                                [
-                                    -130.146962,
-                                    55.547187
-                                ],
-                                [
-                                    -130.112172,
-                                    55.509345
-                                ],
-                                [
-                                    -130.101674,
-                                    55.481147
-                                ],
-                                [
-                                    -130.095082,
-                                    55.472113
-                                ],
-                                [
-                                    -130.065419,
-                                    55.446112
-                                ],
-                                [
-                                    -130.057525,
-                                    55.434882
-                                ],
-                                [
-                                    -130.052561,
-                                    55.414008
-                                ],
-                                [
-                                    -130.054311,
-                                    55.366645
-                                ],
-                                [
-                                    -130.05012,
-                                    55.345445
-                                ],
-                                [
-                                    -130.039296,
-                                    55.330756
-                                ],
-                                [
-                                    -129.989247,
-                                    55.284003
-                                ],
-                                [
-                                    -130.031239,
-                                    55.26435
-                                ],
-                                [
-                                    -130.050038,
-                                    55.252875
-                                ],
-                                [
-                                    -130.067494,
-                                    55.239
-                                ],
-                                [
-                                    -130.078236,
-                                    55.233791
-                                ],
-                                [
-                                    -130.100494,
-                                    55.230292
-                                ],
-                                [
-                                    -130.104726,
-                                    55.225653
-                                ],
-                                [
-                                    -130.105702,
-                                    55.211127
-                                ],
-                                [
-                                    -130.10912,
-                                    55.200751
-                                ],
-                                [
-                                    -130.115793,
-                                    55.191596
-                                ],
-                                [
-                                    -130.126454,
-                                    55.180976
-                                ],
-                                [
-                                    -130.151967,
-                                    55.163275
-                                ],
-                                [
-                                    -130.159983,
-                                    55.153713
-                                ],
-                                [
-                                    -130.167592,
-                                    55.129584
-                                ],
-                                [
-                                    -130.173695,
-                                    55.117743
-                                ],
-                                [
-                                    -130.200266,
-                                    55.104153
-                                ],
-                                [
-                                    -130.211781,
-                                    55.084133
-                                ],
-                                [
-                                    -130.228871,
-                                    55.04385
-                                ],
-                                [
-                                    -130.238678,
-                                    55.03441
-                                ],
-                                [
-                                    -130.261342,
-                                    55.022895
-                                ],
-                                [
-                                    -130.269846,
-                                    55.016547
-                                ],
-                                [
-                                    -130.275706,
-                                    55.006985
-                                ],
-                                [
-                                    -130.286366,
-                                    54.983222
-                                ],
-                                [
-                                    -130.294342,
-                                    54.971869
-                                ],
-                                [
-                                    -130.326568,
-                                    54.952094
-                                ],
-                                [
-                                    -130.335561,
-                                    54.938707
-                                ],
-                                [
-                                    -130.365387,
-                                    54.907294
-                                ],
-                                [
-                                    -130.385243,
-                                    54.896552
-                                ],
-                                [
-                                    -130.430816,
-                                    54.881252
-                                ],
-                                [
-                                    -130.488759,
-                                    54.844184
-                                ],
-                                [
-                                    -130.580312,
-                                    54.806383
-                                ],
-                                [
-                                    -130.597485,
-                                    54.803391
-                                ],
-                                [
-                                    -130.71074,
-                                    54.733215
-                                ],
-                                [
-                                    -131.160718,
-                                    54.787192
-                                ]
-                            ]
-                        ]
-                    ]
-                }
-            }
-        ]
-    },
-    "featureIcons": {
-        "circle-stroked": {
-            "12": [
-                42,
-                0
-            ],
-            "18": [
-                24,
-                0
-            ],
-            "24": [
-                0,
-                0
-            ]
-        },
-        "circle": {
-            "12": [
-                96,
-                0
-            ],
-            "18": [
-                78,
-                0
-            ],
-            "24": [
-                54,
-                0
-            ]
-        },
-        "square-stroked": {
-            "12": [
-                150,
-                0
-            ],
-            "18": [
-                132,
-                0
-            ],
-            "24": [
-                108,
-                0
-            ]
-        },
-        "square": {
-            "12": [
-                204,
-                0
-            ],
-            "18": [
-                186,
-                0
-            ],
-            "24": [
-                162,
-                0
-            ]
-        },
-        "triangle-stroked": {
-            "12": [
-                258,
-                0
-            ],
-            "18": [
-                240,
-                0
-            ],
-            "24": [
-                216,
-                0
-            ]
-        },
-        "triangle": {
-            "12": [
-                42,
-                24
-            ],
-            "18": [
-                24,
-                24
-            ],
-            "24": [
-                0,
-                24
-            ]
-        },
-        "star-stroked": {
-            "12": [
-                96,
-                24
-            ],
-            "18": [
-                78,
-                24
-            ],
-            "24": [
-                54,
-                24
-            ]
-        },
-        "star": {
-            "12": [
-                150,
-                24
-            ],
-            "18": [
-                132,
-                24
-            ],
-            "24": [
-                108,
-                24
-            ]
-        },
-        "cross": {
-            "12": [
-                204,
-                24
-            ],
-            "18": [
-                186,
-                24
-            ],
-            "24": [
-                162,
-                24
-            ]
-        },
-        "marker-stroked": {
-            "12": [
-                258,
-                24
-            ],
-            "18": [
-                240,
-                24
-            ],
-            "24": [
-                216,
-                24
-            ]
-        },
-        "marker": {
-            "12": [
-                42,
-                48
-            ],
-            "18": [
-                24,
-                48
-            ],
-            "24": [
-                0,
-                48
-            ]
-        },
-        "religious-jewish": {
-            "12": [
-                96,
-                48
-            ],
-            "18": [
-                78,
-                48
-            ],
-            "24": [
-                54,
-                48
-            ]
-        },
-        "religious-christian": {
-            "12": [
-                150,
-                48
-            ],
-            "18": [
-                132,
-                48
-            ],
-            "24": [
-                108,
-                48
-            ]
-        },
-        "religious-muslim": {
-            "12": [
-                204,
-                48
-            ],
-            "18": [
-                186,
-                48
-            ],
-            "24": [
-                162,
-                48
-            ]
-        },
-        "cemetery": {
-            "12": [
-                258,
-                48
-            ],
-            "18": [
-                240,
-                48
-            ],
-            "24": [
-                216,
-                48
-            ]
-        },
-        "rocket": {
-            "12": [
-                42,
-                72
-            ],
-            "18": [
-                24,
-                72
-            ],
-            "24": [
-                0,
-                72
-            ]
-        },
-        "airport": {
-            "12": [
-                96,
-                72
-            ],
-            "18": [
-                78,
-                72
-            ],
-            "24": [
-                54,
-                72
-            ]
-        },
-        "heliport": {
-            "12": [
-                150,
-                72
-            ],
-            "18": [
-                132,
-                72
-            ],
-            "24": [
-                108,
-                72
-            ]
-        },
-        "rail": {
-            "12": [
-                204,
-                72
-            ],
-            "18": [
-                186,
-                72
-            ],
-            "24": [
-                162,
-                72
-            ]
-        },
-        "rail-metro": {
-            "12": [
-                258,
-                72
-            ],
-            "18": [
-                240,
-                72
-            ],
-            "24": [
-                216,
-                72
-            ]
-        },
-        "rail-light": {
-            "12": [
-                42,
-                96
-            ],
-            "18": [
-                24,
-                96
-            ],
-            "24": [
-                0,
-                96
-            ]
-        },
-        "bus": {
-            "12": [
-                96,
-                96
-            ],
-            "18": [
-                78,
-                96
-            ],
-            "24": [
-                54,
-                96
-            ]
-        },
-        "fuel": {
-            "12": [
-                150,
-                96
-            ],
-            "18": [
-                132,
-                96
-            ],
-            "24": [
-                108,
-                96
-            ]
-        },
-        "parking": {
-            "12": [
-                204,
-                96
-            ],
-            "18": [
-                186,
-                96
-            ],
-            "24": [
-                162,
-                96
-            ]
-        },
-        "parking-garage": {
-            "12": [
-                258,
-                96
-            ],
-            "18": [
-                240,
-                96
-            ],
-            "24": [
-                216,
-                96
-            ]
-        },
-        "airfield": {
-            "12": [
-                42,
-                120
-            ],
-            "18": [
-                24,
-                120
-            ],
-            "24": [
-                0,
-                120
-            ]
-        },
-        "roadblock": {
-            "12": [
-                96,
-                120
-            ],
-            "18": [
-                78,
-                120
-            ],
-            "24": [
-                54,
-                120
-            ]
-        },
-        "ferry": {
-            "12": [
-                150,
-                120
-            ],
-            "18": [
-                132,
-                120
-            ],
-            "24": [
-                108,
-                120
-            ],
-            "line": [
-                2240,
-                25
-            ]
-        },
-        "harbor": {
-            "12": [
-                204,
-                120
-            ],
-            "18": [
-                186,
-                120
-            ],
-            "24": [
-                162,
-                120
-            ]
-        },
-        "bicycle": {
-            "12": [
-                258,
-                120
-            ],
-            "18": [
-                240,
-                120
-            ],
-            "24": [
-                216,
-                120
-            ]
-        },
-        "park": {
-            "12": [
-                42,
-                144
-            ],
-            "18": [
-                24,
-                144
-            ],
-            "24": [
-                0,
-                144
-            ]
-        },
-        "park2": {
-            "12": [
-                96,
-                144
-            ],
-            "18": [
-                78,
-                144
-            ],
-            "24": [
-                54,
-                144
-            ]
-        },
-        "museum": {
-            "12": [
-                150,
-                144
-            ],
-            "18": [
-                132,
-                144
-            ],
-            "24": [
-                108,
-                144
-            ]
-        },
-        "lodging": {
-            "12": [
-                204,
-                144
-            ],
-            "18": [
-                186,
-                144
-            ],
-            "24": [
-                162,
-                144
-            ]
-        },
-        "monument": {
-            "12": [
-                258,
-                144
-            ],
-            "18": [
-                240,
-                144
-            ],
-            "24": [
-                216,
-                144
-            ]
-        },
-        "zoo": {
-            "12": [
-                42,
-                168
-            ],
-            "18": [
-                24,
-                168
-            ],
-            "24": [
-                0,
-                168
-            ]
-        },
-        "garden": {
-            "12": [
-                96,
-                168
-            ],
-            "18": [
-                78,
-                168
-            ],
-            "24": [
-                54,
-                168
-            ]
-        },
-        "campsite": {
-            "12": [
-                150,
-                168
-            ],
-            "18": [
-                132,
-                168
-            ],
-            "24": [
-                108,
-                168
-            ]
-        },
-        "theatre": {
-            "12": [
-                204,
-                168
-            ],
-            "18": [
-                186,
-                168
-            ],
-            "24": [
-                162,
-                168
-            ]
-        },
-        "art-gallery": {
-            "12": [
-                258,
-                168
-            ],
-            "18": [
-                240,
-                168
-            ],
-            "24": [
-                216,
-                168
-            ]
-        },
-        "pitch": {
-            "12": [
-                42,
-                192
-            ],
-            "18": [
-                24,
-                192
-            ],
-            "24": [
-                0,
-                192
-            ]
-        },
-        "soccer": {
-            "12": [
-                96,
-                192
-            ],
-            "18": [
-                78,
-                192
-            ],
-            "24": [
-                54,
-                192
-            ]
-        },
-        "america-football": {
-            "12": [
-                150,
-                192
-            ],
-            "18": [
-                132,
-                192
-            ],
-            "24": [
-                108,
-                192
-            ]
-        },
-        "tennis": {
-            "12": [
-                204,
-                192
-            ],
-            "18": [
-                186,
-                192
-            ],
-            "24": [
-                162,
-                192
-            ]
-        },
-        "basketball": {
-            "12": [
-                258,
-                192
-            ],
-            "18": [
-                240,
-                192
-            ],
-            "24": [
-                216,
-                192
-            ]
-        },
-        "baseball": {
-            "12": [
-                42,
-                216
-            ],
-            "18": [
-                24,
-                216
-            ],
-            "24": [
-                0,
-                216
-            ]
-        },
-        "golf": {
-            "12": [
-                96,
-                216
-            ],
-            "18": [
-                78,
-                216
-            ],
-            "24": [
-                54,
-                216
-            ]
-        },
-        "swimming": {
-            "12": [
-                150,
-                216
-            ],
-            "18": [
-                132,
-                216
-            ],
-            "24": [
-                108,
-                216
-            ]
-        },
-        "cricket": {
-            "12": [
-                204,
-                216
-            ],
-            "18": [
-                186,
-                216
-            ],
-            "24": [
-                162,
-                216
-            ]
-        },
-        "skiing": {
-            "12": [
-                258,
-                216
-            ],
-            "18": [
-                240,
-                216
-            ],
-            "24": [
-                216,
-                216
-            ]
-        },
-        "school": {
-            "12": [
-                42,
-                240
-            ],
-            "18": [
-                24,
-                240
-            ],
-            "24": [
-                0,
-                240
-            ]
-        },
-        "college": {
-            "12": [
-                96,
-                240
-            ],
-            "18": [
-                78,
-                240
-            ],
-            "24": [
-                54,
-                240
-            ]
-        },
-        "library": {
-            "12": [
-                150,
-                240
-            ],
-            "18": [
-                132,
-                240
-            ],
-            "24": [
-                108,
-                240
-            ]
-        },
-        "post": {
-            "12": [
-                204,
-                240
-            ],
-            "18": [
-                186,
-                240
-            ],
-            "24": [
-                162,
-                240
-            ]
-        },
-        "fire-station": {
-            "12": [
-                258,
-                240
-            ],
-            "18": [
-                240,
-                240
-            ],
-            "24": [
-                216,
-                240
-            ]
-        },
-        "town-hall": {
-            "12": [
-                42,
-                264
-            ],
-            "18": [
-                24,
-                264
-            ],
-            "24": [
-                0,
-                264
-            ]
-        },
-        "police": {
-            "12": [
-                96,
-                264
-            ],
-            "18": [
-                78,
-                264
-            ],
-            "24": [
-                54,
-                264
-            ]
-        },
-        "prison": {
-            "12": [
-                150,
-                264
-            ],
-            "18": [
-                132,
-                264
-            ],
-            "24": [
-                108,
-                264
-            ]
-        },
-        "embassy": {
-            "12": [
-                204,
-                264
-            ],
-            "18": [
-                186,
-                264
-            ],
-            "24": [
-                162,
-                264
-            ]
-        },
-        "beer": {
-            "12": [
-                258,
-                264
-            ],
-            "18": [
-                240,
-                264
-            ],
-            "24": [
-                216,
-                264
-            ]
-        },
-        "restaurant": {
-            "12": [
-                42,
-                288
-            ],
-            "18": [
-                24,
-                288
-            ],
-            "24": [
-                0,
-                288
-            ]
-        },
-        "cafe": {
-            "12": [
-                96,
-                288
-            ],
-            "18": [
-                78,
-                288
-            ],
-            "24": [
-                54,
-                288
-            ]
-        },
-        "shop": {
-            "12": [
-                150,
-                288
-            ],
-            "18": [
-                132,
-                288
-            ],
-            "24": [
-                108,
-                288
-            ]
-        },
-        "fast-food": {
-            "12": [
-                204,
-                288
-            ],
-            "18": [
-                186,
-                288
-            ],
-            "24": [
-                162,
-                288
-            ]
-        },
-        "bar": {
-            "12": [
-                258,
-                288
-            ],
-            "18": [
-                240,
-                288
-            ],
-            "24": [
-                216,
-                288
-            ]
-        },
-        "bank": {
-            "12": [
-                42,
-                312
-            ],
-            "18": [
-                24,
-                312
-            ],
-            "24": [
-                0,
-                312
-            ]
-        },
-        "grocery": {
-            "12": [
-                96,
-                312
-            ],
-            "18": [
-                78,
-                312
-            ],
-            "24": [
-                54,
-                312
-            ]
-        },
-        "cinema": {
-            "12": [
-                150,
-                312
-            ],
-            "18": [
-                132,
-                312
-            ],
-            "24": [
-                108,
-                312
-            ]
-        },
-        "pharmacy": {
-            "12": [
-                204,
-                312
-            ],
-            "18": [
-                186,
-                312
-            ],
-            "24": [
-                162,
-                312
-            ]
-        },
-        "hospital": {
-            "12": [
-                258,
-                312
-            ],
-            "18": [
-                240,
-                312
-            ],
-            "24": [
-                216,
-                312
-            ]
-        },
-        "danger": {
-            "12": [
-                42,
-                336
-            ],
-            "18": [
-                24,
-                336
-            ],
-            "24": [
-                0,
-                336
-            ]
-        },
-        "industrial": {
-            "12": [
-                96,
-                336
-            ],
-            "18": [
-                78,
-                336
-            ],
-            "24": [
-                54,
-                336
-            ]
-        },
-        "warehouse": {
-            "12": [
-                150,
-                336
-            ],
-            "18": [
-                132,
-                336
-            ],
-            "24": [
-                108,
-                336
-            ]
-        },
-        "commercial": {
-            "12": [
-                204,
-                336
-            ],
-            "18": [
-                186,
-                336
-            ],
-            "24": [
-                162,
-                336
-            ]
-        },
-        "building": {
-            "12": [
-                258,
-                336
-            ],
-            "18": [
-                240,
-                336
-            ],
-            "24": [
-                216,
-                336
-            ]
-        },
-        "place-of-worship": {
-            "12": [
-                42,
-                360
-            ],
-            "18": [
-                24,
-                360
-            ],
-            "24": [
-                0,
-                360
-            ]
-        },
-        "alcohol-shop": {
-            "12": [
-                96,
-                360
-            ],
-            "18": [
-                78,
-                360
-            ],
-            "24": [
-                54,
-                360
-            ]
-        },
-        "logging": {
-            "12": [
-                150,
-                360
-            ],
-            "18": [
-                132,
-                360
-            ],
-            "24": [
-                108,
-                360
-            ]
-        },
-        "oil-well": {
-            "12": [
-                204,
-                360
-            ],
-            "18": [
-                186,
-                360
-            ],
-            "24": [
-                162,
-                360
-            ]
-        },
-        "slaughterhouse": {
-            "12": [
-                258,
-                360
-            ],
-            "18": [
-                240,
-                360
-            ],
-            "24": [
-                216,
-                360
-            ]
-        },
-        "dam": {
-            "12": [
-                42,
-                384
-            ],
-            "18": [
-                24,
-                384
-            ],
-            "24": [
-                0,
-                384
-            ]
-        },
-        "water": {
-            "12": [
-                96,
-                384
-            ],
-            "18": [
-                78,
-                384
-            ],
-            "24": [
-                54,
-                384
-            ]
-        },
-        "wetland": {
-            "12": [
-                150,
-                384
-            ],
-            "18": [
-                132,
-                384
-            ],
-            "24": [
-                108,
-                384
-            ]
-        },
-        "disability": {
-            "12": [
-                204,
-                384
-            ],
-            "18": [
-                186,
-                384
-            ],
-            "24": [
-                162,
-                384
-            ]
-        },
-        "telephone": {
-            "12": [
-                258,
-                384
-            ],
-            "18": [
-                240,
-                384
-            ],
-            "24": [
-                216,
-                384
-            ]
-        },
-        "emergency-telephone": {
-            "12": [
-                42,
-                408
-            ],
-            "18": [
-                24,
-                408
-            ],
-            "24": [
-                0,
-                408
-            ]
-        },
-        "toilets": {
-            "12": [
-                96,
-                408
-            ],
-            "18": [
-                78,
-                408
-            ],
-            "24": [
-                54,
-                408
-            ]
-        },
-        "waste-basket": {
-            "12": [
-                150,
-                408
-            ],
-            "18": [
-                132,
-                408
-            ],
-            "24": [
-                108,
-                408
-            ]
-        },
-        "music": {
-            "12": [
-                204,
-                408
-            ],
-            "18": [
-                186,
-                408
-            ],
-            "24": [
-                162,
-                408
-            ]
-        },
-        "land-use": {
-            "12": [
-                258,
-                408
-            ],
-            "18": [
-                240,
-                408
-            ],
-            "24": [
-                216,
-                408
-            ]
-        },
-        "city": {
-            "12": [
-                42,
-                432
-            ],
-            "18": [
-                24,
-                432
-            ],
-            "24": [
-                0,
-                432
-            ]
-        },
-        "town": {
-            "12": [
-                96,
-                432
-            ],
-            "18": [
-                78,
-                432
-            ],
-            "24": [
-                54,
-                432
-            ]
-        },
-        "village": {
-            "12": [
-                150,
-                432
-            ],
-            "18": [
-                132,
-                432
-            ],
-            "24": [
-                108,
-                432
-            ]
-        },
-        "farm": {
-            "12": [
-                204,
-                432
-            ],
-            "18": [
-                186,
-                432
-            ],
-            "24": [
-                162,
-                432
-            ]
-        },
-        "bakery": {
-            "12": [
-                258,
-                432
-            ],
-            "18": [
-                240,
-                432
-            ],
-            "24": [
-                216,
-                432
-            ]
-        },
-        "dog-park": {
-            "12": [
-                42,
-                456
-            ],
-            "18": [
-                24,
-                456
-            ],
-            "24": [
-                0,
-                456
-            ]
-        },
-        "lighthouse": {
-            "12": [
-                96,
-                456
-            ],
-            "18": [
-                78,
-                456
-            ],
-            "24": [
-                54,
-                456
-            ]
-        },
-        "clothing-store": {
-            "12": [
-                150,
-                456
-            ],
-            "18": [
-                132,
-                456
-            ],
-            "24": [
-                108,
-                456
-            ]
-        },
-        "polling-place": {
-            "12": [
-                204,
-                456
-            ],
-            "18": [
-                186,
-                456
-            ],
-            "24": [
-                162,
-                456
-            ]
-        },
-        "playground": {
-            "12": [
-                258,
-                456
-            ],
-            "18": [
-                240,
-                456
-            ],
-            "24": [
-                216,
-                456
-            ]
-        },
-        "entrance": {
-            "12": [
-                42,
-                480
-            ],
-            "18": [
-                24,
-                480
-            ],
-            "24": [
-                0,
-                480
-            ]
-        },
-        "heart": {
-            "12": [
-                96,
-                480
-            ],
-            "18": [
-                78,
-                480
-            ],
-            "24": [
-                54,
-                480
-            ]
-        },
-        "london-underground": {
-            "12": [
-                150,
-                480
-            ],
-            "18": [
-                132,
-                480
-            ],
-            "24": [
-                108,
-                480
-            ]
-        },
-        "minefield": {
-            "12": [
-                204,
-                480
-            ],
-            "18": [
-                186,
-                480
-            ],
-            "24": [
-                162,
-                480
-            ]
-        },
-        "rail-underground": {
-            "12": [
-                258,
-                480
-            ],
-            "18": [
-                240,
-                480
-            ],
-            "24": [
-                216,
-                480
-            ]
-        },
-        "rail-above": {
-            "12": [
-                42,
-                504
-            ],
-            "18": [
-                24,
-                504
-            ],
-            "24": [
-                0,
-                504
-            ]
-        },
-        "camera": {
-            "12": [
-                96,
-                504
-            ],
-            "18": [
-                78,
-                504
-            ],
-            "24": [
-                54,
-                504
-            ]
-        },
-        "laundry": {
-            "12": [
-                150,
-                504
-            ],
-            "18": [
-                132,
-                504
-            ],
-            "24": [
-                108,
-                504
-            ]
-        },
-        "car": {
-            "12": [
-                204,
-                504
-            ],
-            "18": [
-                186,
-                504
-            ],
-            "24": [
-                162,
-                504
-            ]
-        },
-        "suitcase": {
-            "12": [
-                258,
-                504
-            ],
-            "18": [
-                240,
-                504
-            ],
-            "24": [
-                216,
-                504
-            ]
-        },
-        "hairdresser": {
-            "12": [
-                42,
-                528
-            ],
-            "18": [
-                24,
-                528
-            ],
-            "24": [
-                0,
-                528
-            ]
-        },
-        "chemist": {
-            "12": [
-                96,
-                528
-            ],
-            "18": [
-                78,
-                528
-            ],
-            "24": [
-                54,
-                528
-            ]
-        },
-        "mobilephone": {
-            "12": [
-                150,
-                528
-            ],
-            "18": [
-                132,
-                528
-            ],
-            "24": [
-                108,
-                528
-            ]
-        },
-        "scooter": {
-            "12": [
-                204,
-                528
-            ],
-            "18": [
-                186,
-                528
-            ],
-            "24": [
-                162,
-                528
-            ]
-        },
-        "gift": {
-            "12": [
-                258,
-                528
-            ],
-            "18": [
-                240,
-                528
-            ],
-            "24": [
-                216,
-                528
-            ]
-        },
-        "ice-cream": {
-            "12": [
-                42,
-                552
-            ],
-            "18": [
-                24,
-                552
-            ],
-            "24": [
-                0,
-                552
-            ]
-        },
-        "highway-motorway": {
-            "line": [
-                20,
-                25
-            ]
-        },
-        "highway-trunk": {
-            "line": [
-                80,
-                25
-            ]
-        },
-        "highway-primary": {
-            "line": [
-                140,
-                25
-            ]
-        },
-        "highway-secondary": {
-            "line": [
-                200,
-                25
-            ]
-        },
-        "highway-tertiary": {
-            "line": [
-                260,
-                25
-            ]
-        },
-        "highway-motorway-link": {
-            "line": [
-                320,
-                25
-            ]
-        },
-        "highway-trunk-link": {
-            "line": [
-                380,
-                25
-            ]
-        },
-        "highway-primary-link": {
-            "line": [
-                440,
-                25
-            ]
-        },
-        "highway-secondary-link": {
-            "line": [
-                500,
-                25
-            ]
-        },
-        "highway-tertiary-link": {
-            "line": [
-                560,
-                25
-            ]
-        },
-        "highway-residential": {
-            "line": [
-                620,
-                25
-            ]
-        },
-        "highway-unclassified": {
-            "line": [
-                680,
-                25
-            ]
-        },
-        "highway-service": {
-            "line": [
-                740,
-                25
-            ]
-        },
-        "highway-road": {
-            "line": [
-                800,
-                25
-            ]
-        },
-        "highway-track": {
-            "line": [
-                860,
-                25
-            ]
-        },
-        "highway-living-street": {
-            "line": [
-                920,
-                25
-            ]
-        },
-        "highway-path": {
-            "line": [
-                980,
-                25
-            ]
-        },
-        "highway-cycleway": {
-            "line": [
-                1040,
-                25
-            ]
-        },
-        "highway-footway": {
-            "line": [
-                1100,
-                25
-            ]
-        },
-        "highway-bridleway": {
-            "line": [
-                1160,
-                25
-            ]
-        },
-        "highway-steps": {
-            "line": [
-                1220,
-                25
-            ]
-        },
-        "railway-rail": {
-            "line": [
-                1280,
-                25
-            ]
-        },
-        "railway-disused": {
-            "line": [
-                1340,
-                25
-            ]
-        },
-        "railway-abandoned": {
-            "line": [
-                1400,
-                25
-            ]
-        },
-        "railway-subway": {
-            "line": [
-                1460,
-                25
-            ]
-        },
-        "railway-light-rail": {
-            "line": [
-                1520,
-                25
-            ]
-        },
-        "railway-monorail": {
-            "line": [
-                1580,
-                25
-            ]
-        },
-        "waterway-river": {
-            "line": [
-                1640,
-                25
-            ]
-        },
-        "waterway-stream": {
-            "line": [
-                1700,
-                25
-            ]
-        },
-        "waterway-canal": {
-            "line": [
-                1760,
-                25
-            ]
-        },
-        "waterway-ditch": {
-            "line": [
-                1820,
-                25
-            ]
-        },
-        "power-line": {
-            "line": [
-                1880,
-                25
-            ]
-        },
-        "other-line": {
-            "line": [
-                1940,
-                25
-            ]
-        },
-        "category-roads": {
-            "line": [
-                2000,
-                25
-            ]
-        },
-        "category-rail": {
-            "line": [
-                2060,
-                25
-            ]
-        },
-        "category-path": {
-            "line": [
-                2120,
-                25
-            ]
-        },
-        "category-water": {
-            "line": [
-                2180,
-                25
-            ]
-        },
-        "pipeline": {
-            "line": [
-                2300,
-                25
-            ]
-        },
-        "relation": {
-            "relation": [
-                20,
-                25
-            ]
-        },
-        "restriction": {
-            "relation": [
-                80,
-                25
-            ]
-        },
-        "multipolygon": {
-            "relation": [
-                141,
-                25
-            ]
-        },
-        "boundary": {
-            "relation": [
-                200,
-                25
-            ]
-        },
-        "route": {
-            "relation": [
-                260,
-                25
-            ]
-        },
-        "route-road": {
-            "relation": [
-                320,
-                25
-            ]
-        },
-        "route-bicycle": {
-            "relation": [
-                380,
-                25
-            ]
-        },
-        "route-foot": {
-            "relation": [
-                440,
-                25
-            ]
-        },
-        "route-bus": {
-            "relation": [
-                500,
-                25
-            ]
-        },
-        "route-train": {
-            "relation": [
-                560,
-                25
-            ]
-        },
-        "route-detour": {
-            "relation": [
-                620,
-                25
-            ]
-        },
-        "route-tram": {
-            "relation": [
-                680,
-                25
-            ]
-        },
-        "route-ferry": {
-            "relation": [
-                740,
-                25
-            ]
-        },
-        "route-power": {
-            "relation": [
-                800,
-                25
-            ]
-        },
-        "route-pipeline": {
-            "relation": [
-                860,
-                25
-            ]
-        },
-        "route-master": {
-            "relation": [
-                920,
-                25
-            ]
-        },
-        "restriction-no-straight-on": {
-            "relation": [
-                980,
-                25
-            ]
-        },
-        "restriction-no-u-turn": {
-            "relation": [
-                1040,
-                25
-            ]
-        },
-        "restriction-no-left-turn": {
-            "relation": [
-                1100,
-                25
-            ]
-        },
-        "restriction-no-right-turn": {
-            "relation": [
-                1160,
-                25
-            ]
-        },
-        "restriction-only-straight-on": {
-            "relation": [
-                1220,
-                25
-            ]
-        },
-        "restriction-only-left-turn": {
-            "relation": [
-                1280,
-                25
-            ]
-        },
-        "restriction-only-right-turn": {
-            "relation": [
-                1340,
-                25
-            ]
-        }
-    },
-    "operations": {
-        "icon-operation-delete": [
-            0,
-            140
-        ],
-        "icon-operation-circularize": [
-            20,
-            140
-        ],
-        "icon-operation-straighten": [
-            40,
-            140
-        ],
-        "icon-operation-split": [
-            60,
-            140
-        ],
-        "icon-operation-disconnect": [
-            80,
-            140
-        ],
-        "icon-operation-reverse": [
-            100,
-            140
-        ],
-        "icon-operation-move": [
-            120,
-            140
-        ],
-        "icon-operation-merge": [
-            140,
-            140
-        ],
-        "icon-operation-orthogonalize": [
-            160,
-            140
-        ],
-        "icon-operation-rotate": [
-            180,
-            140
-        ],
-        "icon-operation-simplify": [
-            200,
-            140
-        ],
-        "icon-operation-continue": [
-            220,
-            140
-        ],
-        "icon-operation-disabled-delete": [
-            0,
-            160
-        ],
-        "icon-operation-disabled-circularize": [
-            20,
-            160
-        ],
-        "icon-operation-disabled-straighten": [
-            40,
-            160
-        ],
-        "icon-operation-disabled-split": [
-            60,
-            160
-        ],
-        "icon-operation-disabled-disconnect": [
-            80,
-            160
-        ],
-        "icon-operation-disabled-reverse": [
-            100,
-            160
-        ],
-        "icon-operation-disabled-move": [
-            120,
-            160
-        ],
-        "icon-operation-disabled-merge": [
-            140,
-            160
-        ],
-        "icon-operation-disabled-orthogonalize": [
-            160,
-            160
-        ],
-        "icon-operation-disabled-rotate": [
-            180,
-            160
-        ],
-        "icon-operation-disabled-simplify": [
-            200,
-            160
-        ],
-        "icon-operation-disabled-continue": [
-            220,
-            160
-        ],
-        "icon-restriction-yes": [
-            50,
-            80
-        ],
-        "icon-restriction-no": [
-            95,
-            80
-        ],
-        "icon-restriction-only": [
-            140,
-            80
-        ],
-        "icon-restriction-yes-u": [
-            185,
-            80
-        ],
-        "icon-restriction-no-u": [
-            230,
-            80
-        ],
-        "icon-restriction-only-u": [
-            275,
-            80
+                                [
+                                    -132.276366,
+                                    57.14889
+                                ],
+                                [
+                                    -132.34122,
+                                    57.080393
+                                ],
+                                [
+                                    -132.16229,
+                                    57.050317
+                                ],
+                                [
+                                    -132.031859,
+                                    57.028406
+                                ],
+                                [
+                                    -132.107384,
+                                    56.858753
+                                ],
+                                [
+                                    -131.871558,
+                                    56.79346
+                                ],
+                                [
+                                    -131.865874,
+                                    56.785708
+                                ],
+                                [
+                                    -131.872411,
+                                    56.77297
+                                ],
+                                [
+                                    -131.882617,
+                                    56.759146
+                                ],
+                                [
+                                    -131.887966,
+                                    56.747958
+                                ],
+                                [
+                                    -131.886028,
+                                    56.737055
+                                ],
+                                [
+                                    -131.880705,
+                                    56.728838
+                                ],
+                                [
+                                    -131.864789,
+                                    56.71349
+                                ],
+                                [
+                                    -131.838976,
+                                    56.682278
+                                ],
+                                [
+                                    -131.830424,
+                                    56.664759
+                                ],
+                                [
+                                    -131.826574,
+                                    56.644606
+                                ],
+                                [
+                                    -131.832103,
+                                    56.603368
+                                ],
+                                [
+                                    -131.825592,
+                                    56.593343
+                                ],
+                                [
+                                    -131.799108,
+                                    56.587658
+                                ],
+                                [
+                                    -131.692293,
+                                    56.585074
+                                ],
+                                [
+                                    -131.585891,
+                                    56.595048
+                                ],
+                                [
+                                    -131.560363,
+                                    56.594066
+                                ],
+                                [
+                                    -131.536437,
+                                    56.585229
+                                ],
+                                [
+                                    -131.491659,
+                                    56.560166
+                                ],
+                                [
+                                    -131.345699,
+                                    56.503271
+                                ],
+                                [
+                                    -131.215604,
+                                    56.45255
+                                ],
+                                [
+                                    -131.100546,
+                                    56.407669
+                                ],
+                                [
+                                    -131.016934,
+                                    56.38705
+                                ],
+                                [
+                                    -130.839089,
+                                    56.372452
+                                ],
+                                [
+                                    -130.760334,
+                                    56.345192
+                                ],
+                                [
+                                    -130.645768,
+                                    56.261942
+                                ],
+                                [
+                                    -130.602256,
+                                    56.247059
+                                ],
+                                [
+                                    -130.495518,
+                                    56.232434
+                                ],
+                                [
+                                    -130.47229,
+                                    56.22489
+                                ],
+                                [
+                                    -130.458053,
+                                    56.210653
+                                ],
+                                [
+                                    -130.427926,
+                                    56.143964
+                                ],
+                                [
+                                    -130.418159,
+                                    56.129702
+                                ],
+                                [
+                                    -130.403974,
+                                    56.121898
+                                ],
+                                [
+                                    -130.290311,
+                                    56.10097
+                                ],
+                                [
+                                    -130.243156,
+                                    56.092391
+                                ],
+                                [
+                                    -130.211246,
+                                    56.089962
+                                ],
+                                [
+                                    -130.116756,
+                                    56.105646
+                                ],
+                                [
+                                    -130.094328,
+                                    56.101486
+                                ],
+                                [
+                                    -130.071539,
+                                    56.084123
+                                ],
+                                [
+                                    -130.039319,
+                                    56.045521
+                                ],
+                                [
+                                    -130.026632,
+                                    56.024101
+                                ],
+                                [
+                                    -130.01901,
+                                    56.002216
+                                ],
+                                [
+                                    -130.014695,
+                                    55.963252
+                                ],
+                                [
+                                    -130.016788,
+                                    55.918913
+                                ],
+                                [
+                                    -130.019612,
+                                    55.907978
+                                ],
+                                [
+                                    -130.019618,
+                                    55.907952
+                                ],
+                                [
+                                    -130.022817,
+                                    55.901353
+                                ],
+                                [
+                                    -130.049387,
+                                    55.871405
+                                ],
+                                [
+                                    -130.104726,
+                                    55.825263
+                                ],
+                                [
+                                    -130.136627,
+                                    55.806464
+                                ],
+                                [
+                                    -130.148834,
+                                    55.795356
+                                ],
+                                [
+                                    -130.163482,
+                                    55.771145
+                                ],
+                                [
+                                    -130.167307,
+                                    55.766262
+                                ],
+                                [
+                                    -130.170806,
+                                    55.759833
+                                ],
+                                [
+                                    -130.173655,
+                                    55.749498
+                                ],
+                                [
+                                    -130.170806,
+                                    55.740953
+                                ],
+                                [
+                                    -130.163808,
+                                    55.734565
+                                ],
+                                [
+                                    -130.160064,
+                                    55.727118
+                                ],
+                                [
+                                    -130.167388,
+                                    55.715399
+                                ],
+                                [
+                                    -130.155914,
+                                    55.700141
+                                ],
+                                [
+                                    -130.142893,
+                                    55.689521
+                                ],
+                                [
+                                    -130.131825,
+                                    55.676581
+                                ],
+                                [
+                                    -130.126454,
+                                    55.653998
+                                ],
+                                [
+                                    -130.12857,
+                                    55.63642
+                                ],
+                                [
+                                    -130.135121,
+                                    55.619127
+                                ],
+                                [
+                                    -130.153147,
+                                    55.58511
+                                ],
+                                [
+                                    -130.148671,
+                                    55.578192
+                                ],
+                                [
+                                    -130.146881,
+                                    55.569322
+                                ],
+                                [
+                                    -130.146962,
+                                    55.547187
+                                ],
+                                [
+                                    -130.112172,
+                                    55.509345
+                                ],
+                                [
+                                    -130.101674,
+                                    55.481147
+                                ],
+                                [
+                                    -130.095082,
+                                    55.472113
+                                ],
+                                [
+                                    -130.065419,
+                                    55.446112
+                                ],
+                                [
+                                    -130.057525,
+                                    55.434882
+                                ],
+                                [
+                                    -130.052561,
+                                    55.414008
+                                ],
+                                [
+                                    -130.054311,
+                                    55.366645
+                                ],
+                                [
+                                    -130.05012,
+                                    55.345445
+                                ],
+                                [
+                                    -130.039296,
+                                    55.330756
+                                ],
+                                [
+                                    -129.989247,
+                                    55.284003
+                                ],
+                                [
+                                    -130.031239,
+                                    55.26435
+                                ],
+                                [
+                                    -130.050038,
+                                    55.252875
+                                ],
+                                [
+                                    -130.067494,
+                                    55.239
+                                ],
+                                [
+                                    -130.078236,
+                                    55.233791
+                                ],
+                                [
+                                    -130.100494,
+                                    55.230292
+                                ],
+                                [
+                                    -130.104726,
+                                    55.225653
+                                ],
+                                [
+                                    -130.105702,
+                                    55.211127
+                                ],
+                                [
+                                    -130.10912,
+                                    55.200751
+                                ],
+                                [
+                                    -130.115793,
+                                    55.191596
+                                ],
+                                [
+                                    -130.126454,
+                                    55.180976
+                                ],
+                                [
+                                    -130.151967,
+                                    55.163275
+                                ],
+                                [
+                                    -130.159983,
+                                    55.153713
+                                ],
+                                [
+                                    -130.167592,
+                                    55.129584
+                                ],
+                                [
+                                    -130.173695,
+                                    55.117743
+                                ],
+                                [
+                                    -130.200266,
+                                    55.104153
+                                ],
+                                [
+                                    -130.211781,
+                                    55.084133
+                                ],
+                                [
+                                    -130.228871,
+                                    55.04385
+                                ],
+                                [
+                                    -130.238678,
+                                    55.03441
+                                ],
+                                [
+                                    -130.261342,
+                                    55.022895
+                                ],
+                                [
+                                    -130.269846,
+                                    55.016547
+                                ],
+                                [
+                                    -130.275706,
+                                    55.006985
+                                ],
+                                [
+                                    -130.286366,
+                                    54.983222
+                                ],
+                                [
+                                    -130.294342,
+                                    54.971869
+                                ],
+                                [
+                                    -130.326568,
+                                    54.952094
+                                ],
+                                [
+                                    -130.335561,
+                                    54.938707
+                                ],
+                                [
+                                    -130.365387,
+                                    54.907294
+                                ],
+                                [
+                                    -130.385243,
+                                    54.896552
+                                ],
+                                [
+                                    -130.430816,
+                                    54.881252
+                                ],
+                                [
+                                    -130.488759,
+                                    54.844184
+                                ],
+                                [
+                                    -130.580312,
+                                    54.806383
+                                ],
+                                [
+                                    -130.597485,
+                                    54.803391
+                                ],
+                                [
+                                    -130.71074,
+                                    54.733215
+                                ],
+                                [
+                                    -131.160718,
+                                    54.787192
+                                ]
+                            ]
+                        ]
+                    ]
+                }
+            }
         ]
     },
         ]
     },
+    "featureIcons": {
+        "circle-stroked-24": {
+            "x": 0,
+            "y": 0,
+            "width": 24,
+            "height": 24
+        },
+        "circle-stroked-18": {
+            "x": 24,
+            "y": 0,
+            "width": 18,
+            "height": 18
+        },
+        "circle-stroked-12": {
+            "x": 42,
+            "y": 0,
+            "width": 12,
+            "height": 12
+        },
+        "circle-24": {
+            "x": 54,
+            "y": 0,
+            "width": 24,
+            "height": 24
+        },
+        "circle-18": {
+            "x": 78,
+            "y": 0,
+            "width": 18,
+            "height": 18
+        },
+        "circle-12": {
+            "x": 96,
+            "y": 0,
+            "width": 12,
+            "height": 12
+        },
+        "square-stroked-24": {
+            "x": 108,
+            "y": 0,
+            "width": 24,
+            "height": 24
+        },
+        "square-stroked-18": {
+            "x": 132,
+            "y": 0,
+            "width": 18,
+            "height": 18
+        },
+        "square-stroked-12": {
+            "x": 150,
+            "y": 0,
+            "width": 12,
+            "height": 12
+        },
+        "square-24": {
+            "x": 162,
+            "y": 0,
+            "width": 24,
+            "height": 24
+        },
+        "square-18": {
+            "x": 186,
+            "y": 0,
+            "width": 18,
+            "height": 18
+        },
+        "square-12": {
+            "x": 204,
+            "y": 0,
+            "width": 12,
+            "height": 12
+        },
+        "triangle-stroked-24": {
+            "x": 216,
+            "y": 0,
+            "width": 24,
+            "height": 24
+        },
+        "triangle-stroked-18": {
+            "x": 240,
+            "y": 0,
+            "width": 18,
+            "height": 18
+        },
+        "triangle-stroked-12": {
+            "x": 258,
+            "y": 0,
+            "width": 12,
+            "height": 12
+        },
+        "triangle-24": {
+            "x": 0,
+            "y": 24,
+            "width": 24,
+            "height": 24
+        },
+        "triangle-18": {
+            "x": 24,
+            "y": 24,
+            "width": 18,
+            "height": 18
+        },
+        "triangle-12": {
+            "x": 42,
+            "y": 24,
+            "width": 12,
+            "height": 12
+        },
+        "star-stroked-24": {
+            "x": 54,
+            "y": 24,
+            "width": 24,
+            "height": 24
+        },
+        "star-stroked-18": {
+            "x": 78,
+            "y": 24,
+            "width": 18,
+            "height": 18
+        },
+        "star-stroked-12": {
+            "x": 96,
+            "y": 24,
+            "width": 12,
+            "height": 12
+        },
+        "star-24": {
+            "x": 108,
+            "y": 24,
+            "width": 24,
+            "height": 24
+        },
+        "star-18": {
+            "x": 132,
+            "y": 24,
+            "width": 18,
+            "height": 18
+        },
+        "star-12": {
+            "x": 150,
+            "y": 24,
+            "width": 12,
+            "height": 12
+        },
+        "cross-24": {
+            "x": 162,
+            "y": 24,
+            "width": 24,
+            "height": 24
+        },
+        "cross-18": {
+            "x": 186,
+            "y": 24,
+            "width": 18,
+            "height": 18
+        },
+        "cross-12": {
+            "x": 204,
+            "y": 24,
+            "width": 12,
+            "height": 12
+        },
+        "marker-stroked-24": {
+            "x": 216,
+            "y": 24,
+            "width": 24,
+            "height": 24
+        },
+        "marker-stroked-18": {
+            "x": 240,
+            "y": 24,
+            "width": 18,
+            "height": 18
+        },
+        "marker-stroked-12": {
+            "x": 258,
+            "y": 24,
+            "width": 12,
+            "height": 12
+        },
+        "marker-24": {
+            "x": 0,
+            "y": 48,
+            "width": 24,
+            "height": 24
+        },
+        "marker-18": {
+            "x": 24,
+            "y": 48,
+            "width": 18,
+            "height": 18
+        },
+        "marker-12": {
+            "x": 42,
+            "y": 48,
+            "width": 12,
+            "height": 12
+        },
+        "religious-jewish-24": {
+            "x": 54,
+            "y": 48,
+            "width": 24,
+            "height": 24
+        },
+        "religious-jewish-18": {
+            "x": 78,
+            "y": 48,
+            "width": 18,
+            "height": 18
+        },
+        "religious-jewish-12": {
+            "x": 96,
+            "y": 48,
+            "width": 12,
+            "height": 12
+        },
+        "religious-christian-24": {
+            "x": 108,
+            "y": 48,
+            "width": 24,
+            "height": 24
+        },
+        "religious-christian-18": {
+            "x": 132,
+            "y": 48,
+            "width": 18,
+            "height": 18
+        },
+        "religious-christian-12": {
+            "x": 150,
+            "y": 48,
+            "width": 12,
+            "height": 12
+        },
+        "religious-muslim-24": {
+            "x": 162,
+            "y": 48,
+            "width": 24,
+            "height": 24
+        },
+        "religious-muslim-18": {
+            "x": 186,
+            "y": 48,
+            "width": 18,
+            "height": 18
+        },
+        "religious-muslim-12": {
+            "x": 204,
+            "y": 48,
+            "width": 12,
+            "height": 12
+        },
+        "cemetery-24": {
+            "x": 216,
+            "y": 48,
+            "width": 24,
+            "height": 24
+        },
+        "cemetery-18": {
+            "x": 240,
+            "y": 48,
+            "width": 18,
+            "height": 18
+        },
+        "cemetery-12": {
+            "x": 258,
+            "y": 48,
+            "width": 12,
+            "height": 12
+        },
+        "rocket-24": {
+            "x": 0,
+            "y": 72,
+            "width": 24,
+            "height": 24
+        },
+        "rocket-18": {
+            "x": 24,
+            "y": 72,
+            "width": 18,
+            "height": 18
+        },
+        "rocket-12": {
+            "x": 42,
+            "y": 72,
+            "width": 12,
+            "height": 12
+        },
+        "airport-24": {
+            "x": 54,
+            "y": 72,
+            "width": 24,
+            "height": 24
+        },
+        "airport-18": {
+            "x": 78,
+            "y": 72,
+            "width": 18,
+            "height": 18
+        },
+        "airport-12": {
+            "x": 96,
+            "y": 72,
+            "width": 12,
+            "height": 12
+        },
+        "heliport-24": {
+            "x": 108,
+            "y": 72,
+            "width": 24,
+            "height": 24
+        },
+        "heliport-18": {
+            "x": 132,
+            "y": 72,
+            "width": 18,
+            "height": 18
+        },
+        "heliport-12": {
+            "x": 150,
+            "y": 72,
+            "width": 12,
+            "height": 12
+        },
+        "rail-24": {
+            "x": 162,
+            "y": 72,
+            "width": 24,
+            "height": 24
+        },
+        "rail-18": {
+            "x": 186,
+            "y": 72,
+            "width": 18,
+            "height": 18
+        },
+        "rail-12": {
+            "x": 204,
+            "y": 72,
+            "width": 12,
+            "height": 12
+        },
+        "rail-metro-24": {
+            "x": 216,
+            "y": 72,
+            "width": 24,
+            "height": 24
+        },
+        "rail-metro-18": {
+            "x": 240,
+            "y": 72,
+            "width": 18,
+            "height": 18
+        },
+        "rail-metro-12": {
+            "x": 258,
+            "y": 72,
+            "width": 12,
+            "height": 12
+        },
+        "rail-light-24": {
+            "x": 0,
+            "y": 96,
+            "width": 24,
+            "height": 24
+        },
+        "rail-light-18": {
+            "x": 24,
+            "y": 96,
+            "width": 18,
+            "height": 18
+        },
+        "rail-light-12": {
+            "x": 42,
+            "y": 96,
+            "width": 12,
+            "height": 12
+        },
+        "bus-24": {
+            "x": 54,
+            "y": 96,
+            "width": 24,
+            "height": 24
+        },
+        "bus-18": {
+            "x": 78,
+            "y": 96,
+            "width": 18,
+            "height": 18
+        },
+        "bus-12": {
+            "x": 96,
+            "y": 96,
+            "width": 12,
+            "height": 12
+        },
+        "fuel-24": {
+            "x": 108,
+            "y": 96,
+            "width": 24,
+            "height": 24
+        },
+        "fuel-18": {
+            "x": 132,
+            "y": 96,
+            "width": 18,
+            "height": 18
+        },
+        "fuel-12": {
+            "x": 150,
+            "y": 96,
+            "width": 12,
+            "height": 12
+        },
+        "parking-24": {
+            "x": 162,
+            "y": 96,
+            "width": 24,
+            "height": 24
+        },
+        "parking-18": {
+            "x": 186,
+            "y": 96,
+            "width": 18,
+            "height": 18
+        },
+        "parking-12": {
+            "x": 204,
+            "y": 96,
+            "width": 12,
+            "height": 12
+        },
+        "parking-garage-24": {
+            "x": 216,
+            "y": 96,
+            "width": 24,
+            "height": 24
+        },
+        "parking-garage-18": {
+            "x": 240,
+            "y": 96,
+            "width": 18,
+            "height": 18
+        },
+        "parking-garage-12": {
+            "x": 258,
+            "y": 96,
+            "width": 12,
+            "height": 12
+        },
+        "airfield-24": {
+            "x": 0,
+            "y": 120,
+            "width": 24,
+            "height": 24
+        },
+        "airfield-18": {
+            "x": 24,
+            "y": 120,
+            "width": 18,
+            "height": 18
+        },
+        "airfield-12": {
+            "x": 42,
+            "y": 120,
+            "width": 12,
+            "height": 12
+        },
+        "roadblock-24": {
+            "x": 54,
+            "y": 120,
+            "width": 24,
+            "height": 24
+        },
+        "roadblock-18": {
+            "x": 78,
+            "y": 120,
+            "width": 18,
+            "height": 18
+        },
+        "roadblock-12": {
+            "x": 96,
+            "y": 120,
+            "width": 12,
+            "height": 12
+        },
+        "ferry-24": {
+            "x": 108,
+            "y": 120,
+            "width": 24,
+            "height": 24
+        },
+        "ferry-18": {
+            "x": 132,
+            "y": 120,
+            "width": 18,
+            "height": 18
+        },
+        "ferry-12": {
+            "x": 150,
+            "y": 120,
+            "width": 12,
+            "height": 12
+        },
+        "harbor-24": {
+            "x": 162,
+            "y": 120,
+            "width": 24,
+            "height": 24
+        },
+        "harbor-18": {
+            "x": 186,
+            "y": 120,
+            "width": 18,
+            "height": 18
+        },
+        "harbor-12": {
+            "x": 204,
+            "y": 120,
+            "width": 12,
+            "height": 12
+        },
+        "bicycle-24": {
+            "x": 216,
+            "y": 120,
+            "width": 24,
+            "height": 24
+        },
+        "bicycle-18": {
+            "x": 240,
+            "y": 120,
+            "width": 18,
+            "height": 18
+        },
+        "bicycle-12": {
+            "x": 258,
+            "y": 120,
+            "width": 12,
+            "height": 12
+        },
+        "park-24": {
+            "x": 0,
+            "y": 144,
+            "width": 24,
+            "height": 24
+        },
+        "park-18": {
+            "x": 24,
+            "y": 144,
+            "width": 18,
+            "height": 18
+        },
+        "park-12": {
+            "x": 42,
+            "y": 144,
+            "width": 12,
+            "height": 12
+        },
+        "park2-24": {
+            "x": 54,
+            "y": 144,
+            "width": 24,
+            "height": 24
+        },
+        "park2-18": {
+            "x": 78,
+            "y": 144,
+            "width": 18,
+            "height": 18
+        },
+        "park2-12": {
+            "x": 96,
+            "y": 144,
+            "width": 12,
+            "height": 12
+        },
+        "museum-24": {
+            "x": 108,
+            "y": 144,
+            "width": 24,
+            "height": 24
+        },
+        "museum-18": {
+            "x": 132,
+            "y": 144,
+            "width": 18,
+            "height": 18
+        },
+        "museum-12": {
+            "x": 150,
+            "y": 144,
+            "width": 12,
+            "height": 12
+        },
+        "lodging-24": {
+            "x": 162,
+            "y": 144,
+            "width": 24,
+            "height": 24
+        },
+        "lodging-18": {
+            "x": 186,
+            "y": 144,
+            "width": 18,
+            "height": 18
+        },
+        "lodging-12": {
+            "x": 204,
+            "y": 144,
+            "width": 12,
+            "height": 12
+        },
+        "monument-24": {
+            "x": 216,
+            "y": 144,
+            "width": 24,
+            "height": 24
+        },
+        "monument-18": {
+            "x": 240,
+            "y": 144,
+            "width": 18,
+            "height": 18
+        },
+        "monument-12": {
+            "x": 258,
+            "y": 144,
+            "width": 12,
+            "height": 12
+        },
+        "zoo-24": {
+            "x": 0,
+            "y": 168,
+            "width": 24,
+            "height": 24
+        },
+        "zoo-18": {
+            "x": 24,
+            "y": 168,
+            "width": 18,
+            "height": 18
+        },
+        "zoo-12": {
+            "x": 42,
+            "y": 168,
+            "width": 12,
+            "height": 12
+        },
+        "garden-24": {
+            "x": 54,
+            "y": 168,
+            "width": 24,
+            "height": 24
+        },
+        "garden-18": {
+            "x": 78,
+            "y": 168,
+            "width": 18,
+            "height": 18
+        },
+        "garden-12": {
+            "x": 96,
+            "y": 168,
+            "width": 12,
+            "height": 12
+        },
+        "campsite-24": {
+            "x": 108,
+            "y": 168,
+            "width": 24,
+            "height": 24
+        },
+        "campsite-18": {
+            "x": 132,
+            "y": 168,
+            "width": 18,
+            "height": 18
+        },
+        "campsite-12": {
+            "x": 150,
+            "y": 168,
+            "width": 12,
+            "height": 12
+        },
+        "theatre-24": {
+            "x": 162,
+            "y": 168,
+            "width": 24,
+            "height": 24
+        },
+        "theatre-18": {
+            "x": 186,
+            "y": 168,
+            "width": 18,
+            "height": 18
+        },
+        "theatre-12": {
+            "x": 204,
+            "y": 168,
+            "width": 12,
+            "height": 12
+        },
+        "art-gallery-24": {
+            "x": 216,
+            "y": 168,
+            "width": 24,
+            "height": 24
+        },
+        "art-gallery-18": {
+            "x": 240,
+            "y": 168,
+            "width": 18,
+            "height": 18
+        },
+        "art-gallery-12": {
+            "x": 258,
+            "y": 168,
+            "width": 12,
+            "height": 12
+        },
+        "pitch-24": {
+            "x": 0,
+            "y": 192,
+            "width": 24,
+            "height": 24
+        },
+        "pitch-18": {
+            "x": 24,
+            "y": 192,
+            "width": 18,
+            "height": 18
+        },
+        "pitch-12": {
+            "x": 42,
+            "y": 192,
+            "width": 12,
+            "height": 12
+        },
+        "soccer-24": {
+            "x": 54,
+            "y": 192,
+            "width": 24,
+            "height": 24
+        },
+        "soccer-18": {
+            "x": 78,
+            "y": 192,
+            "width": 18,
+            "height": 18
+        },
+        "soccer-12": {
+            "x": 96,
+            "y": 192,
+            "width": 12,
+            "height": 12
+        },
+        "america-football-24": {
+            "x": 108,
+            "y": 192,
+            "width": 24,
+            "height": 24
+        },
+        "america-football-18": {
+            "x": 132,
+            "y": 192,
+            "width": 18,
+            "height": 18
+        },
+        "america-football-12": {
+            "x": 150,
+            "y": 192,
+            "width": 12,
+            "height": 12
+        },
+        "tennis-24": {
+            "x": 162,
+            "y": 192,
+            "width": 24,
+            "height": 24
+        },
+        "tennis-18": {
+            "x": 186,
+            "y": 192,
+            "width": 18,
+            "height": 18
+        },
+        "tennis-12": {
+            "x": 204,
+            "y": 192,
+            "width": 12,
+            "height": 12
+        },
+        "basketball-24": {
+            "x": 216,
+            "y": 192,
+            "width": 24,
+            "height": 24
+        },
+        "basketball-18": {
+            "x": 240,
+            "y": 192,
+            "width": 18,
+            "height": 18
+        },
+        "basketball-12": {
+            "x": 258,
+            "y": 192,
+            "width": 12,
+            "height": 12
+        },
+        "baseball-24": {
+            "x": 0,
+            "y": 216,
+            "width": 24,
+            "height": 24
+        },
+        "baseball-18": {
+            "x": 24,
+            "y": 216,
+            "width": 18,
+            "height": 18
+        },
+        "baseball-12": {
+            "x": 42,
+            "y": 216,
+            "width": 12,
+            "height": 12
+        },
+        "golf-24": {
+            "x": 54,
+            "y": 216,
+            "width": 24,
+            "height": 24
+        },
+        "golf-18": {
+            "x": 78,
+            "y": 216,
+            "width": 18,
+            "height": 18
+        },
+        "golf-12": {
+            "x": 96,
+            "y": 216,
+            "width": 12,
+            "height": 12
+        },
+        "swimming-24": {
+            "x": 108,
+            "y": 216,
+            "width": 24,
+            "height": 24
+        },
+        "swimming-18": {
+            "x": 132,
+            "y": 216,
+            "width": 18,
+            "height": 18
+        },
+        "swimming-12": {
+            "x": 150,
+            "y": 216,
+            "width": 12,
+            "height": 12
+        },
+        "cricket-24": {
+            "x": 162,
+            "y": 216,
+            "width": 24,
+            "height": 24
+        },
+        "cricket-18": {
+            "x": 186,
+            "y": 216,
+            "width": 18,
+            "height": 18
+        },
+        "cricket-12": {
+            "x": 204,
+            "y": 216,
+            "width": 12,
+            "height": 12
+        },
+        "skiing-24": {
+            "x": 216,
+            "y": 216,
+            "width": 24,
+            "height": 24
+        },
+        "skiing-18": {
+            "x": 240,
+            "y": 216,
+            "width": 18,
+            "height": 18
+        },
+        "skiing-12": {
+            "x": 258,
+            "y": 216,
+            "width": 12,
+            "height": 12
+        },
+        "school-24": {
+            "x": 0,
+            "y": 240,
+            "width": 24,
+            "height": 24
+        },
+        "school-18": {
+            "x": 24,
+            "y": 240,
+            "width": 18,
+            "height": 18
+        },
+        "school-12": {
+            "x": 42,
+            "y": 240,
+            "width": 12,
+            "height": 12
+        },
+        "college-24": {
+            "x": 54,
+            "y": 240,
+            "width": 24,
+            "height": 24
+        },
+        "college-18": {
+            "x": 78,
+            "y": 240,
+            "width": 18,
+            "height": 18
+        },
+        "college-12": {
+            "x": 96,
+            "y": 240,
+            "width": 12,
+            "height": 12
+        },
+        "library-24": {
+            "x": 108,
+            "y": 240,
+            "width": 24,
+            "height": 24
+        },
+        "library-18": {
+            "x": 132,
+            "y": 240,
+            "width": 18,
+            "height": 18
+        },
+        "library-12": {
+            "x": 150,
+            "y": 240,
+            "width": 12,
+            "height": 12
+        },
+        "post-24": {
+            "x": 162,
+            "y": 240,
+            "width": 24,
+            "height": 24
+        },
+        "post-18": {
+            "x": 186,
+            "y": 240,
+            "width": 18,
+            "height": 18
+        },
+        "post-12": {
+            "x": 204,
+            "y": 240,
+            "width": 12,
+            "height": 12
+        },
+        "fire-station-24": {
+            "x": 216,
+            "y": 240,
+            "width": 24,
+            "height": 24
+        },
+        "fire-station-18": {
+            "x": 240,
+            "y": 240,
+            "width": 18,
+            "height": 18
+        },
+        "fire-station-12": {
+            "x": 258,
+            "y": 240,
+            "width": 12,
+            "height": 12
+        },
+        "town-hall-24": {
+            "x": 0,
+            "y": 264,
+            "width": 24,
+            "height": 24
+        },
+        "town-hall-18": {
+            "x": 24,
+            "y": 264,
+            "width": 18,
+            "height": 18
+        },
+        "town-hall-12": {
+            "x": 42,
+            "y": 264,
+            "width": 12,
+            "height": 12
+        },
+        "police-24": {
+            "x": 54,
+            "y": 264,
+            "width": 24,
+            "height": 24
+        },
+        "police-18": {
+            "x": 78,
+            "y": 264,
+            "width": 18,
+            "height": 18
+        },
+        "police-12": {
+            "x": 96,
+            "y": 264,
+            "width": 12,
+            "height": 12
+        },
+        "prison-24": {
+            "x": 108,
+            "y": 264,
+            "width": 24,
+            "height": 24
+        },
+        "prison-18": {
+            "x": 132,
+            "y": 264,
+            "width": 18,
+            "height": 18
+        },
+        "prison-12": {
+            "x": 150,
+            "y": 264,
+            "width": 12,
+            "height": 12
+        },
+        "embassy-24": {
+            "x": 162,
+            "y": 264,
+            "width": 24,
+            "height": 24
+        },
+        "embassy-18": {
+            "x": 186,
+            "y": 264,
+            "width": 18,
+            "height": 18
+        },
+        "embassy-12": {
+            "x": 204,
+            "y": 264,
+            "width": 12,
+            "height": 12
+        },
+        "beer-24": {
+            "x": 216,
+            "y": 264,
+            "width": 24,
+            "height": 24
+        },
+        "beer-18": {
+            "x": 240,
+            "y": 264,
+            "width": 18,
+            "height": 18
+        },
+        "beer-12": {
+            "x": 258,
+            "y": 264,
+            "width": 12,
+            "height": 12
+        },
+        "restaurant-24": {
+            "x": 0,
+            "y": 288,
+            "width": 24,
+            "height": 24
+        },
+        "restaurant-18": {
+            "x": 24,
+            "y": 288,
+            "width": 18,
+            "height": 18
+        },
+        "restaurant-12": {
+            "x": 42,
+            "y": 288,
+            "width": 12,
+            "height": 12
+        },
+        "cafe-24": {
+            "x": 54,
+            "y": 288,
+            "width": 24,
+            "height": 24
+        },
+        "cafe-18": {
+            "x": 78,
+            "y": 288,
+            "width": 18,
+            "height": 18
+        },
+        "cafe-12": {
+            "x": 96,
+            "y": 288,
+            "width": 12,
+            "height": 12
+        },
+        "shop-24": {
+            "x": 108,
+            "y": 288,
+            "width": 24,
+            "height": 24
+        },
+        "shop-18": {
+            "x": 132,
+            "y": 288,
+            "width": 18,
+            "height": 18
+        },
+        "shop-12": {
+            "x": 150,
+            "y": 288,
+            "width": 12,
+            "height": 12
+        },
+        "fast-food-24": {
+            "x": 162,
+            "y": 288,
+            "width": 24,
+            "height": 24
+        },
+        "fast-food-18": {
+            "x": 186,
+            "y": 288,
+            "width": 18,
+            "height": 18
+        },
+        "fast-food-12": {
+            "x": 204,
+            "y": 288,
+            "width": 12,
+            "height": 12
+        },
+        "bar-24": {
+            "x": 216,
+            "y": 288,
+            "width": 24,
+            "height": 24
+        },
+        "bar-18": {
+            "x": 240,
+            "y": 288,
+            "width": 18,
+            "height": 18
+        },
+        "bar-12": {
+            "x": 258,
+            "y": 288,
+            "width": 12,
+            "height": 12
+        },
+        "bank-24": {
+            "x": 0,
+            "y": 312,
+            "width": 24,
+            "height": 24
+        },
+        "bank-18": {
+            "x": 24,
+            "y": 312,
+            "width": 18,
+            "height": 18
+        },
+        "bank-12": {
+            "x": 42,
+            "y": 312,
+            "width": 12,
+            "height": 12
+        },
+        "grocery-24": {
+            "x": 54,
+            "y": 312,
+            "width": 24,
+            "height": 24
+        },
+        "grocery-18": {
+            "x": 78,
+            "y": 312,
+            "width": 18,
+            "height": 18
+        },
+        "grocery-12": {
+            "x": 96,
+            "y": 312,
+            "width": 12,
+            "height": 12
+        },
+        "cinema-24": {
+            "x": 108,
+            "y": 312,
+            "width": 24,
+            "height": 24
+        },
+        "cinema-18": {
+            "x": 132,
+            "y": 312,
+            "width": 18,
+            "height": 18
+        },
+        "cinema-12": {
+            "x": 150,
+            "y": 312,
+            "width": 12,
+            "height": 12
+        },
+        "pharmacy-24": {
+            "x": 162,
+            "y": 312,
+            "width": 24,
+            "height": 24
+        },
+        "pharmacy-18": {
+            "x": 186,
+            "y": 312,
+            "width": 18,
+            "height": 18
+        },
+        "pharmacy-12": {
+            "x": 204,
+            "y": 312,
+            "width": 12,
+            "height": 12
+        },
+        "hospital-24": {
+            "x": 216,
+            "y": 312,
+            "width": 24,
+            "height": 24
+        },
+        "hospital-18": {
+            "x": 240,
+            "y": 312,
+            "width": 18,
+            "height": 18
+        },
+        "hospital-12": {
+            "x": 258,
+            "y": 312,
+            "width": 12,
+            "height": 12
+        },
+        "danger-24": {
+            "x": 0,
+            "y": 336,
+            "width": 24,
+            "height": 24
+        },
+        "danger-18": {
+            "x": 24,
+            "y": 336,
+            "width": 18,
+            "height": 18
+        },
+        "danger-12": {
+            "x": 42,
+            "y": 336,
+            "width": 12,
+            "height": 12
+        },
+        "industrial-24": {
+            "x": 54,
+            "y": 336,
+            "width": 24,
+            "height": 24
+        },
+        "industrial-18": {
+            "x": 78,
+            "y": 336,
+            "width": 18,
+            "height": 18
+        },
+        "industrial-12": {
+            "x": 96,
+            "y": 336,
+            "width": 12,
+            "height": 12
+        },
+        "warehouse-24": {
+            "x": 108,
+            "y": 336,
+            "width": 24,
+            "height": 24
+        },
+        "warehouse-18": {
+            "x": 132,
+            "y": 336,
+            "width": 18,
+            "height": 18
+        },
+        "warehouse-12": {
+            "x": 150,
+            "y": 336,
+            "width": 12,
+            "height": 12
+        },
+        "commercial-24": {
+            "x": 162,
+            "y": 336,
+            "width": 24,
+            "height": 24
+        },
+        "commercial-18": {
+            "x": 186,
+            "y": 336,
+            "width": 18,
+            "height": 18
+        },
+        "commercial-12": {
+            "x": 204,
+            "y": 336,
+            "width": 12,
+            "height": 12
+        },
+        "building-24": {
+            "x": 216,
+            "y": 336,
+            "width": 24,
+            "height": 24
+        },
+        "building-18": {
+            "x": 240,
+            "y": 336,
+            "width": 18,
+            "height": 18
+        },
+        "building-12": {
+            "x": 258,
+            "y": 336,
+            "width": 12,
+            "height": 12
+        },
+        "place-of-worship-24": {
+            "x": 0,
+            "y": 360,
+            "width": 24,
+            "height": 24
+        },
+        "place-of-worship-18": {
+            "x": 24,
+            "y": 360,
+            "width": 18,
+            "height": 18
+        },
+        "place-of-worship-12": {
+            "x": 42,
+            "y": 360,
+            "width": 12,
+            "height": 12
+        },
+        "alcohol-shop-24": {
+            "x": 54,
+            "y": 360,
+            "width": 24,
+            "height": 24
+        },
+        "alcohol-shop-18": {
+            "x": 78,
+            "y": 360,
+            "width": 18,
+            "height": 18
+        },
+        "alcohol-shop-12": {
+            "x": 96,
+            "y": 360,
+            "width": 12,
+            "height": 12
+        },
+        "logging-24": {
+            "x": 108,
+            "y": 360,
+            "width": 24,
+            "height": 24
+        },
+        "logging-18": {
+            "x": 132,
+            "y": 360,
+            "width": 18,
+            "height": 18
+        },
+        "logging-12": {
+            "x": 150,
+            "y": 360,
+            "width": 12,
+            "height": 12
+        },
+        "oil-well-24": {
+            "x": 162,
+            "y": 360,
+            "width": 24,
+            "height": 24
+        },
+        "oil-well-18": {
+            "x": 186,
+            "y": 360,
+            "width": 18,
+            "height": 18
+        },
+        "oil-well-12": {
+            "x": 204,
+            "y": 360,
+            "width": 12,
+            "height": 12
+        },
+        "slaughterhouse-24": {
+            "x": 216,
+            "y": 360,
+            "width": 24,
+            "height": 24
+        },
+        "slaughterhouse-18": {
+            "x": 240,
+            "y": 360,
+            "width": 18,
+            "height": 18
+        },
+        "slaughterhouse-12": {
+            "x": 258,
+            "y": 360,
+            "width": 12,
+            "height": 12
+        },
+        "dam-24": {
+            "x": 0,
+            "y": 384,
+            "width": 24,
+            "height": 24
+        },
+        "dam-18": {
+            "x": 24,
+            "y": 384,
+            "width": 18,
+            "height": 18
+        },
+        "dam-12": {
+            "x": 42,
+            "y": 384,
+            "width": 12,
+            "height": 12
+        },
+        "water-24": {
+            "x": 54,
+            "y": 384,
+            "width": 24,
+            "height": 24
+        },
+        "water-18": {
+            "x": 78,
+            "y": 384,
+            "width": 18,
+            "height": 18
+        },
+        "water-12": {
+            "x": 96,
+            "y": 384,
+            "width": 12,
+            "height": 12
+        },
+        "wetland-24": {
+            "x": 108,
+            "y": 384,
+            "width": 24,
+            "height": 24
+        },
+        "wetland-18": {
+            "x": 132,
+            "y": 384,
+            "width": 18,
+            "height": 18
+        },
+        "wetland-12": {
+            "x": 150,
+            "y": 384,
+            "width": 12,
+            "height": 12
+        },
+        "disability-24": {
+            "x": 162,
+            "y": 384,
+            "width": 24,
+            "height": 24
+        },
+        "disability-18": {
+            "x": 186,
+            "y": 384,
+            "width": 18,
+            "height": 18
+        },
+        "disability-12": {
+            "x": 204,
+            "y": 384,
+            "width": 12,
+            "height": 12
+        },
+        "telephone-24": {
+            "x": 216,
+            "y": 384,
+            "width": 24,
+            "height": 24
+        },
+        "telephone-18": {
+            "x": 240,
+            "y": 384,
+            "width": 18,
+            "height": 18
+        },
+        "telephone-12": {
+            "x": 258,
+            "y": 384,
+            "width": 12,
+            "height": 12
+        },
+        "emergency-telephone-24": {
+            "x": 0,
+            "y": 408,
+            "width": 24,
+            "height": 24
+        },
+        "emergency-telephone-18": {
+            "x": 24,
+            "y": 408,
+            "width": 18,
+            "height": 18
+        },
+        "emergency-telephone-12": {
+            "x": 42,
+            "y": 408,
+            "width": 12,
+            "height": 12
+        },
+        "toilets-24": {
+            "x": 54,
+            "y": 408,
+            "width": 24,
+            "height": 24
+        },
+        "toilets-18": {
+            "x": 78,
+            "y": 408,
+            "width": 18,
+            "height": 18
+        },
+        "toilets-12": {
+            "x": 96,
+            "y": 408,
+            "width": 12,
+            "height": 12
+        },
+        "waste-basket-24": {
+            "x": 108,
+            "y": 408,
+            "width": 24,
+            "height": 24
+        },
+        "waste-basket-18": {
+            "x": 132,
+            "y": 408,
+            "width": 18,
+            "height": 18
+        },
+        "waste-basket-12": {
+            "x": 150,
+            "y": 408,
+            "width": 12,
+            "height": 12
+        },
+        "music-24": {
+            "x": 162,
+            "y": 408,
+            "width": 24,
+            "height": 24
+        },
+        "music-18": {
+            "x": 186,
+            "y": 408,
+            "width": 18,
+            "height": 18
+        },
+        "music-12": {
+            "x": 204,
+            "y": 408,
+            "width": 12,
+            "height": 12
+        },
+        "land-use-24": {
+            "x": 216,
+            "y": 408,
+            "width": 24,
+            "height": 24
+        },
+        "land-use-18": {
+            "x": 240,
+            "y": 408,
+            "width": 18,
+            "height": 18
+        },
+        "land-use-12": {
+            "x": 258,
+            "y": 408,
+            "width": 12,
+            "height": 12
+        },
+        "city-24": {
+            "x": 0,
+            "y": 432,
+            "width": 24,
+            "height": 24
+        },
+        "city-18": {
+            "x": 24,
+            "y": 432,
+            "width": 18,
+            "height": 18
+        },
+        "city-12": {
+            "x": 42,
+            "y": 432,
+            "width": 12,
+            "height": 12
+        },
+        "town-24": {
+            "x": 54,
+            "y": 432,
+            "width": 24,
+            "height": 24
+        },
+        "town-18": {
+            "x": 78,
+            "y": 432,
+            "width": 18,
+            "height": 18
+        },
+        "town-12": {
+            "x": 96,
+            "y": 432,
+            "width": 12,
+            "height": 12
+        },
+        "village-24": {
+            "x": 108,
+            "y": 432,
+            "width": 24,
+            "height": 24
+        },
+        "village-18": {
+            "x": 132,
+            "y": 432,
+            "width": 18,
+            "height": 18
+        },
+        "village-12": {
+            "x": 150,
+            "y": 432,
+            "width": 12,
+            "height": 12
+        },
+        "farm-24": {
+            "x": 162,
+            "y": 432,
+            "width": 24,
+            "height": 24
+        },
+        "farm-18": {
+            "x": 186,
+            "y": 432,
+            "width": 18,
+            "height": 18
+        },
+        "farm-12": {
+            "x": 204,
+            "y": 432,
+            "width": 12,
+            "height": 12
+        },
+        "bakery-24": {
+            "x": 216,
+            "y": 432,
+            "width": 24,
+            "height": 24
+        },
+        "bakery-18": {
+            "x": 240,
+            "y": 432,
+            "width": 18,
+            "height": 18
+        },
+        "bakery-12": {
+            "x": 258,
+            "y": 432,
+            "width": 12,
+            "height": 12
+        },
+        "dog-park-24": {
+            "x": 0,
+            "y": 456,
+            "width": 24,
+            "height": 24
+        },
+        "dog-park-18": {
+            "x": 24,
+            "y": 456,
+            "width": 18,
+            "height": 18
+        },
+        "dog-park-12": {
+            "x": 42,
+            "y": 456,
+            "width": 12,
+            "height": 12
+        },
+        "lighthouse-24": {
+            "x": 54,
+            "y": 456,
+            "width": 24,
+            "height": 24
+        },
+        "lighthouse-18": {
+            "x": 78,
+            "y": 456,
+            "width": 18,
+            "height": 18
+        },
+        "lighthouse-12": {
+            "x": 96,
+            "y": 456,
+            "width": 12,
+            "height": 12
+        },
+        "clothing-store-24": {
+            "x": 108,
+            "y": 456,
+            "width": 24,
+            "height": 24
+        },
+        "clothing-store-18": {
+            "x": 132,
+            "y": 456,
+            "width": 18,
+            "height": 18
+        },
+        "clothing-store-12": {
+            "x": 150,
+            "y": 456,
+            "width": 12,
+            "height": 12
+        },
+        "polling-place-24": {
+            "x": 162,
+            "y": 456,
+            "width": 24,
+            "height": 24
+        },
+        "polling-place-18": {
+            "x": 186,
+            "y": 456,
+            "width": 18,
+            "height": 18
+        },
+        "polling-place-12": {
+            "x": 204,
+            "y": 456,
+            "width": 12,
+            "height": 12
+        },
+        "playground-24": {
+            "x": 216,
+            "y": 456,
+            "width": 24,
+            "height": 24
+        },
+        "playground-18": {
+            "x": 240,
+            "y": 456,
+            "width": 18,
+            "height": 18
+        },
+        "playground-12": {
+            "x": 258,
+            "y": 456,
+            "width": 12,
+            "height": 12
+        },
+        "entrance-24": {
+            "x": 0,
+            "y": 480,
+            "width": 24,
+            "height": 24
+        },
+        "entrance-18": {
+            "x": 24,
+            "y": 480,
+            "width": 18,
+            "height": 18
+        },
+        "entrance-12": {
+            "x": 42,
+            "y": 480,
+            "width": 12,
+            "height": 12
+        },
+        "heart-24": {
+            "x": 54,
+            "y": 480,
+            "width": 24,
+            "height": 24
+        },
+        "heart-18": {
+            "x": 78,
+            "y": 480,
+            "width": 18,
+            "height": 18
+        },
+        "heart-12": {
+            "x": 96,
+            "y": 480,
+            "width": 12,
+            "height": 12
+        },
+        "london-underground-24": {
+            "x": 108,
+            "y": 480,
+            "width": 24,
+            "height": 24
+        },
+        "london-underground-18": {
+            "x": 132,
+            "y": 480,
+            "width": 18,
+            "height": 18
+        },
+        "london-underground-12": {
+            "x": 150,
+            "y": 480,
+            "width": 12,
+            "height": 12
+        },
+        "minefield-24": {
+            "x": 162,
+            "y": 480,
+            "width": 24,
+            "height": 24
+        },
+        "minefield-18": {
+            "x": 186,
+            "y": 480,
+            "width": 18,
+            "height": 18
+        },
+        "minefield-12": {
+            "x": 204,
+            "y": 480,
+            "width": 12,
+            "height": 12
+        },
+        "rail-underground-24": {
+            "x": 216,
+            "y": 480,
+            "width": 24,
+            "height": 24
+        },
+        "rail-underground-18": {
+            "x": 240,
+            "y": 480,
+            "width": 18,
+            "height": 18
+        },
+        "rail-underground-12": {
+            "x": 258,
+            "y": 480,
+            "width": 12,
+            "height": 12
+        },
+        "rail-above-24": {
+            "x": 0,
+            "y": 504,
+            "width": 24,
+            "height": 24
+        },
+        "rail-above-18": {
+            "x": 24,
+            "y": 504,
+            "width": 18,
+            "height": 18
+        },
+        "rail-above-12": {
+            "x": 42,
+            "y": 504,
+            "width": 12,
+            "height": 12
+        },
+        "camera-24": {
+            "x": 54,
+            "y": 504,
+            "width": 24,
+            "height": 24
+        },
+        "camera-18": {
+            "x": 78,
+            "y": 504,
+            "width": 18,
+            "height": 18
+        },
+        "camera-12": {
+            "x": 96,
+            "y": 504,
+            "width": 12,
+            "height": 12
+        },
+        "laundry-24": {
+            "x": 108,
+            "y": 504,
+            "width": 24,
+            "height": 24
+        },
+        "laundry-18": {
+            "x": 132,
+            "y": 504,
+            "width": 18,
+            "height": 18
+        },
+        "laundry-12": {
+            "x": 150,
+            "y": 504,
+            "width": 12,
+            "height": 12
+        },
+        "car-24": {
+            "x": 162,
+            "y": 504,
+            "width": 24,
+            "height": 24
+        },
+        "car-18": {
+            "x": 186,
+            "y": 504,
+            "width": 18,
+            "height": 18
+        },
+        "car-12": {
+            "x": 204,
+            "y": 504,
+            "width": 12,
+            "height": 12
+        },
+        "suitcase-24": {
+            "x": 216,
+            "y": 504,
+            "width": 24,
+            "height": 24
+        },
+        "suitcase-18": {
+            "x": 240,
+            "y": 504,
+            "width": 18,
+            "height": 18
+        },
+        "suitcase-12": {
+            "x": 258,
+            "y": 504,
+            "width": 12,
+            "height": 12
+        },
+        "hairdresser-24": {
+            "x": 0,
+            "y": 528,
+            "width": 24,
+            "height": 24
+        },
+        "hairdresser-18": {
+            "x": 24,
+            "y": 528,
+            "width": 18,
+            "height": 18
+        },
+        "hairdresser-12": {
+            "x": 42,
+            "y": 528,
+            "width": 12,
+            "height": 12
+        },
+        "chemist-24": {
+            "x": 54,
+            "y": 528,
+            "width": 24,
+            "height": 24
+        },
+        "chemist-18": {
+            "x": 78,
+            "y": 528,
+            "width": 18,
+            "height": 18
+        },
+        "chemist-12": {
+            "x": 96,
+            "y": 528,
+            "width": 12,
+            "height": 12
+        },
+        "mobilephone-24": {
+            "x": 108,
+            "y": 528,
+            "width": 24,
+            "height": 24
+        },
+        "mobilephone-18": {
+            "x": 132,
+            "y": 528,
+            "width": 18,
+            "height": 18
+        },
+        "mobilephone-12": {
+            "x": 150,
+            "y": 528,
+            "width": 12,
+            "height": 12
+        },
+        "scooter-24": {
+            "x": 162,
+            "y": 528,
+            "width": 24,
+            "height": 24
+        },
+        "scooter-18": {
+            "x": 186,
+            "y": 528,
+            "width": 18,
+            "height": 18
+        },
+        "scooter-12": {
+            "x": 204,
+            "y": 528,
+            "width": 12,
+            "height": 12
+        },
+        "gift-24": {
+            "x": 216,
+            "y": 528,
+            "width": 24,
+            "height": 24
+        },
+        "gift-18": {
+            "x": 240,
+            "y": 528,
+            "width": 18,
+            "height": 18
+        },
+        "gift-12": {
+            "x": 258,
+            "y": 528,
+            "width": 12,
+            "height": 12
+        },
+        "ice-cream-24": {
+            "x": 0,
+            "y": 552,
+            "width": 24,
+            "height": 24
+        },
+        "ice-cream-18": {
+            "x": 24,
+            "y": 552,
+            "width": 18,
+            "height": 18
+        },
+        "ice-cream-12": {
+            "x": 42,
+            "y": 552,
+            "width": 12,
+            "height": 12
+        }
+    },
     "locales": [
         "af",
         "sq",
     "locales": [
         "af",
         "sq",
@@ -52832,7 +52980,6 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
         "gl",
         "de",
         "el",
         "gl",
         "de",
         "el",
-        "hi-IN",
         "hu",
         "is",
         "id",
         "hu",
         "is",
         "id",
@@ -52848,7 +52995,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
         "pl",
         "pt",
         "pt-BR",
         "pl",
         "pt",
         "pt-BR",
-        "ro-RO",
+        "ro",
         "ru",
         "sc",
         "sr",
         "ru",
         "sc",
         "sr",
@@ -53003,13 +53150,14 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
             },
             "merge": {
                 "title": "Merge",
             },
             "merge": {
                 "title": "Merge",
-                "description": "Merge these lines.",
+                "description": "Merge these features.",
                 "key": "C",
                 "key": "C",
-                "annotation": "Merged {n} lines.",
+                "annotation": "Merged {n} features.",
                 "not_eligible": "These features can't be merged.",
                 "not_eligible": "These features can't be merged.",
-                "not_adjacent": "These lines can't be merged because they aren't connected.",
-                "restriction": "These lines can't be merged because at least one is a member of a \"{relation}\" relation.",
-                "incomplete_relation": "These features can't be merged because at least one hasn't been fully downloaded."
+                "not_adjacent": "These features can't be merged because they aren't connected.",
+                "restriction": "These features can't be merged because at least one is a member of a \"{relation}\" relation.",
+                "incomplete_relation": "These features can't be merged because at least one hasn't been fully downloaded.",
+                "conflicting_tags": "These features can't be merged because some of their tags have conflicting values."
             },
             "move": {
                 "title": "Move",
             },
             "move": {
                 "title": "Move",
@@ -53082,7 +53230,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
             "nothing": "Nothing to redo."
         },
         "tooltip_keyhint": "Shortcut:",
             "nothing": "Nothing to redo."
         },
         "tooltip_keyhint": "Shortcut:",
-        "browser_notice": "This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 9 and above. Please upgrade your browser or use Potlatch 2 to edit the map.",
+        "browser_notice": "This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.",
         "translate": {
             "translate": "Translate",
             "localized_translation_label": "Multilingual name",
         "translate": {
             "translate": "Translate",
             "localized_translation_label": "Multilingual name",
@@ -53092,7 +53240,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
         "zoom_in_edit": "Zoom in to Edit",
         "logout": "logout",
         "loading_auth": "Connecting to OpenStreetMap...",
         "zoom_in_edit": "Zoom in to Edit",
         "logout": "logout",
         "loading_auth": "Connecting to OpenStreetMap...",
-        "report_a_bug": "report a bug",
+        "report_a_bug": "Report a bug",
+        "help_translate": "Help translate",
         "feature_info": {
             "hidden_warning": "{count} hidden features",
             "hidden_details": "These features are currently hidden: {details}"
         "feature_info": {
             "hidden_warning": "{count} hidden features",
             "hidden_details": "These features are currently hidden: {details}"
@@ -53818,6 +53967,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                     "label": "Handicap",
                     "placeholder": "1-18"
                 },
                     "label": "Handicap",
                     "placeholder": "1-18"
                 },
+                "handrail": {
+                    "label": "Handrail"
+                },
                 "highway": {
                     "label": "Type"
                 },
                 "highway": {
                     "label": "Type"
                 },
@@ -53932,6 +54084,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                     "label": "Speed Limit",
                     "placeholder": "40, 50, 60..."
                 },
                     "label": "Speed Limit",
                     "placeholder": "40, 50, 60..."
                 },
+                "maxstay": {
+                    "label": "Max Stay"
+                },
                 "mtb/scale": {
                     "label": "Mountain Biking Difficulty",
                     "placeholder": "0, 1, 2, 3...",
                 "mtb/scale": {
                     "label": "Mountain Biking Difficulty",
                     "placeholder": "0, 1, 2, 3...",
@@ -54289,6 +54444,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                         "grade5": "Soft: soil/sand/grass"
                     }
                 },
                         "grade5": "Soft: soil/sand/grass"
                     }
                 },
+                "traffic_signals": {
+                    "label": "Type"
+                },
                 "trail_visibility": {
                     "label": "Trail Visibility",
                     "placeholder": "Excellent, Good, Bad...",
                 "trail_visibility": {
                     "label": "Trail Visibility",
                     "placeholder": "Excellent, Good, Bad...",
@@ -54589,6 +54747,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                     "name": "Marketplace",
                     "terms": ""
                 },
                     "name": "Marketplace",
                     "terms": ""
                 },
+                "amenity/motorcycle_parking": {
+                    "name": "Motorcycle Parking",
+                    "terms": ""
+                },
                 "amenity/nightclub": {
                     "name": "Nightclub",
                     "terms": "disco*,night club,dancing,dance club"
                 "amenity/nightclub": {
                     "name": "Nightclub",
                     "terms": "disco*,night club,dancing,dance club"
@@ -54721,9 +54883,45 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                     "name": "University Grounds",
                     "terms": "college"
                 },
                     "name": "University Grounds",
                     "terms": "college"
                 },
-                "amenity/vending_machine": {
+                "amenity/vending_machine/cigarettes": {
+                    "name": "Cigarette Vending Machine",
+                    "terms": "cigarette"
+                },
+                "amenity/vending_machine/condoms": {
+                    "name": "Condom Vending Machine",
+                    "terms": "condom"
+                },
+                "amenity/vending_machine/drinks": {
+                    "name": "Drink Vending Machine",
+                    "terms": "drink,soda,beverage,juice,pop"
+                },
+                "amenity/vending_machine/excrement_bags": {
+                    "name": "Excrement Bag Vending Machine",
+                    "terms": "excrement bags,poop,dog,animal"
+                },
+                "amenity/vending_machine/news_papers": {
+                    "name": "Newspaper Vending Machine",
+                    "terms": "newspaper"
+                },
+                "amenity/vending_machine/parcel_pickup_dropoff": {
+                    "name": "Parcel Pickup/Dropoff Vending Machine",
+                    "terms": "parcel,mail,pickup"
+                },
+                "amenity/vending_machine/parking_tickets": {
+                    "name": "Parking Ticket Vending Machine",
+                    "terms": "parking,ticket"
+                },
+                "amenity/vending_machine/public_transport_tickets": {
+                    "name": "Transit Ticket Vending Machine",
+                    "terms": "bus,train,ferry,rail,ticket,transportation"
+                },
+                "amenity/vending_machine/sweets": {
+                    "name": "Snack Vending Machine",
+                    "terms": "candy,gum,chip,pretzel,cookie,cracker"
+                },
+                "amenity/vending_machine/vending_machine": {
                     "name": "Vending Machine",
                     "name": "Vending Machine",
-                    "terms": "snack,soda,ticket"
+                    "terms": ""
                 },
                 "amenity/veterinary": {
                     "name": "Veterinary",
                 },
                 "amenity/veterinary": {
                     "name": "Veterinary",
@@ -54834,15 +55032,15 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                     "terms": ""
                 },
                 "building/cathedral": {
                     "terms": ""
                 },
                 "building/cathedral": {
-                    "name": "Cathedral",
+                    "name": "Cathedral Building",
                     "terms": ""
                 },
                 "building/chapel": {
                     "terms": ""
                 },
                 "building/chapel": {
-                    "name": "Chapel",
+                    "name": "Chapel Building",
                     "terms": ""
                 },
                 "building/church": {
                     "terms": ""
                 },
                 "building/church": {
-                    "name": "Church",
+                    "name": "Church Building",
                     "terms": ""
                 },
                 "building/college": {
                     "terms": ""
                 },
                 "building/college": {
@@ -54858,8 +55056,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                     "terms": ""
                 },
                 "building/detached": {
                     "terms": ""
                 },
                 "building/detached": {
-                    "name": "Detached Home",
-                    "terms": ""
+                    "name": "Detached House",
+                    "terms": "home,single,family,residence,dwelling"
                 },
                 "building/dormitory": {
                     "name": "Dormitory",
                 },
                 "building/dormitory": {
                     "name": "Dormitory",
@@ -54891,7 +55089,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                 },
                 "building/house": {
                     "name": "House",
                 },
                 "building/house": {
                     "name": "House",
-                    "terms": ""
+                    "terms": "home,family,residence,dwelling"
                 },
                 "building/hut": {
                     "name": "Hut",
                 },
                 "building/hut": {
                     "name": "Hut",
@@ -54925,6 +55123,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                     "name": "School Building",
                     "terms": "academy,elementary school,middle school,high school"
                 },
                     "name": "School Building",
                     "terms": "academy,elementary school,middle school,high school"
                 },
+                "building/semidetached_house": {
+                    "name": "Semi-Detached House",
+                    "terms": "home,double,duplex,twin,family,residence,dwelling"
+                },
                 "building/shed": {
                     "name": "Shed",
                     "terms": ""
                 "building/shed": {
                     "name": "Shed",
                     "terms": ""
@@ -54939,7 +55141,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                 },
                 "building/terrace": {
                     "name": "Row Houses",
                 },
                 "building/terrace": {
                     "name": "Row Houses",
-                    "terms": ""
+                    "terms": "home,terrace,brownstone,family,residence,dwelling"
                 },
                 "building/train_station": {
                     "name": "Train Station",
                 },
                 "building/train_station": {
                     "name": "Train Station",
@@ -55418,8 +55620,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                     "terms": ""
                 },
                 "landuse/allotments": {
                     "terms": ""
                 },
                 "landuse/allotments": {
-                    "name": "Allotments",
-                    "terms": ""
+                    "name": "Community Garden",
+                    "terms": "allotment,garden"
                 },
                 "landuse/basin": {
                     "name": "Basin",
                 },
                 "landuse/basin": {
                     "name": "Basin",
@@ -55573,6 +55775,14 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                     "name": "Basketball Court",
                     "terms": ""
                 },
                     "name": "Basketball Court",
                     "terms": ""
                 },
+                "leisure/pitch/rugby_league": {
+                    "name": "Rugby League Field",
+                    "terms": ""
+                },
+                "leisure/pitch/rugby_union": {
+                    "name": "Rugby Union Field",
+                    "terms": ""
+                },
                 "leisure/pitch/skateboard": {
                     "name": "Skate Park",
                     "terms": ""
                 "leisure/pitch/skateboard": {
                     "name": "Skate Park",
                     "terms": ""
@@ -55713,10 +55923,30 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                     "name": "Bunker",
                     "terms": ""
                 },
                     "name": "Bunker",
                     "terms": ""
                 },
+                "military/checkpoint": {
+                    "name": "Checkpoint",
+                    "terms": ""
+                },
+                "military/danger_area": {
+                    "name": "Danger Area",
+                    "terms": ""
+                },
+                "military/naval_base": {
+                    "name": "Naval Base",
+                    "terms": ""
+                },
+                "military/obstacle_course": {
+                    "name": "Obstacle Course",
+                    "terms": ""
+                },
                 "military/range": {
                     "name": "Military Range",
                     "terms": ""
                 },
                 "military/range": {
                     "name": "Military Range",
                     "terms": ""
                 },
+                "military/training_area": {
+                    "name": "Training area",
+                    "terms": ""
+                },
                 "natural": {
                     "name": "Natural",
                     "terms": ""
                 "natural": {
                     "name": "Natural",
                     "terms": ""