Giter Site home page Giter Site logo

mapbox / node-or-tools Goto Github PK

View Code? Open in Web Editor NEW
146.0 114.0 47.0 1.95 MB

Node.js bindings for or-tools vehicle routing problems

License: MIT License

Python 5.38% JavaScript 21.62% Shell 6.14% C++ 66.10% Dockerfile 0.75%
tsp vrp optimization routing logistics

node-or-tools's Introduction

node-or-tools

Build Status

NodeJS bindings for or-tools Travelling Salesman Problem (TSP) and Vehicle Routing Problem (VRP) solvers.

See API.md for documentation.

Solving TSP and VRP problems always starts out with having a m x m cost matrix for all pairwise routes between all locations. We recommend using the Mapbox Directions Matrix service when optimizing travel times.

Example

Quick Start

npm install node_or_tools
var ortools = require('node_or_tools')

var VRP = new ortools.VRP(solverOpts);

VRP.Solve(searchOpts, function (err, solution) {
  // ..
});

See API.md for interface documentation and the example for a small self-contained example.

We ship pre-built native binaries (for Node.js LTS 4 and 6 on Linux and macOS). You will need a compatible C++ stdlib, see below if you encounter issues. Building from source is supported via the --build-from-source flag.

Ubuntu 16.04

You're fine. The system's stdlib is recent enough.

Ubuntu 14.04

apt install software-properties-common
add-apt-repository ppa:ubuntu-toolchain-r/test
apt update
apt install libstdc++-5-dev

Tests

npm test

Building - Undefined Symbols

If your C++ compiler and stdlib are quite recent they will default to a new ABI. Mason packages are still built against an old ABI. If you see undefined symbols errors force the stdlib to use the old ABI by setting:

export CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0"

and re-build the project.

Releases

  • Push commit with [publish binary] on master
  • Wait for Travis to build and publish binaries, check the AWS bucket if in doubt
  • Tag the release git tag vx.y.z -a on master, git push origin vx.y.z
  • Then npm login, npm publish to npm
  • Make Github Release for tag

References

Routing Interfaces

More or-tools

Tests

Node bindings

License

Copyright © 2017 Mapbox

Distributed under the MIT License (MIT).

node-or-tools's People

Contributors

andrewharvey avatar carlosen14 avatar chaupow avatar daniel-j-h avatar danpat avatar danpaz avatar grigorydobrov avatar heystenson avatar ivosabev avatar jariz avatar sobinsunny avatar springmeyer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

node-or-tools's Issues

Heterogeneous Fleets

Support different types of vehicles such as walk, bike, car.
Could also be used to model "skill sets" when dispatching employees.

This requires the user to hand us vehicle-class specific

  • cost matrices
  • duration matrices
  • capacities

Implementation:

For Costs:

Use SetArcCostEvaluatorOfVehicle and provide callback on a per-vehicle basis. We now require numVehicle cost matrices from the user.

For Time Dimension:

Use AddDimensionWithVehicleTransits. Takes a vector of transition time evaluators per vehicle for pairs of nodes. Evaluator(i, j) { return ServiceTime(i) + TransitionTime(i, j); }. We now require numVehicle duration matrices from the user.

For Capacity Dimension:

Use AddDimensionWithVehicleCapacity. See explanation above.

For Time and Capacity:

Use AddDimensionWithVehicleTransitAndCapacity. See explanation above.

demands integer only

While testing the VPR with ~ 500 destinations with demands, some calculated tours are slightly over the given vehicle capacity. The given demands are floats with 2 decimals. Making the vehicle capacity and the demands integers (by multiply by 100), all the tour-demands are just below the vehicle capacity, which is correct.

https://github.com/mapbox/node-or-tools/blob/master/API.md#constructor-1 = Numbers. Floats are numbers, too.

Is this an error in documentation or a bug in the node-or-tools?

Provide capacities per vehicle at each location in output

We should output the capacity each vehicle has before / after servicing a location.

Use-case: being able to tell the vehicle's load at a specific time and place.


Implementation:

  • When an assignment could be found: for each vehicle walk over all location indices in the route
  • For each location index store the accumulated capacity domain at this location for the vehicle
const auto* loadVar = capacityDimension.CumulVar(index);
assignment->Value(loadVar)

Error: Cannot find module './binding/node_or_tools.node'

When I try to install the example here: https://github.com/mapbox/node-or-tools/tree/master/example I get error:

 Error: Cannot find module './binding/node_or_tools.node'
     at Function.Module._resolveFilename (module.js:325:15)
     at Function.Module._load (module.js:276:25)
     at Module.require (module.js:353:17)
     at require (internal/module.js:12:17)
     at Object.<anonymous> (/Users/samir/Downloads/node-or-tools-master/lib/index.js:1:80)
     at Module._compile (module.js:409:26)
     at Object.Module._extensions..js (module.js:416:10)
     at Module.load (module.js:343:32)
     at Function.Module._load (module.js:300:12)
     at Module.require (module.js:353:17)

although I did:

npm install

and I can see node_or_tools is already installed:

npm WARN package.json [email protected] No repository field.

> [email protected] install /Users/samir/Downloads/node-or-tools-master/example/node_modules/node_or_tools
> node-pre-gyp install --fallback-to-build

[node_or_tools] Success: "/Users/samir/Downloads/node-or-tools-master/example/node_modules/node_or_tools/lib/binding/node_or_tools.node" already installed
Pass --update-binary to reinstall or --build-from-source to recompile

any idea?

Optional locations, potentially with penalty

We should expose an option to configure locations as being optional.
Potentially adding a penalty to the solution if the location is not serviced.


Implementation: see model.AddDisjunction()

Allow for drivers / vehicles starting at a specific time

We should support drivers starting at a specific time (i.e. not all at the begin of the day).


Implementation:

Constrain the min. arrival time at the route's first location:

auto index = model.Start(0);
auto* var = model.CumulVar(index, "Time");
var->SetMin(10am);

Time windows array must include depot?

In your example..

var vrpSolverOpts = {
  numNodes: 3,
  costs: [[0, 10, 10], [10, 0, 10], [10, 10, 0]],
  durations: [[0, 2, 2], [2, 0, 2], [2, 2, 0]],
  timeWindows: [[0, 9], [2, 3], [2, 3]], //<<<< here
  demands: [[0, 0, 0], [1, 1, 1], [1, 1, 1]]
};

timeWindows variable is including a value for the depot index, it must be a full time window? It is represented as hour?

Fairness - balance number of locations serviced per vehicle

We want to be able to balance the number of locations serviced by each vehicle to be as even as possible. The use-case is for example drivers who are getting paid (at least partially) by number of deliveries.

This constraint should be behind a flag and optional.


Implementation: use the underlying solver to

  • Establish a vehicle vars <-> vehicle counts relationship via the Distribute constraint
  • Add a Deviation constraint for vehicle counts targeting the deviation var
  • Minimizing the deviation var

Roughly as follows:

std::vector<IntVar*> vehicleCounts;

for (auto vehicle = 0; vehicle < numVehicles; ++vehicle)
  vehicleCounts.push_back(solver->MakeIntVar(0, numNodes));

solver->AddConstraint(solver->MakeDistribute(vehicleVars, vehicleCounts));

auto* deviationVar = solver->MakeIntVar(0, numNodes * numNodes);

solver->AddConstraint(solver->MakeDeviation(vehicleCounts, deviationVar, numNodes));

model.AddVariableMinimizedByFinalizer(deviationVar);

What is durations? And how to declare demands?

i have been able to run your example, also modified it with OSRM to get more than 25 locations.

Did some other examples with more locations and vehicles, and everything works great.

But now i am going to go one step further and test other parameters, but I don't really understand the duration, can you please explain it?
This is what is written in the API docs.

durations Array Duration array the solver uses for time constraints. Two-dimensional with durations[from][to] being a Number representing the duration for servicing node from plus the time for traversing the arc from from to to.

I will try to explain the mean i understand, is it the time that takes to go from pointA to pointB plus the time the driver will stay in pointB

Supposing i will stay 10 minutes in each point

  Distances                   Durations(Travel)         Durations(Travel + Time servicing node)
  |  A -  B -  C |            |  A -  B -  C |          |  A -  B -  C |          
A |  0 - 10 - 20 |          A |  0 - 10 - 30 |        A |  0 - 20 - 40 |          
B | 10 -  0 - 10 |          B | 10 -  0 - 10 |        B | 20 -  0 - 20 |          
C | 20 - 10 -  0 |          C | 30 - 10 -  0 |        C | 40 - 20 -  0 |           

// And this is represented in the array as
distances = [[0,10,20],[10,0,10],[20,10,0]];
// durationTravel =  [[0,10,20],[10,0,10],[20,10,0]]; // without the time servicing node
durationTravelPlusTimeServicing = [[0,20,40],[20,0,20],[40,20,0]];

Also i have another doubt about demand parameter. This is the definition in the readme

demands Array Demands array the solver uses for vehicle capacity constraints. Two-dimensional with demands[from][to] being a Number representing the demand at node from, for example number of packages to deliver to this location. The to node index is unused and reserved for future changes; set demands[at] to a constant array for now. The depot should have a demand of zero.

The instructions says that this has to be a bi-dimentional Array demands[from][to], but only will read the from value, how do you translate this?

// this is in the example
demands = [[0, 0, 0], [1, 1, 1], [1, 1, 1]];

/* if pointA demads 5 and pointB demands 10. How is going to be the array?, 
I know first must be zero because it index to depot. */
demands = [[0,0,0], [5,5,5], [10,10,10]];

Is this correct?

Thank you!

Developer needed

Hi @daniel-j-h , what a wonderful project you've got here! We at letsjobit.com have an app that does order management and planning alongside with route optimisation. Our app is built with Meteor.js (thus, in the nodejs world) but the optimiser is a customized version or o-tools, built in C++.

Our optimisation servers are nodejs services running C++ binaries with child_process basically.

After seeing your project, I'm sure this is the way to go, but we lack the expertise on some of the libraries you're using (like NAN).

Would you be willing to point us in the right direction here or sharing the contact of someone that could assist?

Many thanks and well done!!

Pre build binaries missing for v1.0.4 (OSX + node 7.3.0)

npm i

> [email protected] install /Users/Jari/Copy/www/node-or-tools
> node-pre-gyp install --fallback-to-build

node-pre-gyp ERR! Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/node_or_tools/v1.0.4/Release/node-v51-darwin-x64.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for [email protected] and [email protected] (node-v51 ABI) (falling back to source compile with node-gyp)

It only 403's with darwin, the linux binary does exist.

`ACTION binding_gyp_action_before_build_target_install_deps mason_packages` is called twice on Node 10

This is very weird as it only happens if node_or_tools is part of a package.json with other packages, but it doesn't happen if node_or_tools is the only package in the package.json file.

Node version is v10.11.0

node-pre-gyp WARN Using request for node-pre-gyp https download 
node-pre-gyp WARN Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/node_or_tools/v1.0.6/Release/node-v64-darwin-x64.tar.gz 
node-pre-gyp WARN Pre-built binaries not found for [email protected] and [email protected] (node-v64 ABI, unknown) (falling back to source compile with node-gyp) 
node-pre-gyp WARN Pre-built binaries not installable for [email protected] and [email protected] (node-v64 ABI, unknown) (falling back to source compile with node-gyp) 
node-pre-gyp WARN Hit error Connection closed while downloading tarball file 
  ACTION binding_gyp_action_before_build_target_install_deps mason_packages
  ACTION binding_gyp_action_before_build_target_install_deps mason_packages
Downloading Mason @ca9b4cb
Downloading Mason @ca9b4cb
* Downloading binary package osx-x86_64/protobuf/3.0.0.tar.gz...
* Downloading binary package osx-x86_64/protobuf/3.0.0.tar.gz...
* Installed binary package at /xxx/node_modules/node_or_tools/mason_packages/osx-x86_64/protobuf/3.0.0
* Linking /xxx/node_modules/node_or_tools/mason_packages/osx-x86_64/protobuf/3.0.0
* Links will be inside /xxx/node_modules/node_or_tools/mason_packages/.link/
* Using bash fallback for symlinking (install lndir for faster symlinking)
mv: cannot stat '/xxx/node_modules/node_or_tools/mason_packages/.binaries/osx-x86_64/protobuf/3.0.0.tar.gz.tmp': No such file or directory

How to minimize number of vehicles and enforce routes to maximize usage

Hi,

I'am trying to minimize the number of vehicles while enforcing to maximize their usage. A vehicle can make a route of maximum 7 hours (I calculate "distance" base on time). To do this I use the following lines of code:

image

However, for what I saw it is apply as a maximum but not as a maximizer. Our idea is that if the algorithm finds 2 routes, then 1 route should be almost 7 hours lenght and the other only the necessary.

Thanks for you time,

Regards,

[HELP] Can't install node-or-tools on Win10, cmd error

Hi,

Something is preventing me from installing node-or-tools and I can't seem to figure out what. I try running it on Windows 10 64bit in Powershell. I tried it both with node v8.10 and v6.13.1 installed. I already solved an issue with the python PATH settings, as well as with C++ VS 15 tools. I have node-gyp and node-pre-gyp installed using npm. I also tried installing without the msvsversion2015 flag.

My error log is as follows:

PS C:\Users\...> npm install node_or_tools --msvs_version=2015

> node_or_tools@1.0.5 install C:\Users\...\node_modules\node_or_tools
> node-pre-gyp install --fallback-to-build

node-pre-gyp ERR! Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/node_or_tools/v1.0.5/Release/node-v48-win32-x64.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for node_or_tools@1.0.5 and node@6.13.1 (node-v48 ABI) (falling back to source compile with node-gyp)

C:\Users\...\node_modules\node_or_tools>if not defined npm_config_node_gyp (node "C:\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" clean )  else (node "" clean )

C:\Users\...\node_modules\node_or_tools>if not defined npm_config_node_gyp (node "C:\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" configure --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding --python=C:\Python\Python27\python.exe --msvs_version=2015 )  else (node "" configure --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding --python=C:\Python\Python27\python.exe --msvs_version=2015 )

C:\Users\...\node_modules\node_or_tools>if not defined npm_config_node_gyp (node "C:\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" build --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding )  else (node "" build --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding )
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
  install-deps
  The system cannot find the specified path.
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(171,5): error MSB6006: "cmd.exe" exi
ted with code 1. [C:\Users\...\node_modules\node_or_tools\build\action_before_build.vcxproj]
gyp ERR! build error
gyp ERR! stack Error: `C:\Program Files (x86)\MSBuild\14.0\bin\msbuild.exe` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onExit (C:\nodejs\node_modules\npm\node_modules\node-gyp\lib\build.js:276:23)
gyp ERR! stack     at emitTwo (events.js:106:13)
gyp ERR! stack     at ChildProcess.emit (events.js:191:7)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:219:12)
gyp ERR! System Windows_NT 10.0.16299
gyp ERR! command "C:\\nodejs\\node.exe" "C:\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "build" "--fallback-to-build" "--module=C:\\Users\\...\\node_modules\\node_or_tools\\lib\\binding\\node_or_tools.node" "--module_name=node_or_tools" "--module_path=C:\\Users\\...\\node_modules\\node_or_tools\\lib\\binding"
gyp ERR! cwd C:\Users\...\node_modules\node_or_tools
gyp ERR! node -v v6.13.1
gyp ERR! node-gyp -v v3.4.0
gyp ERR! not ok
node-pre-gyp ERR! build error
node-pre-gyp ERR! stack Error: Failed to execute 'node-gyp.cmd build --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding' (1)
node-pre-gyp ERR! stack     at ChildProcess.<anonymous> (C:\Users\...\node_modules\node_or_tools\node_modules\node-pre-gyp\lib\util\compile.js:83:29)
node-pre-gyp ERR! stack     at emitTwo (events.js:106:13)
node-pre-gyp ERR! stack     at ChildProcess.emit (events.js:191:7)
node-pre-gyp ERR! stack     at maybeClose (internal/child_process.js:920:16)
node-pre-gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:230:5)
node-pre-gyp ERR! System Windows_NT 10.0.16299
node-pre-gyp ERR! command "C:\\nodejs\\node.exe" "C:\\Users\\...\\node_modules\\node_or_tools\\node_modules\\node-pre-gyp\\bin\\node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd C:\Users\...\node_modules\node_or_tools
node-pre-gyp ERR! node -v v6.13.1
node-pre-gyp ERR! node-pre-gyp -v v0.6.36
node-pre-gyp ERR! not ok
Failed to execute 'node-gyp.cmd build --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding' (1)
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\...\package.json'
npm WARN ... No description
npm WARN ... No repository field.
npm WARN ... No README data
npm WARN ... No license field.
npm ERR! Windows_NT 10.0.16299
npm ERR! argv "C:\\nodejs\\node.exe" "C:\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "node_or_tools" "--msvs_version=2015"
npm ERR! node v6.13.1
npm ERR! npm  v3.10.10
npm ERR! code ELIFECYCLE

npm ERR! node_or_tools@1.0.5 install: `node-pre-gyp install --fallback-to-build`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the node_or_tools@1.0.5 install script 'node-pre-gyp install --fallback-to-build'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the node_or_tools package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-pre-gyp install --fallback-to-build
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs node_or_tools
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls node_or_tools
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     C:\Users\...\npm-debug.log

If necessary I can provide the debug.log file.

I hope that anyone could help me out on this, since I suspect the solution should be simple.

Bindings.gyp not found

When doing npm install node_or_tools with a non-LTS Node version, I receive the following error (relevant lines are the first three):

node-pre-gyp ERR! Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/node_or_tools/v1.0.3/Release/node-v51-darwin-x64.tar.gz 
node-pre-gyp ERR! Pre-built binaries not found for [email protected] and [email protected] (node-v51 ABI) (falling back to source compile with node-gyp) 
gyp: binding.gyp not found (cwd: /Users/.../node_modules/node_or_tools) while trying to load binding.gyp
gyp ERR! configure error 
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:336:16)
gyp ERR! stack     at emitTwo (events.js:106:13)
gyp ERR! stack     at ChildProcess.emit (events.js:194:7)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:215:12)
gyp ERR! System Darwin 16.6.0
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "--fallback-to-build" "--module=/Users/.../node_modules/node_or_tools/lib/binding/node_or_tools.node" "--module_name=node_or_tools" "--module_path=/Users/.../node_modules/node_or_tools/lib/binding"
gyp ERR! cwd /Users/.../node_modules/node_or_tools
gyp ERR! node -v v7.10.1
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok 
node-pre-gyp ERR! build error 
node-pre-gyp ERR! stack Error: Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js configure --fallback-to-build --module=/Users/.../node_modules/node_or_tools/lib/binding/node_or_tools.node --module_name=node_or_tools --module_path=/Users/.../node_modules/node_or_tools/lib/binding' (1)
node-pre-gyp ERR! stack     at ChildProcess.<anonymous> (/Users/.../node_modules/node_or_tools/node_modules/node-pre-gyp/lib/util/compile.js:83:29)
node-pre-gyp ERR! stack     at emitTwo (events.js:106:13)
node-pre-gyp ERR! stack     at ChildProcess.emit (events.js:194:7)
node-pre-gyp ERR! stack     at maybeClose (internal/child_process.js:899:16)
node-pre-gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)
node-pre-gyp ERR! System Darwin 16.6.0
node-pre-gyp ERR! command "/usr/local/bin/node" "/Users/.../node_modules/node_or_tools/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd /Users/.../node_modules/node_or_tools
node-pre-gyp ERR! node -v v7.10.1
node-pre-gyp ERR! node-pre-gyp -v v0.6.36
node-pre-gyp ERR! not ok 
Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js configure --fallback-to-build --module=/Users/.../node_modules/node_or_tools/lib/binding/node_or_tools.node --module_name=node_or_tools --module_path=/Users/.../node_modules/node_or_tools/lib/binding' (1)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] install: `node-pre-gyp install --fallback-to-build`
npm ERR! Exit status 1

This seems to be caused by the ignoring of bindings.gyp in the .npmignore. Is this intentional?

Soft time and capacity bounds, potentially with penalty

We should allow for the user to not only add hard bounds (think: time window of 10am--11am, or a specific capacity) but also soft bounds which will add proportionally to the solution's cost if exceeded.

Use-case: think of a hard time window of 10am--1am. Maybe we want to be on time as often as possible. We could set a soft upper bound e.g. of 10:15am adding a penalty proportional to how late we are)


Implementation: see RoutingDimension type's Soft member functions adding penalties to the cost.

Expose machine-readable cause of error in callback result

In case of an error in the bindings we use SetErrorMessage in both the TSP and VRP worker to let NAN generate an Js Error for us. What we should add is not only a message but also a parse-able code, think:

{code: 'Timeout', message: 'Unable to find a solution, solver timed out'}

Implementation: in the async. workers override

void HandleErrorCallback()

and generate a Js Error object.

NPM install

Hello,
Trying to do an "npm install node_or_tools" on a SunOS 5.11 Linux machine but running into some errors. Have installed globally the "node-pre-gyp" package and "node-gyp" package. Here are the initial build errors...Does the node version have to be 4.8? I have installed Node 6.9.2 and NPM 5.0.3.

Thanks in advance for any help.

[email protected] install /home/routing/node_modules/node_or_tools
node-pre-gyp install --fallback-to-build

node-pre-gyp ERR! Tried to download(403): https://mapbox-node-binary.s3.amazon
s.com/node_or_tools/v1.0.3/Release/node-v48-sunos-x64.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for [email protected] and nod
6.9.2 (node-v48 ABI) (falling back to source compile with node-gyp)
gyp: binding.gyp not found (cwd: /home/routing/node_modules/node_or_tools) whi
trying to load binding.gyp
gyp ERR! configure error
gyp ERR! stack Error: gyp failed with exit code: 1
gyp ERR! stack at ChildProcess.onCpExit (/home/routing/node_modules/node-g
/lib/configure.js:336:16)
gyp ERR! stack at emitTwo (events.js:106:13)
gyp ERR! stack at ChildProcess.emit (events.js:191:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_proc
s.js:215:12)
gyp ERR! System SunOS 5.11
gyp ERR! command "/opt/local/bin/node" "/home/routing/node_modules/node-gyp/bi
node-gyp.js" "configure" "--fallback-to-build" "--module=/home/routing/node_mo
les/node_or_tools/lib/binding/node_or_tools.node" "--module_name=node_or_tools
"--module_path=/home/routing/node_modules/node_or_tools/lib/binding"
gyp ERR! cwd /home/routing/node_modules/node_or_tools
gyp ERR! node -v v6.9.2
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok
node-pre-gyp ERR! build error
node-pre-gyp ERR! stack Error: Failed to execute '/opt/local/bin/node /home/ro
ing/node_modules/node-gyp/bin/node-gyp.js configure --fallback-to-build --modu
=/home/routing/node_modules/node_or_tools/lib/binding/node_or_tools.node --mod
e_name=node_or_tools --module_path=/home/routing/node_modules/node_or_tools/li
binding' (1)
node-pre-gyp ERR! stack at ChildProcess. (/home/routing/node_mo
les/node_or_tools/node_modules/node-pre-gyp/lib/util/compile.js:83:29)
node-pre-gyp ERR! stack at emitTwo (events.js:106:13)
node-pre-gyp ERR! stack at ChildProcess.emit (events.js:191:7)
node-pre-gyp ERR! stack at maybeClose (internal/child_process.js:877:16)
node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/c
ld_process.js:226:5)
node-pre-gyp ERR! System SunOS 5.11
node-pre-gyp ERR! command "/opt/local/bin/node" "/home/routing/node_modules/no
_or_tools/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd /home/routing/node_modules/node_or_tools
node-pre-gyp ERR! node -v v6.9.2
node-pre-gyp ERR! -v v0.6.36
node-pre-gyp ERR! not ok
Failed to execute '/opt/local/bin/node /home/routing/node_modules/node-gyp/bin
ode-gyp.js configure --fallback-to-build --module=/home/routing/node_modules/n
e_or_tools/lib/binding/node_or_tools.node --module_name=node_or_tools --module
ath=/home/routing/node_modules/node_or_tools/lib/binding' (1)

The routes result is empty

Hi, @daniel-j-h.
I have tried this library with these params.
numNodes = 7 (except depot)
demands = all 1
numVehicles = 3
and if I use vehicleCapacity >= 5 it will return just 2 routes and another empty route with cost 8778.
If I use vehicleCapacity = 4 it will return 3 routes with cost 9892.
How can I set the results to have full routes?
Thank you for your response.
ps. sry for my Eng, hope you understand.

Building from source fails because src folder doesn't exist

The src folder exists in the repo but not in the npm package (it seems).
It's explicitly ignored in .npmignore, why?

Environment
OSX/Linux (tried both)

Reproducible by
run npm install node_or_tools --build-from-source

Expectation
Building from source succeeds.

Logs
OSX: (full)

  TOUCH Release/obj.target/action_before_build.stamp
  SOLINK_MODULE(target) node_modules/node_or_tools/lib/binding/node_or_tools.node
clang: error: no such file or directory: 'Release/obj.target/node_or_tools/src/main.o'
clang: error: no such file or directory: 'Release/obj.target/node_or_tools/src/tsp.o'
clang: error: no such file or directory: 'Release/obj.target/node_or_tools/src/vrp.o'
make: *** [node_modules/node_or_tools/lib/binding/node_or_tools.node] Error 1

Linux: (full)

  TOUCH Release/obj.target/action_before_build.stamp
  SOLINK_MODULE(target) /usr/src/app/node_modules/node_or_tools/lib/binding/node_or_tools.node
g++: error: Release/obj.target/node_or_tools/src/main.o: No such file or directory
g++: error: Release/obj.target/node_or_tools/src/tsp.o: No such file or directory
g++: error: Release/obj.target/node_or_tools/src/vrp.o: No such file or directory
make: *** [/usr/src/app/node_modules/node_or_tools/lib/binding/node_or_tools.node] Error 1
node_or_tools.target.mk:156: recipe for target '/usr/src/app/node_modules/node_or_tools/lib/binding/node_or_tools.node' failed

Vehicle Specific Cost and Duration Factors

At the moment we expose a single cost and duration matrix per vehicle. What we should allow for in the context of multiple vehicles is cost and duration factors on a per vehicle basis to scale the cost and duration matrix the user passes us, think

numVehicles: 3
costFactors: [1.0, 0.7, 1.5]
durationFactors: [1.0, 0.7, 1.5]

which would scale both the cost as well as the duration matrices depending on the factors for each vehicle. We need to separate cost and duration factors because users could specify e.g. distance as cost in which case costFactors would be [1.0 1.0 1.0] and durationFactors would account for slower and faster vehicles.

Related: Heterogeneous Fleets #11

cc @karenzshea

Alternative time windows

We need to be able to set multiple possible time windows for each customer (for example, one customer might be available 8-10 and 18-20, but not 10-18).

Node-or-tools only accepts one time window per node though...

I looked at the original OR-Tools docs too, and it seems to be the same there, so not just a limit of node-or-tools: https://developers.google.com/optimization/routing/tsp/vehicle_routing_time_windows

This seems like it would be a pretty common request, especially when you want to optimize schedules/routes for a whole week. I don't think this would add much to the computational complexity btw, as you're just splitting a range into blocks.

Do you have any suggestions? :)

Not giving the best (shortest and fastest) route

It is not taking the best (shortest and fastest) route. The image shows the points to visit ordered as the VRP result.
i use node-osrm to get the cost table using.

image

As you can see, it ordered to visit A > C > B > D

I Draw these points to osrm route and give this as not the fastest one.

The fastest one was ordering as A > B > C > D , just by some little difference, but i expect it to be the optimized order

npm ERR! ....

i got dis error in an attempt to in node-or-tool as npm successful installation

npm ERR! Linux 4.15.0-30-generic
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install" "node-or-tools-master"
npm ERR! node v4.9.1
npm ERR! npm v2.15.11
npm ERR! code E404

npm ERR! 404 Not found : node-or-tools-master
npm ERR! 404
npm ERR! 404 'node-or-tools-master' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.

npm ERR! Please include the following file with any support request:
npm ERR! /home/bunmalik/Desktop/thesis/codes/c++/Untitled Folder/npm-debug.log

Please I need guidance to go about this

Using Dockerfile

I've tried to build the Dockerfile as a step to deploy a testing app to AWS EC2, but I got this error:

Error: /usr/local/src/app/lib/binding/node_or_tools.node: invalid ELF header
    at Error (native)
    at Object.Module._extensions..node (module.js:434:18)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/usr/local/src/app/lib/index.js:1:18)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/usr/local/src/app/test/tsp.js:2:15)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
Error: /usr/local/src/app/lib/binding/node_or_tools.node: invalid ELF header
    at Error (native)
    at Object.Module._extensions..node (module.js:434:18)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/usr/local/src/app/lib/index.js:1:18)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/usr/local/src/app/test/vrp.js:2:15)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
test/tsp.js
  1) test/tsp.js
test/vrp.js
  2) test/vrp.js

  0 passing (726.356ms)
  2 failing

  1) test/tsp.js test/tsp.js:
     test/tsp.js


  2) test/vrp.js test/vrp.js:
     test/vrp.js


npm ERR! Test failed.  See above for more details.
The command '/bin/sh -c apt-get update &&     apt-get install -y curl python make g++ &&         (curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash) &&  export NVM_DIR="$HOME/.nvm" &&     . ${NVM_DIR}/nvm.sh &&     nvm install 4.8 &&     nvm use 4.8 &&         npm install --unsafe-perm &&     npm test &&         apt-get clean &&     rm -rf /var/lib/apt/lists/*' returned a non-zero code: 1

Also, I tried to run bash in a container of the resulted image:

docker run -it --rm 31f486c07bf6 /bin/bash

but it seems that npm/node are not installed? :

root@35c9b4eca133:/usr/local/src/app# npm
bash: npm: command not found
root@35c9b4eca133:/usr/local/src/app# node index
bash: node: command not found
root@35c9b4eca133:/usr/local/src/app# cd examples
bash: cd: examples: No such file or directory
root@35c9b4eca133:/usr/local/src/app# node index
bash: node: command not found

RouteLocks is for establish starting points in order, or to assign points to route to visit optimized?

I am working with routeLocks to assign some points to a certain route and to visit them along with others remain, in a optimized way. But instead it just makes the VRP to push them in first place to visit starting the route without analyze if those points are optimized.

As you can see in the image red route start from point depot, goes to point 1, next it goes back to point 2, and goes to point 3 which is close to point 1. With routeLock I expected to assign those points to certain route and visit them optimized. As you can see the route is not optimized, it goes far away, and then comes close to depot, then goes far away close to the first point and come back to depot, the traveling time is the highest possible.
geojson io 2

Expected result..
geojson io 4
Or this..
geojson io 3

Any help?
Did I understand wrong?
Is Node-or-tools capable to solve this and assign points to a route and visit them in a optimized way?

Minimizing Makespan - the total duration vehicles are on the road

At the moment users can pass in a durations matrix for costs and we will minimize the total number of vehicle driving hours. In contrast, this ticket is about minimizing the total duration vehicles are on the road.


Implementation:

Minimize the route's end cumul var. for the time dimension. This will minimize the overall completion time.

for (auto vehicle = 0; vehicle < model.vehicles(); ++vehicle)
  model.AddVariableMinimizedByFinalizer(model.CumulVar(model.End(vehicle), timeDimension));

Handling large numbers (400) of locations?

We have around 400 missions/locations. From what I understand, that means we need to start with 400x400 distance matrix. Both yours and Google's Distance Matrix APIs have a maximum of 25x25.
Is it expected that I make many (about 256) requests, and then merge the matrixes myself?
And if the Distance Matrix API can only handle 25x25, is OR-Tools even built to handle this many locations? Or am I supposed to do some sort of pre-culling before creating the matrix?

Vehicle Specific Capacities

At the moment we expose a single vehicleCapacity property. With it users can set the capacities for all their vehicles. What we should do instead is expose a vehicleCapacities property (parallel array coinciding with the vehicles) where the user can specify a capacity on a per vehicle basis.

Related: Heterogeneous Fleets #11

cc @karenzshea

npm ERR! [email protected] install: `node-gyp rebuild`

I just tried to test this repo at EC2, I've checked the linux flavor:

$ cat /proc/version
Linux version 4.9.51-10.52.amzn1.x86_64 (mockbuild@gobi-build-64010) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Fri Sep 29 01:16:19 UTC 2017

if I tried to run npm install I got this result:

ec2-user:~/environment/node-or-tools-master $ npm install

> [email protected] install /home/ec2-user/environment/node-or-tools-master/node_modules/node_or_tools
> node-pre-gyp install --fallback-to-build

[node_or_tools] Success: "/home/ec2-user/environment/node-or-tools-master/node_modules/node_or_tools/lib/binding/node_or_tools.node" is installed via remote

> [email protected] install /home/ec2-user/environment/node-or-tools-master
> node-gyp rebuild

gyp WARN download NVM_NODEJS_ORG_MIRROR is deprecated and will be removed in node-gyp v4, please use NODEJS_ORG_MIRROR
gyp WARN download NVM_NODEJS_ORG_MIRROR is deprecated and will be removed in node-gyp v4, please use NODEJS_ORG_MIRROR
gyp: Undefined variable module_path in binding.gyp while trying to load binding.gyp
gyp ERR! configure error 
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit (/home/ec2-user/.nvm/versions/node/v6.11.4/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:305:16)
gyp ERR! stack     at emitTwo (events.js:106:13)
gyp ERR! stack     at ChildProcess.emit (events.js:191:7)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:219:12)
gyp ERR! System Linux 4.9.51-10.52.amzn1.x86_64
gyp ERR! command "/home/ec2-user/.nvm/versions/node/v6.11.4/bin/node" "/home/ec2-user/.nvm/versions/node/v6.11.4/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /home/ec2-user/environment/node-or-tools-master
gyp ERR! node -v v6.11.4
gyp ERR! node-gyp -v v3.4.0
gyp ERR! not ok 

npm WARN [email protected] No repository field.
npm WARN [email protected] No license field.
npm ERR! Linux 4.9.51-10.52.amzn1.x86_64
npm ERR! argv "/home/ec2-user/.nvm/versions/node/v6.11.4/bin/node" "/home/ec2-user/.nvm/versions/node/v6.11.4/bin/npm" "install"
npm ERR! node v6.11.4
npm ERR! npm  v3.10.10
npm ERR! code ELIFECYCLE
npm ERR! [email protected] install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] install script 'node-gyp rebuild'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the node_or_tools_example package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp rebuild
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs node_or_tools_example
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls node_or_tools_example
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /home/ec2-user/environment/node-or-tools-master/npm-debug.log

/home/ec2-user/environment/node-or-tools-master/npm-debug.log:

0 info it worked if it ends with ok
1 verbose cli [ '/home/ec2-user/.nvm/versions/node/v6.11.4/bin/node',
1 verbose cli   '/home/ec2-user/.nvm/versions/node/v6.11.4/bin/npm',
1 verbose cli   'install' ]
2 info using [email protected]
3 info using [email protected]
4 silly loadCurrentTree Starting
5 silly install loadCurrentTree
6 silly install readLocalPackageData
7 silly install normalizeTree
8 silly loadCurrentTree Finishing
9 silly loadIdealTree Starting
10 silly install loadIdealTree
11 silly cloneCurrentTree Starting
12 silly install cloneCurrentTreeToIdealTree
13 silly cloneCurrentTree Finishing
14 silly loadShrinkwrap Starting
15 silly install loadShrinkwrap
16 silly loadShrinkwrap Finishing
17 silly loadAllDepsIntoIdealTree Starting
18 silly install loadAllDepsIntoIdealTree
19 silly loadAllDepsIntoIdealTree Finishing
20 silly loadIdealTree Finishing
21 silly currentTree [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ └─┬ [email protected]
21 silly currentTree │   └── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └─┬ [email protected]
21 silly currentTree │ │   ├── [email protected]
21 silly currentTree │ │   └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ │ ├── [email protected]
21 silly currentTree │ │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ │   └── [email protected]
21 silly currentTree │ │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ │ └── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ │ ├── [email protected]
21 silly currentTree │ │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ │   └── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ │ ├── [email protected]
21 silly currentTree │ │ │ │ ├── [email protected]
21 silly currentTree │ │ │ │ ├── [email protected]
21 silly currentTree │ │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ │   └── [email protected]
21 silly currentTree │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   ├── [email protected]
21 silly currentTree │ │ │   └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └─┬ [email protected]
21 silly currentTree │ │   ├── [email protected]
21 silly currentTree │ │   ├─┬ [email protected]
21 silly currentTree │ │   │ └── [email protected]
21 silly currentTree │ │   ├── [email protected]
21 silly currentTree │ │   ├─┬ [email protected]
21 silly currentTree │ │   │ └─┬ [email protected]
21 silly currentTree │ │   │   ├── [email protected]
21 silly currentTree │ │   │   └── [email protected]
21 silly currentTree │ │   ├─┬ [email protected]
21 silly currentTree │ │   │ └── [email protected]
21 silly currentTree │ │   └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │   └─┬ [email protected]
21 silly currentTree │ │ │     ├── [email protected]
21 silly currentTree │ │ │     └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ └─┬ [email protected]
21 silly currentTree │   ├── [email protected]
21 silly currentTree │   ├─┬ [email protected]
21 silly currentTree │   │ └── [email protected]
21 silly currentTree │   └── [email protected]
21 silly currentTree └─┬ [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├─┬ [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ ├─┬ [email protected]
21 silly currentTree   │ │ │ └── [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ └─┬ [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   ├─┬ [email protected]
21 silly currentTree   │   │ └── [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   ├─┬ [email protected]
21 silly currentTree   │   │ └── [email protected]
21 silly currentTree   │   ├─┬ [email protected]
21 silly currentTree   │   │ ├─┬ [email protected]
21 silly currentTree   │   │ │ ├── [email protected]
21 silly currentTree   │   │ │ ├── [email protected]
21 silly currentTree   │   │ │ ├─┬ [email protected]
21 silly currentTree   │   │ │ │ └── [email protected]
21 silly currentTree   │   │ │ ├─┬ [email protected]
21 silly currentTree   │   │ │ │ └── [email protected]
21 silly currentTree   │   │ │ └── [email protected]
21 silly currentTree   │   │ ├── [email protected]
21 silly currentTree   │   │ ├─┬ [email protected]
21 silly currentTree   │   │ │ ├── [email protected]
21 silly currentTree   │   │ │ ├─┬ [email protected]
21 silly currentTree   │   │ │ │ └── [email protected]
21 silly currentTree   │   │ │ ├── [email protected]
21 silly currentTree   │   │ │ └── [email protected]
21 silly currentTree   │   │ └─┬ [email protected]
21 silly currentTree   │   │   └── [email protected]
21 silly currentTree   │   ├─┬ [email protected]
21 silly currentTree   │   │ ├── [email protected]
21 silly currentTree   │   │ ├── [email protected]
21 silly currentTree   │   │ ├── [email protected]
21 silly currentTree   │   │ └── [email protected]
21 silly currentTree   │   ├─┬ [email protected]
21 silly currentTree   │   │ ├── [email protected]
21 silly currentTree   │   │ ├─┬ [email protected]
21 silly currentTree   │   │ │ ├── [email protected]
21 silly currentTree   │   │ │ ├── [email protected]
21 silly currentTree   │   │ │ ├── [email protected]
21 silly currentTree   │   │ │ └─┬ [email protected]
21 silly currentTree   │   │ │   └── [email protected]
21 silly currentTree   │   │ └─┬ [email protected]
21 silly currentTree   │   │   ├── [email protected]
21 silly currentTree   │   │   ├── [email protected]
21 silly currentTree   │   │   ├── [email protected]
21 silly currentTree   │   │   ├── [email protected]
21 silly currentTree   │   │   ├── [email protected]
21 silly currentTree   │   │   ├── [email protected]
21 silly currentTree   │   │   ├── [email protected]
21 silly currentTree   │   │   └── [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   ├─┬ [email protected]
21 silly currentTree   │   │ └── [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   ├─┬ [email protected]
21 silly currentTree   │   │ └── [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   └── [email protected]
21 silly currentTree   ├─┬ [email protected]
21 silly currentTree   │ └─┬ [email protected]
21 silly currentTree   │   ├─┬ [email protected]
21 silly currentTree   │   │ ├── [email protected]
21 silly currentTree   │   │ └── [email protected]
21 silly currentTree   │   └── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├─┬ [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └─┬ [email protected]
21 silly currentTree   │ │   ├── [email protected]
21 silly currentTree   │ │   └── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ └── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├─┬ [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ └── [email protected]
21 silly currentTree   ├─┬ [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ ├─┬ [email protected]
21 silly currentTree   │ │ │ └── [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ ├── [email protected]
21 silly currentTree   │ │ ├── [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ └─┬ [email protected]
21 silly currentTree   │   └─┬ [email protected]
21 silly currentTree   │     └── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├─┬ [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ └── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├─┬ [email protected]
21 silly currentTree   │ └── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├─┬ [email protected]
21 silly currentTree   │ ├─┬ [email protected]
21 silly currentTree   │ │ └── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ ├── [email protected]
21 silly currentTree   │ └─┬ [email protected]
21 silly currentTree   │   ├── [email protected]
21 silly currentTree   │   └─┬ [email protected]
21 silly currentTree   │     └── [email protected]
21 silly currentTree   ├─┬ [email protected]
21 silly currentTree   │ └── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   ├── [email protected]
21 silly currentTree   └── [email protected]
22 silly idealTree [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ └─┬ [email protected]
22 silly idealTree │   └── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └─┬ [email protected]
22 silly idealTree │ │   ├── [email protected]
22 silly idealTree │ │   └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ │ ├── [email protected]
22 silly idealTree │ │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ │   └── [email protected]
22 silly idealTree │ │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ │ └── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ │ ├── [email protected]
22 silly idealTree │ │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ │   └── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ │ ├── [email protected]
22 silly idealTree │ │ │ │ ├── [email protected]
22 silly idealTree │ │ │ │ ├── [email protected]
22 silly idealTree │ │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ │   └── [email protected]
22 silly idealTree │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   ├── [email protected]
22 silly idealTree │ │ │   └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └─┬ [email protected]
22 silly idealTree │ │   ├── [email protected]
22 silly idealTree │ │   ├─┬ [email protected]
22 silly idealTree │ │   │ └── [email protected]
22 silly idealTree │ │   ├── [email protected]
22 silly idealTree │ │   ├─┬ [email protected]
22 silly idealTree │ │   │ └─┬ [email protected]
22 silly idealTree │ │   │   ├── [email protected]
22 silly idealTree │ │   │   └── [email protected]
22 silly idealTree │ │   ├─┬ [email protected]
22 silly idealTree │ │   │ └── [email protected]
22 silly idealTree │ │   └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │   └─┬ [email protected]
22 silly idealTree │ │ │     ├── [email protected]
22 silly idealTree │ │ │     └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ └─┬ [email protected]
22 silly idealTree │   ├── [email protected]
22 silly idealTree │   ├─┬ [email protected]
22 silly idealTree │   │ └── [email protected]
22 silly idealTree │   └── [email protected]
22 silly idealTree └─┬ [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├─┬ [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ ├─┬ [email protected]
22 silly idealTree   │ │ │ └── [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ └─┬ [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   ├─┬ [email protected]
22 silly idealTree   │   │ └── [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   ├─┬ [email protected]
22 silly idealTree   │   │ └── [email protected]
22 silly idealTree   │   ├─┬ [email protected]
22 silly idealTree   │   │ ├─┬ [email protected]
22 silly idealTree   │   │ │ ├── [email protected]
22 silly idealTree   │   │ │ ├── [email protected]
22 silly idealTree   │   │ │ ├─┬ [email protected]
22 silly idealTree   │   │ │ │ └── [email protected]
22 silly idealTree   │   │ │ ├─┬ [email protected]
22 silly idealTree   │   │ │ │ └── [email protected]
22 silly idealTree   │   │ │ └── [email protected]
22 silly idealTree   │   │ ├── [email protected]
22 silly idealTree   │   │ ├─┬ [email protected]
22 silly idealTree   │   │ │ ├── [email protected]
22 silly idealTree   │   │ │ ├─┬ [email protected]
22 silly idealTree   │   │ │ │ └── [email protected]
22 silly idealTree   │   │ │ ├── [email protected]
22 silly idealTree   │   │ │ └── [email protected]
22 silly idealTree   │   │ └─┬ [email protected]
22 silly idealTree   │   │   └── [email protected]
22 silly idealTree   │   ├─┬ [email protected]
22 silly idealTree   │   │ ├── [email protected]
22 silly idealTree   │   │ ├── [email protected]
22 silly idealTree   │   │ ├── [email protected]
22 silly idealTree   │   │ └── [email protected]
22 silly idealTree   │   ├─┬ [email protected]
22 silly idealTree   │   │ ├── [email protected]
22 silly idealTree   │   │ ├─┬ [email protected]
22 silly idealTree   │   │ │ ├── [email protected]
22 silly idealTree   │   │ │ ├── [email protected]
22 silly idealTree   │   │ │ ├── [email protected]
22 silly idealTree   │   │ │ └─┬ [email protected]
22 silly idealTree   │   │ │   └── [email protected]
22 silly idealTree   │   │ └─┬ [email protected]
22 silly idealTree   │   │   ├── [email protected]
22 silly idealTree   │   │   ├── [email protected]
22 silly idealTree   │   │   ├── [email protected]
22 silly idealTree   │   │   ├── [email protected]
22 silly idealTree   │   │   ├── [email protected]
22 silly idealTree   │   │   ├── [email protected]
22 silly idealTree   │   │   ├── [email protected]
22 silly idealTree   │   │   └── [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   ├─┬ [email protected]
22 silly idealTree   │   │ └── [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   ├─┬ [email protected]
22 silly idealTree   │   │ └── [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   └── [email protected]
22 silly idealTree   ├─┬ [email protected]
22 silly idealTree   │ └─┬ [email protected]
22 silly idealTree   │   ├─┬ [email protected]
22 silly idealTree   │   │ ├── [email protected]
22 silly idealTree   │   │ └── [email protected]
22 silly idealTree   │   └── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├─┬ [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └─┬ [email protected]
22 silly idealTree   │ │   ├── [email protected]
22 silly idealTree   │ │   └── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ └── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├─┬ [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ └── [email protected]
22 silly idealTree   ├─┬ [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ ├─┬ [email protected]
22 silly idealTree   │ │ │ └── [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ ├── [email protected]
22 silly idealTree   │ │ ├── [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ └─┬ [email protected]
22 silly idealTree   │   └─┬ [email protected]
22 silly idealTree   │     └── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├─┬ [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ └── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├─┬ [email protected]
22 silly idealTree   │ └── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├─┬ [email protected]
22 silly idealTree   │ ├─┬ [email protected]
22 silly idealTree   │ │ └── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ ├── [email protected]
22 silly idealTree   │ └─┬ [email protected]
22 silly idealTree   │   ├── [email protected]
22 silly idealTree   │   └─┬ [email protected]
22 silly idealTree   │     └── [email protected]
22 silly idealTree   ├─┬ [email protected]
22 silly idealTree   │ └── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   ├── [email protected]
22 silly idealTree   └── [email protected]
23 silly generateActionsToTake Starting
24 silly install generateActionsToTake
25 silly generateActionsToTake Finishing
26 silly diffTrees action count 0
27 silly decomposeActions action count 0
28 silly runTopLevelLifecycles Starting
29 silly install runPreinstallTopLevelLifecycles
30 silly preinstall [email protected] /home/ec2-user/environment/node-or-tools-master/node_or_tools_example-72236f2b
31 info lifecycle [email protected]~preinstall: [email protected]
32 silly lifecycle [email protected]~preinstall: no script for preinstall, continuing
33 silly executeActions Starting
34 silly install executeActions
35 silly doSerial global-install 0
36 silly doParallel fetch 0
37 verbose correctMkdir /home/ec2-user/.npm/_locks correctMkdir not in flight; initializing
38 verbose lock using /home/ec2-user/.npm/_locks/staging-85dfaefb2836ee20.lock for /home/ec2-user/environment/node-or-tools-master/node_modules/.staging
39 silly doParallel extract 0
40 silly doParallel preinstall 0
41 silly doReverseSerial remove 0
42 silly doSerial move 0
43 silly doSerial finalize 0
44 silly doSerial build 0
45 silly doSerial global-link 0
46 silly doParallel update-linked 0
47 silly doSerial install 0
48 silly doSerial postinstall 0
49 verbose unlock done using /home/ec2-user/.npm/_locks/staging-85dfaefb2836ee20.lock for /home/ec2-user/environment/node-or-tools-master/node_modules/.staging
50 silly executeActions Finishing
51 silly rollbackFailedOptional Starting
52 silly rollbackFailedOptional Finishing
53 silly install runPostinstallTopLevelLifecycles
54 silly build [email protected]
55 info linkStuff [email protected]
56 silly linkStuff [email protected] has /home/ec2-user/environment as its parent node_modules
57 verbose linkBins [email protected]
58 verbose linkMans [email protected]
59 silly install [email protected] /home/ec2-user/environment/node-or-tools-master/node_or_tools_example-72236f2b
60 info lifecycle [email protected]~install: [email protected]
61 verbose lifecycle [email protected]~install: unsafe-perm in lifecycle true
62 verbose lifecycle [email protected]~install: PATH: /home/ec2-user/.nvm/versions/node/v6.11.4/lib/node_modules/npm/bin/node-gyp-bin:/home/ec2-user/environment/node-or-tools-master/node_modules/.bin:/home/ec2-user/.nvm/versions/node/v6.11.4/bin:/usr/local/rvm/gems/ruby-2.4.1/bin:/usr/local/rvm/gems/ruby-2.4.1@global/bin:/usr/local/rvm/rubies/ruby-2.4.1/bin:/usr/local/bin:/bin:/usr/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/opt/aws/bin:/usr/local/rvm/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin
63 verbose lifecycle [email protected]~install: CWD: /home/ec2-user/environment/node-or-tools-master
64 silly lifecycle [email protected]~install: Args: [ '-c', 'node-gyp rebuild' ]
65 silly lifecycle [email protected]~install: Returned: code: 1  signal: null
66 info lifecycle [email protected]~install: Failed to exec install script
67 warn [email protected] No repository field.
68 verbose If you need help, you may report this error at:
68 verbose     <https://github.com/npm/npm/issues>
69 warn [email protected] No license field.
70 verbose If you need help, you may report this error at:
70 verbose     <https://github.com/npm/npm/issues>
71 verbose stack Error: [email protected] install: `node-gyp rebuild`
71 verbose stack Exit status 1
71 verbose stack     at EventEmitter.<anonymous> (/home/ec2-user/.nvm/versions/node/v6.11.4/lib/node_modules/npm/lib/utils/lifecycle.js:255:16)
71 verbose stack     at emitTwo (events.js:106:13)
71 verbose stack     at EventEmitter.emit (events.js:191:7)
71 verbose stack     at ChildProcess.<anonymous> (/home/ec2-user/.nvm/versions/node/v6.11.4/lib/node_modules/npm/lib/utils/spawn.js:40:14)
71 verbose stack     at emitTwo (events.js:106:13)
71 verbose stack     at ChildProcess.emit (events.js:191:7)
71 verbose stack     at maybeClose (internal/child_process.js:920:16)
71 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:230:5)
72 verbose pkgid [email protected]
73 verbose cwd /home/ec2-user/environment/node-or-tools-master
74 error Linux 4.9.51-10.52.amzn1.x86_64
75 error argv "/home/ec2-user/.nvm/versions/node/v6.11.4/bin/node" "/home/ec2-user/.nvm/versions/node/v6.11.4/bin/npm" "install"
76 error node v6.11.4
77 error npm  v3.10.10
78 error code ELIFECYCLE
79 error [email protected] install: `node-gyp rebuild`
79 error Exit status 1
80 error Failed at the [email protected] install script 'node-gyp rebuild'.
80 error Make sure you have the latest version of node.js and npm installed.
80 error If you do, this is most likely a problem with the node_or_tools_example package,
80 error not with npm itself.
80 error Tell the author that this fails on your system:
80 error     node-gyp rebuild
80 error You can get information on how to open an issue for this project with:
80 error     npm bugs node_or_tools_example
80 error Or if that isn't available, you can get their info via:
80 error     npm owner ls node_or_tools_example
80 error There is likely additional logging output above.
81 verbose exit [ 1, true ]

Multiple time windows per location

We should expose the possibility to specify multiple time windows per location.

Use-case: you can service a location between 9am--11am and between 1pm--3pm.


Implementation:

  • Sort intervals per location by start then stop, assert for non-overlapping
  • Take the min and max and set CumulVar(n)->SetRange(minStart, maxStop)
  • Walk over adjacent intervals and remove in between CumulVar(n)->RemoveInterval(stop, start).

Build Debug Bindings for NPM

In #23 we switched to statically linking against upstream libortools.a and more importantly strip out debug symbols here. What we should do is build debug binaries for npm which link against libortools.a with debug symbols not stripped out.

Tasks:

  • Create Travis builds for debug binaries which do not strip out debug symbols
  • Publish debug binaries passing --debug to node-pre-gyp
  • Make a new release https://github.com/mapbox/node-or-tools#releases
  • Check s3 to see if debug binaries are there

cc @karenzshea

Size too large for deployment. Possibilities to reduce size?

Hey, guys. Thanks for making a great library. I'm getting beautifully optimized routes!

My issue revolves around the resulting library size. Pulling from npm, this library comes in at a chunk of 475 MB, and it looks like the biggest piece is libtools.a @ 317 MB.

Is there any way I can reduce this size? We were really hoping to use this in a Lambda function to build optimal routes for our fleet, but the Lambda max is 250 MB. Is there another version of libtools.a or node-or-tools in general that's a bit slimmer?

Thanks a lot for any help!

Edit: Using --build-from-source doesn't work either if it helps.

how to minimize each vehicle time in vrp with or-tools

i want minimize network time in other words: each vehicle time should be minimized as possible
1- this means force all vehicle to service locations
2- and balance number of locations serviced per vehicle
3- and minimizes the time the last vehicle will arrive to its end node
@daniel-j-h what you said about forcing all vehicle works fine but others not working at all
do you have any idea to do number 3?

Option to force all vehicles to service locations

We should provide an option to force all vehicles on the road.
Probably goes hand in hand with the fairness constraint, see #1.


Implementation: remove the depot from the start's NextVar, so vehicles have to service locations:

model.CloseModel()

for (auto vehicle = 0; vehicle < numVehicles; ++vehicle) {
  IntVar* const start = routing.NextVar(routing.Start(vehicle));
  for (auto node = routing.Size(); node < routing.Size() + routing.vehicles(); ++node)
    start->RemoveValue(node);
}

[email protected] and [email protected]

any plan for supporting recent node version ?

node-pre-gyp WARN Using request for node-pre-gyp https download 
node-pre-gyp WARN Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/node_or_tools/v1.0.6/Release/node-v67-linux-x64.tar.gz 
node-pre-gyp WARN Pre-built binaries not found for [email protected] and [email protected] (node-v67 ABI, glibc) (falling back to source compile with node-gyp) 
node-pre-gyp WARN Pre-built binaries not installable for [email protected] and [email protected] (node-v67 ABI, glibc) (falling back to source compile with node-gyp) 
node-pre-gyp WARN Hit error Connection closed while downloading tarball file 

What is depotIndex?

As I am reviewing the source code of node example, I did not understand the depotIndex, can you please explain it?

Also, how to define origin point? considering locations are all destinations?

Last question please, in the example, there is:

  // 9am -- 5pm
  var dayStarts = 0;
  var dayEnds = 8 * 60 * 60;

how did you figure out the 9am ? as dayStarts equals to zero?

Thank you!

Problem when providing pair of pickup and delivery indices

Hey,

There is this issue where providing a pair of pickup and delivery indices would lead to this error message: Unable to find a solution

Expected Behavior

It should return a valid route order based on cost array.

Current Behavior

Returns Unable to find a solution

Steps to Reproduce

  1. Copy node-or-tools/test/vrp.js file content to a new file
  2. Remove all assertions
  3. Add a pair of pickup and delivery indices in searchOpts.
   pickups: [4, 7],
   deliveries: [7, 10]

Context (Environment)

I have a pair of pickup and delivery indices and I want to visit one or more stops before visiting others.

This is my code snippet. You could see that if we remove the pickup and delivery indices, the code will work but after adding aforementioned indices, it returns Unable to find a solution

module.exports = () => {
  const ortools = require('node_or_tools')
  var locations = [
    [0, 0], [0, 1], [0, 2], [0, 3],
    [1, 0], [1, 1], [1, 2], [1, 3],
    [2, 0], [2, 1], [2, 2], [2, 3],
    [3, 0], [3, 1], [3, 2], [3, 3]]

  var depot = 0

  function manhattanDistance(lhs, rhs) {
    return Math.abs(lhs[0] - rhs[0]) + Math.abs(lhs[1] - rhs[1])
  }

  var costMatrix = new Array(locations.length)

  for (var from = 0; from < locations.length; ++from) {
    costMatrix[from] = new Array(locations.length)

    for (var to = 0; to < locations.length; ++to) {
      costMatrix[from][to] = manhattanDistance(locations[from], locations[to])
    }
  }

  var dayStarts = Hours(0)
  var dayEnds = Hours(3)


  var seed = 2147483650

  function ParkMillerRNG(seed) {
    var modulus = 2147483647
    var multiplier = 48271
    var increment = 0
    var state = seed

    return function() {
      state = (multiplier * state + increment) % modulus
      return state / modulus
    }
  }

  var rand = ParkMillerRNG(seed)


  function Seconds(v) {
    return v
  }

  function Minutes(v) {
    return Seconds(v * 60)
  }

  function Hours(v) {
    return Minutes(v * 60)
  }


  var durationMatrix = new Array(locations.length)

  for (var from = 0; from < locations.length; ++from) {
    durationMatrix[from] = new Array(locations.length)

    for (var to = 0; to < locations.length; ++to) {
      var serviceTime = Minutes(3)
      var travelTime = Minutes(costMatrix[from][to])

      durationMatrix[from][to] = serviceTime + travelTime
    }
  }


  var timeWindows = new Array(locations.length)

  for (var at = 0; at < locations.length; ++at) {
    if (at === depot) {
      timeWindows[at] = [dayStarts, dayEnds]
      continue
    }

    var earliest = dayStarts
    var latest = dayEnds - Hours(1)

    var start = rand() * (latest - earliest) + earliest
    var stop = rand() * (latest - start) + start

    timeWindows[at] = [start, stop]
  }


  var demandMatrix = new Array(locations.length)

  for (var from = 0; from < locations.length; ++from) {
    demandMatrix[from] = new Array(locations.length)

    for (var to = 0; to < locations.length; ++to) {
      if (from === depot)
        demandMatrix[from][to] = 0
      else
        demandMatrix[from][to] = 1
    }
  }


  var solverOpts = {
    numNodes: locations.length,
    costs: costMatrix,
    durations: durationMatrix,
    timeWindows: timeWindows,
    demands: demandMatrix
  }

  var VRP = new ortools.VRP(solverOpts)

  var numVehicles = 10
  var timeHorizon = dayEnds - dayStarts
  var vehicleCapacity = 10

// Dummy lock to let vehicle 0 go to location 2 and 3 first - to test route locks
  var routeLocks = new Array(numVehicles)

  for (var vehicle = 0; vehicle < numVehicles; ++vehicle) {
    if (vehicle === 0)
      routeLocks[vehicle] = [2, 3]
    else
      routeLocks[vehicle] = []
  }

  var searchOpts = {
    computeTimeLimit: 1000,
    numVehicles: numVehicles,
    depotNode: depot,
    timeHorizon: timeHorizon,
    vehicleCapacity: vehicleCapacity,
    routeLocks: routeLocks,
    pickups: [4, 7],
    deliveries: [7, 10]
  }

  VRP.Solve(searchOpts, function(err, solution) {


    console.log('**********************')
    console.log(err,solution)
    console.log('**********************')
    function used(v) {
      return v.length == 0 ? 0 : 1
    }

    function addition(l, r) {
      return l + r
    }

    var numVehiclesUsed = solution.routes.map(used).reduce(addition, 0)


    function checkRoute(v) {
      var depotInRoute = v.find(function(u) {
        return u == depot
      })
    }

    function checkTimeWindows(v) {
      v.forEach(function(u) {
      })
    }

    solution.routes.forEach(checkRoute)
    solution.times.forEach(checkTimeWindows)

  })

}

MbxClient.getMatrix is not a function

I've tried to run the example, however, I got this error:

/home/ubuntu/ortools/node-or-tools-master/example/index.js:78
MbxClient.getMatrix(locations.map(function (coord) { return { longitude: coord[0], latitude: coord[1] } }), {profile: profile}, function(err, results) {
          ^

TypeError: MbxClient.getMatrix is not a function
    at Object.<anonymous> (/home/ubuntu/ortools/node-or-tools-master/example/index.js:78:11)
    at Module._compile (module.js:410:26)
    at Object.Module._extensions..js (module.js:417:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.runMain [as _onTimeout] (module.js:442:10)
    at Timer.listOnTimeout (timers.js:92:15)


Process exited with code: 1

I am sure that MbxClient is initialized, and I can see it in debugger as attached snapshot:
screen shot 2017-12-23 at 12 12 19 pm

As for installed dependencies versions as below: ( [email protected] )

ubuntu@ip-172-31-29-171:~/ortools/node-or-tools-master/example$ npm list
[email protected] /home/ubuntu/ortools/node-or-tools-master/example
├── @turf/[email protected]
├── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └── [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ └─┬ [email protected]
│ │ │   ├─┬ [email protected]
│ │ │   │ ├── [email protected]
│ │ │   │ ├── [email protected]
│ │ │   │ └── [email protected]
│ │ │   └── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ └── [email protected]
├── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └─┬ [email protected]
│ │   ├── [email protected]
│ │   └── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └─┬ [email protected]
│ │ │ │   └── [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └─┬ [email protected]
│ │ │ │   └── [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └─┬ [email protected]
│ │ │ │   └── [email protected]
│ │ │ └─┬ [email protected]
│ │ │   ├── [email protected]
│ │ │   ├── [email protected]
│ │ │   ├── [email protected]
│ │ │   ├─┬ [email protected]
│ │ │   │ └── [email protected]
│ │ │   ├── [email protected]
│ │ │   ├─┬ [email protected]
│ │ │   │ └── [email protected]
│ │ │   ├── [email protected]
│ │ │   └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ └─┬ [email protected]
│ │   ├── [email protected]
│ │   ├── [email protected]
│ │   ├─┬ [email protected]
│ │   │ └─┬ [email protected]
│ │   │   ├── [email protected]
│ │   │   └── [email protected]
│ │   └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ └─┬ [email protected]
│   ├─┬ [email protected]
│   │ └── [email protected]
│   ├── [email protected]
│   ├─┬ [email protected]
│   │ └── [email protected]
│   ├─┬ [email protected]
│   │ ├── [email protected]
│   │ ├── [email protected]
│   │ ├── [email protected]
│   │ ├── [email protected]
│   │ └── [email protected]
│   └── [email protected]
└─┬ [email protected]
  └─┬ [email protected]
    ├─┬ [email protected]
    │ └── [email protected]
    ├─┬ [email protected]
    │ ├── [email protected]
    │ └─┬ [email protected]
    │   ├── [email protected]
    │   └── [email protected]
    ├─┬ [email protected]
    │ ├─┬ [email protected]
    │ │ └── [email protected]
    │ ├── [email protected]
    │ ├─┬ [email protected]
    │ │ ├── [email protected]
    │ │ ├── [email protected]
    │ │ ├── [email protected]
    │ │ ├── [email protected]
    │ │ ├─┬ [email protected]
    │ │ │ ├── [email protected]
    │ │ │ └─┬ [email protected]
    │ │ │   └── [email protected]
    │ │ ├─┬ [email protected]
    │ │ │ └── [email protected]
    │ │ └── [email protected]
    │ └── [email protected]
    ├─┬ [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ └── [email protected]
    ├─┬ [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ ├─┬ [email protected]
    │ │ └── [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ ├─┬ [email protected]
    │ │ └── [email protected]
    │ ├─┬ [email protected]
    │ │ ├─┬ [email protected]
    │ │ │ ├── [email protected]
    │ │ │ └─┬ [email protected]
    │ │ │   └── [email protected]
    │ │ └── [email protected]
    │ ├─┬ [email protected]
    │ │ ├── [email protected]
    │ │ ├── [email protected]
    │ │ ├── [email protected]
    │ │ └── [email protected]
    │ ├─┬ [email protected]
    │ │ ├── [email protected]
    │ │ ├─┬ [email protected]
    │ │ │ ├── [email protected]
    │ │ │ ├── [email protected]
    │ │ │ ├── [email protected]
    │ │ │ └─┬ [email protected]
    │ │ │   └── [email protected]
    │ │ └─┬ [email protected]
    │ │   ├── [email protected]
    │ │   ├── [email protected]
    │ │   ├── [email protected]
    │ │   ├─┬ [email protected]
    │ │   │ └── [email protected]
    │ │   ├── [email protected]
    │ │   ├─┬ [email protected]
    │ │   │ └── [email protected]
    │ │   ├── [email protected]
    │ │   └── [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ ├─┬ [email protected]
    │ │ └── [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ ├─┬ [email protected]
    │ │ └── [email protected]
    │ ├── [email protected]
    │ └── [email protected]
    ├─┬ [email protected]
    │ └─┬ [email protected]
    │   ├── [email protected]
    │   ├── [email protected]
    │   ├─┬ [email protected]
    │   │ └─┬ [email protected]
    │   │   ├── [email protected]
    │   │   └── [email protected]
    │   └── [email protected]
    ├── [email protected]
    ├─┬ [email protected]
    │ ├── [email protected]
    │ ├─┬ [email protected]
    │ │ └── [email protected]
    │ └── [email protected]
    └─┬ [email protected]
      ├─┬ [email protected]
      │ └── [email protected]
      ├── [email protected]
      ├─┬ [email protected]
      │ └── [email protected]
      ├─┬ [email protected]
      │ ├── [email protected]
      │ ├── [email protected]
      │ ├── [email protected]
      │ ├── [email protected]
      │ └── [email protected]
      └── [email protected]


So, do I miss something? please advice..

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.