Building on this - experimenting with fake 3d svg arcs using two nested orthographic projections and cardinal line interpolation.
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | { | |
| "vars": { | |
| "@gray-base": "#000", | |
| "@gray-darker": "lighten(@gray-base, 13.5%)", | |
| "@gray-dark": "lighten(@gray-base, 20%)", | |
| "@gray": "lighten(@gray-base, 33.5%)", | |
| "@gray-light": "lighten(@gray-base, 46.7%)", | |
| "@gray-lighter": "lighten(@gray-base, 93.5%)", | |
| "@brand-primary": "darken(#428bca, 6.5%)", | |
| "@brand-success": "#5cb85c", | 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | () => { | |
| function hookPrototypeMethods(prefix, object) { | |
| // TODO: also hook getters | |
| if (!object) return; | |
| const originals = {}; | |
| const prototype = Object.getPrototypeOf(object); | |
| Object | |
| .getOwnPropertyNames(prototype) | |
| .filter((n) => { | |
| try { | 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | // Task no. 1: | |
| // use array.reduce to change a two-dimensional array to a key-value object (keys must not be overwritten) | |
| const array = [ | |
| ['name', 'MORWBYTfaG'], | |
| ['name', 'F05hDUA88t'], | |
| ['name', 'YYgmrag4VT'], | |
| ['name', 'iMIqSv8sWR'], | |
| ['name', 'sh1N28ncvu'], | 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | #!/usr/local/bin/3proxy | |
| system "echo 3proxy up!" | |
| # you may use system to execute some external command if proxy starts | |
| nserver 9.9.9.9 | |
| nserver 149.112.112.112 | |
| nscache 65536 | |
| timeouts 1 5 30 60 180 1800 15 60 | 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | -- | |
| -- This is SQL query to extract AddressBook info from respective sqlite3 file from iOS backup. | |
| -- It has been tested only on my own backup, so, if anything is wrong, fork, edit, and stuff. | |
| -- | |
| -- # parse-manifest.py from http://stackoverflow.com/questions/3085153/how-to-parse-the-manifest-mbdb-file-in-an-ios-4-0-itunes-backup | |
| -- | |
| -- $ python ../parse-manifest.py | grep AddressBook.sqlitedb | |
| -- -rw-r--r-- 000001f5 000001f5 1654784 1312812502 1312812502 1287387943 (31bb7ba8914766d4ba40d6dfb6113c8b614be442)HomeDomain::Library/AddressBook/AddressBook.sqlitedb | |
| -- | |
| -- $ sqlite3 31bb7ba8914766d4ba40d6dfb6113c8b614be442 | 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | const {extend: gotExtend} = require('got'); | |
| const http2 = require('http2-wrapper'); | |
| const resolveALPN = require('resolve-alpn'); | |
| // Taken from https://github.com/nodejs/node/blob/d4c91f28148af8a6c1a95392e5c88cb93d4b61c6/lib/_http_agent.js | |
| // | |
| // throws | |
| // tls.connect({host: 'httpbin.org', port: 443}); | |
| // | |
| // doesn't throw | 
Adapted from this, to avoid the second projection and make flying arc height proportional to length.
Because the 'sky' projection is just a scaled up version of the original one, the projection of a sky point in canvas coords can be easily calculated by scaling the ground projection point along the vector from the origin.
Another improvement(?) might be to avoid the swoosh/interpolate function by doing this same trick directly on the stream of points that comes from the normal projection path function.