diff --git a/app/js/controllers/init/create/RootBlockController.js b/app/js/controllers/init/create/RootBlockController.js
index 6a264506e2821da8c0d2d86c9a05a0ce398b9529..2864598ebb8cc0f082fee0d32f11959d8db104f0 100644
--- a/app/js/controllers/init/create/RootBlockController.js
+++ b/app/js/controllers/init/create/RootBlockController.js
@@ -23,9 +23,6 @@ module.exports = ($scope, $http, $state, Webmin) => {
       yield Webmin.server.sendConf({
         conf: $scope.$parent.conf
       });
-      yield Webmin.server.http.start();
-      yield Webmin.server.http.openUPnP();
-      yield Webmin.server.http.regularUPnP();
       yield $scope.try();
     } catch (e) {
       $scope.message = e.message;
@@ -33,7 +30,6 @@ module.exports = ($scope, $http, $state, Webmin) => {
   });
 
   $scope.stop = () => co(function *() {
-    yield Webmin.server.http.stop();
     $scope.started = false;
   });
 
@@ -63,7 +59,6 @@ module.exports = ($scope, $http, $state, Webmin) => {
   });
 
   $scope.cancelAndReset = () => co(function *() {
-    yield Webmin.server.http.stop();
     yield Webmin.server.services.stopAll();
     yield Webmin.server.resetData();
     $state.go('index');
diff --git a/app/js/controllers/main/MainController.js b/app/js/controllers/main/MainController.js
index 3a112f5ee11131e3a95bb0d45a15d4a8f7f738b8..709d4e03f27bfb81a4147a63d6e1384c201ca7f9 100644
--- a/app/js/controllers/main/MainController.js
+++ b/app/js/controllers/main/MainController.js
@@ -121,9 +121,7 @@ module.exports = ($scope, $state, $http, $timeout, $interval, Webmin, summary, U
   $scope.startServer = () => {
     $scope.server_stopped = false;
     return co(function *() {
-      yield Webmin.server.http.start();
       yield Webmin.server.services.startAll();
-      yield Webmin.server.http.regularUPnP();
       $scope.server_started = true;
     });
   };
@@ -131,7 +129,6 @@ module.exports = ($scope, $state, $http, $timeout, $interval, Webmin, summary, U
   $scope.stopServer = () => {
     $scope.server_started = false;
     return co(function *() {
-      yield Webmin.server.http.stop();
       yield Webmin.server.services.stopAll();
       $scope.server_stopped = true;
     });
diff --git a/app/js/controllers/main/settings/SettingsController.js b/app/js/controllers/main/settings/SettingsController.js
index dcb7b94f194a8675dbd86b48baa7a89157ebaf03..54851a59a2d895272251c7a5cb69fb7fb95ecd7a 100644
--- a/app/js/controllers/main/settings/SettingsController.js
+++ b/app/js/controllers/main/settings/SettingsController.js
@@ -12,7 +12,6 @@ module.exports = ($scope, $http, $state, $location, Webmin, UIUtils) => {
   $(".dropdown-button").dropdown({ constrainwidth: false });
 
   $scope.fullReset = () => co(function *() {
-    yield Webmin.server.http.stop();
     yield Webmin.server.services.stopAll();
     yield Webmin.server.resetData();
     $state.go('index');
diff --git a/app/js/controllers/main/settings/tabs/DataController.js b/app/js/controllers/main/settings/tabs/DataController.js
index 4869f8c89c782168498145fe9e214d86b1ffb48f..57a7480a57f2ede6acd4047629dd8e7a8af100a7 100644
--- a/app/js/controllers/main/settings/tabs/DataController.js
+++ b/app/js/controllers/main/settings/tabs/DataController.js
@@ -18,7 +18,6 @@ module.exports = ($scope, $http, $state, Webmin, peers) => {
   };
 
   $scope.resetNodeAndSync = () => co(function *() {
-    yield Webmin.server.http.stop();
     yield Webmin.server.services.stopAll();
     yield Webmin.server.resetData();
     let sp = $scope.remote_host.split('|');
diff --git a/app/js/lib/conf/routes.js b/app/js/lib/conf/routes.js
index 967ab26bab28fad02eb9e7ee22fcb8b4d55ec670..38341880b7bba1da49861102874d59a980008af4 100644
--- a/app/js/lib/conf/routes.js
+++ b/app/js/lib/conf/routes.js
@@ -123,9 +123,6 @@ module.exports = (app) => {
     state('main.home.overview', {
       url: '/overview',
       template: require('views/main/home/tabs/overview'),
-      resolve: {
-        startHttp: (Webmin) => Webmin.server.http.start()
-      },
       controller: 'OverviewController'
     }).
 
diff --git a/index.js b/index.js
index 6fb6648ee0ef1890ee1298e73f71e72dd02aea45..65c0086ae9ee09c975fc5c2221d7493f3b7ecf34 100644
--- a/index.js
+++ b/index.js
@@ -17,18 +17,17 @@ if (process.argv.length === 2) {
 module.exports = {
   duniter: {
 
-    'cliOptions': [
+    cliOptions: [
 
       // Webmin options
       { value: '--webmhost <host>', desc: 'Local network interface to connect to (IP)' },
       { value: '--webmport <port>', desc: 'Local network port to connect', parser: parseInt }
     ],
 
-    'cli': [{
+    cli: [{
       name: 'webstart',
       desc: 'Do a webstart',
-      requires: ['service'],
-      promiseCallback: (duniterServer, conf, program) => co(function*(){
+      onDatabaseExecute: (server, conf, program, params, startServices, stopServices) => co(function*(){
 
         try {
 
@@ -55,7 +54,7 @@ module.exports = {
           }));
           app.use(bodyParser.json());
 
-          const wbmin = webminController(duniterServer);
+          const wbmin = webminController(server, startServices, stopServices);
           const httpServer = http.createServer(app);
           httpServer.listen(PORT, HOTE);
           console.log("Serveur web disponible a l'adresse http://%s:%s", HOTE, PORT);
@@ -63,7 +62,6 @@ module.exports = {
           require('./server/lib/routes').webmin(wbmin, app);
           require('./server/lib/routes').webminWS(wbmin)(httpServer);
 
-          yield wbmin.startHTTP();
           yield wbmin.startAllServices();
 
           // Never ending promise
diff --git a/package.json b/package.json
index 1e4920aaec6b0b45dd631a457ddf4e075ebefeb9..932564aff8b7d169b693a569f39450439026872f 100644
--- a/package.json
+++ b/package.json
@@ -32,13 +32,18 @@
     "brunch": "2.4.2",
     "co": "4.6.0",
     "cors": "2.8.1",
+    "duniter-keypair": "^0.2.0",
+    "duniter-crawler": "^0.2.1",
+    "event-stream": "3.3.4",
     "express": "4.14.0",
     "express-fileupload": "0.0.5",
     "fs-extra": "1.0.0",
     "materialize-css": "0.97.5",
     "moment": "2.6.0",
     "node-pre-gyp": "0.6.32",
+    "q": "1.4.1",
     "request": "2.31.0",
+    "request-promise": "4.1.1",
     "rimraf": "2.5.4",
     "tmp": "0.0.29",
     "underscore": "1.8.3"
diff --git a/public/app.js b/public/app.js
index 5779070cbf8c760decfdc2b32640d684f4fa29e8..0acef3b62b21e23307f2bd4f94c129b6aec7a953 100644
--- a/public/app.js
+++ b/public/app.js
@@ -257,36 +257,24 @@ module.exports = function ($scope, $http, $state, Webmin) {
 
             case 8:
               _context.next = 10;
-              return Webmin.server.http.start();
-
-            case 10:
-              _context.next = 12;
-              return Webmin.server.http.openUPnP();
-
-            case 12:
-              _context.next = 14;
-              return Webmin.server.http.regularUPnP();
-
-            case 14:
-              _context.next = 16;
               return $scope.try();
 
-            case 16:
-              _context.next = 21;
+            case 10:
+              _context.next = 15;
               break;
 
-            case 18:
-              _context.prev = 18;
+            case 12:
+              _context.prev = 12;
               _context.t0 = _context['catch'](0);
 
               $scope.message = _context.t0.message;
 
-            case 21:
+            case 15:
             case 'end':
               return _context.stop();
           }
         }
-      }, _callee, this, [[0, 18]]);
+      }, _callee, this, [[0, 12]]);
     }));
   };
 
@@ -296,13 +284,9 @@ module.exports = function ($scope, $http, $state, Webmin) {
         while (1) {
           switch (_context2.prev = _context2.next) {
             case 0:
-              _context2.next = 2;
-              return Webmin.server.http.stop();
-
-            case 2:
               $scope.started = false;
 
-            case 3:
+            case 1:
             case 'end':
               return _context2.stop();
           }
@@ -404,20 +388,16 @@ module.exports = function ($scope, $http, $state, Webmin) {
           switch (_context6.prev = _context6.next) {
             case 0:
               _context6.next = 2;
-              return Webmin.server.http.stop();
+              return Webmin.server.services.stopAll();
 
             case 2:
               _context6.next = 4;
-              return Webmin.server.services.stopAll();
-
-            case 4:
-              _context6.next = 6;
               return Webmin.server.resetData();
 
-            case 6:
+            case 4:
               $state.go('index');
 
-            case 7:
+            case 5:
             case 'end':
               return _context6.stop();
           }
@@ -774,20 +754,12 @@ module.exports = function ($scope, $state, $http, $timeout, $interval, Webmin, s
           switch (_context.prev = _context.next) {
             case 0:
               _context.next = 2;
-              return Webmin.server.http.start();
-
-            case 2:
-              _context.next = 4;
               return Webmin.server.services.startAll();
 
-            case 4:
-              _context.next = 6;
-              return Webmin.server.http.regularUPnP();
-
-            case 6:
+            case 2:
               $scope.server_started = true;
 
-            case 7:
+            case 3:
             case 'end':
               return _context.stop();
           }
@@ -804,16 +776,12 @@ module.exports = function ($scope, $state, $http, $timeout, $interval, Webmin, s
           switch (_context2.prev = _context2.next) {
             case 0:
               _context2.next = 2;
-              return Webmin.server.http.stop();
-
-            case 2:
-              _context2.next = 4;
               return Webmin.server.services.stopAll();
 
-            case 4:
+            case 2:
               $scope.server_stopped = true;
 
-            case 5:
+            case 3:
             case 'end':
               return _context2.stop();
           }
@@ -1400,20 +1368,16 @@ module.exports = function ($scope, $http, $state, $location, Webmin, UIUtils) {
           switch (_context.prev = _context.next) {
             case 0:
               _context.next = 2;
-              return Webmin.server.http.stop();
+              return Webmin.server.services.stopAll();
 
             case 2:
               _context.next = 4;
-              return Webmin.server.services.stopAll();
-
-            case 4:
-              _context.next = 6;
               return Webmin.server.resetData();
 
-            case 6:
+            case 4:
               $state.go('index');
 
-            case 7:
+            case 5:
             case 'end':
               return _context.stop();
           }
@@ -1511,17 +1475,13 @@ module.exports = function ($scope, $http, $state, Webmin, peers) {
           switch (_context.prev = _context.next) {
             case 0:
               _context.next = 2;
-              return Webmin.server.http.stop();
+              return Webmin.server.services.stopAll();
 
             case 2:
               _context.next = 4;
-              return Webmin.server.services.stopAll();
-
-            case 4:
-              _context.next = 6;
               return Webmin.server.resetData();
 
-            case 6:
+            case 4:
               sp = $scope.remote_host.split('|');
 
               $state.go('sync', {
@@ -1530,7 +1490,7 @@ module.exports = function ($scope, $http, $state, Webmin, peers) {
                 sync: true
               });
 
-            case 8:
+            case 6:
             case 'end':
               return _context.stop();
           }
@@ -2263,11 +2223,6 @@ module.exports = function (app) {
     }).state('main.home.overview', {
       url: '/overview',
       template: require('views/main/home/tabs/overview'),
-      resolve: {
-        startHttp: function startHttp(Webmin) {
-          return Webmin.server.http.start();
-        }
-      },
       controller: 'OverviewController'
     }).state('main.home.network', {
       url: '/network',
diff --git a/public/app.js.map b/public/app.js.map
index eeb90e98cf34c76b5a9232a1403b131fd1faf666..5c8d781e8f3b3d6f75309c3e8c138e472adb26b3 100644
--- a/public/app.js.map
+++ b/public/app.js.map
@@ -1 +1 @@
-{"version":3,"sources":["AboutController.js","IndexController.js","IdentityController.js","ParametersController.js","RootBlockController.js","SyncController.js","MainController.js","GraphsBlockchainController.js","GraphsController.js","HomeController.js","HomeNetworkController.js","OverviewController.js","SettingsController.js","BackupController.js","CPUController.js","CurrencyController.js","DataController.js","KeyController.js","LogsController.js","LogsSettingsController.js","NetworkController.js","app.config.js","application.js","conf.js","app/js/lib/conf/i18n/en.json","routes.js","translate.js","peer.js","mobileDetector.js","base58.js","datetime.js","graphs.js","importer.js","pubkeyGenerator.js","ui_utils.js","webmin.js"],"names":["co","require","module","exports","$scope","version","UIUtils","translate","$parent","title","$http","$state","Webmin","summary","changeTitle","message","connected","current","go","console","error","err","conf","PubkeyGenerator","setTimeout","$","material_select","accept","modal","css","openModal","dev_autoconf","idty_uid","Math","random","idty_entropy","idty_password","enableInputs","generated","started","start","hosts","remote_ipv4","push","rport","join","remote_ipv6","host_listening","server","sendConf","http","openUPnP","regularUPnP","try","stop","previewNext","block","raw","blockchain","block_add","res","number","startServices","services","startAll","cancelAndReset","stopAll","resetData","$timeout","$stateParams","$translate","syncWS","ws","sync_mode","simplified_host","synchronizing","sync_failed","host","localStorage","getItem","port","parseInt","to","wrong_host","remote_current","checkNode","checked_host","sync_error","sync_message","split","checking","testSync","targetHost","toast","startSync","down_percent","apply_percent","sp","translatedErr","on","undefined","data","type","value","errorMessage","msg","republishNewSelfPeer","then","log","changed","$apply","autoConfNetwork","setItem","chunkLen","max","min","sync","nodeOK","$interval","Base58","local_host","local_port","local_sign_pk","decode","pubkey","local_sign_sk","seckey","DEFAULT_CESIUM_SETTINGS","notifications","help","Waves","displayEffect","isMobile","sideNav","menuWidth","openWallet","walletHeight","walletWidth","openNewTab","window","location","origin","position","height","width","show","win","settingsStr","dataStr","settings","JSON","parse","keyPairOK","keypair","signPk","signSk","length","encode","Array","from","node","debug","plugins","rememberMe","stringify","close","innerHeight","innerWidth","mainWindow","focus","aboutWin","showAbout","openWindow","subwin","gui","startServer","server_stopped","server_started","stopServer","restartServer","checkUpdates","LATEST_RELEASE_URL","get","latest","local_string_version","m","match","localVersion","localSuffix","isLocalAPreRelease","remoteVersion","tag_name","substr","filter","entry","icon","onclick","openExternal","BLOCKS_COUNT","Graph","loading","blocksCount","$watch","newValue","timeGraph","speedGraph","diffGraph","updateGraphs","currency","parameters","blocks","count","speeds","accelerations","medianTimeIncrements","actualDurations","BY_HOUR","i","len","acc","previousPos","dtDiffEval","j","medianTime","availPreviousBlocks","localAvgSpeed","realDuration","isNaN","avgGenTime","parseFloat","toFixed","time","minSpeeds","map","ceil","sqrt","maxSpeeds","floor","minDurations","maxDurations","difficulties","b","powMin","graphs","withTime","withSpeed","withDifficulty","timeGraphs","series","difficultyGraph","enableTabs","menu","peers","update","searching","delayP","Q","delay","network","moment","bindBlockWS","loadPowData","M","monetaryMass","UD","ud0","lastUDBlock","N","membersCount","dividend","pow","unitbase","c","current_currency","current_number","current_membersCount","current_medianTime","current_powMin","phones","abc","newIdentities","dropdown","constrainwidth","lastNearPoW","totalPoW","sync_state","network_percent","peer_percent","has_pulled","is_pulling","last_pulling","start_block","sync_time","fromNow","powSummary","pow_total","total","pow_mirror","mirror","pow_waiting","waiting","event","last","doneCount","found","hash","cb","wsBlock","reconfigure_network","reconfiguring","interfaces","netinferfaces","local_ipv4","auto","local","ipv4","local_ipv6","ipv6","remote","lport","upnp","dns","netConf","should_reconfigure","isNodePubliclyReachable","reachable","success","$location","fullReset","Importer","export_link","getExportURL","cpuPower","cpu","updateCPUpower","savingCPU","cpuConf","attr","Peer","peer","p","name","getURL","slice","host_port","getHost","getPort","resetNode","resetNodeAndSync","remote_host","keyConf","reload","_","logsSize","logs","range","logsString","follow","levels","warn","info","trace","keys","level","splice","send","addLogs","autoDigest","pause","newlogs","elem","document","getElementById","scrollTop","scrollHeight","whenOpened","generating","shareLogs","logsExport","link","netinterfaces","firstConf","autoconf","autoconfig","local_neti","toArrayOfAddresses","remote_neti","default_port","saveConf","netiScope","reduce","arr","neti","concat","addresses","addr","address","family","angular","duniterApp","config","$compileProvider","aHrefSanitizationWhitelist","duniterChildCallback","onresize","onResize","url","options","callback","Window","open","screenTop","top","screenLeft","left","Shell","homeControllers","controller","init","jade","e","api_timeout","app","$stateProvider","$urlRouterProvider","state","template","resolve","abstract","dt","stepMax","sigDelay","sigPeriod","sigStock","sigWindow","sigValidity","msValidity","sigQty","xpercent","percentRot","blocksRot","medianTimeBlocks","resolveNetworkAutoConf","startHttp","selfPeer","self","status","errorMsg","otherwise","run","$rootScope","$on","toState","toParams","fromState","fromParams","$translateProvider","translations","preferredLanguage","useSanitizeValueStrategy","json","that","BMA_REGEXP","Object","forEach","key","endpoints","statusTS","keyID","substring","copyValues","obj","copyValuesFrom","getRaw","getBMA","bma","ep","matches","getDns","getIPv4","getIPv6","hasValid4","base","getNamedURL","isReachable","mobilecheck","check","a","test","navigator","userAgent","vendor","opera","alphabet","alphabetMap","charAt","buffer","digits","carry","unshift","digit","string","Uint8Array","input","bytes","factory","format","speedGraphs","id","offset","getSeries","xValuex","highcharts","chart","zoomType","events","load","text","subtitle","ontouchstart","xAxis","minRange","labels","formatter","yAxis","minorTickInterval","colors","legend","enabled","tooltip","shared","crosshairs","blockFormatter","plotOptions","area","fillColor","linearGradient","x1","y1","x2","y2","stops","Highcharts","getOptions","Color","setOpacity","marker","radius","lineWidth","states","hover","threshold","timeAccelerations","timesInc","inc","html","x","points","point","color","y","Upload","uploadFiles","file","errFiles","f","errFile","upload","getImportURL","importData","response","result","evt","progress","loaded","pubkey_preview","timeout","preview","salt","pass","newConcat","previewPubkey","catch","$q","when","toastRaw","Materialize","translated","addClass","jTabs","tabs","click","href","currentTarget","currentID","path","replace","httpProtocol","protocol","wsProtocol","getResource","uri","params","httpGet","Promise","reject","suffix","pkeys","queryParams","pkey","prevURI","RegExp","headers","postResource","post","wsMap","sock","WebSocket","onclose","onerror","opened","openedCallback","onopen","listener","messageType","onmessage","wsPeer","nbLines","opts","hostname","service","instance"],"mappings":"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AR,CAAzD;AACA+Z,kBAAgBC,UAAhB,CAA2B,4BAA3B,EAAyDha,QAAQ,sDAAR,CAAzD;AACD,CA1FD;;;;ACAA;;AAEAC,OAAOC,OAAP,GAAiB;;AAEf+Z,QAAM,gBAAM;;AAEV;AACA,QAAI;AACFvR,aAAOwR,IAAP,GAAcla,QAAQ,SAAS,GAAT,GAAe,SAAvB,CAAd;AACD,KAFD,CAEE,OAAOma,CAAP,EAAU,CACX;;AAEDjZ,YAAQyF,GAAR,CAAY,4BAAZ;;AAEA3G,YAAQ,cAAR;;AAEAkB,YAAQyF,GAAR,CAAY,kBAAZ;AACD;AAfc,CAAjB;;;;;;ACFA1G,OAAOC,OAAP,GAAiB;AACf6C,UAAQ,EADO,EACH;AACZgC,QAAM,EAFS,EAEH;AACZmT,gBAAc,IAHC;AAIfpW,gBAAc,KAJC;AAKfsY,eAAa,KALE,CAKI;AALJ,CAAjB;;;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA1MA;AAAA;;;;;;ACAA,IAAIra,KAAKC,QAAQ,IAAR,CAAT;AACA,IAAI+V,IAAI/V,QAAQ,YAAR,CAAR;;AAEAC,OAAOC,OAAP,GAAiB,UAACma,GAAD,EAAS;;AAExBA,MAAItB,MAAJ,CAAW,CAAC,gBAAD,EAAmB,oBAAnB,EAAyC,UAACuB,cAAD,EAAiBC,kBAAjB,EAAwC;;AAE1F;AACAD,mBACAE,KADA,CACM,OADN,EACe;AACbnB,WAAK,GADQ;AAEboB,gBAAUza,QAAQ,aAAR,CAFG;AAGb0a,eAAS;AACPnW,YAAI,YAAC5D,MAAD;AAAA,iBAAYA,OAAO4D,EAAP,EAAZ;AAAA,SADG;AAEP3D,iBAAS,iBAACD,MAAD;AAAA,iBAAYA,OAAOC,OAAP,EAAZ;AAAA;AAFF,OAHI;AAOboZ,kBAAY;AAPC,KADf,EAWAQ,KAXA,CAWM,OAXN,EAWe;AACbnB,WAAK,QADQ;AAEboB,gBAAUza,QAAQ,aAAR,CAFG;AAGb0a,eAAS;AACP9Z,iBAAS,iBAACD,MAAD;AAAA,iBAAYA,OAAOC,OAAP,EAAZ;AAAA,SADF;AAEPR,iBAAS,iBAACQ,OAAD;AAAA,iBAAaA,WAAW,MAAMA,QAAQR,OAAzB,IAAoC,iBAAjD;AAAA;AAFF,OAHI;AAOb4Z,kBAAY;AAPC,KAXf,EAqBAQ,KArBA,CAqBM,WArBN,EAqBmB;AACjBG,gBAAU,IADO;AAEjBtB,WAAK,YAFY;AAGjBoB,gBAAUza,QAAQ,mBAAR,CAHO;AAIjBga,kBAAY,oBAAC7Z,MAAD,EAAY;AACtBA,eAAOkB,IAAP,GAAc;AACZ0L,oBAAU,gBADE;AAEZgE,aAAG,WAFS;AAGZ6J,cAAI,UAAU,EAAV,GAAe,IAHP;AAIZpK,eAAK,GAJO;AAKZqK,mBAAS,CALG;AAMZC,oBAAU,OAAO,EAAP,GAAY,GAAZ,GAAkB,CANhB;AAOZC,qBAAW,CAPC,EAOE;AACdC,oBAAU,EARE;AASZC,qBAAW,OAAO,EAAP,GAAY,EATX,EASe;AAC3BC,uBAAa,OAAO,EAAP,GAAY,GAVb;AAWZC,sBAAY,OAAO,EAAP,GAAY,GAXZ;AAYZC,kBAAQ,CAZI;AAaZC,oBAAU,GAbE;AAcZC,sBAAY,IAdA;AAeZC,qBAAW,EAfC;AAgBZpN,sBAAY,KAAK,EAhBL;AAiBZP,sBAAY,EAjBA;AAkBZ4N,4BAAkB;AAlBN,SAAd;AAoBD;AAzBgB,KArBnB,EAiDAhB,KAjDA,CAiDM,kBAjDN,EAiD0B;AACxBnB,WAAK,SADmB;AAExBoB,gBAAUza,QAAQ,mBAAR,CAFc;AAGxBga,kBAAY,oBAAC7Z,MAAD,EAASqU,QAAT,EAAsB;AAChCA,iBAASrU,MAAT;AACD;AALuB,KAjD1B,EAyDAqa,KAzDA,CAyDM,kBAzDN,EAyD0B;AACxBnB,WAAK,SADmB;AAExBoB,gBAAU;AAFc,KAzD1B,EA8DAD,KA9DA,CA8DM,sBA9DN,EA8D8B;AAC5BnB,WAAK,aADuB;AAE5BoB,gBAAUza,QAAQ,8BAAR,CAFkB;AAG5Bga,kBAAY;AAHgB,KA9D9B,EAoEAQ,KApEA,CAoEM,0BApEN,EAoEkC;AAChCnB,WAAK,iBAD2B;AAEhCoB,gBAAUza,QAAQ,kCAAR,CAFsB;AAGhC0a,eAAS;AACP/C,uBAAe,uBAAChX,MAAD;AAAA,iBAAY8a,uBAAuB9a,MAAvB,CAAZ;AAAA,SADR;AAEPiX,mBAAW;AAAA,iBAAM,IAAN;AAAA;AAFJ,OAHuB;AAOhCoC,kBAAY;AAPoB,KApElC,EA8EAQ,KA9EA,CA8EM,6BA9EN,EA8EqC;AACnCnB,WAAK,oBAD8B;AAEnCoB,gBAAUza,QAAQ,qCAAR,CAFyB;AAGnCga,kBAAY;AAHuB,KA9ErC,EAoFAQ,KApFA,CAoFM,uBApFN,EAoF+B;AAC7BnB,WAAK,cADwB;AAE7BoB,gBAAUza,QAAQ,+BAAR,CAFmB;AAG7Bga,kBAAY;AAHiB,KApF/B,EA0FAQ,KA1FA,CA0FM,MA1FN,EA0Fc;AACZnB,WAAK,6BADO;AAEZoB,gBAAUza,QAAQ,sBAAR,CAFE;AAGZga,kBAAY;AAHA,KA1Fd,EAgGAQ,KAhGA,CAgGM,MAhGN,EAgGc;AACZG,gBAAU,IADE;AAEZtB,WAAK,OAFO;AAGZoB,gBAAUza,QAAQ,iBAAR,CAHE;AAIZ0a,eAAS;AACPnW,YAAI,YAAC5D,MAAD;AAAA,iBAAYA,OAAO4D,EAAP,EAAZ;AAAA,SADG;AAEP3D,iBAAS,iBAACD,MAAD;AAAA,iBAAYA,OAAOC,OAAP,EAAZ;AAAA;AAFF,OAJG;AAQZoZ,kBAAY;AARA,KAhGd,EA2GAQ,KA3GA,CA2GM,WA3GN,EA2GmB;AACjBG,gBAAU,IADO;AAEjBtB,WAAK,OAFY;AAGjBoB,gBAAUza,QAAQ,sBAAR,CAHO;AAIjBga,kBAAY;AAJK,KA3GnB,EAkHAQ,KAlHA,CAkHM,oBAlHN,EAkH4B;AAC1BnB,WAAK,WADqB;AAE1BoB,gBAAUza,QAAQ,+BAAR,CAFgB;AAG1B0a,eAAS;AACPgB,mBAAW,mBAAC/a,MAAD;AAAA,iBAAYA,OAAOoC,MAAP,CAAcE,IAAd,CAAmBV,KAAnB,EAAZ;AAAA;AADJ,OAHiB;AAM1ByX,kBAAY;AANc,KAlH5B,EA2HAQ,KA3HA,CA2HM,mBA3HN,EA2H2B;AACzBnB,WAAK,UADoB;AAEzBoB,gBAAUza,QAAQ,8BAAR,CAFe;AAGzB0a,eAAS;AACP/K,eAAO,eAAChP,MAAD;AAAA,iBAAYZ,2BAAG;AAAA;AAAA;AAAA;AAAA;AAAA,qDACbY,OAAOsP,OAAP,CAAeN,KAAf,EADa;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAH,EAAZ;AAAA;AADA,OAHgB;AAQzBqK,kBAAY;AARa,KA3H3B,EAsIAQ,KAtIA,CAsIM,eAtIN,EAsIuB;AACrBG,gBAAU,IADW;AAErBtB,WAAK,WAFgB;AAGrBoB,gBAAUza,QAAQ,8BAAR,CAHW;AAIrB0a,eAAS;AACP9Z,iBAAS,iBAACD,MAAD;AAAA,iBAAYA,OAAOC,OAAP,EAAZ;AAAA;AADF,OAJY;AAOrBoZ,kBAAY;AAPS,KAtIvB,EAgJAQ,KAhJA,CAgJM,oBAhJN,EAgJ4B;AAC1BnB,WAAK,OADqB;AAE1BoB,gBAAUza,QAAQ,+BAAR,CAFgB;AAG1B0a,eAAS;AACP/K,eAAO,eAAChP,MAAD;AAAA,iBAAYZ,2BAAG;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAEDY,OAAOsP,OAAP,CAAe0L,QAAf,EAFC;;AAAA;AAEdC,kCAFc;AAAA;AAAA,qCAGFjb,OAAOsP,OAAP,CAAeN,KAAf,EAHE;;AAAA;AAGdhM,iCAHc;AAAA;AAAA,mCAIXoS,EAAE/J,MAAF,CAASrI,IAAIgM,KAAb,EAAoB,UAACwF,CAAD;AAAA,yCAAOA,EAAExN,MAAF,IAAYiU,KAAKjU,MAAjB,IAA2BwN,EAAE0G,MAAF,IAAY,IAA9C;AAAA,iCAApB;AAJW;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAMlB3a,4BAAQC,KAAR;AANkB,sDAOX,EAPW;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAH,EAAZ;AAAA;AADA,OAHiB;AAe1B6Y,kBAAY;AAfc,KAhJ5B,EAkKAQ,KAlKA,CAkKM,oBAlKN,EAkK4B;AAC1BnB,WAAK,OADqB;AAE1BoB,gBAAUza,QAAQ,+BAAR,CAFgB;AAG1Bga,kBAAY;AAHc,KAlK5B,EAwKAQ,KAxKA,CAwKM,sBAxKN,EAwK8B;AAC5BnB,WAAK,SADuB;AAE5BoB,gBAAUza,QAAQ,iCAAR,CAFkB;AAG5Bga,kBAAY;AAHgB,KAxK9B,EA8KAQ,KA9KA,CA8KM,mBA9KN,EA8K2B;AACzBnB,WAAK,MADoB;AAEzBoB,gBAAUza,QAAQ,8BAAR,CAFe;AAGzB0a,eAAS;AACP9Z,iBAAS,iBAACD,MAAD;AAAA,iBAAYA,OAAOC,OAAP,EAAZ;AAAA;AADF,OAHgB;AAMzBoZ,kBAAY;AANa,KA9K3B,EAuLAQ,KAvLA,CAuLM,sBAvLN,EAuL8B;AAC5BnB,WAAK,SADuB;AAE5BoB,gBAAUza,QAAQ,iCAAR,CAFkB;AAG5Bga,kBAAY;AAHgB,KAvL9B,EA6LAQ,KA7LA,CA6LM,uBA7LN,EA6L+B;AAC7BnB,WAAK,UADwB;AAE7BqB,eAAS;AACP/C,uBAAe,uBAAChX,MAAD;AAAA,iBAAY8a,uBAAuB9a,MAAvB,CAAZ;AAAA,SADR;AAEPiX,mBAAW;AAAA,iBAAM,KAAN;AAAA;AAFJ,OAFoB;AAM7B6C,gBAAUza,QAAQ,kCAAR,CANmB;AAO7Bga,kBAAY;AAPiB,KA7L/B,EAuMAQ,KAvMA,CAuMM,wBAvMN,EAuMgC;AAC9BnB,WAAK,WADyB;AAE9BqB,eAAS;AACPrZ,cAAM,cAACT,OAAD;AAAA,iBAAab,2BAAG;AAAA;AAAA;AAAA;AAAA;AAAA,sDACba,QAAQoM,UADK;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAH,EAAb;AAAA;AADC,OAFqB;AAO9ByN,gBAAUza,QAAQ,mCAAR,CAPoB;AAQ9Bga,kBAAY;AARkB,KAvMhC,EAkNAQ,KAlNA,CAkNM,aAlNN,EAkNqB;AACnBG,gBAAU,IADS;AAEnBtB,WAAK,SAFc;AAGnBoB,gBAAUza,QAAQ,0BAAR,CAHS;AAInBga,kBAAY;AAJO,KAlNrB,EAyNAQ,KAzNA,CAyNM,wBAzNN,EAyNgC;AAC9BnB,WAAK,aADyB;AAE9BoB,gBAAUza,QAAQ,8BAAR,CAFoB;AAG9Bga,kBAAY;AAHkB,KAzNhC;;AA+NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEAQ,SA1PA,CA0PM,MA1PN,EA0Pc;AACZnB,WAAK,OADO;AAEZoB,gBAAUza,QAAQ,YAAR,CAFE;AAGZ0a,eAAS;AACPnW,YAAI,YAAC5D,MAAD;AAAA,iBAAYA,OAAO4D,EAAP,EAAZ;AAAA;AADG,OAHG;AAMZyV,kBAAY;AANA,KA1Pd,EAmQAQ,KAnQA,CAmQM,OAnQN,EAmQe;AACbnB,WAAK,aADQ;AAEboB,gBAAUza,QAAQ,aAAR,CAFG;AAGbga,kBAAY,oBAAC7Z,MAAD,EAASiE,YAAT;AAAA,eACVjE,OAAO2b,QAAP,GAAkB1X,aAAahD,GAAb,IAAoB,aAD5B;AAAA;AAHC,KAnQf;;AA0QA;AACAmZ,uBAAmBwB,SAAnB,CAA6B,GAA7B;AACD,GA/QU,CAAX;;AAiRA1B,MAAI2B,GAAJ,CAAQ,UAACC,UAAD,EAAavb,MAAb,EAAwB;AAC9Bub,eAAWC,GAAX,CAAe,mBAAf,EAAoC,UAACtJ,KAAD,EAAQuJ,OAAR,EAAiBC,QAAjB,EAA2BC,SAA3B,EAAsCC,UAAtC,EAAkDnb,KAAlD,EAA4D;AAC9FD,cAAQC,KAAR,CAAcA,KAAd;AACAT,aAAOO,EAAP,CAAU,OAAV,EAAmB,EAAEG,KAAKD,MAAML,OAAb,EAAnB;AACD,KAHD;AAID,GALD;;AAOA,WAAS2a,sBAAT,CAAgC9a,MAAhC,EAAwC;AACtC,WAAOZ,2BAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBACkBY,OAAOsP,OAAP,CAAeoD,UAAf,EADlB;;AAAA;AACJsE,2BADI;AAAA,gDAEDA,iBAAiB,EAAElE,OAAO,EAAT,EAAaI,QAAQ,EAArB,EAFhB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAH,EAAP;AAID;AACF,CAhSD;;;;;;ACHA5T,OAAOC,OAAP,GAAiB,UAACma,GAAD,EAAS;;AAExBA,MAAItB,MAAJ,CAAW,CAAC,oBAAD,EAAuB,UAACwD,kBAAD,EAAwB;;AAExDA,uBAAmBC,YAAnB,CAAgC,IAAhC,EAAsCxc,QAAQ,WAAR,CAAtC;;AAEA;AACAuc,uBAAmBE,iBAAnB,CAAqC,IAArC;;AAEA;AACAF,uBAAmBG,wBAAnB,CAA4C,EAA5C;AACD,GATU,CAAX;AAUD,CAZD;;;;ACAA;;AAEAzc,OAAOC,OAAP,GAAiB,SAAS+U,IAAT,CAAc0H,IAAd,EAAoB;;AAEnC,MAAIC,OAAO,IAAX;;AAEA,MAAIC,aAAa,qFAAjB;;AAEAC,SAAOrG,IAAP,CAAYkG,IAAZ,EAAkBI,OAAlB,CAA0B,UAASC,GAAT,EAAc;AACtCJ,SAAKI,GAAL,IAAYL,KAAKK,GAAL,CAAZ;AACD,GAFD;;AAIAJ,OAAKK,SAAL,GAAiBL,KAAKK,SAAL,IAAkB,EAAnC;AACAL,OAAKM,QAAL,GAAgBN,KAAKM,QAAL,IAAiB,CAAjC;;AAEAN,OAAKO,KAAL,GAAa,YAAY;AACvB,WAAOP,KAAKjV,MAAL,IAAeiV,KAAKjV,MAAL,CAAYgC,MAAZ,GAAqB,EAApC,GAAyCiT,KAAKjV,MAAL,CAAYyV,SAAZ,CAAsB,CAAtB,EAAyB,EAAzB,CAAzC,GAAwE,SAA/E;AACD,GAFD;;AAIAR,OAAKS,UAAL,GAAkB,UAASpY,EAAT,EAAa;AAC7B,QAAIqY,MAAMV,IAAV;AACA,KAAC,SAAD,EAAY,UAAZ,EAAwB,KAAxB,EAA+B,WAA/B,EAA4C,MAA5C,EAAoD,QAApD,EAA8D,UAA9D,EAA0E,OAA1E,EAAmF,WAAnF,EAAgGG,OAAhG,CAAwG,UAAUC,GAAV,EAAe;AACrH/X,SAAG+X,GAAH,IAAUM,IAAIN,GAAJ,CAAV;AACD,KAFD;AAGD,GALD;;AAOAJ,OAAKW,cAAL,GAAsB,UAASzT,IAAT,EAAe;AACnC,QAAIwT,MAAMV,IAAV;AACA,KAAC,SAAD,EAAY,UAAZ,EAAwB,KAAxB,EAA+B,WAA/B,EAA4C,OAA5C,EAAqD,WAArD,EAAkEG,OAAlE,CAA0E,UAAUC,GAAV,EAAe;AACvFM,UAAIN,GAAJ,IAAWlT,KAAKkT,GAAL,CAAX;AACD,KAFD;AAGD,GALD;;AAOAJ,OAAKD,IAAL,GAAY,YAAW;AACrB,QAAIW,MAAMV,IAAV;AACA,QAAID,OAAO,EAAX;AACA,KAAC,SAAD,EAAY,UAAZ,EAAwB,WAAxB,EAAqC,QAArC,EAA+C,OAA/C,EAAwD,WAAxD,EAAqEI,OAArE,CAA6E,UAAUC,GAAV,EAAe;AAC1FL,WAAKK,GAAL,IAAYM,IAAIN,GAAJ,CAAZ;AACD,KAFD;AAGAL,SAAKnZ,GAAL,GAAWoZ,KAAKY,MAAL,EAAX;AACAb,SAAKhV,MAAL,GAAciV,KAAKjV,MAAnB;AACA,WAAOgV,IAAP;AACD,GATD;;AAWAC,OAAKa,MAAL,GAAc,YAAW;AACvB,QAAIC,MAAM,IAAV;AACAd,SAAKK,SAAL,CAAeF,OAAf,CAAuB,UAASY,EAAT,EAAY;AACjC,UAAIC,UAAU,CAACF,GAAD,IAAQC,GAAGlS,KAAH,CAASoR,UAAT,CAAtB;AACA,UAAIe,OAAJ,EAAa;AACXF,cAAM;AACJ,iBAAOE,QAAQ,CAAR,KAAc,EADjB;AAEJ,kBAAQA,QAAQ,CAAR,KAAc,EAFlB;AAGJ,kBAAQA,QAAQ,CAAR,KAAc,EAHlB;AAIJ,kBAAQA,QAAQ,CAAR,KAAc;AAJlB,SAAN;AAMD;AACF,KAVD;AAWA,WAAOF,OAAO,EAAd;AACD,GAdD;;AAgBAd,OAAKiB,MAAL,GAAc,YAAW;AACvB,QAAIH,MAAMd,KAAKa,MAAL,EAAV;AACA,WAAOC,IAAI1J,GAAJ,GAAU0J,IAAI1J,GAAd,GAAoB,IAA3B;AACD,GAHD;;AAKA4I,OAAKkB,OAAL,GAAe,YAAW;AACxB,QAAIJ,MAAMd,KAAKa,MAAL,EAAV;AACA,WAAOC,IAAIhK,IAAJ,GAAWgK,IAAIhK,IAAf,GAAsB,IAA7B;AACD,GAHD;;AAKAkJ,OAAKmB,OAAL,GAAe,YAAW;AACxB,QAAIL,MAAMd,KAAKa,MAAL,EAAV;AACA,WAAOC,IAAI9J,IAAJ,GAAW8J,IAAI9J,IAAf,GAAsB,IAA7B;AACD,GAHD;;AAKAgJ,OAAKnH,OAAL,GAAe,YAAW;AACxB,QAAIiI,MAAMd,KAAKa,MAAL,EAAV;AACA,WAAOC,IAAI3Y,IAAJ,GAAW2Y,IAAI3Y,IAAf,GAAsB,IAA7B;AACD,GAHD;;AAKA6X,OAAKpH,OAAL,GAAe,YAAW;AACxB,QAAIkI,MAAMd,KAAKa,MAAL,EAAV;AACA,QAAI7Y,OACDgY,KAAKoB,SAAL,CAAeN,GAAf,IAAsBA,IAAIhK,IAA1B,GACEgK,IAAI1J,GAAJ,GAAU0J,IAAI1J,GAAd,GACE0J,IAAI9J,IAAJ,GAAW,MAAM8J,IAAI9J,IAAV,GAAiB,GAA5B,GAAkC,EAHzC;AAIA,WAAOhP,IAAP;AACD,GAPD;;AASAgY,OAAKvH,MAAL,GAAc,YAAW;AACvB,QAAIqI,MAAMd,KAAKa,MAAL,EAAV;AACA,QAAIQ,OAAO,EAAX;AACA,QAAIP,IAAI1J,GAAR,EAAa;AACXiK,aAAOP,IAAI1J,GAAX;AACD,KAFD,MAEO,IAAI4I,KAAKoB,SAAL,CAAeN,GAAf,CAAJ,EAAyB;AAC9BO,aAAOP,IAAIhK,IAAX;AACD,KAFM,MAEA,IAAIgK,IAAI9J,IAAR,EAAc;AACnBqK,aAAO,MAAMP,IAAI9J,IAAV,GAAiB,GAAxB;AACD;AACD,QAAG8J,IAAI3Y,IAAP,EACEkZ,QAAQ,MAAMP,IAAI3Y,IAAlB;AACF,WAAOkZ,IAAP;AACD,GAbD;;AAeArB,OAAKoB,SAAL,GAAiB,UAASN,GAAT,EAAc;AAC7B,WAAOA,IAAIhK,IAAJ,IAAY,CAACgK,IAAIhK,IAAJ,CAASjI,KAAT,CAAe,QAAf,CAAb,IAAyC,CAACiS,IAAIhK,IAAJ,CAASjI,KAAT,CAAe,UAAf,CAA1C,GAAuE,IAAvE,GAA8E,KAArF;AACD,GAFD;;AAIAmR,OAAKsB,WAAL,GAAmB,YAAW;AAC5B,QAAIR,MAAMd,KAAKa,MAAL,EAAV;AACA,QAAIQ,OACDrB,KAAKoB,SAAL,CAAeN,GAAf,IAAsBA,IAAIhK,IAA1B,GACEgK,IAAI1J,GAAJ,GAAU0J,IAAI1J,GAAd,GACE0J,IAAI9J,IAAJ,GAAW,MAAM8J,IAAI9J,IAAV,GAAiB,GAA5B,GAAkC,EAHzC;AAIA,QAAG8J,IAAI3Y,IAAP,EACEkZ,QAAQ,MAAMP,IAAI3Y,IAAlB;AACF,WAAOkZ,IAAP;AACD,GATD;;AAWArB,OAAKuB,WAAL,GAAmB,YAAY;AAC7B,WAAOvB,KAAKvH,MAAL,KAAgB,IAAhB,GAAuB,KAA9B;AACD,GAFD;AAGD,CAxHD;;;;;;ACFApV,OAAOC,OAAP,GAAiB,SAASke,WAAT,GAAuB;AACtC,MAAIC,QAAQ,KAAZ;AACA,GAAC,UAASC,CAAT,EAAW;AAAC,QAAG,2TAA2TC,IAA3T,CAAgUD,CAAhU,KAAoU,0kDAA0kDC,IAA1kD,CAA+kDD,EAAEvS,MAAF,CAAS,CAAT,EAAW,CAAX,CAA/kD,CAAvU,EAAq6DsS,QAAQ,IAAR;AAAa,GAA/7D,EAAi8DG,UAAUC,SAAV,IAAqBD,UAAUE,MAA/B,IAAuChW,OAAOiW,KAA/+D;AACA,SAAON,KAAP;AACD,CAJD;;;;;;ACAApe,OAAOC,OAAP,GAAiB,UAACma,GAAD,EAAS;;AAExB,MAAI/S,SAAS,EAAb;;AAEAA,SAAOsX,QAAP,GAAkB,4DAAlB;AACAtX,SAAOuX,WAAP,GAAqB,EAArB;;AAEA,OAAI,IAAIrR,IAAI,CAAZ,EAAeA,IAAIlG,OAAOsX,QAAP,CAAgBjV,MAAnC,EAA2C6D,GAA3C,EAAgD;AAC9ClG,WAAOuX,WAAP,CAAmBvX,OAAOsX,QAAP,CAAgBE,MAAhB,CAAuBtR,CAAvB,CAAnB,IAAgDA,CAAhD;AACD;;AAEDlG,SAAOsC,MAAP,GAAgB,UAASmV,MAAT,EAAiB;AAC/B,QAAIA,OAAOpV,MAAP,KAAkB,CAAtB,EAAyB,OAAO,EAAP;;AAEzB,QAAI6D,UAAJ;AAAA,QAAOK,UAAP;AAAA,QAAUmR,SAAS,CAAC,CAAD,CAAnB;AACA,SAAKxR,IAAI,CAAT,EAAYA,IAAIuR,OAAOpV,MAAvB,EAA+B6D,GAA/B,EAAoC;AAClC,WAAKK,IAAI,CAAT,EAAYA,IAAImR,OAAOrV,MAAvB,EAA+BkE,GAA/B;AAAoCmR,eAAOnR,CAAP,MAAc,CAAd;AAApC,OACAmR,OAAOA,OAAOrV,MAAP,GAAgB,CAAvB,KAA6BoV,OAAOvR,CAAP,CAA7B;;AAEA,UAAIyR,QAAQ,CAAZ;AACA,WAAKpR,IAAImR,OAAOrV,MAAP,GAAgB,CAAzB,EAA4BkE,KAAK,CAAjC,EAAoCA,GAApC,EAAwC;AACtCmR,eAAOnR,CAAP,KAAaoR,KAAb;AACAA,gBAASD,OAAOnR,CAAP,IAAY,EAAb,GAAmB,CAA3B;AACAmR,eAAOnR,CAAP,KAAa,EAAb;AACD;;AAED,aAAOoR,KAAP,EAAc;AACZD,eAAOE,OAAP,CAAeD,KAAf;AACAA,gBAASD,OAAO,CAAP,IAAY,EAAb,GAAmB,CAA3B;AACAA,eAAO,CAAP,KAAa,EAAb;AACD;AACF;;AAED;AACA,SAAKxR,IAAI,CAAT,EAAYA,IAAIuR,OAAOpV,MAAP,GAAgB,CAApB,IAAyBoV,OAAOvR,CAAP,KAAa,CAAlD,EAAqDA,GAArD;AAA0DwR,aAAOE,OAAP,CAAe,CAAf;AAA1D,KAEA,OAAOF,OAAOxQ,GAAP,CAAW,UAAS2Q,KAAT,EAAgB;AAAE,aAAO7X,OAAOsX,QAAP,CAAgBO,KAAhB,CAAP;AAA+B,KAA5D,EAA8Dvc,IAA9D,CAAmE,EAAnE,CAAP;AACD,GA1BD;;AA4BA0E,SAAOI,MAAP,GAAgB,UAAS0X,MAAT,EAAiB;AAC/B,QAAIA,OAAOzV,MAAP,KAAkB,CAAtB,EAAyB,OAAQ,IAAI0V,UAAJ,EAAR;;AAEzB,QAAIC,QAAQF,OAAO5Z,KAAP,CAAa,EAAb,EAAiBgJ,GAAjB,CAAqB,UAASuC,CAAT,EAAW;AAC1C,aAAOzJ,OAAOuX,WAAP,CAAmB9N,CAAnB,CAAP;AACD,KAFW,CAAZ;;AAIA,QAAIvD,UAAJ;AAAA,QAAOK,UAAP;AAAA,QAAU0R,QAAQ,CAAC,CAAD,CAAlB;AACA,SAAK/R,IAAI,CAAT,EAAYA,IAAI8R,MAAM3V,MAAtB,EAA8B6D,GAA9B,EAAmC;AACjC,WAAKK,IAAI,CAAT,EAAYA,IAAI0R,MAAM5V,MAAtB,EAA8BkE,GAA9B;AAAmC0R,cAAM1R,CAAN,KAAY,EAAZ;AAAnC,OACA0R,MAAMA,MAAM5V,MAAN,GAAe,CAArB,KAA2B2V,MAAM9R,CAAN,CAA3B;;AAEA,UAAIyR,QAAQ,CAAZ;AACA,WAAKpR,IAAI0R,MAAM5V,MAAN,GAAe,CAAxB,EAA2BkE,KAAK,CAAhC,EAAmCA,GAAnC,EAAuC;AACrC0R,cAAM1R,CAAN,KAAYoR,KAAZ;AACAA,gBAAQM,MAAM1R,CAAN,KAAY,CAApB;AACA0R,cAAM1R,CAAN,KAAY,IAAZ;AACD;;AAED,aAAOoR,KAAP,EAAc;AACZM,cAAML,OAAN,CAAcD,KAAd;AACAA,gBAAQM,MAAM,CAAN,KAAY,CAApB;AACAA,cAAM,CAAN,KAAY,IAAZ;AACD;AACF;;AAED;AACA,SAAK/R,IAAI,CAAT,EAAYA,IAAI8R,MAAM3V,MAAN,GAAe,CAAnB,IAAwB2V,MAAM9R,CAAN,KAAY,CAAhD,EAAmDA,GAAnD;AAAwD+R,YAAML,OAAN,CAAc,CAAd;AAAxD,KACA,OAAQ,IAAIG,UAAJ,CAAeE,KAAf,CAAR;AACD,GA7BD;;AA+BAlF,MAAImF,OAAJ,CAAY,QAAZ,EAAsB,YAAW;AAC/B,WAAO;AACL5V,cAAQtC,OAAOsC,MADV;AAELlC,cAAQJ,OAAOI;AAFV,KAAP;AAID,GALD;AAMD,CA5ED;;;;;;ACAA,IAAIqO,IAAI/V,QAAQ,YAAR,CAAR;AACA,IAAIqB,OAAOrB,QAAQ,kBAAR,CAAX;AACA,IAAIkQ,SAASlQ,QAAQ,QAAR,CAAb;;AAEAC,OAAOC,OAAP,GAAiB,UAACma,GAAD,EAAS;;AAEtBA,MAAIrO,MAAJ,CAAW,SAAX,EAAsB,YAAM;AAC1B,WAAO,UAACsT,KAAD,EAAW;AAChB,UAAGA,SAAS,IAAZ,EAAiB;AAAE,eAAO,EAAP;AAAY;AAC/B,aAAOpP,OAAOoP,QAAQ,IAAf,EAAqBG,MAArB,CAA4B,YAA5B,CAAP;AACD,KAHD;AAID,GALD;;AAOApF,MAAIrO,MAAJ,CAAW,SAAX,EAAsB,YAAM;AAC1B,WAAO,UAACsT,KAAD,EAAW;AAChB,UAAGA,SAAS,IAAZ,EAAiB;AAAE,eAAO,EAAP;AAAY;AAC/B,aAAOpP,OAAOoP,QAAQ,IAAf,EAAqBG,MAArB,CAA4B,UAA5B,CAAP;AACD,KAHD;AAID,GALD;AAMH,CAfD;;;;;;ACJAxf,OAAOC,OAAP,GAAiB,UAACma,GAAD,EAAS;;AAExBA,MAAImF,OAAJ,CAAY,OAAZ,EAAqB,YAAW;AAC5B,WAAO;;AAEL5S,kBAAY,SAAS8S,WAAT,CAAsBC,EAAtB,EAA0BC,MAA1B,EAAkCzS,MAAlC,EAA0CoB,SAA1C,EAAqDI,SAArD,EAAgEkR,SAAhE,EAA2E;AACrF,YAAIC,UAAU,EAAd;AACA,aAAK,IAAItS,IAAI,CAAR,EAAWC,MAAMN,OAAOxD,MAA7B,EAAqC6D,IAAIC,GAAzC,EAA8CD,GAA9C,EAAmD;AACjDsS,kBAAQpd,IAAR,CAAa8K,IAAIoS,MAAjB;AACD;AACDpe,UAAEme,EAAF,EAAMI,UAAN,CAAiB;AACfC,iBAAO;AACL3Z,kBAAM,MADD;AAEL4Z,sBAAU,GAFL;AAGLC,oBAAQ;AACNC,oBAAM,gBAAY;AAChBN,0BAAU,KAAKtQ,MAAf;AACD;AAHK;AAHH,WADQ;AAUf/O,iBAAO;AACL4f,kBAAM;AADD,WAVQ;AAafC,oBAAU;AACRD,kBAAMlJ,SAASoJ,YAAT,KAA0Bna,SAA1B,GACJ,4CADI,GAEJ;AAHM,WAbK;AAkBfoa,iBAAO;AACL;AACAC,sBAAU,CAFL,EAEQ;AACbC,oBAAQ;AACNC,yBAAW,qBAAW;AACpB,uBAAO,KAAKpa,KAAL,GAAasZ,MAApB;AACD;AAHK;AAHH,WAlBQ;AA2Bfe,iBAAO;AACL;AACAC,+BAAmB,CAFd;AAGLpgB,mBAAO;AACL4f,oBAAM;AADD,aAHF;AAMLxR,mBAAO,CANF;AAOL1H,iBAAK;AAPA,WA3BQ;AAoCf2Z,kBAAQ,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,CApCO;AAqCfC,kBAAQ;AACNC,qBAAS;AADH,WArCO;AAwCfC,mBAAS;AACPC,oBAAQ,IADD;AAEPC,wBAAY,IAFL;AAGPR,uBAAWS,eAAevB,MAAf;AAHJ,WAxCM;AA6CfwB,uBAAa;AACXC,kBAAM;AACJC,yBAAW;AACTC,gCAAgB,EAAEC,IAAI,CAAN,EAASC,IAAI,CAAb,EAAgBC,IAAI,CAApB,EAAuBC,IAAI,CAA3B,EADP;AAETC,uBAAO,CACL,CAAC,CAAD,EAAIC,WAAWC,UAAX,GAAwBjB,MAAxB,CAA+B,CAA/B,CAAJ,CADK,EAEL,CAAC,CAAD,EAAIgB,WAAWE,KAAX,CAAiBF,WAAWC,UAAX,GAAwBjB,MAAxB,CAA+B,CAA/B,CAAjB,EAAoDmB,UAApD,CAA+D,CAA/D,EAAkE3W,GAAlE,CAAsE,MAAtE,CAAJ,CAFK;AAFE,eADP;AAQJ4W,sBAAQ;AACNC,wBAAQ;AADF,eARJ;AAWJC,yBAAW,CAXP;AAYJC,sBAAQ;AACNC,uBAAO;AACLF,6BAAW;AADN;AADD,eAZJ;AAiBJG,yBAAW;AAjBP;AADK,WA7CE;;AAmEf/S,kBAAQ,CAAC;AACPlJ,kBAAM,MADC;AAEP+O,kBAAM,aAFC;AAGPhP,kBAAMuI;AAHC,WAAD,EAIN;AACAtI,kBAAM,MADN;AAEA+O,kBAAM,cAFN;AAGAhP,kBAAM+G;AAHN,WAJM,EAQN;AACA9G,kBAAM,MADN;AAEA+O,kBAAM,aAFN;AAGAhP,kBAAMmI;AAHN,WARM;AAnEO,SAAjB;AAkFD,OAzFI;;AA2FLiB,uBAAiB,SAASA,eAAT,CAA0BmQ,EAA1B,EAA8BC,MAA9B,EAAsC7Q,YAAtC,EAAoD;AACnEvN,UAAEme,EAAF,EAAMI,UAAN,CAAiB;AACfC,iBAAO;AACL3Z,kBAAM,MADD;AAEL4Z,sBAAU;AAFL,WADQ;AAKfzf,iBAAO;AACL4f,kBAAM;AADD,WALQ;AAQfC,oBAAU;AACRD,kBAAMlJ,SAASoJ,YAAT,KAA0Bna,SAA1B,GACJ,4CADI,GAEJ;AAHM,WARK;AAafoa,iBAAO;AACLC,sBAAU,EADL,EACS;AACdC,oBAAQ;AACNC,yBAAW,qBAAW;AACpB,uBAAO,KAAKpa,KAAL,GAAasZ,MAApB;AACD;AAHK;AAFH,WAbQ;AAqBfe,iBAAO;AACLngB,mBAAO;AACL4f,oBAAM;AADD,aADF;AAILxR,mBAAO,CAJF;AAKL1H,iBAAK;AALA,WArBQ;AA4Bf4Z,kBAAQ;AACNC,qBAAS;AADH,WA5BO;AA+BfC,mBAAS;AACPC,oBAAQ,IADD;AAEPC,wBAAY,IAFL;AAGPR,uBAAWS,eAAevB,MAAf;AAHJ,WA/BM;AAoCfwB,uBAAa;AACXC,kBAAM;AACJC,yBAAW;AACTC,gCAAgB,EAAEC,IAAI,CAAN,EAASC,IAAI,CAAb,EAAgBC,IAAI,CAApB,EAAuBC,IAAI,CAA3B,EADP;AAETC,uBAAO,CACL,CAAC,CAAD,EAAIC,WAAWC,UAAX,GAAwBjB,MAAxB,CAA+B,CAA/B,CAAJ,CADK,EAEL,CAAC,CAAD,EAAIgB,WAAWE,KAAX,CAAiBF,WAAWC,UAAX,GAAwBjB,MAAxB,CAA+B,CAA/B,CAAjB,EAAoDmB,UAApD,CAA+D,CAA/D,EAAkE3W,GAAlE,CAAsE,MAAtE,CAAJ,CAFK;AAFE,eADP;AAQJ4W,sBAAQ;AACNC,wBAAQ;AADF,eARJ;AAWJC,yBAAW,CAXP;AAYJC,sBAAQ;AACNC,uBAAO;AACLF,6BAAW;AADN;AADD,eAZJ;AAiBJG,yBAAW;AAjBP;AADK,WApCE;;AA0Df/S,kBAAQ,CACN;AACE6F,kBAAM,gBADR;AAEEhP,kBAAM2I;AAFR,WADM;AA1DO,SAAjB;AAiED,OA7JI;;AA+JLO,kBAAY,SAASA,UAAT,CAAqBqQ,EAArB,EAAyBC,MAAzB,EAAiC2C,iBAAjC,EAAoDlV,oBAApD,EAA0EF,MAA1E,EAAkFoB,SAAlF,EAA6FI,SAA7F,EAAwG;AAClH,YAAI6T,WAAW,EAAf;AACAnV,6BAAqB0P,OAArB,CAA6B,UAAU0F,GAAV,EAAe;AAC1CD,mBAAS9f,IAAT,CAAc+f,OAAO,CAAP,GAAW,CAAX,GAAeA,GAA7B;AACD,SAFD;AAGAjhB,UAAEme,EAAF,EAAMI,UAAN,CAAiB;AACfC,iBAAO;AACL;AACAC,sBAAU;AAFL,WADQ;AAKfzf,iBAAO;AACL4f,kBAAM;AADD,WALQ;AAQfC,oBAAU;AACRD,kBAAMlJ,SAASoJ,YAAT,KAA0Bna,SAA1B,GACJ,4CADI,GAEJ;AAHM,WARK;AAafoa,iBAAO;AACLC,sBAAU,EADL,EACS;AACdC,oBAAQ;AACNC,yBAAW,qBAAW;AACpB,uBAAO,KAAKpa,KAAL,GAAasZ,MAApB;AACD;AAHK;AAFH,WAbQ;AAqBfe,iBAAO;AACL;AACAC,+BAAmB,CAFd;AAGLpgB,mBAAO;AACL4f,oBAAM;AADD;AAHF,WArBQ;AA4BfU,kBAAQ;AACNC,qBAAS;AADH,WA5BO;AA+BfC,mBAAS;AACPC,oBAAQ,IADD;AAEPC,wBAAY,IAFL;AAGPR,uBAAWS,eAAevB,MAAf;AAHJ,WA/BM;AAoCfwB,uBAAa;AACXC,kBAAM;AACJC,yBAAW;AACTC,gCAAgB,EAAEC,IAAI,CAAN,EAASC,IAAI,CAAb,EAAgBC,IAAI,CAApB,EAAuBC,IAAI,CAA3B,EADP;AAETC,uBAAO,CACL,CAAC,CAAD,EAAIC,WAAWC,UAAX,GAAwBjB,MAAxB,CAA+B,CAA/B,CAAJ,CADK,EAEL,CAAC,CAAD,EAAIgB,WAAWE,KAAX,CAAiBF,WAAWC,UAAX,GAAwBjB,MAAxB,CAA+B,CAA/B,CAAjB,EAAoDmB,UAApD,CAA+D,CAA/D,EAAkE3W,GAAlE,CAAsE,MAAtE,CAAJ,CAFK;AAFE,eADP;AAQJ4W,sBAAQ;AACNC,wBAAQ;AADF,eARJ;AAWJC,yBAAW,CAXP;AAYJC,sBAAQ;AACNC,uBAAO;AACLF,6BAAW;AADN;AADD,eAZJ;AAiBJG,yBAAW;AAjBP;AADK,WApCE;;AA0Df/S,kBAAQ,CACN;AACE6F,kBAAM,mBADR;AAEEhP,kBAAMmc;AAFR,WADM,EAIJ;AACAnN,kBAAM,uBADN;AAEAhP,kBAAMoc;AAFN,WAJI,EAQL;AACCpN,kBAAM,mBADP;AAEChP,kBAAMuI;AAFP,WARK,EAYL;AACCyG,kBAAM,iBADP;AAEChP,kBAAM+G;AAFP,WAZK,EAgBL;AACCiI,kBAAM,kBADP;AAEChP,kBAAMmI;AAFP,WAhBK;AA1DO,SAAjB;AAgFD;AApPI,KAAP;AAsPD,GAvPH;AAwPD,CA1PD;;AA4PA,SAAS4S,cAAT,CAAwBvB,MAAxB,EAAgC;AAC9B,SAAO,YAAW;AAChB,QAAI8C,OAAO,oCAAoC,KAAKC,CAAL,GAAS/C,MAA7C,IAAuD,cAAlE;AACA,SAAK,IAAIpS,IAAI,CAAR,EAAWC,MAAM,KAAKmV,MAAL,CAAYjZ,MAAlC,EAA0C6D,IAAIC,GAA9C,EAAmDD,GAAnD,EAAwD;AACtD,UAAIqV,QAAQ,KAAKD,MAAL,CAAYpV,CAAZ,CAAZ;AACA,UAAI+B,SAASsT,MAAMtT,MAAnB;AACAmT,cAAQ,wBAAwBnT,OAAOuT,KAA/B,GAAuC,iBAAvC,GAA2DvT,OAAO6F,IAAlE,GAAyE,OAAzE,GAAmFyN,MAAME,CAAzF,GAA6F,WAArG;AACD;AACD,WAAOL,IAAP;AACD,GARD;AASD;;;;;;ACtQDziB,OAAOC,OAAP,GAAiB,UAACma,GAAD,EAAS;;AAExBA,MAAImF,OAAJ,CAAY,UAAZ,EAAwB,UAAS/e,KAAT,EAAgBC,MAAhB,EAAwByD,QAAxB,EAAkC9D,OAAlC,EAA2C2iB,MAA3C,EAAmDriB,MAAnD,EAA2D;;AAEjF,WAAO,UAACR,MAAD,EAAY;;AAEjBA,aAAO8iB,WAAP,GAAqB,UAASC,IAAT,EAAeC,QAAf,EAAyB;AAC5ChjB,eAAOijB,CAAP,GAAWF,IAAX;AACA/iB,eAAOkjB,OAAP,GAAiBF,YAAYA,SAAS,CAAT,CAA7B;AACA,YAAID,IAAJ,EAAU;AACR7iB,kBAAQuF,KAAR,CAAc,gCAAd;AACAsd,eAAKI,MAAL,GAAcN,OAAOM,MAAP,CAAc;AAC1BjK,iBAAK1Y,OAAO4iB,YAAP,EADqB;AAE1Bnd,kBAAM,EAAEod,YAAYN,IAAd;AAFoB,WAAd,CAAd;;AAKAA,eAAKI,MAAL,CAAY5c,IAAZ,CAAiB,UAAU+c,QAAV,EAAoB;AACnCtf,qBAAS,YAAY;AACnB9D,sBAAQuF,KAAR,CAAc,+BAAd;AACAlF,qBAAOO,EAAP,CAAU,oBAAV;AACAiiB,mBAAKQ,MAAL,GAAcD,SAASrd,IAAvB;AACD,aAJD;AAKD,WAND,EAMG,UAAUqd,QAAV,EAAoB;AACrB,gBAAIA,SAAS5H,MAAT,GAAkB,CAAtB,EACE1b,OAAO2b,QAAP,GAAkB2H,SAAS5H,MAAT,GAAkB,IAAlB,GAAyB4H,SAASrd,IAApD;AACH,WATD,EASG,UAAUud,GAAV,EAAe;AAChBT,iBAAKU,QAAL,GAAgB5hB,KAAKkF,GAAL,CAAS,GAAT,EAAclC,SAAS,QACrC2e,IAAIE,MADiC,GACxBF,IAAIpR,KADW,CAAd,CAAhB;AAED,WAZD;AAaD;AACF,OAxBD;AAyBD,KA3BD;AA4BD,GA9BD;AA+BD,CAjCD;;;;;;ACAAtS,OAAOC,OAAP,GAAiB,UAACma,GAAD,EAAS;;AAExBA,MAAImF,OAAJ,CAAY,iBAAZ,EAA+B,UAASrb,QAAT,EAAmBxD,MAAnB,EAA2B;;AAExD,QAAIZ,KAAKC,QAAQ,IAAR,CAAT;;AAEA,WAAO,UAACG,MAAD,EAAY;;AAEjB,UAAIqY,SAAS,EAAb;AACArY,aAAO2jB,cAAP,GAAwB,EAAxB;AACA,UAAIC,UAAUC,SAAd;;AAEA,eAASA,OAAT,GAAmB;AACjB,eAAO7f,SAAS,YAAM;AACpB,cAAIhE,OAAOI,OAAX,EAAoB;AAClB,gBAAI0jB,OAAO9jB,OAAOI,OAAP,CAAec,IAAf,CAAoBa,YAA/B;AACA,gBAAIgiB,OAAO/jB,OAAOI,OAAP,CAAec,IAAf,CAAoBc,aAA/B;AACA,gBAAIgiB,YAAY,CAACF,IAAD,EAAOC,IAAP,EAAathB,IAAb,CAAkB,EAAlB,CAAhB;AACA,gBAAIqhB,QAAQC,IAAR,IAAgBC,aAAa3L,MAAjC,EAAyC;AACvCA,uBAAS2L,SAAT;AACAhkB,qBAAOikB,aAAP,CAAqB5L,MAArB;AACAuL,wBAAUC,SAAV;AACD,aAJD,MAIO;AACLD,wBAAUC,SAAV;AACD;AACF;AACF,SAbM,EAaJ,GAbI,CAAP;AAcD;;AAED7jB,aAAOikB,aAAP,GAAuB;AAAA,eAAMrkB,2BAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBACbY,OAAOqc,GAAP,CAAWgH,OAAX,CAAmB;AAClC3iB,0BAAMlB,OAAOI,OAAP,CAAec;AADa,mBAAnB,CADa;;AAAA;AAC1B+E,sBAD0B;;AAI9BjG,yBAAO2jB,cAAP,GAAwB1d,KAAKuB,MAA7B;;AAJ8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAH,GAK1B0c,KAL0B,CAKpB;AAAA,iBAAM,IAAN;AAAA,SALoB,CAAN;AAAA,OAAvB;AAMD,KA7BD;AA8BD,GAlCD;AAmCD,CArCD;;;;;;ACAApkB,OAAOC,OAAP,GAAiB,UAACma,GAAD,EAAS;;AAExBA,MAAImF,OAAJ,CAAY,SAAZ,EAAuB,UAAS8E,EAAT,EAAajgB,UAAb,EAAyB3D,MAAzB,EAAiC4T,SAAjC,EAA4C;AAC/D,WAAO;;AAELhU,iBAAW,mBAACkG,GAAD;AAAA,eAAS8d,GAAGC,IAAH,CAAQlgB,WAAWmC,GAAX,CAAR,CAAT;AAAA,OAFN;;AAILge,gBAAU,kBAAChe,GAAD,EAAS;AACjB,eAAOie,YAAY7e,KAAZ,CAAkBY,GAAlB,EAAuB,IAAvB,CAAP;AACD,OANI;;AAQLZ,aAAO,eAACY,GAAD,EAAS;AACd,eAAO8d,GAAGC,IAAH,CAAQlgB,WAAWmC,GAAX,CAAR,EAAyBE,IAAzB,CAA8B,UAACge,UAAD;AAAA,iBAAgBD,YAAY7e,KAAZ,CAAkB8e,UAAlB,EAA8B,IAA9B,CAAhB;AAAA,SAA9B,CAAP;AACD,OAVI;;AAYLtiB,oBAAc;AAAA,eAAMZ,EAAE,4BAAF,EAAgCmjB,QAAhC,CAAyC,QAAzC,CAAN;AAAA,OAZT;;AAcLlV,kBAAY,sBAAM;AAChB,YAAImV,QAAQpjB,EAAE,SAAF,CAAZ;AACAojB,cAAMC,IAAN;AACArjB,UAAE,WAAF,EAAesjB,KAAf,CAAqB,UAAC3K,CAAD,EAAO;AAC1B,cAAI4K,OAAOvjB,EAAE2Y,EAAE6K,aAAJ,EAAmBhQ,IAAnB,CAAwB,MAAxB,CAAX;AACA,cAAIwF,QAAQuK,KAAKzP,KAAL,CAAW,CAAX,CAAZ;AACA5U,iBAAOO,EAAP,CAAUuZ,KAAV;AACD,SAJD;;AAMA,YAAIyK,YAAY3Q,UAAU4Q,IAAV,GACbC,OADa,CACL,KADK,EACE,GADF,EAEbA,OAFa,CAEL,IAFK,EAEC,EAFD,CAAhB;;AAIAP,cAAMC,IAAN,CAAW,YAAX,EAAyBI,SAAzB;AACD,OA5BI;;AA8BLpkB,mBAAa,qBAACT,OAAD;AAAA,eAAa8W,SAAS1W,KAAT,GAAiB,aAAaJ,OAA3C;AAAA;AA9BR,KAAP;AAgCD,GAjCH;AAkCD,CApCD;;;;;;;;ACAA,IAAML,KAAKC,QAAQ,IAAR,CAAX;AACA,IAAM+V,IAAI/V,QAAQ,YAAR,CAAV;AACA,IAAMqB,OAAOrB,QAAQ,kBAAR,CAAb;;AAEAC,OAAOC,OAAP,GAAiB,UAAC2Y,OAAD,EAAa;;AAE5BA,UAAQ5Y,MAAR,CAAe,yBAAf,EAA0C,CAAC,YAAD,CAA1C,EAEGuf,OAFH,CAEW,QAFX,EAEqB,UAAS/e,KAAT,EAAgB6jB,EAAhB,EAAoB;;AAErC,aAASc,YAAT,GAAwB;AACtB,aAAO1c,OAAOC,QAAP,CAAgB0c,QAAhB,GAA2B,IAAlC;AACD;;AAED,aAASC,UAAT,GAAsB;AACpB,aAAO5c,OAAOC,QAAP,CAAgB0c,QAAhB,KAA6B,QAA7B,GAAwC,QAAxC,GAAmD,OAA1D;AACD;;AAED,aAAS1kB,MAAT,CAAgBoC,MAAhB,EAAwB;;AAEtB,eAASwiB,WAAT,CAAqBC,GAArB,EAA0BH,QAA1B,EAAoC;AAClC,eAAO,UAASI,MAAT,EAAiB;AACtB,iBAAOnB,GAAGC,IAAH,CAAQmB,QAAQF,GAAR,EAAaC,MAAb,EAAqBJ,QAArB,CAAR,CAAP;AACD,SAFD;AAGD;;AAED,eAASK,OAAT,CAAiBF,GAAjB,EAAsBC,MAAtB,EAA8BJ,QAA9B,EAAwC;AACtC,eAAOtV,EAAE4V,OAAF,CAAU,UAACjL,OAAD,EAAUkL,MAAV,EAAqB;AACpC,cAAI7M,SAAS;AACXgL,qBAAS1iB,KAAK+Y;AADH,WAAb;AAAA,cAEGyL,SAAS,EAFZ;AAAA,cAEgBC,QAAQ,EAFxB;AAAA,cAE4BC,cAAc,IAF1C;AAGA,cAAI,QAAON,MAAP,yCAAOA,MAAP,MAAiB,QAArB,EAA+B;AAC7BK,oBAAQ/P,EAAEU,IAAF,CAAOgP,MAAP,CAAR;AACAM,0BAAc,EAAd;AACD;AACDD,gBAAM/I,OAAN,CAAc,UAASiJ,IAAT,EAAc;AAC1B,gBAAIC,UAAUT,GAAd;AACAA,kBAAMA,IAAIL,OAAJ,CAAY,IAAIe,MAAJ,CAAW,MAAMF,IAAjB,CAAZ,EAAoCP,OAAOO,IAAP,CAApC,CAAN;AACA,gBAAIC,WAAWT,GAAf,EAAoB;AAClBO,0BAAYC,IAAZ,IAAoBP,OAAOO,IAAP,CAApB;AACD;AACF,WAND;AAOAjN,iBAAO0M,MAAP,GAAgBM,WAAhB;AACAtlB,gBAAM4K,GAAN,CAAU,CAACga,YAAYD,cAAb,IAA+BriB,MAA/B,GAAwCyiB,GAAxC,GAA8CK,MAAxD,EAAgE9M,MAAhE,EACG1E,OADH,CACW,UAASjO,IAAT,EAAeyV,MAAf,EAAuBsK,OAAvB,EAAgCpN,MAAhC,EAAwC;AAC/C2B,oBAAQtU,IAAR;AACD,WAHH,EAIGjF,KAJH,CAIS,UAASiF,IAAT,EAAeyV,MAAf,EAAuBsK,OAAvB,EAAgCpN,MAAhC,EAAwC;AAC7C7X,oBAAQyF,GAAR,CAAYP,IAAZ;AACAwf,mBAAOxf,IAAP;AACD,WAPH;AAQD,SAxBM,CAAP;AAyBD;;AAED,eAASggB,YAAT,CAAsBZ,GAAtB,EAA2B;AACzB,eAAO,UAASpf,IAAT,EAAeqf,MAAf,EAAuB;AAC5B,iBAAOnB,GAAGC,IAAH,CAAQxU,EAAE4V,OAAF,CAAU,UAACjL,OAAD,EAAUkL,MAAV,EAAqB;AAC5C,gBAAI7M,SAAS;AACXgL,uBAAS;AADE,aAAb;AAAA,gBAEG8B,SAAS,EAFZ;AAAA,gBAEgBC,QAAQ,EAFxB;AAAA,gBAE4BC,cAAc,IAF1C;AAGA,gBAAI,QAAON,MAAP,yCAAOA,MAAP,MAAiB,QAArB,EAA+B;AAC7BK,sBAAQ/P,EAAEU,IAAF,CAAOgP,MAAP,CAAR;AACAM,4BAAc,EAAd;AACD;AACDD,kBAAM/I,OAAN,CAAc,UAASiJ,IAAT,EAAc;AAC1B,kBAAIC,UAAUT,GAAd;AACAA,oBAAMA,IAAIL,OAAJ,CAAY,IAAIe,MAAJ,CAAW,MAAMF,IAAjB,CAAZ,EAAoCP,OAAOO,IAAP,CAApC,CAAN;AACA,kBAAIC,WAAWT,GAAf,EAAoB;AAClBO,4BAAYC,IAAZ,IAAoBP,OAAOO,IAAP,CAApB;AACD;AACF,aAND;AAOAjN,mBAAO0M,MAAP,GAAgBM,WAAhB;AACAtlB,kBAAM4lB,IAAN,CAAWjB,iBAAiBriB,MAAjB,GAA0ByiB,GAA1B,GAAgCK,MAA3C,EAAmDzf,IAAnD,EAAyD2S,MAAzD,EACG1E,OADH,CACW,UAASjO,IAAT,EAAeyV,MAAf,EAAuBsK,OAAvB,EAAgCpN,MAAhC,EAAwC;AAC/C2B,sBAAQtU,IAAR;AACD,aAHH,EAIGjF,KAJH,CAIS,UAASiF,IAAT,EAAeyV,MAAf,EAAuBsK,OAAvB,EAAgCpN,MAAhC,EAAwC;AAC7C6M,qBAAOxf,IAAP;AACD,aANH;AAOD,WAvBc,CAAR,CAAP;AAwBD,SAzBD;AA0BD;;AAED,UAAIkgB,QAAQ,EAAZ;;AAEA,eAAS/hB,GAAT,CAAYihB,GAAZ,EAAiB;AACf,YAAIe,OAAOD,MAAMd,GAAN,KAAc,IAAIgB,SAAJ,CAAchB,GAAd,CAAzB;AACAc,cAAMd,GAAN,IAAae,IAAb;AACAA,aAAKE,OAAL,GAAe,UAAStM,CAAT,EAAY;AACzBjZ,kBAAQyF,GAAR,CAAY,OAAZ;AACAzF,kBAAQyF,GAAR,CAAYwT,CAAZ;AACD,SAHD;AAIAoM,aAAKG,OAAL,GAAe,UAASvM,CAAT,EAAY;AACzBjZ,kBAAQyF,GAAR,CAAY,SAAZ;AACAzF,kBAAQyF,GAAR,CAAYwT,CAAZ;AACD,SAHD;AAIA,YAAIwM,SAAS,KAAb;AAAA,YAAoBC,uBAApB;AACAL,aAAKM,MAAL,GAAc,YAAW;AACvBF,mBAAS,IAAT;AACAC,4BAAkBA,gBAAlB;AACD,SAHD;AAIA,YAAIE,iBAAJ;AAAA,YAAcC,oBAAd;AACAR,aAAKS,SAAL,GAAiB,UAAS7M,CAAT,EAAY;AAC3B,cAAIxW,MAAM0F,KAAKC,KAAL,CAAW6Q,EAAE/T,IAAb,CAAV;AACA,cAAIzC,IAAI0C,IAAJ,IAAY,KAAhB,EAAuB;AACrB,iBAAK,IAAImH,IAAI,CAAR,EAAWC,MAAM9J,IAAI2C,KAAJ,CAAUqD,MAAhC,EAAwC6D,IAAIC,GAA5C,EAAiDD,GAAjD,EAAsD;AACpD,kBAAI7G,MAAMhD,IAAI2C,KAAJ,CAAUkH,CAAV,CAAV;AACA;AACD;AACF;AACD,cAAIsZ,aAAaC,gBAAgB5gB,SAAhB,IAA8BxC,IAAI0C,IAAJ,KAAa0gB,WAAxD,CAAJ,EAA2E;AACzED,qBAASnjB,GAAT;AACD;AACF,SAXD;AAYA,eAAO;AACLuC,cAAI,YAASG,IAAT,EAAekT,QAAf,EAAyB;AAC3BwN,0BAAc1gB,IAAd;AACAygB,uBAAWvN,QAAX;AACD,WAJI;AAKLjC,sBAAY;AAAA,mBAAMvX,2BAAG;AAAA;AAAA;AAAA;AAAA;AAAA,2BACf4mB,MADe;AAAA;AAAA;AAAA;;AAAA,uDACA,IADA;;AAAA;AAAA;AAAA,6BAGX5W,EAAE4V,OAAF,CAAU,UAACjL,OAAD,EAAa;AAC3BkM,yCAAiBlM,OAAjB;AACD,uBAFK,CAHW;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAH,EAAN;AAAA,WALP;AAaL9D,gBAAM,cAACpQ,GAAD;AAAA,mBAAS+f,KAAK3P,IAAL,CAAUpQ,GAAV,CAAT;AAAA;AAbD,SAAP;AAeD;;AAED,aAAO;AACLkO,sBAAc;AAAA,iBAAM0Q,iBAAiBriB,MAAjB,GAA0B,6BAAhC;AAAA,SADT;AAELwgB,sBAAc;AAAA,iBAAM6B,iBAAiBriB,MAAjB,GAA0B,6BAAhC;AAAA,SAFT;AAGLoR,iCAAyBoR,YAAY,0BAAZ,CAHpB;AAILhhB,YAAI;AAAA,iBAAMA,IAAG+gB,eAAeviB,MAAf,GAAwB,YAA3B,CAAN;AAAA,SAJC;AAKLmQ,iBAAS;AAAA,iBAAM3O,IAAG+gB,eAAeviB,MAAf,GAAwB,kBAA3B,CAAN;AAAA,SALJ;AAMLkkB,gBAAQ;AAAA,iBAAM1iB,IAAG+gB,eAAeviB,MAAf,GAAwB,iBAA3B,CAAN;AAAA,SANH;AAOLnC,iBAAS2kB,YAAY,iBAAZ,CAPJ;AAQLlT,oBAAYkT,YAAY,qBAAZ,CARP;AASL9N,oBAAY,oBAACyP,OAAD;AAAA,iBAAa3B,YAAY,yBAAyB2B,OAArC,GAAb;AAAA,SATP;AAULzjB,oBAAY;AACVwJ,kBAAQ,gBAACka,IAAD;AAAA,mBAAU5B,YAAY,+BAA+B4B,KAAKja,KAApC,GAA4C,GAA5C,GAAkDia,KAAKrd,IAAnE,GAAV;AAAA,WADE;AAEVpG,qBAAW0iB,aAAa,wBAAb;AAFD,SAVP;AAcLrjB,gBAAQ;AACNE,gBAAM;AACJV,mBAAOgjB,YAAY,2BAAZ,CADH;AAEJliB,kBAAMkiB,YAAY,0BAAZ,CAFF;AAGJriB,sBAAUqiB,YAAY,+BAAZ,CAHN;AAIJpiB,yBAAaoiB,YAAY,kCAAZ;AAJT,WADA;AAONzhB,oBAAU;AACRC,sBAAUwhB,YAAY,mCAAZ,CADF;AAERthB,qBAASshB,YAAY,kCAAZ;AAFD,WAPJ;AAWNviB,oBAAUojB,aAAa,0BAAb,CAXJ;AAYNnS,mBAASmS,aAAa,yBAAb,CAZH;AAaNvQ,mBAASuQ,aAAa,yBAAb,CAbH;AAcNrR,mBAASqR,aAAa,yBAAb,CAdH;AAeN1gB,oBAAU0gB,aAAa,0BAAb,CAfJ;AAgBNvgB,qBAAWugB,aAAa,2BAAb,CAhBL;AAiBN9iB,uBAAaiiB,YAAY,6BAAZ,CAjBP;AAkBNze,2BAAiBye,YAAY,kCAAZ,CAlBX;AAmBNrhB,qBAAWqhB,YAAY,2BAAZ,CAnBL;AAoBN9e,gCAAsB8e,YAAY,mCAAZ;AApBhB,SAdH;AAoCLvI,aAAK;AACHgH,mBAASoC,aAAa,qBAAb;AADN,SApCA;AAuCLnW,iBAAS;AACPoD,sBAAYkS,YAAY,4BAAZ,CADL;AAEP5J,oBAAU4J,YAAY,sBAAZ,CAFH;AAGP5V,iBAAO4V,YAAY,uBAAZ;AAHA,SAvCJ;AA4CLxY,kBAAU;AACRC,sBAAYuY,YAAY,6BAAZ;AADJ;AA5CL,OAAP;AAgDD;AACD,QAAIxiB,SAAS2F,OAAOC,QAAP,CAAgBye,QAA7B;AACA,QAAIriB,OAAO2D,OAAOC,QAAP,CAAgB5D,IAA3B;AACA,QAAIsiB,UAAU1mB,OAAO,CAACoC,MAAD,EAASgC,IAAT,EAAenC,IAAf,CAAoB,GAApB,CAAP,CAAd;AACAykB,YAAQC,QAAR,GAAmB3mB,MAAnB;AACA,WAAO0mB,OAAP;AACD,GAnLH;AAoLD,CAtLD","file":"public/app.js","sourcesContent":["\"use strict\";\n\nconst co = require('co');\n\nmodule.exports = ($scope, version, UIUtils) => {\n\n  $scope.version = version;\n\n  return co(function*() {\n    $scope.$parent.title = yield UIUtils.translate('help.about_duniter.title');\n  });\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = ($scope, $http, $state, Webmin, summary, UIUtils) => {\n\n  UIUtils.changeTitle(summary.version);\n\n  $scope.message = 'index.message.loading';\n  co(function *() {\n    let connected = false;\n    try {\n      let summary = yield Webmin.summary();\n      if (summary.current) {\n        return $state.go('main.home.overview');\n      }\n      return $state.go('configure.choose');\n    }\n    catch (e) {\n      console.error(connected, e);\n      if (!connected) {\n        return $state.go('error', { err: 'err.connection'});\n      }\n      return $state.go('error', { err: e });\n    }\n  });\n};\n","\"use strict\";\n\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = ($scope, $state, PubkeyGenerator) => {\n\n  setTimeout(() => {\n    $('select').material_select();\n  }, 500);\n\n  $scope.accept = () => {\n    let modal = $('#modal1');\n    if (modal.css('display') == 'none') {\n      $('#modal1').openModal();\n    }\n  };\n\n  PubkeyGenerator($scope);\n\n  if (conf.dev_autoconf) {\n    $scope.$parent.conf.idty_uid = 'dev_' + ~~(Math.random() * 2147483647);\n    $scope.$parent.conf.idty_entropy = ~~(Math.random() * 2147483647) + \"\";\n    $scope.$parent.conf.idty_password = ~~(Math.random() * 2147483647) + \"\";\n    $state.go('configure.create.network');\n  }\n};\n","\"use strict\";\n\nmodule.exports = ($scope, UIUtils) => {\n\n  UIUtils.enableInputs();\n};\n","\"use strict\";\n\nvar co = require('co');\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = ($scope, $http, $state, Webmin) => {\n\n  $scope.generated = '';\n  $scope.started = false;\n  $scope.message = 'configuration.create_root.need_a_try';\n\n  $scope.start = () => co(function *() {\n    try {\n      let hosts = [];\n      if ($scope.$parent.conf.remote_ipv4) {\n        hosts.push([$scope.$parent.conf.remote_ipv4, $scope.$parent.conf.rport].join(':'));\n      }\n      if ($scope.$parent.conf.remote_ipv6) {\n        hosts.push([\"[\" + $scope.$parent.conf.remote_ipv6 + \"]\", $scope.$parent.conf.rport].join(':'));\n      }\n      $scope.host_listening = hosts.join('\\n');\n      $scope.started = true;\n      yield Webmin.server.sendConf({\n        conf: $scope.$parent.conf\n      });\n      yield Webmin.server.http.start();\n      yield Webmin.server.http.openUPnP();\n      yield Webmin.server.http.regularUPnP();\n      yield $scope.try();\n    } catch (e) {\n      $scope.message = e.message;\n    }\n  });\n\n  $scope.stop = () => co(function *() {\n    yield Webmin.server.http.stop();\n    $scope.started = false;\n  });\n\n  $scope.try = () => co(function *() {\n    try {\n      $scope.block = yield Webmin.server.previewNext();\n      $scope.generated = $scope.block.raw;\n      $scope.message = '';\n    } catch (e) {\n      $scope.message = e.message;\n    }\n  });\n\n  $scope.accept = () => co(function *() {\n    let res = yield Webmin.blockchain.block_add({\n      block: $scope.generated\n    });\n    if (res.number == 0) {\n      // We successfully started the blockchain\n      yield $scope.startServices();\n    }\n  });\n\n  $scope.startServices = () => co(function *() {\n    yield Webmin.server.services.startAll();\n    $state.go('index');\n  });\n\n  $scope.cancelAndReset = () => co(function *() {\n    yield Webmin.server.http.stop();\n    yield Webmin.server.services.stopAll();\n    yield Webmin.server.resetData();\n    $state.go('index');\n  });\n\n  return co(function *() {\n    try {\n      yield $scope.start();\n      yield $scope.try();\n      $scope.started = true;\n    } catch (e) {\n      $scope.started = false;\n    }\n  });\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = ($scope, $http, $state, $timeout, $stateParams, $translate, UIUtils, Webmin) => {\n\n  let syncWS = Webmin.ws();\n\n  UIUtils.enableInputs();\n  $scope.sync_mode = 'simplified';\n  $scope.simplified_host = '';\n  $scope.synchronizing = false;\n  $scope.sync_failed = false;\n  $scope.host = $stateParams.host || localStorage.getItem('sync_host') || '';\n  $scope.port = parseInt($stateParams.port) || parseInt(localStorage.getItem('sync_port')) || 8999;\n  $scope.to = parseInt($stateParams.to);\n  $scope.wrong_host = false;\n  $scope.remote_current = null;\n\n  $scope.checkNode = () => co(function *() {\n    $scope.checked_host = '';\n    $scope.sync_error = '';\n    $scope.sync_message = '';\n    if ($scope.sync_mode == 'simplified') {\n      $scope.host = $scope.simplified_host.split(':')[0];\n      $scope.port = parseInt($scope.simplified_host.split(':')[1]);\n    }\n    $scope.checking = true;\n    try {\n      const current = yield Webmin.server.testSync({\n        host: $scope.host,\n        port: $scope.port\n      });\n      const targetHost = [$scope.host, $scope.port].join(':');\n      if (current) {\n        $scope.remote_current = current;\n        $scope.checked_host = targetHost;\n      }\n      UIUtils.toast('sync.ready.node.part1');\n      $timeout(() => {\n        if (!$scope.synchronizing) {\n          UIUtils.toast('sync.ready.node.part2');\n        }\n      }, 6000);\n    } catch (e) {\n      $scope.sync_error = 'sync.error.unreachable.try.another.node';\n    }\n    $scope.checking = false;\n    return $scope.checked_host ? true : false;\n  });\n\n  $scope.startSync = () => {\n    $scope.down_percent = 0;\n    $scope.apply_percent = 0;\n    $scope.sync_failed = false;\n    $scope.synchronizing = true;\n    return co(function *() {\n      $scope.sync_message = (yield $translate('sync.started.node')) + ' ' + $scope.checked_host;\n      let sp = $scope.checked_host.split(':');\n      let translatedErr = yield $translate('err.sync.interrupted');\n      syncWS.on(undefined, (data) => {\n        if (data.type == 'sync') {\n          $scope.down_percent = 100;\n          $scope.apply_percent = 100;\n          $scope.sync_failed = data.value;\n          let errorMessage = data.msg && (data.msg.message || data.msg);\n          errorMessage = translatedErr + ' « ' + errorMessage + ' »';\n          Webmin.server.republishNewSelfPeer()\n            .then(() => console.log('Peer republished'));\n          if (data.value === true) {\n            $state.go('index');\n          } else {\n            $state.go('error', { err: (errorMessage) });\n          }\n        } else {\n          let changed = true;\n          if (data.type == 'download' && $scope.down_percent != data.value) {\n            $scope.down_percent = data.value;\n            changed = true;\n          }\n          if (data.type == 'applied' && $scope.apply_percent != data.value) {\n            $scope.apply_percent = data.value;\n            changed = true;\n          }\n          if (changed) {\n            $scope.$apply();\n          }\n        }\n      });\n      yield Webmin.server.autoConfNetwork();\n      localStorage.setItem(\"sync_host\", sp[0]);\n      localStorage.setItem(\"sync_port\", sp[1]);\n      Webmin.server.startSync({\n        host: sp[0],\n        port: sp[1],\n        to: $scope.to,\n        chunkLen: Math.max(500, Math.min(25, $scope.remote_current ? $scope.remote_current.number / 100 : 0))\n      });\n    });\n  };\n\n  // Autostart\n  if ($scope.host && $scope.port && $stateParams.sync) {\n    return co(function *() {\n      let nodeOK = yield $scope.checkNode();\n      if (nodeOK) {\n        return $scope.startSync();\n      }\n    });\n  }\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = ($scope, $state, $http, $timeout, $interval, Webmin, summary, UIUtils, Base58) => {\n\n  const local_host = summary.host.split(':')[0]; // We suppose IPv4 configuration\n  const local_port = summary.host.split(':')[1];\n  const local_sign_pk = Base58.decode(summary.pubkey);\n  const local_sign_sk = Base58.decode(summary.seckey);\n\n  const DEFAULT_CESIUM_SETTINGS = {\n    \"useRelative\": true,\n    \"timeWarningExpire\": 2592000,\n    \"useLocalStorage\": true,\n    \"rememberMe\": true,\n    \"plugins\": {},\n    \"node\": {\n      \"host\": local_host,\n      \"port\": local_port\n    },\n    \"showUDHistory\": true\n  };\n\n  $scope.notifications = {\n    help: []\n  };\n\n  Waves.displayEffect();\n\n  var isMobile = require('js/lib/mobileDetector');\n  if (isMobile()) {\n    $(\".button-collapse\").sideNav({\n      menuWidth: 280\n    });\n  }\n\n  UIUtils.changeTitle(summary.version);\n\n  $scope.openWallet = () => {\n\n    let walletHeight = parseInt(localStorage.getItem('wallet_height')) || 1000;\n    let walletWidth = parseInt(localStorage.getItem('wallet_width')) || 1400;\n\n    openNewTab (window.location.origin + '/cesium/index.html', {\n      position: 'center',\n      height: walletHeight,\n      width: walletWidth,\n      show: false\n    }, function(win) {\n      let settingsStr = win.window.localStorage.getItem('CESIUM_SETTINGS');\n      let dataStr = win.window.localStorage.getItem('CESIUM_DATA');\n      let settings = (settingsStr && JSON.parse(settingsStr));\n      let data = (dataStr && JSON.parse(dataStr));\n      let keyPairOK = data && data.keypair && data.keypair.signPk && data.keypair.signSk && true;\n      if (keyPairOK) {\n        data.keypair.signPk.length = local_sign_pk.length;\n        data.keypair.signSk.length = local_sign_sk.length;\n        keyPairOK = Base58.encode(Array.from(data.keypair.signPk)) == summary.pubkey\n          && Base58.encode(Array.from(data.keypair.signSk)) == summary.seckey\n          && data.pubkey == summary.pubkey;\n      }\n      if (!data\n        || !keyPairOK\n        || settings.node.host != local_host\n        || settings.node.port != local_port) {\n        settings = settings || DEFAULT_CESIUM_SETTINGS;\n        data = data || {};\n        console.debug('Configuring Cesium...');\n        settings.node = {\n          \"host\": local_host,\n          \"port\": local_port\n        };\n        settings.plugins = {};\n        settings.rememberMe = true;\n        data.pubkey = summary.pubkey;\n        data.keypair = {\n          signPk: local_sign_pk,\n          signSk: local_sign_sk\n        };\n        win.window.localStorage.setItem('CESIUM_SETTINGS', JSON.stringify(settings));\n        win.window.localStorage.setItem('CESIUM_DATA', JSON.stringify(data));\n        win.on('closed', () => {\n          // Reopen the wallet\n          $timeout(() => $scope.openWallet(), 1);\n        });\n        win.close();\n      } else {\n        // Cesium is correctly configured for the network part\n        win.show();\n        win.on('closed', function() {\n          localStorage.setItem('wallet_height', win.window.innerHeight - 8); // Seems to always have 8 pixels more\n          localStorage.setItem('wallet_width', win.window.innerWidth - 16); // Seems to always have 16 pixels more\n          mainWindow.focus();\n        });\n      }\n    });\n  };\n\n  let aboutWin;\n\n  $scope.showAbout = () => {\n    if (aboutWin) {\n      aboutWin.focus();\n    } else {\n      openWindow(window.location.origin + '/#/about', {\n        position: 'center',\n        height: 380,\n        width: 510\n      }, function(subwin) {\n        subwin.window.gui = window.gui;\n        subwin.on('closed', () => {\n          aboutWin = null;\n          mainWindow.focus();\n        });\n        aboutWin = subwin;\n      });\n    }\n  };\n\n  $scope.startServer = () => {\n    $scope.server_stopped = false;\n    return co(function *() {\n      yield Webmin.server.http.start();\n      yield Webmin.server.services.startAll();\n      yield Webmin.server.http.regularUPnP();\n      $scope.server_started = true;\n    });\n  };\n\n  $scope.stopServer = () => {\n    $scope.server_started = false;\n    return co(function *() {\n      yield Webmin.server.http.stop();\n      yield Webmin.server.services.stopAll();\n      $scope.server_stopped = true;\n    });\n  };\n\n  $scope.restartServer = () => {\n    return co(function *() {\n      yield $scope.stopServer();\n      yield $scope.startServer();\n    });\n  };\n\n  function checkUpdates() {\n    const LATEST_RELEASE_URL = 'https://api.github.com/repos/duniter/duniter/releases/latest';\n    co(function*() {\n      try {\n        const latest = yield $http.get(LATEST_RELEASE_URL);\n        const local_string_version = 'v' + summary.version;\n        const m = local_string_version.match(/^v([\\d.]+)([ab]?\\d*)/);\n        const localVersion = (m && m[1]) || \"\";\n        const localSuffix = m && m[2];\n        const isLocalAPreRelease = !!(localSuffix);\n        const remoteVersion = latest.data.tag_name.substr(1);\n        if (localVersion < remoteVersion || (localVersion == remoteVersion && isLocalAPreRelease)) {\n          if ($scope.notifications.help.filter((entry) => entry.message == 'help.new_version_available').length == 0) {\n            $scope.notifications.help.push({\n              icon: 'play_for_work',\n              message: 'help.new_version_available',\n              onclick: () => openExternal('https://github.com/duniter/duniter/releases/latest')\n            });\n          }\n        }\n      } catch (e) {\n        console.error(e);\n      }\n    });\n  }\n\n  $interval(checkUpdates, 1000 * 3600);\n  $timeout(checkUpdates, 1000);\n};\n","\"use strict\";\n\nconst BLOCKS_COUNT = 40;\n\nvar co = require('co');\n\nmodule.exports = ($scope, $state, $timeout, Webmin, UIUtils, Graph) => {\n\n  let data = {};\n\n  $scope.loading = true;\n  $scope.blocksCount = $scope.blocksCount || BLOCKS_COUNT;\n\n  $scope.$watch('withTime', (newValue) => {\n    if (newValue) {\n      timeGraph();\n    }\n  });\n\n  $scope.$watch('withSpeed', (newValue) => {\n    if (newValue) {\n      speedGraph();\n    }\n  });\n\n  $scope.$watch('withDifficulty', (newValue) => {\n    if (newValue) {\n      diffGraph();\n    }\n  });\n\n  $scope.updateGraphs = () => {\n    return co(function *() {\n      let summary = yield Webmin.summary();\n      let parameters = yield Webmin.currency.parameters();\n      let blocks = yield Webmin.blockchain.blocks({\n        count: $scope.blocksCount,\n        from: Math.max(0, summary.current.number - $scope.blocksCount)\n      });\n      let speeds = [], accelerations = [], medianTimeIncrements = [], actualDurations = [];\n      let BY_HOUR = 3600;\n      for (let i = 0, len = blocks.length; i < len; i++) {\n        let block = blocks[i];\n        let acc = 0;\n        let previousPos = Math.max(0, i - parameters.dtDiffEval);\n        for (let j = previousPos; j < i; j++) {\n          acc += (blocks[j+1].medianTime - blocks[j].medianTime);\n        }\n        let availPreviousBlocks = i - 1 - previousPos;\n        let localAvgSpeed = acc / (availPreviousBlocks || 1);\n        let realDuration = !isNaN(localAvgSpeed) && localAvgSpeed != 0 ? localAvgSpeed : parameters.avgGenTime;\n        actualDurations.push(parseFloat((realDuration).toFixed(2)));\n        speeds.push(parseFloat((BY_HOUR/realDuration).toFixed(2)));\n        accelerations.push(block.time - block.medianTime);\n        medianTimeIncrements.push(block.medianTime - (i ? blocks[i-1].medianTime : block.medianTime));\n      }\n      data.summary = summary;\n      data.speeds = speeds;\n      data.accelerations = accelerations;\n      data.medianTimeIncrements = medianTimeIncrements;\n      data.actualDurations = actualDurations;\n      data.minSpeeds = speeds.map(() => parseFloat((BY_HOUR/Math.ceil(parameters.avgGenTime * Math.sqrt(1.066))).toFixed(2)));\n      data.maxSpeeds = speeds.map(() => parseFloat((BY_HOUR/Math.floor(parameters.avgGenTime / Math.sqrt(1.066))).toFixed(2)));\n      data.minDurations = speeds.map(() => parseFloat(((parameters.avgGenTime / 1.066)).toFixed(2)));\n      data.maxDurations = speeds.map(() => parseFloat(((parameters.avgGenTime * 1.066)).toFixed(2)));\n      data.difficulties = blocks.map((b) => b.powMin);\n\n      let graphs = [];\n      if ($scope.withTime) graphs.push(timeGraph);\n      if ($scope.withSpeed) graphs.push(speedGraph);\n      if ($scope.withDifficulty) graphs.push(diffGraph);\n      for (let i = 0, len = graphs.length; i < len; i++) {\n        graphs[i]();\n      }\n      $scope.loading = false;\n    });\n  };\n\n  function timeGraph() {\n    if ($scope.withTime) {\n      Graph.timeGraphs('#timeGraph', Math.max(0, data.summary.current.number - $scope.blocksCount + 1), data.accelerations, data.medianTimeIncrements, data.actualDurations, data.minDurations, data.maxDurations);\n    }\n  }\n\n  function speedGraph() {\n    if ($scope.withSpeed) {\n      Graph.speedGraph('#speedGraph', Math.max(0, data.summary.current.number - $scope.blocksCount), data.speeds, data.minSpeeds, data.maxSpeeds, (series) => {\n        $scope.series = series;\n      });\n    }\n  }\n\n  function diffGraph() {\n    if ($scope.withDifficulty) {\n      Graph.difficultyGraph('#difficultyGraph', Math.max(0, data.summary.current.number - $scope.blocksCount), data.difficulties);\n    }\n  }\n\n  return co(function *() {\n    yield $scope.updateGraphs();\n    $scope.withTime = true;\n    $scope.withDifficulty = true;\n    $scope.$apply();\n  });\n};\n","\"use strict\";\n\nmodule.exports = ($scope, UIUtils) => {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.menu = 'graphs';\n};\n","\"use strict\";\n\nmodule.exports = ($scope, UIUtils) => {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.menu = 'home';\n};\n","\"use strict\";\n\nmodule.exports = ($scope, Webmin, peers) => {\n\n  $scope.peers = peers.peers;\n\n  const co = require('co');\n\n  $scope.update = () => co(function *() {\n    $scope.searching = true;\n    let delayP = Q.delay(500);\n    $scope.peers = (yield Webmin.network.peers()).peers;\n    yield delayP;\n    $scope.searching = false;\n    $scope.$apply();\n  });\n};\n","\"use strict\";\n\nmodule.exports = ($scope, $interval, Webmin, UIUtils, summary, ws) => {\n\n  let co = require('co');\n  let moment = require('moment');\n\n  bindBlockWS(() => {\n    $scope.loadPowData();\n  });\n  let M = summary.current.monetaryMass || 0;\n  // const nbUDperYear = Math.ceil(365.25 * 3600 * 24 / summary.parameters.dt);\n  // const globalC = Math.round(Math.pow(1 + summary.parameters.c, nbUDperYear) * 100) / 100 - 1;\n  let UD = summary.parameters.ud0;\n  if (summary.lastUDBlock) {\n    const N = summary.current.membersCount;\n    UD = parseInt((summary.lastUDBlock.dividend * Math.pow(10, summary.lastUDBlock.unitbase) + Math.pow(summary.parameters.c, 2) * M / N).toFixed(0));\n  }\n  $scope.current = summary.current;\n  $scope.current_currency = summary.current.currency;\n  $scope.current_number = summary.current.number;\n  $scope.current_membersCount = summary.current.membersCount;\n  $scope.current_medianTime = summary.current.medianTime;\n  $scope.current_powMin = summary.current.powMin;\n  $scope.monetaryMass = parseInt(M / UD) || 0;\n  $scope.server_started = true;\n  $scope.server_stopped = false;\n  $scope.phones = [];\n  $scope.abc = 'abcdef';\n  $scope.newIdentities = 2;\n\n  $(\".dropdown-button\").dropdown({ constrainwidth: false });\n\n  $scope.lastNearPoW = '';\n  $scope.totalPoW = '...';\n  $scope.sync_state = 'home.pulling.state.unkown';\n  $scope.network_percent = 0;\n  $scope.peer_percent = 0;\n  $scope.has_pulled = false;\n  $scope.is_pulling = false;\n  $scope.last_pulling = 0;\n  let start_block = 0;\n\n  $interval(() => {\n    if ($scope.last_pulling) {\n      $scope.sync_state = $scope.is_pulling ? 'home.pulling.state.syncing' : 'home.pulling.state.synced';\n      $scope.sync_time = moment($scope.last_pulling).fromNow();\n    }\n  }, 1000);\n\n  $scope.loadPowData = () => co(function*() {\n    let res = yield Webmin.powSummary();\n    $scope.pow_total = res.total;\n    $scope.pow_mirror = res.mirror;\n    $scope.pow_waiting = res.waiting;\n  });\n\n  ws.on(undefined, (data) => {\n    if (data.type === 'started') {\n      $scope.server_started = true;\n      $scope.server_stopped = false;\n      bindBlockWS();\n      UIUtils.toast('general.server.started');\n      $scope.$apply();\n    }\n    if (data.type === 'stopped') {\n      $scope.server_stopped = true;\n      $scope.server_started = false;\n      UIUtils.toast('general.server.stopped');\n      $scope.$apply();\n    }\n    if (data.type === 'pulling') {\n      $scope.is_pulling = true;\n      $scope.has_pulled = true;\n      const event = data.value;\n      if (($scope.last_pulling && event.type === 'start') || (!$scope.last_pulling && event.type !== 'end')) {\n        $scope.last_pulling = moment();\n      }\n      if (event.type === 'peer') {\n        $scope.network_percent = parseInt((event.data.number + 1) / event.data.length * 100);\n        $scope.peer_percent = 100;\n        start_block = 0;\n      }\n      if (event.type === 'applying') {\n        if (!start_block) {\n          start_block = event.data.number;\n        }\n        const total = event.data.last - start_block;\n        const doneCount = event.data.number - start_block;\n        $scope.peer_percent = parseInt(doneCount / total * 100);\n      }\n      if (event.type === 'end') {\n        $scope.is_pulling = false;\n        $scope.network_percent = 0;\n        $scope.peer_percent = 0;\n        start_block = 0;\n      }\n    }\n    if (data.type === 'pow') {\n      const pow = data.value;\n      if (pow.found) {\n        $scope.pow_waiting = true;\n        $scope.lastNearPoW = '#' + pow.hash;\n        $scope.$apply();\n      } else {\n        $scope.pow_waiting = false;\n        $scope.lastNearPoW = '#' + pow.hash;\n        $scope.$apply();\n      }\n    }\n  });\n\n  function bindBlockWS(cb) {\n    Webmin.wsBlock().on(undefined, (block) => {\n      $scope.current_currency = block.currency;\n      $scope.current_number = block.number;\n      $scope.current_membersCount = block.membersCount;\n      $scope.current_medianTime = block.medianTime;\n      $scope.current_powMin = block.powMin;\n      let M = summary.current.monetaryMass || 0;\n      let UD = summary.parameters.ud0;\n      if (summary.lastUDBlock) {\n        const N = summary.current.membersCount;\n        UD = parseInt((summary.lastUDBlock.dividend * Math.pow(10, summary.lastUDBlock.unitbase) + Math.pow(summary.parameters.c, 2) * M / N).toFixed(0));\n      }\n      $scope.monetaryMass = parseInt(M / UD) || 0;\n      $scope.$apply();\n      cb && cb();\n    });\n  }\n  \n  $scope.reconfigure_network = () => co(function *() {\n    $scope.reconfiguring = true;\n    let delay = Q.delay(1000);\n    try {\n      let netinferfaces = yield Webmin.network.interfaces();\n      let conf = {};\n      conf.local_ipv4 = netinferfaces.auto.local.ipv4 || '';\n      conf.local_ipv6 = netinferfaces.auto.local.ipv6 || '';\n      conf.remote_ipv4 = netinferfaces.auto.remote.ipv4 || '';\n      conf.remote_ipv6 = netinferfaces.auto.remote.ipv6 || '';\n      conf.lport = netinferfaces.auto.local.port || 9330;\n      conf.rport = netinferfaces.auto.remote.port || 9330;\n      conf.upnp = netinferfaces.auto.remote.upnp || false;\n      conf.dns = netinferfaces.auto.remote.dns || '';\n      yield Webmin.server.netConf({\n        conf: conf\n      });\n      yield delay;\n      $scope.should_reconfigure = false;\n      UIUtils.toast('general.network.reconf_ok');\n      $scope.$apply();\n    } catch (e) {\n      yield delay;\n      $scope.reconfiguring = false;\n      $scope.$apply();\n    }\n  });\n\n  return co(function *() {\n    yield $scope.startServer();\n    try {\n      yield $scope.loadPowData();\n      const reachable = yield Webmin.isNodePubliclyReachable();\n      if (!reachable || !reachable.success) {\n        $scope.should_reconfigure = true;\n      }\n    } catch (e) {\n      console.log(e);\n    }\n  });\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = ($scope, $http, $state, $location, Webmin, UIUtils) => {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.conf = $scope.$parent.conf || {};\n  $scope.$parent.menu = 'settings';\n\n  $(\".dropdown-button\").dropdown({ constrainwidth: false });\n\n  $scope.fullReset = () => co(function *() {\n    yield Webmin.server.http.stop();\n    yield Webmin.server.services.stopAll();\n    yield Webmin.server.resetData();\n    $state.go('index');\n  });\n};\n","\"use strict\";\n\nmodule.exports = ($scope, Importer, Webmin) => {\n\n  $scope.export_link = Webmin.getExportURL();\n\n  Importer($scope);\n};\n","\"use strict\";\n\nconst co = require('co');\n\nmodule.exports = ($scope, $http, $state, $timeout, UIUtils, summary, Webmin) => {\n\n  $scope.cpuPower = parseInt(summary.conf.cpu * 100);\n\n  $scope.updateCPUpower = () => co(function *() {\n    $scope.savingCPU = true;\n    yield Webmin.server.cpuConf({\n      cpu: parseFloat(($scope.cpuPower / 100).toFixed(2))\n    });\n    UIUtils.toast('settings.cpu.saved');\n    $scope.savingCPU = false;\n  });\n};\n","\"use strict\";\n\nmodule.exports = ($scope, conf, UIUtils) => {\n\n  $scope.$parent.conf = conf;\n\n  UIUtils.enableInputs();\n  $('input').attr('disabled', 'disabled');\n};\n","\"use strict\";\n\nvar co = require('co');\nvar Peer = require('js/lib/entity/peer');\n\nmodule.exports = ($scope, $http, $state, Webmin, peers) => {\n\n  $scope.peers = peers.map((peer) => {\n    let p = new Peer(peer);\n    return {\n      name: [p.getURL(), \"(\" + p.pubkey.slice(0, 6) + \")\"].join(' '),\n      host_port: [p.getHost(), p.getPort()].join('|')\n    }\n  });\n\n  $scope.resetNode = () => {\n    $('#modalReset').openModal();\n  };\n\n  $scope.resetNodeAndSync = () => co(function *() {\n    yield Webmin.server.http.stop();\n    yield Webmin.server.services.stopAll();\n    yield Webmin.server.resetData();\n    let sp = $scope.remote_host.split('|');\n    $state.go('sync', {\n      host: sp[0],\n      port: sp[1],\n      sync: true\n    })\n  });\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = ($scope, $state, Webmin, summary, PubkeyGenerator) => {\n\n  $scope.pubkey = summary.pubkey;\n\n  setTimeout(() => {\n    $('select').material_select();\n  }, 500);\n\n  $scope.accept = () => co(function *() {\n    yield Webmin.server.keyConf({\n      conf: $scope.$parent.conf\n    });\n    $scope.$parent.conf.idty_entropy = '';\n    $scope.$parent.conf.idty_password = '';\n    $state.reload();\n    $scope.restartServer();\n  });\n\n  PubkeyGenerator($scope);\n};\n","\"use strict\";\n\nmodule.exports = ($scope, ws, UIUtils) => {\n\n  UIUtils.enableTabs();\n\n  let co = require('co');\n  let _ = require('underscore');\n\n  // Default values\n  if (!localStorage.getItem('log_error')) localStorage.setItem('log_error', true);\n  if (!localStorage.getItem('log_warn')) localStorage.setItem('log_warn', true);\n  if (!localStorage.getItem('log_info')) localStorage.setItem('log_info', true);\n\n  $scope.logsSize = parseInt(localStorage.getItem('log_size')) || 100;\n  $scope.logs = _.range(0, $scope.logsSize).map(() => \"\");\n  $scope.logsString = \"\";\n  $scope.follow = true;\n  $scope.levels = {\n    error: localStorage.getItem('log_error') == \"true\",\n    warn: localStorage.getItem('log_warn') == \"true\",\n    info: localStorage.getItem('log_info') == \"true\",\n    debug: localStorage.getItem('log_debug') == \"true\",\n    trace: localStorage.getItem('log_trace') == \"true\"\n  };\n\n  _.keys($scope.levels).map((level) => {\n    $scope.$watch('levels.' + level, (newValue) => {\n      localStorage.setItem('log_' + level, newValue);\n      $scope.logs.splice(0, $scope.logs.length);\n      ws.send();\n    });\n  });\n\n  $scope.$watch('logsSize', (newValue) => {\n    localStorage.setItem('log_size', newValue);\n    addLogs({ value: [] }, true);\n  });\n\n  ws.on('log', addLogs);\n\n  function addLogs(res, autoDigest) {\n\n    if (!$scope.pause) {\n      let newlogs = _.filter(res.value, (log) => $scope.levels[log.level]);\n      // Add at max LOGS_FLOW_SIZE new lines\n      newlogs.splice(0, Math.max(0, newlogs.length - $scope.logsSize));\n      // Add just enough space for incoming logs\n      $scope.logs.splice(0, Math.max(0, $scope.logs.length + newlogs.length - $scope.logsSize));\n      for (let i = 0, len = newlogs.length; i < len; i++) {\n        let log = newlogs[i];\n        $scope.logs.push(log);\n      }\n      if (!autoDigest) {\n        $scope.$apply();\n      }\n    }\n\n    if ($scope.follow) {\n      var elem = document.getElementById('logs');\n      if (elem) {\n        elem.scrollTop = elem.scrollHeight;\n      }\n    }\n  }\n\n  return co(function *() {\n    yield ws.whenOpened();\n    ws.send();\n  });\n};\n","\"use strict\";\n\nconst co = require('co');\n\nmodule.exports = ($scope, Webmin) => {\n  \n  $scope.generating = false;\n  $scope.error = '';\n\n  $scope.shareLogs = () => co(function*() {\n    if (!$scope.generating) {\n      try {\n        $scope.error = '';\n        $scope.generating = true;\n        const res = yield Webmin.logsExport(2000);\n        $scope.link = res.link;\n      } catch (e) {\n        $scope.error = (e && e.message) || e || 'Unknown error';\n      }\n      $scope.generating = false;\n    }\n  });\n};\n","\"use strict\";\n\nvar co = require('co');\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = ($scope, $http, $state, Webmin, UIUtils, netinterfaces, firstConf) => {\n\n  let autoconf = netinterfaces.auto;\n\n  $scope.autoconfig = () => {\n    $scope.$parent.conf.local_ipv4 = autoconf.local.ipv4 || '';\n    $scope.$parent.conf.local_ipv6 = autoconf.local.ipv6 || '';\n    $scope.$parent.conf.remote_ipv4 = autoconf.remote.ipv4 || '';\n    $scope.$parent.conf.remote_ipv6 = autoconf.remote.ipv6 || '';\n    $scope.$parent.conf.lport = autoconf.local.port || $scope.$parent.conf.lport;\n    $scope.$parent.conf.rport = autoconf.remote.port || $scope.$parent.conf.rport;\n    $scope.$parent.conf.upnp = autoconf.remote.upnp || $scope.$parent.conf.upnp;\n    $scope.$parent.conf.dns = autoconf.remote.dns || $scope.$parent.conf.dns;\n\n    if (conf.dev_autoconf && firstConf) {\n      $state.go('configure.create.root');\n    }\n  };\n\n  $scope.local_neti = toArrayOfAddresses(netinterfaces.local);\n  $scope.remote_neti = toArrayOfAddresses(netinterfaces.remote);\n\n  $scope.$parent.conf = $scope.$parent.conf || {};\n  $scope.$parent.conf.local_ipv4 = netinterfaces.conf.local.ipv4;\n  $scope.$parent.conf.local_ipv6 = netinterfaces.conf.local.ipv6;\n  $scope.$parent.conf.remote_ipv4 = netinterfaces.conf.remote.ipv4;\n  $scope.$parent.conf.remote_ipv6 = netinterfaces.conf.remote.ipv6;\n  $scope.$parent.conf.lport = netinterfaces.conf.local.port;\n  $scope.$parent.conf.rport = netinterfaces.conf.remote.port;\n  $scope.$parent.conf.upnp = netinterfaces.conf.remote.upnp;\n  $scope.$parent.conf.dns = netinterfaces.conf.remote.dns;\n\n  UIUtils.enableInputs();\n\n  if (firstConf) {\n    $scope.$parent.conf.lport = conf.default_port;\n    $scope.$parent.conf.rport = conf.default_port;\n    // Trigger autoconfig\n    $scope.autoconfig();\n  }\n\n  $scope.saveConf = () => co(function *() {\n    $scope.$parent.conf.lport = $scope.$parent.conf.rport;\n    $scope.$parent.conf.remote_ipv6 = $scope.$parent.conf.local_ipv6;\n    yield Webmin.server.netConf({\n      conf: $scope.$parent.conf\n    });\n    UIUtils.toast('settings.network.saved');\n  });\n};\n\nfunction toArrayOfAddresses(netiScope) {\n  return netiScope.reduce(function(arr, neti) {\n    return arr.concat(neti.addresses.map((addr) => {\n      return {\n        name: [neti.name, addr.address].join(' '),\n        addr: addr.address,\n        family: addr.family\n      };\n    }))\n  }, []);\n}\n","module.exports = () => {\n  require('./services/webmin')(angular);\n\n  const duniterApp = angular.module('duniterUIApp', [\n    'ui.router',\n    'homeControllers',\n    'pascalprecht.translate'\n  ]);\n\n  duniterApp.config( [\n    '$compileProvider', ($compileProvider) => $compileProvider.aHrefSanitizationWhitelist(/^\\s*(https?|data):/)\n  ]);\n\n  require('./lib/conf/translate')(duniterApp);\n  require('./lib/conf/routes')(duniterApp);\n  require('js/services/datetime')(duniterApp);\n  require('js/services/ui_utils')(duniterApp);\n  require('js/services/graphs')(duniterApp);\n  require('js/services/pubkeyGenerator')(duniterApp);\n  require('js/services/importer')(duniterApp);\n  require('js/services/base58')(duniterApp);\n\n  window.duniterChildCallback = function(gui) {\n    window.gui = gui;\n  };\n\n  window.onresize = () => {\n    window.onResize && window.onResize(window);\n  };\n\n  window.openWindow = function openWindow(url, options, callback) {\n    if (window.gui) {\n      // Duniter Desktop\n      window.gui.Window.open(url, options, callback);\n    } else {\n      // Browser\n      let innerHeight = options.height || 375;\n      let innerWidth = options.width || 500;\n      window.open(url, '_blank ', [\n        'top=' + (window.screenTop + (options.top || 200)),\n        'left=' + (window.screenLeft + (options.left || 200)),\n        'height=' + (innerHeight + 8),\n        'width=' + (innerWidth + 16),\n        'menubar=no',\n        'status=no'\n      ].join(','));\n    }\n  };\n\n  window.openNewTab = function openWindow(url, options, callback) {\n    if (window.gui) {\n      // Duniter Desktop\n      window.gui.Window.open(url, options, callback);\n    } else {\n      // Browser\n      window.open(url, '_blank ');\n    }\n  };\n\n  window.openExternal = function openExternal(url) {\n    if (window.gui) {\n      window.gui.Shell.openExternal(url);\n    } else {\n      window.open(url, '_blank');\n    }\n  };\n\n  let homeControllers = angular.module('homeControllers', ['duniter.services.webmin', 'ngFileUpload']);\n\n  homeControllers.controller('IndexController',            require('./controllers/IndexController'));\n  homeControllers.controller('AboutController',            require('./controllers/AboutController'));\n  homeControllers.controller('IdentityController',         require('./controllers/init/create/IdentityController'));\n  homeControllers.controller('ParametersController',       require('./controllers/init/create/ParametersController'));\n  homeControllers.controller('RootBlockController',        require('./controllers/init/create/RootBlockController'));\n  homeControllers.controller('SyncController',             require('./controllers/init/sync/SyncController'));\n  homeControllers.controller('MainController',             require('./controllers/main/MainController'));\n  homeControllers.controller('HomeController',             require('./controllers/main/home/HomeController'));\n  homeControllers.controller('OverviewController',         require('./controllers/main/home/tabs/OverviewController'));\n  homeControllers.controller('HomeNetworkController',      require('./controllers/main/home/tabs/HomeNetworkController'));\n  homeControllers.controller('LogsController',             require('./controllers/main/settings/tabs/LogsController'));\n  homeControllers.controller('LogsSettingsController',     require('./controllers/main/settings/tabs/LogsSettingsController'));\n  homeControllers.controller('NetworkController',          require('./controllers/main/settings/tabs/NetworkController'));\n  homeControllers.controller('SettingsController',         require('./controllers/main/settings/SettingsController'));\n  homeControllers.controller('DataController',             require('./controllers/main/settings/tabs/DataController'));\n  homeControllers.controller('BackupController',           require('./controllers/main/settings/tabs/BackupController'));\n  homeControllers.controller('CPUController',              require('./controllers/main/settings/tabs/CPUController'));\n  homeControllers.controller('CurrencyController',         require('./controllers/main/settings/tabs/CurrencyController'));\n  homeControllers.controller('KeyController',              require('./controllers/main/settings/tabs/KeyController'));\n  homeControllers.controller('GraphsController',           require('./controllers/main/graphs/GraphsController'));\n  homeControllers.controller('GraphsBlockchainController', require('./controllers/main/graphs/GraphsBlockchainController'));\n};\n","\"use strict\";\n\nmodule.exports = {\n\n  init: () => {\n\n    // Hack since Node v5\n    try {\n      window.jade = require('jade' + '/' + 'runtime');\n    } catch (e) {\n    }\n\n    console.log('Configuring Angular app...');\n\n    require('./app.config')();\n\n    console.log('App initialized.');\n  }\n};\n","module.exports = {\n  server: \"\", // Empty server will use the browser current host\n  port: \"\",   // Empty port will use the browser current port\n  default_port: 9220,\n  dev_autoconf: false,\n  api_timeout: 10000 // 10 sec timeout\n};\n","module.exports = {\n  \"top.menu.overview\": \"Home\",\n  \"top.menu.data\": \"Explore\",\n  \"top.menu.settings\": \"Settings\",\n  \"top.menu.wallet\": \"Wallet\",\n  \"general.server.started\": \"Server started\",\n  \"general.server.stopped\": \"Server stopped\",\n  \"general.choose_option\": \"Choose your option\",\n  \"general.network.reconf_ok\": \"Reconfiguration success\",\n  \"global.button.validate\": \"Validate\",\n  \"global.button.start\": \"Start\",\n  \"err.unknown\": \"Unknown error\",\n  \"err.connection\": \"Could not connect to node\",\n  \"err.back_index\": \"Get back to previous screen\",\n  \"err.sync.interrupted\": \"Sync interrupted because the following error occured:\",\n  \"index.message.loading\": \"Loading...\",\n  \"crypto.secret_key\": \"Secret key\",\n  \"index.message.current_block\": \"Current block {{ number }}\",\n  \"configuration.init.choose.title\": \"Initialization\",\n  \"configuration.init.choose.message\": \"Your software has to be initialized. You may either create a new currency or connect to an existing one.\",\n  \"configuration.init.choose.create\": \"Create a new currency\",\n  \"configuration.init.choose.connect\": \"Connect to an existing currency\",\n  \"configuration.init.choose.import\": \"Import from a backup file\",\n  \"configuration.create_currency.cancel\": \"Cancel & go home\",\n  \"configuration.create_uid.title\": \"Your identity\",\n  \"configuration.create_uid.message\": \"As a first step, you need to define your personal, unique identity.<br/>The following informations will be <strong>definitive</strong> for this currency: please choose them carefully.\",\n  \"configuration.create_uid.uid.tooltip\": \"The name you will be known as.\",\n  \"configuration.create_uid.entropy.tooltip\": \"An entropy source to make your key unique: an e-mail, a phone n°, ...\",\n  \"configuration.create_uid.password.tooltip\": \"A secret password to protect your key.\",\n  \"configuration.create_uid.create_button\": \"Continue\",\n  \"configuration.create_uid.preview_button\": \"Preview pubkey\",\n  \"configuration.create_uid.nrp_algo_choose\": \"NRP algorithm\",\n  \"configuration.create_uid.nrp_algo_choose_1\": \"N = 4096 ; r = 16 ; p = 1\",\n  \"configuration.create_uid.modal_title\": \"Identity confirmation\",\n  \"configuration.create_uid.modal_message\": \"This identity will be definitive for this currency: you will be known by your User ID and will be able to access your account using your Secret Key and Password values.\",\n  \"configuration.create_uid.modal_agree\": \"Agree\",\n  \"configuration.create_uid.modal_disagree\": \"Disagree\",\n  \"configuration.create_uid.modal_preview_title\": \"Preview of pubkey\",\n  \"configuration.create_uid.modal_preview_ok\": \"OK\",\n  \"configuration.create_network.title\": \"Network\",\n  \"configuration.create_network.message\": \"uCoin is a P2P software and needs bidirectionnal access to the network. Please chose carefully the following parameters.\",\n  \"configuration.create_network.none\": \"None\",\n  \"configuration.create_network.ipv4.title\": \"IPv4\",\n  \"configuration.create_network.ipv6.title\": \"IPv6\",\n  \"configuration.create_network.ipv4.message\": \"For compatibilty reasons, you may prefer to use classic IPv4 interfaces. The configuration is more complicated.\",\n  \"configuration.create_network.local_ipv4\": \"Private (computer)\",\n  \"configuration.create_network.remote_ipv4\": \"Public (box/router)\",\n  \"configuration.create_network.local_ipv6\": \"IPv6\",\n  \"configuration.create_network.port\": \"Port\",\n  \"configuration.create_network.port.title\": \"Port\",\n  \"configuration.create_network.ipv6.message\": \"IPv6 gives your computer a unique, direct address to your node over the Internet. This is the <b>recommended way</b> to connect your node to the network.\",\n  \"configuration.create_network.port.message\": \"Wether you use IPv6 or IPv4, Duniter node will use this port number for connection to the network. With IPv4, this number will be used for both private and public interfaces.\",\n  \"configuration.create_network.dns.title\": \"Domain name\",\n  \"configuration.create_network.dns\": \"Domain name\",\n  \"configuration.create_network.dns.message\": \"IPv6 (AAAA) and IPv4 (A) DNS records will be used.\",\n  \"configuration.create_network.upnp\": \"Use UPnP\",\n  \"configuration.create_network.button.validate\": \"Continue\",\n  \"configuration.create_network.button.autoconf\": \"Automatic configuration\",\n  \"configuration.create_parameters.title\": \"Currency\",\n  \"configuration.create_parameters.message\": \"Initial parameters of the currency. It should be carefully chosen, as these parameters never change once the currency is started.\",\n  \"configuration.create_parameters.currency.title\": \"Money units\",\n  \"configuration.create_parameters.currency.message\": \"Give a name to your currency. The 3 following parameters configure the way new money units are created.\",\n  \"configuration.create_parameters.currency\": \"Currency name\",\n  \"configuration.create_parameters.c\": \"c\",\n  \"configuration.create_parameters.dt\": \"UD period\",\n  \"configuration.create_parameters.ud0\": \"UD(0)\",\n  \"configuration.create_parameters.button.validate\": \"Continue\",\n  \"configuration.create_parameters.wot.title\": \"Web of Trust\",\n  \"configuration.create_parameters.wot.message\": \"The following parameters deal with identities and their links gathered in the Web of Trust concept.\",\n  \"configuration.create_parameters.sigStock\": \"Max cert stock\",\n  \"configuration.create_parameters.sigPeriod\": \"Delay between 2 certs\",\n  \"configuration.create_parameters.sigValidity\": \"Cert expiry delay\",\n  \"configuration.create_parameters.msValidity\": \"Membership expiry delay\",\n  \"configuration.create_parameters.sigQty\": \"Min required certs\",\n  \"configuration.create_parameters.sigWindow\": \"Cert time window\",\n  \"configuration.create_parameters.stepMax\": \"Max distance\",\n  \"configuration.create_parameters.xpercent\": \"Percent of distance\",\n  \"configuration.create_parameters.blockchain.title\": \"Blockchain\",\n  \"configuration.create_parameters.blockchain.message\": \"The technical support of money and identities is the blockchain. It also has some parameters driving its behavior.\",\n  \"configuration.create_parameters.medianTimeBlocks\": \"Blocks count\",\n  \"configuration.create_parameters.avgGenTime\": \"Block gen. duration\",\n  \"configuration.create_parameters.dtDiffEval\": \"Blocks count for diff.\",\n  \"configuration.create_parameters.blocksRot\": \"Personal diff. blocks\",\n  \"configuration.create_parameters.percentRot\": \"Personal diff. rotation\",\n  \"configuration.create_root.title\": \"Root block creation\",\n  \"configuration.create_root.message\": \"This is the final step to create the new currency! The root block or <i>genesis</i> will include the first members and define the currency parameters. Once generated and submitted, the blockchain will be started.\",\n  \"configuration.create_root.button.start\": \"Start HTTP\",\n  \"configuration.create_root.button.stop\": \"Stop HTTP\",\n  \"configuration.create_root.button.generate\": \"Give a try\",\n  \"configuration.create_root.need_a_try\": \"You need to generate a first block with the « Give a try » button. Start HTTP server to do so.\",\n  \"configuration.create_root.button.accept_and_send\": \"Accept this block and start currency\",\n  \"configuration.create_root.button.cancel\": \"Cancel creation and go to home screen\",\n  \"configuration.create_root.host_listening\": \"Host listening at:\",\n  \"configuration.create_uid.pubkey_preview\": \"Public key preview\",\n  \"home.current.number\": \"Current block #\",\n  \"home.current.membersCount\": \"Members count\",\n  \"home.current.medianTime\": \"Median time\",\n  \"home.current.powMin\": \"Common difficulty level\",\n  \"home.current.mmass\": \"Monetary mass\",\n  \"home.pulling.network\": \"Network\",\n  \"home.pulling.peer\": \"Peer\",\n  \"home.pulling.state.unkown\": \"Next sync in few minutes\",\n  \"home.pulling.state.synced\": \"Synced\",\n  \"home.pulling.state.syncing\": \"Syncing...\",\n  \"home.pow.unit\": \"blocks made by this key\",\n  \"home.pow.is_mirror\": \"This node is a mirror\",\n  \"home.pow.is_waiting\": \"Waiting for better proof conditions\",\n  \"home.tabs.overview\": \"Overview\",\n  \"home.tabs.overview.should_reconfigure\": \"Your configuration has changed and your node is no more reachable from the network. You should reconfigure it to have a functional node. If this message appears again, you should manually configure the network settings. Often, selecting only IPv6 interface (disabling IPv4) solves the problem.\",\n  \"home.tabs.network\": \"Peers\",\n  \"home.tabs.network.button.update\": \"Check peers again\",\n  \"home.tabs.logs\": \"Logs\",\n  \"home.tabs.logs.follow.logs\": \"Follow logs\",\n  \"home.tabs.logs.pause.logs\": \"Pause logs\",\n  \"home.tabs.logs.level.error\": \"Error\",\n  \"home.tabs.logs.level.warn\": \"Warning\",\n  \"home.tabs.logs.level.info\": \"Info\",\n  \"home.tabs.logs.level.debug\": \"Debug\",\n  \"home.tabs.logs.level.trace\": \"Trace\",\n  \"sync.title\": \"Synchronize\",\n  \"sync.message\": \"Your node will be synchronized with an existing currency: just enter technical details about a node to sync with it.\",\n  \"sync.host\": \"Host\",\n  \"sync.port\": \"Port\",\n  \"sync.check\": \"Check node\",\n  \"sync.start\": \"Synchronize with this node\",\n  \"sync.failed\": \"Synchronization failed.\",\n  \"sync.mode.simplified\": \"Simplified mode\",\n  \"sync.mode.manual\": \"Manual mode\",\n  \"sync.simplified.choose\": \"Node to connect to\",\n  \"sync.simplified.default_option\": \"Please select a node to continue\",\n  \"sync.simplified.currency\": \"Currency\",\n  \"sync.simplified.main_mirror\": \"(main mirror)\",\n  \"sync.simplified.official_mirror\": \"(other official mirror)\",\n  \"sync.ready.node.part1\": \"This node is available!\",\n  \"sync.ready.node.part2\": \"Click on the green button to proceed.\",\n  \"sync.started.node\": \"Synchronization started on node:\",\n  \"sync.error.unreachable.try.another.node\": \"This node is not available. Please select another one.\",\n  \"home.menu.server.stop\": \"Stop server\",\n  \"home.menu.server.start\": \"Start server\",\n  \"home.menu.server.restart\": \"Restart server\",\n  \"home.state\": \"Server:\",\n  \"home.state.started\": \"STARTED\",\n  \"home.state.stopped\": \"STOPPED\",\n  \"settings.tabs.logs\": \"Logs\",\n  \"settings.tabs.data\": \"Data\",\n  \"settings.tabs.backup\": \"Backup\",\n  \"settings.tabs.identity\": \"Crypto\",\n  \"settings.tabs.network\": \"Network\",\n  \"settings.tabs.currency\": \"Currency\",\n  \"settings.tabs.cpu\": \"CPU\",\n  \"settings.data.reset.title\": \"Reset this node\",\n  \"settings.data.reset.message\": \"If you desire to reset this node's data and sync it again with the network, please select a node to sync against and validate.\",\n  \"settings.data.reset.warning\": \"This process <strong>will not</strong> reset the node identity and network settings, which will be reused.\",\n  \"settings.data.reset.peer.none_option\": \"Select a node\",\n  \"settings.data.reset.peer.label\": \"Synchronization peer\",\n  \"settings.data.reset.button\": \"Full reset of the node\",\n  \"settings.data.reset_sync.button\": \"Reset data and start sync\",\n  \"settings.logs.title\": \"Logs\",\n  \"settings.logs.consult.message\": \"Your node continually generates information messages in a log file. This information may help you understand what your node <i>is doing</i> or what it <i>has done</i> few times ago.\",\n  \"settings.logs.consult.button\": \"View real-time logs\",\n  \"settings.logs.share.message\": \"You may want to <b>share your logs</b> with other people, sometimes to get help or to add informations in a bug tracker. Clicking on below button will extract the last 2000 lines of your logs and push it on the web, returning you a link to be shared with whoever you want.\",\n  \"settings.logs.share.button\": \"Create a web link to your logs\",\n  \"settings.logs.share.generating\": \"Generating your link...\",\n  \"settings.logs.share.error\": \"An error occurred during the generation of your link:\",\n  \"settings.data.backup.title\": \"Backup\",\n  \"settings.data.backup.message\": \"You can create backups of your node's data and restore them using the buttons below.\",\n  \"settings.data.backup.warning\": \"<b>Export</b> will only backup your node's data, which <i>excludes your secret key and configuration details</i>.<br><b>Import</b> will reset your node's data by applying the backup. Your secret keys and configuration remains untouched.\",\n  \"settings.data.backup.button.export\": \"Create a data backup\",\n  \"settings.data.backup.button.import\": \"Import a data backup\",\n  \"settings.data.backup.importing\": \"Importing data...\",\n  \"settings.data.backup.imported\": \"Import successfull!\",\n  \"settings.network.button.validate\": \"Save and apply network settings\",\n  \"settings.network.saved\": \"Configuration saved and applied successfully\",\n  \"settings.key.title\": \"Public key of this node:\",\n  \"settings.key.button.validate\": \"Save and use this key\",\n  \"settings.key.button.change\": \"Change keyring\",\n  \"settings.key.pubkey.description\": \"This public key is the public part of your keyring, which is composed of a public key and a private key. This public key is shared with all the peers of the network and users of the currency, while your private key is secretely kept and used by this node to process operations on the network.\",\n  \"settings.data.modal_title\": \"Confirm full reset\",\n  \"settings.data.modal_message\": \"This action will completely reset the data of your node and redirect you to initial configuration screen. Do you confirm?\",\n  \"settings.data.modal_disagree\": \"No, cancel this\",\n  \"settings.data.modal_agree\": \"Yes, process the reset\",\n  \"settings.data.reset.experimental\": \"This functionality is still considered experimental. If you encounters strange behaviors, please stop the software and reset manually your node by removing all the files BUT conf.json under ~/.config/ucoin/ucoin_default, and restart the software.\",\n  \"settings.cpu.title\": \"CPU settings\",\n  \"settings.cpu.message\": \"You can adjust the CPU power dedicated to proof-of-work computation. The higher the value, the faster is your node, the higher the chances you have to compute a block early.\",\n  \"settings.cpu.warning\": \"<b>Up to 8 cores</b> of your machine are dedicated to proof-of-work computation currently. Also, setting CPU to 100% does not mean Duniter will use 100% of each core, but will use as much as possible each of them, as a core is also shared with other programs.\",\n  \"settings.cpu.range\": \"% of CPU power core dedicated to proof-of-work :\",\n  \"settings.cpu.power\": \"Core power:\",\n  \"settings.cpu.saved\": \"CPU settings saved.\",\n  \"graphs.tabs.blockchain\": \"Blockchain\",\n  \"graphs.tabs.currency\": \"Currency\",\n  \"graphs.blockchain.range\": \"Graphs for the last X blocks: (please choose X value)\",\n  \"graphs.blockchain.with.time\": \"Time variations graph\",\n  \"graphs.blockchain.with.speed\": \"Writing speed graph\",\n  \"graphs.blockchain.with.difficulty\": \"Difficulty graph\",\n  \"help.about_duniter\": \"About Duniter\",\n  \"help.about_duniter.title\": \"About\",\n  \"help.about_duniter.subtitle\": \"Duniter Desktop\",\n  \"help.about_duniter.version\": \"Version: \",\n  \"help.about_duniter.forum\": \"Forum\",\n  \"help.about_duniter.chat\": \"Chat\",\n  \"help.new_version_available\": \"New version available\"\n}\n;","var co = require('co');\nvar _ = require('underscore');\n\nmodule.exports = (app) => {\n\n  app.config(['$stateProvider', '$urlRouterProvider', ($stateProvider, $urlRouterProvider) => {\n\n    // States\n    $stateProvider.\n    state('index', {\n      url: '/',\n      template: require('views/index'),\n      resolve: {\n        ws: (Webmin) => Webmin.ws(),\n        summary: (Webmin) => Webmin.summary()\n      },\n      controller: 'IndexController'\n    }).\n\n    state('about', {\n      url: '/about',\n      template: require('views/about'),\n      resolve: {\n        summary: (Webmin) => Webmin.summary(),\n        version: (summary) => summary && 'v' + summary.version || 'unknown version'\n      },\n      controller: 'AboutController'\n    }).\n\n    state('configure', {\n      abstract: true,\n      url: '/configure',\n      template: require('views/init/layout'),\n      controller: ($scope) => {\n        $scope.conf = {\n          currency: 'super_currency',\n          c: 0.007376575,\n          dt: 30.4375 * 24 * 3600,\n          ud0: 100,\n          stepMax: 3,\n          sigDelay: 3600 * 24 * 365 * 5,\n          sigPeriod: 0, // Instant\n          sigStock: 40,\n          sigWindow: 3600 * 24 * 14, // 2 weeks\n          sigValidity: 3600 * 24 * 365,\n          msValidity: 3600 * 24 * 365,\n          sigQty: 0,\n          xpercent: 0.9,\n          percentRot: 0.66,\n          blocksRot: 20,\n          avgGenTime: 16 * 60,\n          dtDiffEval: 10,\n          medianTimeBlocks: 20\n        };\n      }\n    }).\n\n    state('configure.choose', {\n      url: '/choose',\n      template: require('views/init/choose'),\n      controller: ($scope, Importer) => {\n        Importer($scope);\n      }\n    }).\n\n    state('configure.create', {\n      url: '/create',\n      template: '<div class=\"ui-scrollable\" ui-view=\"\"></div>'\n    }).\n\n    state('configure.create.uid', {\n      url: '/create/uid',\n      template: require('views/init/create/create_uid'),\n      controller: 'IdentityController'\n    }).\n\n    state('configure.create.network', {\n      url: '/create/network',\n      template: require('views/init/create/create_network'),\n      resolve: {\n        netinterfaces: (Webmin) => resolveNetworkAutoConf(Webmin),\n        firstConf: () => true\n      },\n      controller: 'NetworkController'\n    }).\n\n    state('configure.create.parameters', {\n      url: '/create/parameters',\n      template: require('views/init/create/create_parameters'),\n      controller: 'ParametersController'\n    }).\n\n    state('configure.create.root', {\n      url: '/create/root',\n      template: require('views/init/create/create_root'),\n      controller: 'RootBlockController'\n    }).\n\n    state('sync', {\n      url: '/sync?host=&port=&sync=&to=',\n      template: require('views/init/sync/sync'),\n      controller: 'SyncController'\n    }).\n\n    state('main', {\n      abstract: true,\n      url: '/main',\n      template: require('views/main/main'),\n      resolve: {\n        ws: (Webmin) => Webmin.ws(),\n        summary: (Webmin) => Webmin.summary()\n      },\n      controller: 'MainController'\n    }).\n\n    state('main.home', {\n      abstract: true,\n      url: '/home',\n      template: require('views/main/home/home'),\n      controller: 'HomeController'\n    }).\n\n    state('main.home.overview', {\n      url: '/overview',\n      template: require('views/main/home/tabs/overview'),\n      resolve: {\n        startHttp: (Webmin) => Webmin.server.http.start()\n      },\n      controller: 'OverviewController'\n    }).\n\n    state('main.home.network', {\n      url: '/network',\n      template: require('views/main/home/tabs/network'),\n      resolve: {\n        peers: (Webmin) => co(function *() {\n          return Webmin.network.peers();\n        })\n      },\n      controller: 'HomeNetworkController'\n    }).\n\n    state('main.settings', {\n      abstract: true,\n      url: '/settings',\n      template: require('views/main/settings/settings'),\n      resolve: {\n        summary: (Webmin) => Webmin.summary()\n      },\n      controller: 'SettingsController'\n    }).\n\n    state('main.settings.data', {\n      url: '/data',\n      template: require('views/main/settings/tabs/data'),\n      resolve: {\n        peers: (Webmin) => co(function *() {\n          try {\n            let self = yield Webmin.network.selfPeer();\n            let res = yield Webmin.network.peers();\n            return _.filter(res.peers, (p) => p.pubkey != self.pubkey && p.status == 'UP');\n          } catch (e) {\n            console.error(e);\n            return [];\n          }\n        })\n      },\n      controller: 'DataController'\n    }).\n\n    state('main.settings.logs', {\n      url: '/logs',\n      template: require('views/main/settings/tabs/logs'),\n      controller: 'LogsSettingsController'\n    }).\n\n    state('main.settings.backup', {\n      url: '/backup',\n      template: require('views/main/settings/tabs/backup'),\n      controller: 'BackupController'\n    }).\n\n    state('main.settings.cpu', {\n      url: '/cpu',\n      template: require('views/main/settings/tabs/cpu'),\n      resolve: {\n        summary: (Webmin) => Webmin.summary()\n      },\n      controller: 'CPUController'\n    }).\n\n    state('main.settings.crypto', {\n      url: '/crypto',\n      template: require('views/main/settings/tabs/crypto'),\n      controller: 'KeyController'\n    }).\n\n    state('main.settings.network', {\n      url: '/network',\n      resolve: {\n        netinterfaces: (Webmin) => resolveNetworkAutoConf(Webmin),\n        firstConf: () => false\n      },\n      template: require('views/main/settings/tabs/network'),\n      controller: 'NetworkController'\n    }).\n\n    state('main.settings.currency', {\n      url: '/currency',\n      resolve: {\n        conf: (summary) => co(function *() {\n          return summary.parameters;\n        })\n      },\n      template: require('views/main/settings/tabs/currency'),\n      controller: 'CurrencyController'\n    }).\n\n    state('main.graphs', {\n      abstract: true,\n      url: '/graphs',\n      template: require('views/main/graphs/graphs'),\n      controller: 'GraphsController'\n    }).\n\n    state('main.graphs.blockchain', {\n      url: '/blockchain',\n      template: require('views/main/graphs/blockchain'),\n      controller: 'GraphsBlockchainController'\n    }).\n\n    //state('graphs.crypto', {\n    //  url: '/crypto',\n    //  template: require('views/graphs/crypto'),\n    //  controller: 'KeyController'\n    //}).\n    //\n    //state('graphs.network', {\n    //  url: '/network',\n    //  resolve: {\n    //    netinterfaces: (Webmin) => resolveNetworkAutoConf(Webmin),\n    //    firstConf: () => false\n    //  },\n    //  template: require('views/graphs/network'),\n    //  controller: 'NetworkController'\n    //}).\n    //\n    //state('graphs.currency', {\n    //  url: '/currency',\n    //  resolve: {\n    //    conf: (bmapi) => co(function *() {\n    //      return bmapi.currency.parameters();\n    //    })\n    //  },\n    //  template: require('views/graphs/currency'),\n    //  controller: 'CurrencyController'\n    //}).\n\n    state('logs', {\n      url: '/logs',\n      template: require('views/logs'),\n      resolve: {\n        ws: (Webmin) => Webmin.ws()\n      },\n      controller: 'LogsController'\n    }).\n\n    state('error', {\n      url: '/error\\?err',\n      template: require('views/error'),\n      controller: ($scope, $stateParams) =>\n        $scope.errorMsg = $stateParams.err || 'err.unknown'\n    });\n\n    // Default route\n    $urlRouterProvider.otherwise('/');\n  }]);\n\n  app.run(($rootScope, $state) => {\n    $rootScope.$on('$stateChangeError', (event, toState, toParams, fromState, fromParams, error) => {\n      console.error(error);\n      $state.go('error', { err: error.message });\n    });\n  });\n\n  function resolveNetworkAutoConf(Webmin) {\n    return co(function *() {\n      let netinterfaces = yield Webmin.network.interfaces();\n      return netinterfaces || { local: {}, remote: {} };\n    });\n  }\n};\n","module.exports = (app) => {\n\n  app.config(['$translateProvider', ($translateProvider) => {\n\n    $translateProvider.translations('en', require('./i18n/en'));\n\n    // Default language\n    $translateProvider.preferredLanguage('en');\n\n    // Other parameters\n    $translateProvider.useSanitizeValueStrategy('');\n  }]);\n};\n","\"use strict\";\n\nmodule.exports = function Peer(json) {\n\n  var that = this;\n\n  var BMA_REGEXP = /^BASIC_MERKLED_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))$/;\n\n  Object.keys(json).forEach(function(key) {\n    that[key] = json[key];\n  });\n\n  that.endpoints = that.endpoints || [];\n  that.statusTS = that.statusTS || 0;\n\n  that.keyID = function () {\n    return that.pubkey && that.pubkey.length > 10 ? that.pubkey.substring(0, 10) : \"Unknown\";\n  };\n\n  that.copyValues = function(to) {\n    var obj = that;\n    [\"version\", \"currency\", \"pub\", \"endpoints\", \"hash\", \"status\", \"statusTS\", \"block\", \"signature\"].forEach(function (key) {\n      to[key] = obj[key];\n    });\n  };\n\n  that.copyValuesFrom = function(from) {\n    var obj = that;\n    [\"version\", \"currency\", \"pub\", \"endpoints\", \"block\", \"signature\"].forEach(function (key) {\n      obj[key] = from[key];\n    });\n  };\n\n  that.json = function() {\n    var obj = that;\n    var json = {};\n    [\"version\", \"currency\", \"endpoints\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n      json[key] = obj[key];\n    });\n    json.raw = that.getRaw();\n    json.pubkey = that.pubkey;\n    return json;\n  };\n\n  that.getBMA = function() {\n    var bma = null;\n    that.endpoints.forEach(function(ep){\n      var matches = !bma && ep.match(BMA_REGEXP);\n      if (matches) {\n        bma = {\n          \"dns\": matches[2] || '',\n          \"ipv4\": matches[4] || '',\n          \"ipv6\": matches[6] || '',\n          \"port\": matches[8] || 9101\n        };\n      }\n    });\n    return bma || {};\n  };\n\n  that.getDns = function() {\n    var bma = that.getBMA();\n    return bma.dns ? bma.dns : null;\n  };\n\n  that.getIPv4 = function() {\n    var bma = that.getBMA();\n    return bma.ipv4 ? bma.ipv4 : null;\n  };\n\n  that.getIPv6 = function() {\n    var bma = that.getBMA();\n    return bma.ipv6 ? bma.ipv6 : null;\n  };\n\n  that.getPort = function() {\n    var bma = that.getBMA();\n    return bma.port ? bma.port : null;\n  };\n\n  that.getHost = function() {\n    var bma = that.getBMA();\n    var host =\n      (that.hasValid4(bma) ? bma.ipv4 :\n        (bma.dns ? bma.dns :\n          (bma.ipv6 ? '[' + bma.ipv6 + ']' : '')));\n    return host;\n  };\n\n  that.getURL = function() {\n    var bma = that.getBMA();\n    var base = '';\n    if (bma.dns) {\n      base = bma.dns;\n    } else if (that.hasValid4(bma)) {\n      base = bma.ipv4;\n    } else if (bma.ipv6) {\n      base = '[' + bma.ipv6 + ']';\n    }\n    if(bma.port)\n      base += ':' + bma.port;\n    return base;\n  };\n\n  that.hasValid4 = function(bma) {\n    return bma.ipv4 && !bma.ipv4.match(/^127.0/) && !bma.ipv4.match(/^192.168/) ? true : false;\n  };\n\n  that.getNamedURL = function() {\n    var bma = that.getBMA();\n    var base =\n      (that.hasValid4(bma) ? bma.ipv4 :\n        (bma.dns ? bma.dns :\n          (bma.ipv6 ? '[' + bma.ipv6 + ']' : '')));\n    if(bma.port)\n      base += ':' + bma.port;\n    return base;\n  };\n\n  that.isReachable = function () {\n    return that.getURL() ? true : false;\n  };\n};\n","module.exports = function mobilecheck() {\n  var check = false;\n  (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n  return check;\n};\n","module.exports = (app) => {\n\n  let Base58 = {};\n\n  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n  Base58.alphabetMap = {};\n\n  for(let i = 0; i < Base58.alphabet.length; i++) {\n    Base58.alphabetMap[Base58.alphabet.charAt(i)] = i\n  }\n\n  Base58.encode = function(buffer) {\n    if (buffer.length === 0) return '';\n\n    let i, j, digits = [0];\n    for (i = 0; i < buffer.length; i++) {\n      for (j = 0; j < digits.length; j++) digits[j] <<= 8\n      digits[digits.length - 1] += buffer[i];\n\n      let carry = 0;\n      for (j = digits.length - 1; j >= 0; j--){\n        digits[j] += carry;\n        carry = (digits[j] / 58) | 0;\n        digits[j] %= 58\n      }\n\n      while (carry) {\n        digits.unshift(carry);\n        carry = (digits[0] / 58) | 0;\n        digits[0] %= 58\n      }\n    }\n\n    // deal with leading zeros\n    for (i = 0; i < buffer.length - 1 && buffer[i] == 0; i++) digits.unshift(0)\n\n    return digits.map(function(digit) { return Base58.alphabet[digit] }).join('')\n  };\n\n  Base58.decode = function(string) {\n    if (string.length === 0) return (new Uint8Array());\n\n    let input = string.split('').map(function(c){\n      return Base58.alphabetMap[c]\n    });\n\n    let i, j, bytes = [0];\n    for (i = 0; i < input.length; i++) {\n      for (j = 0; j < bytes.length; j++) bytes[j] *= 58\n      bytes[bytes.length - 1] += input[i];\n\n      let carry = 0;\n      for (j = bytes.length - 1; j >= 0; j--){\n        bytes[j] += carry;\n        carry = bytes[j] >> 8;\n        bytes[j] &= 0xff\n      }\n\n      while (carry) {\n        bytes.unshift(carry);\n        carry = bytes[0] >> 8;\n        bytes[0] &= 0xff\n      }\n    }\n\n    // deal with leading zeros\n    for (i = 0; i < input.length - 1 && input[i] == 0; i++) bytes.unshift(0)\n    return (new Uint8Array(bytes))\n  };\n\n  app.factory('Base58', function() {\n    return {\n      encode: Base58.encode,\n      decode: Base58.decode\n    };\n  });\n};\n","var _ = require('underscore');\nvar conf = require('../lib/conf/conf');\nlet moment = require('moment');\n\nmodule.exports = (app) => {\n\n    app.filter('mt_date', () => {\n      return (input) => {\n        if(input == null){ return \"\"; }\n        return moment(input * 1000).format('YYYY MM DD');\n      };\n    });\n\n    app.filter('mt_time', () => {\n      return (input) => {\n        if(input == null){ return \"\"; }\n        return moment(input * 1000).format('HH:mm:ss');\n      };\n    });\n};\n","module.exports = (app) => {\n\n  app.factory('Graph', function() {\n      return {\n\n        speedGraph: function speedGraphs (id, offset, speeds, minSpeeds, maxSpeeds, getSeries) {\n          var xValuex = [];\n          for (var i = 0, len = speeds.length; i < len; i++) {\n            xValuex.push(i + offset);\n          }\n          $(id).highcharts({\n            chart: {\n              type: \"area\",\n              zoomType: 'x',\n              events: {\n                load: function () {\n                  getSeries(this.series);\n                }\n              }\n            },\n            title: {\n              text: 'Blocks writing speed'\n            },\n            subtitle: {\n              text: document.ontouchstart === undefined ?\n                'Click and drag in the plot area to zoom in' :\n                'Pinch the chart to zoom in'\n            },\n            xAxis: {\n              //categories: xValuex,\n              minRange: 3, // 10 blocks,\n              labels: {\n                formatter: function() {\n                  return this.value + offset;\n                }\n              }\n            },\n            yAxis: {\n              //type: 'logarithmic',\n              minorTickInterval: 1,\n              title: {\n                text: 'Blocks per hour (logarithmic scale)'\n              },\n              floor: 0,\n              min: 0\n            },\n            colors: ['#ff0000', '#7cb5ec', '#000000'],\n            legend: {\n              enabled: true\n            },\n            tooltip: {\n              shared: true,\n              crosshairs: true,\n              formatter: blockFormatter(offset)\n            },\n            plotOptions: {\n              area: {\n                fillColor: {\n                  linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1},\n                  stops: [\n                    [0, Highcharts.getOptions().colors[0]],\n                    [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]\n                  ]\n                },\n                marker: {\n                  radius: 2\n                },\n                lineWidth: 1,\n                states: {\n                  hover: {\n                    lineWidth: 1\n                  }\n                },\n                threshold: null\n              }\n            },\n\n            series: [{\n              type: 'line',\n              name: \"Upper limit\",\n              data: maxSpeeds\n            },{\n              type: 'area',\n              name: \"Actual speed\",\n              data: speeds\n            },{\n              type: 'line',\n              name: \"Lower limit\",\n              data: minSpeeds\n            }\n            ]\n          });\n        },\n\n        difficultyGraph: function difficultyGraph (id, offset, difficulties) {\n          $(id).highcharts({\n            chart: {\n              type: \"area\",\n              zoomType: 'x'\n            },\n            title: {\n              text: 'Proof-of-Work difficulty by block'\n            },\n            subtitle: {\n              text: document.ontouchstart === undefined ?\n                'Click and drag in the plot area to zoom in' :\n                'Pinch the chart to zoom in'\n            },\n            xAxis: {\n              minRange: 10, // 10 blocks,\n              labels: {\n                formatter: function() {\n                  return this.value + offset;\n                }\n              }\n            },\n            yAxis: {\n              title: {\n                text: 'Number of zeros'\n              },\n              floor: 0,\n              min: 0\n            },\n            legend: {\n              enabled: true\n            },\n            tooltip: {\n              shared: true,\n              crosshairs: true,\n              formatter: blockFormatter(offset)\n            },\n            plotOptions: {\n              area: {\n                fillColor: {\n                  linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1},\n                  stops: [\n                    [0, Highcharts.getOptions().colors[0]],\n                    [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]\n                  ]\n                },\n                marker: {\n                  radius: 2\n                },\n                lineWidth: 1,\n                states: {\n                  hover: {\n                    lineWidth: 1\n                  }\n                },\n                threshold: null\n              }\n            },\n\n            series: [\n              {\n                name: 'PoW difficulty',\n                data: difficulties\n              }\n            ]\n          });\n        },\n\n        timeGraphs: function timeGraphs (id, offset, timeAccelerations, medianTimeIncrements, speeds, minSpeeds, maxSpeeds) {\n          var timesInc = [];\n          medianTimeIncrements.forEach(function (inc) {\n            timesInc.push(inc == 0 ? 1 : inc);\n          });\n          $(id).highcharts({\n            chart: {\n              // type: \"area\",\n              zoomType: 'x'\n            },\n            title: {\n              text: 'Blockchain time variations'\n            },\n            subtitle: {\n              text: document.ontouchstart === undefined ?\n                'Click and drag in the plot area to zoom in' :\n                'Pinch the chart to zoom in'\n            },\n            xAxis: {\n              minRange: 10, // 10 blocks,\n              labels: {\n                formatter: function() {\n                  return this.value + offset;\n                }\n              }\n            },\n            yAxis: {\n              //type: 'logarithmic',\n              minorTickInterval: 1,\n              title: {\n                text: 'Number of seconds (logarithmic scale)'\n              }\n            },\n            legend: {\n              enabled: true\n            },\n            tooltip: {\n              shared: true,\n              crosshairs: true,\n              formatter: blockFormatter(offset)\n            },\n            plotOptions: {\n              area: {\n                fillColor: {\n                  linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1},\n                  stops: [\n                    [0, Highcharts.getOptions().colors[0]],\n                    [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]\n                  ]\n                },\n                marker: {\n                  radius: 2\n                },\n                lineWidth: 1,\n                states: {\n                  hover: {\n                    lineWidth: 1\n                  }\n                },\n                threshold: null\n              }\n            },\n\n            series: [\n              {\n                name: 'Time acceleration',\n                data: timeAccelerations\n              },{\n                name: \"Median Time variation\",\n                data: timesInc\n              }\n              ,{\n                name: \"Too high duration\",\n                data: maxSpeeds\n              }\n              ,{\n                name: \"Actual duration\",\n                data: speeds\n              }\n              ,{\n                name: \"Too low duration\",\n                data: minSpeeds\n              }\n            ]\n          });\n        }\n      }\n    });\n};\n\nfunction blockFormatter(offset) {\n  return function() {\n    var html = '<span style=\"font-size: 10px\">' + (this.x + offset) + '</span><br/>';\n    for (var i = 0, len = this.points.length; i < len; i++) {\n      var point = this.points[i];\n      var series = point.series;\n      html += '<span style=\"color:' + series.color + '\">\\u25CF</span>' + series.name + ': <b>' + point.y + '</b><br/>';\n    }\n    return html;\n  }\n}\n","module.exports = (app) => {\n\n  app.factory('Importer', function($http, $state, $timeout, UIUtils, Upload, Webmin) {\n\n    return ($scope) => {\n\n      $scope.uploadFiles = function(file, errFiles) {\n        $scope.f = file;\n        $scope.errFile = errFiles && errFiles[0];\n        if (file) {\n          UIUtils.toast('settings.data.backup.importing');\n          file.upload = Upload.upload({\n            url: Webmin.getImportURL(),\n            data: { importData: file }\n          });\n\n          file.upload.then(function (response) {\n            $timeout(function () {\n              UIUtils.toast('settings.data.backup.imported');\n              $state.go('main.home.overview');\n              file.result = response.data;\n            });\n          }, function (response) {\n            if (response.status > 0)\n              $scope.errorMsg = response.status + ': ' + response.data;\n          }, function (evt) {\n            file.progress = Math.min(100, parseInt(100.0 *\n              evt.loaded / evt.total));\n          });\n        }\n      }\n    };\n  });\n};\n","module.exports = (app) => {\n\n  app.factory('PubkeyGenerator', function($timeout, Webmin) {\n\n    var co = require('co');\n\n    return ($scope) => {\n\n      let concat = \"\";\n      $scope.pubkey_preview = \"\";\n      let timeout = preview();\n\n      function preview() {\n        return $timeout(() => {\n          if ($scope.$parent) {\n            let salt = $scope.$parent.conf.idty_entropy;\n            let pass = $scope.$parent.conf.idty_password;\n            let newConcat = [salt, pass].join('');\n            if (salt && pass && newConcat != concat) {\n              concat = newConcat;\n              $scope.previewPubkey(concat);\n              timeout = preview();\n            } else {\n              timeout = preview();\n            }\n          }\n        }, 100);\n      }\n\n      $scope.previewPubkey = () => co(function *() {\n        let data = yield Webmin.key.preview({\n          conf: $scope.$parent.conf\n        });\n        $scope.pubkey_preview = data.pubkey;\n      }).catch(() => null);\n    };\n  });\n};\n","module.exports = (app) => {\n\n  app.factory('UIUtils', function($q, $translate, $state, $location) {\n      return {\n\n        translate: (msg) => $q.when($translate(msg)),\n\n        toastRaw: (msg) => {\n          return Materialize.toast(msg, 4000);\n        },\n\n        toast: (msg) => {\n          return $q.when($translate(msg)).then((translated) => Materialize.toast(translated, 4000))\n        },\n\n        enableInputs: () => $('i.prefix, label[value!=\"\"]').addClass('active'),\n\n        enableTabs: () => {\n          let jTabs = $('ul.tabs');\n          jTabs.tabs();\n          $('ul.tabs a').click((e) => {\n            let href = $(e.currentTarget).attr('href');\n            let state = href.slice(1);\n            $state.go(state);\n          });\n\n          let currentID = $location.path()\n            .replace(/\\//g, '.')\n            .replace(/\\./, '');\n\n          jTabs.tabs('select_tab', currentID);\n        },\n\n        changeTitle: (version) => document.title = 'Duniter ' + version\n      }\n    });\n};\n","const co = require('co');\nconst _ = require('underscore');\nconst conf = require('../lib/conf/conf');\n\nmodule.exports = (angular) => {\n\n  angular.module('duniter.services.webmin', ['ngResource'])\n\n    .factory('Webmin', function($http, $q) {\n\n      function httpProtocol() {\n        return window.location.protocol + '//';\n      }\n\n      function wsProtocol() {\n        return window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n      }\n\n      function Webmin(server) {\n\n        function getResource(uri, protocol) {\n          return function(params) {\n            return $q.when(httpGet(uri, params, protocol));\n          }\n        }\n\n        function httpGet(uri, params, protocol) {\n          return Q.Promise((resolve, reject) => {\n            var config = {\n              timeout: conf.api_timeout\n            }, suffix = '', pkeys = [], queryParams = null;\n            if (typeof params == 'object') {\n              pkeys = _.keys(params);\n              queryParams = {};\n            }\n            pkeys.forEach(function(pkey){\n              var prevURI = uri;\n              uri = uri.replace(new RegExp(':' + pkey), params[pkey]);\n              if (prevURI == uri) {\n                queryParams[pkey] = params[pkey];\n              }\n            });\n            config.params = queryParams;\n            $http.get((protocol || httpProtocol()) + server + uri + suffix, config)\n              .success(function(data, status, headers, config) {\n                resolve(data);\n              })\n              .error(function(data, status, headers, config) {\n                console.log(data);\n                reject(data);\n              });\n          });\n        }\n\n        function postResource(uri) {\n          return function(data, params) {\n            return $q.when(Q.Promise((resolve, reject) => {\n              var config = {\n                timeout: 4000\n              }, suffix = '', pkeys = [], queryParams = null;\n              if (typeof params == 'object') {\n                pkeys = _.keys(params);\n                queryParams = {};\n              }\n              pkeys.forEach(function(pkey){\n                var prevURI = uri;\n                uri = uri.replace(new RegExp(':' + pkey), params[pkey]);\n                if (prevURI == uri) {\n                  queryParams[pkey] = params[pkey];\n                }\n              });\n              config.params = queryParams;\n              $http.post(httpProtocol() + server + uri + suffix, data, config)\n                .success(function(data, status, headers, config) {\n                  resolve(data);\n                })\n                .error(function(data, status, headers, config) {\n                  reject(data);\n                });\n            }));\n          }\n        }\n\n        let wsMap = {};\n\n        function ws(uri) {\n          var sock = wsMap[uri] || new WebSocket(uri);\n          wsMap[uri] = sock;\n          sock.onclose = function(e) {\n            console.log('close');\n            console.log(e);\n          };\n          sock.onerror = function(e) {\n            console.log('onerror');\n            console.log(e);\n          };\n          let opened = false, openedCallback;\n          sock.onopen = function() {\n            opened = true;\n            openedCallback && openedCallback();\n          };\n          let listener, messageType;\n          sock.onmessage = function(e) {\n            let res = JSON.parse(e.data);\n            if (res.type == 'log') {\n              for (let i = 0, len = res.value.length; i < len; i++) {\n                let log = res.value[i];\n                // console[log.level](log.msg);\n              }\n            }\n            if (listener && (messageType === undefined || (res.type === messageType))) {\n              listener(res);\n            }\n          };\n          return {\n            on: function(type, callback) {\n              messageType = type;\n              listener = callback;\n            },\n            whenOpened: () => co(function *() {\n              if (opened) return true;\n              else {\n                yield Q.Promise((resolve) => {\n                  openedCallback = resolve;\n                });\n              }\n            }),\n            send: (msg) => sock.send(msg)\n          };\n        }\n\n        return {\n          getExportURL: () => httpProtocol() + server + '/webmin/data/duniter_export',\n          getImportURL: () => httpProtocol() + server + '/webmin/data/duniter_import',\n          isNodePubliclyReachable: getResource('/webmin/server/reachable'),\n          ws: () => ws(wsProtocol() + server + '/webmin/ws'),\n          wsBlock: () => ws(wsProtocol() + server + '/webmin/ws_block'),\n          wsPeer: () => ws(wsProtocol() + server + '/webmin/ws_peer'),\n          summary: getResource('/webmin/summary'),\n          powSummary: getResource('/webmin/summary/pow'),\n          logsExport: (nbLines) => getResource('/webmin/logs/export/' + nbLines)(),\n          blockchain: {\n            blocks: (opts) => getResource('/webmin/blockchain/blocks/' + opts.count + '/' + opts.from)(),\n            block_add: postResource('/webmin/blockchain/add')\n          },\n          server: {\n            http: {\n              start: getResource('/webmin/server/http/start'),\n              stop: getResource('/webmin/server/http/stop'),\n              openUPnP: getResource('/webmin/server/http/upnp/open'),\n              regularUPnP: getResource('/webmin/server/http/upnp/regular')\n            },\n            services: {\n              startAll: getResource('/webmin/server/services/start_all'),\n              stopAll: getResource('/webmin/server/services/stop_all')\n            },\n            sendConf: postResource('/webmin/server/send_conf'),\n            netConf: postResource('/webmin/server/net_conf'),\n            keyConf: postResource('/webmin/server/key_conf'),\n            cpuConf: postResource('/webmin/server/cpu_conf'),\n            testSync: postResource('/webmin/server/test_sync'),\n            startSync: postResource('/webmin/server/start_sync'),\n            previewNext: getResource('/webmin/server/preview_next'),\n            autoConfNetwork: getResource('/webmin/server/auto_conf_network'),\n            resetData: getResource('/webmin/server/reset/data'),\n            republishNewSelfPeer: getResource('/webmin/server/republish_selfpeer')\n          },\n          key: {\n            preview: postResource('/webmin/key/preview')\n          },\n          network: {\n            interfaces: getResource('/webmin/network/interfaces'),\n            selfPeer: getResource('/webmin/network/self'),\n            peers: getResource('/webmin/network/peers')\n          },\n          currency: {\n            parameters: getResource('/webmin/currency/parameters')\n          }\n        }\n      }\n      let server = window.location.hostname;\n      let port = window.location.port;\n      let service = Webmin([server, port].join(':'));\n      service.instance = Webmin;\n      return service;\n    });\n};\n"]}
\ No newline at end of file
+{"version":3,"sources":["AboutController.js","IndexController.js","IdentityController.js","ParametersController.js","RootBlockController.js","SyncController.js","MainController.js","GraphsBlockchainController.js","GraphsController.js","HomeController.js","HomeNetworkController.js","OverviewController.js","SettingsController.js","BackupController.js","CPUController.js","CurrencyController.js","DataController.js","KeyController.js","LogsController.js","LogsSettingsController.js","NetworkController.js","app.config.js","application.js","conf.js","app/js/lib/conf/i18n/en.json","routes.js","translate.js","peer.js","mobileDetector.js","base58.js","datetime.js","graphs.js","importer.js","pubkeyGenerator.js","ui_utils.js","webmin.js"],"names":["co","require","module","exports","$scope","version","UIUtils","translate","$parent","title","$http","$state","Webmin","summary","changeTitle","message","connected","current","go","console","error","err","conf","PubkeyGenerator","setTimeout","$","material_select","accept","modal","css","openModal","dev_autoconf","idty_uid","Math","random","idty_entropy","idty_password","enableInputs","generated","started","start","hosts","remote_ipv4","push","rport","join","remote_ipv6","host_listening","server","sendConf","try","stop","previewNext","block","raw","blockchain","block_add","res","number","startServices","services","startAll","cancelAndReset","stopAll","resetData","$timeout","$stateParams","$translate","syncWS","ws","sync_mode","simplified_host","synchronizing","sync_failed","host","localStorage","getItem","port","parseInt","to","wrong_host","remote_current","checkNode","checked_host","sync_error","sync_message","split","checking","testSync","targetHost","toast","startSync","down_percent","apply_percent","sp","translatedErr","on","undefined","data","type","value","errorMessage","msg","republishNewSelfPeer","then","log","changed","$apply","autoConfNetwork","setItem","chunkLen","max","min","sync","nodeOK","$interval","Base58","local_host","local_port","local_sign_pk","decode","pubkey","local_sign_sk","seckey","DEFAULT_CESIUM_SETTINGS","notifications","help","Waves","displayEffect","isMobile","sideNav","menuWidth","openWallet","walletHeight","walletWidth","openNewTab","window","location","origin","position","height","width","show","win","settingsStr","dataStr","settings","JSON","parse","keyPairOK","keypair","signPk","signSk","length","encode","Array","from","node","debug","plugins","rememberMe","stringify","close","innerHeight","innerWidth","mainWindow","focus","aboutWin","showAbout","openWindow","subwin","gui","startServer","server_stopped","server_started","stopServer","restartServer","checkUpdates","LATEST_RELEASE_URL","get","latest","local_string_version","m","match","localVersion","localSuffix","isLocalAPreRelease","remoteVersion","tag_name","substr","filter","entry","icon","onclick","openExternal","BLOCKS_COUNT","Graph","loading","blocksCount","$watch","newValue","timeGraph","speedGraph","diffGraph","updateGraphs","currency","parameters","blocks","count","speeds","accelerations","medianTimeIncrements","actualDurations","BY_HOUR","i","len","acc","previousPos","dtDiffEval","j","medianTime","availPreviousBlocks","localAvgSpeed","realDuration","isNaN","avgGenTime","parseFloat","toFixed","time","minSpeeds","map","ceil","sqrt","maxSpeeds","floor","minDurations","maxDurations","difficulties","b","powMin","graphs","withTime","withSpeed","withDifficulty","timeGraphs","series","difficultyGraph","enableTabs","menu","peers","update","searching","delayP","Q","delay","network","moment","bindBlockWS","loadPowData","M","monetaryMass","UD","ud0","lastUDBlock","N","membersCount","dividend","pow","unitbase","c","current_currency","current_number","current_membersCount","current_medianTime","current_powMin","phones","abc","newIdentities","dropdown","constrainwidth","lastNearPoW","totalPoW","sync_state","network_percent","peer_percent","has_pulled","is_pulling","last_pulling","start_block","sync_time","fromNow","powSummary","pow_total","total","pow_mirror","mirror","pow_waiting","waiting","event","last","doneCount","found","hash","cb","wsBlock","reconfigure_network","reconfiguring","interfaces","netinferfaces","local_ipv4","auto","local","ipv4","local_ipv6","ipv6","remote","lport","upnp","dns","netConf","should_reconfigure","isNodePubliclyReachable","reachable","success","$location","fullReset","Importer","export_link","getExportURL","cpuPower","cpu","updateCPUpower","savingCPU","cpuConf","attr","Peer","peer","p","name","getURL","slice","host_port","getHost","getPort","resetNode","resetNodeAndSync","remote_host","keyConf","reload","_","logsSize","logs","range","logsString","follow","levels","warn","info","trace","keys","level","splice","send","addLogs","autoDigest","pause","newlogs","elem","document","getElementById","scrollTop","scrollHeight","whenOpened","generating","shareLogs","logsExport","link","netinterfaces","firstConf","autoconf","autoconfig","local_neti","toArrayOfAddresses","remote_neti","default_port","saveConf","netiScope","reduce","arr","neti","concat","addresses","addr","address","family","angular","duniterApp","config","$compileProvider","aHrefSanitizationWhitelist","duniterChildCallback","onresize","onResize","url","options","callback","Window","open","screenTop","top","screenLeft","left","Shell","homeControllers","controller","init","jade","e","api_timeout","app","$stateProvider","$urlRouterProvider","state","template","resolve","abstract","dt","stepMax","sigDelay","sigPeriod","sigStock","sigWindow","sigValidity","msValidity","sigQty","xpercent","percentRot","blocksRot","medianTimeBlocks","resolveNetworkAutoConf","selfPeer","self","status","errorMsg","otherwise","run","$rootScope","$on","toState","toParams","fromState","fromParams","$translateProvider","translations","preferredLanguage","useSanitizeValueStrategy","json","that","BMA_REGEXP","Object","forEach","key","endpoints","statusTS","keyID","substring","copyValues","obj","copyValuesFrom","getRaw","getBMA","bma","ep","matches","getDns","getIPv4","getIPv6","hasValid4","base","getNamedURL","isReachable","mobilecheck","check","a","test","navigator","userAgent","vendor","opera","alphabet","alphabetMap","charAt","buffer","digits","carry","unshift","digit","string","Uint8Array","input","bytes","factory","format","speedGraphs","id","offset","getSeries","xValuex","highcharts","chart","zoomType","events","load","text","subtitle","ontouchstart","xAxis","minRange","labels","formatter","yAxis","minorTickInterval","colors","legend","enabled","tooltip","shared","crosshairs","blockFormatter","plotOptions","area","fillColor","linearGradient","x1","y1","x2","y2","stops","Highcharts","getOptions","Color","setOpacity","marker","radius","lineWidth","states","hover","threshold","timeAccelerations","timesInc","inc","html","x","points","point","color","y","Upload","uploadFiles","file","errFiles","f","errFile","upload","getImportURL","importData","response","result","evt","progress","loaded","pubkey_preview","timeout","preview","salt","pass","newConcat","previewPubkey","catch","$q","when","toastRaw","Materialize","translated","addClass","jTabs","tabs","click","href","currentTarget","currentID","path","replace","httpProtocol","protocol","wsProtocol","getResource","uri","params","httpGet","Promise","reject","suffix","pkeys","queryParams","pkey","prevURI","RegExp","headers","postResource","post","wsMap","sock","WebSocket","onclose","onerror","opened","openedCallback","onopen","listener","messageType","onmessage","wsPeer","nbLines","opts","http","openUPnP","regularUPnP","hostname","service","instance"],"mappings":"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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA1MA;AAAA;;;;;;ACAA,IAAIla,KAAKC,QAAQ,IAAR,CAAT;AACA,IAAI4V,IAAI5V,QAAQ,YAAR,CAAR;;AAEAC,OAAOC,OAAP,GAAiB,UAACga,GAAD,EAAS;;AAExBA,MAAItB,MAAJ,CAAW,CAAC,gBAAD,EAAmB,oBAAnB,EAAyC,UAACuB,cAAD,EAAiBC,kBAAjB,EAAwC;;AAE1F;AACAD,mBACAE,KADA,CACM,OADN,EACe;AACbnB,WAAK,GADQ;AAEboB,gBAAUta,QAAQ,aAAR,CAFG;AAGbua,eAAS;AACPnW,YAAI,YAACzD,MAAD;AAAA,iBAAYA,OAAOyD,EAAP,E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","file":"public/app.js","sourcesContent":["\"use strict\";\n\nconst co = require('co');\n\nmodule.exports = ($scope, version, UIUtils) => {\n\n  $scope.version = version;\n\n  return co(function*() {\n    $scope.$parent.title = yield UIUtils.translate('help.about_duniter.title');\n  });\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = ($scope, $http, $state, Webmin, summary, UIUtils) => {\n\n  UIUtils.changeTitle(summary.version);\n\n  $scope.message = 'index.message.loading';\n  co(function *() {\n    let connected = false;\n    try {\n      let summary = yield Webmin.summary();\n      if (summary.current) {\n        return $state.go('main.home.overview');\n      }\n      return $state.go('configure.choose');\n    }\n    catch (e) {\n      console.error(connected, e);\n      if (!connected) {\n        return $state.go('error', { err: 'err.connection'});\n      }\n      return $state.go('error', { err: e });\n    }\n  });\n};\n","\"use strict\";\n\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = ($scope, $state, PubkeyGenerator) => {\n\n  setTimeout(() => {\n    $('select').material_select();\n  }, 500);\n\n  $scope.accept = () => {\n    let modal = $('#modal1');\n    if (modal.css('display') == 'none') {\n      $('#modal1').openModal();\n    }\n  };\n\n  PubkeyGenerator($scope);\n\n  if (conf.dev_autoconf) {\n    $scope.$parent.conf.idty_uid = 'dev_' + ~~(Math.random() * 2147483647);\n    $scope.$parent.conf.idty_entropy = ~~(Math.random() * 2147483647) + \"\";\n    $scope.$parent.conf.idty_password = ~~(Math.random() * 2147483647) + \"\";\n    $state.go('configure.create.network');\n  }\n};\n","\"use strict\";\n\nmodule.exports = ($scope, UIUtils) => {\n\n  UIUtils.enableInputs();\n};\n","\"use strict\";\n\nvar co = require('co');\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = ($scope, $http, $state, Webmin) => {\n\n  $scope.generated = '';\n  $scope.started = false;\n  $scope.message = 'configuration.create_root.need_a_try';\n\n  $scope.start = () => co(function *() {\n    try {\n      let hosts = [];\n      if ($scope.$parent.conf.remote_ipv4) {\n        hosts.push([$scope.$parent.conf.remote_ipv4, $scope.$parent.conf.rport].join(':'));\n      }\n      if ($scope.$parent.conf.remote_ipv6) {\n        hosts.push([\"[\" + $scope.$parent.conf.remote_ipv6 + \"]\", $scope.$parent.conf.rport].join(':'));\n      }\n      $scope.host_listening = hosts.join('\\n');\n      $scope.started = true;\n      yield Webmin.server.sendConf({\n        conf: $scope.$parent.conf\n      });\n      yield $scope.try();\n    } catch (e) {\n      $scope.message = e.message;\n    }\n  });\n\n  $scope.stop = () => co(function *() {\n    $scope.started = false;\n  });\n\n  $scope.try = () => co(function *() {\n    try {\n      $scope.block = yield Webmin.server.previewNext();\n      $scope.generated = $scope.block.raw;\n      $scope.message = '';\n    } catch (e) {\n      $scope.message = e.message;\n    }\n  });\n\n  $scope.accept = () => co(function *() {\n    let res = yield Webmin.blockchain.block_add({\n      block: $scope.generated\n    });\n    if (res.number == 0) {\n      // We successfully started the blockchain\n      yield $scope.startServices();\n    }\n  });\n\n  $scope.startServices = () => co(function *() {\n    yield Webmin.server.services.startAll();\n    $state.go('index');\n  });\n\n  $scope.cancelAndReset = () => co(function *() {\n    yield Webmin.server.services.stopAll();\n    yield Webmin.server.resetData();\n    $state.go('index');\n  });\n\n  return co(function *() {\n    try {\n      yield $scope.start();\n      yield $scope.try();\n      $scope.started = true;\n    } catch (e) {\n      $scope.started = false;\n    }\n  });\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = ($scope, $http, $state, $timeout, $stateParams, $translate, UIUtils, Webmin) => {\n\n  let syncWS = Webmin.ws();\n\n  UIUtils.enableInputs();\n  $scope.sync_mode = 'simplified';\n  $scope.simplified_host = '';\n  $scope.synchronizing = false;\n  $scope.sync_failed = false;\n  $scope.host = $stateParams.host || localStorage.getItem('sync_host') || '';\n  $scope.port = parseInt($stateParams.port) || parseInt(localStorage.getItem('sync_port')) || 8999;\n  $scope.to = parseInt($stateParams.to);\n  $scope.wrong_host = false;\n  $scope.remote_current = null;\n\n  $scope.checkNode = () => co(function *() {\n    $scope.checked_host = '';\n    $scope.sync_error = '';\n    $scope.sync_message = '';\n    if ($scope.sync_mode == 'simplified') {\n      $scope.host = $scope.simplified_host.split(':')[0];\n      $scope.port = parseInt($scope.simplified_host.split(':')[1]);\n    }\n    $scope.checking = true;\n    try {\n      const current = yield Webmin.server.testSync({\n        host: $scope.host,\n        port: $scope.port\n      });\n      const targetHost = [$scope.host, $scope.port].join(':');\n      if (current) {\n        $scope.remote_current = current;\n        $scope.checked_host = targetHost;\n      }\n      UIUtils.toast('sync.ready.node.part1');\n      $timeout(() => {\n        if (!$scope.synchronizing) {\n          UIUtils.toast('sync.ready.node.part2');\n        }\n      }, 6000);\n    } catch (e) {\n      $scope.sync_error = 'sync.error.unreachable.try.another.node';\n    }\n    $scope.checking = false;\n    return $scope.checked_host ? true : false;\n  });\n\n  $scope.startSync = () => {\n    $scope.down_percent = 0;\n    $scope.apply_percent = 0;\n    $scope.sync_failed = false;\n    $scope.synchronizing = true;\n    return co(function *() {\n      $scope.sync_message = (yield $translate('sync.started.node')) + ' ' + $scope.checked_host;\n      let sp = $scope.checked_host.split(':');\n      let translatedErr = yield $translate('err.sync.interrupted');\n      syncWS.on(undefined, (data) => {\n        if (data.type == 'sync') {\n          $scope.down_percent = 100;\n          $scope.apply_percent = 100;\n          $scope.sync_failed = data.value;\n          let errorMessage = data.msg && (data.msg.message || data.msg);\n          errorMessage = translatedErr + ' « ' + errorMessage + ' »';\n          Webmin.server.republishNewSelfPeer()\n            .then(() => console.log('Peer republished'));\n          if (data.value === true) {\n            $state.go('index');\n          } else {\n            $state.go('error', { err: (errorMessage) });\n          }\n        } else {\n          let changed = true;\n          if (data.type == 'download' && $scope.down_percent != data.value) {\n            $scope.down_percent = data.value;\n            changed = true;\n          }\n          if (data.type == 'applied' && $scope.apply_percent != data.value) {\n            $scope.apply_percent = data.value;\n            changed = true;\n          }\n          if (changed) {\n            $scope.$apply();\n          }\n        }\n      });\n      yield Webmin.server.autoConfNetwork();\n      localStorage.setItem(\"sync_host\", sp[0]);\n      localStorage.setItem(\"sync_port\", sp[1]);\n      Webmin.server.startSync({\n        host: sp[0],\n        port: sp[1],\n        to: $scope.to,\n        chunkLen: Math.max(500, Math.min(25, $scope.remote_current ? $scope.remote_current.number / 100 : 0))\n      });\n    });\n  };\n\n  // Autostart\n  if ($scope.host && $scope.port && $stateParams.sync) {\n    return co(function *() {\n      let nodeOK = yield $scope.checkNode();\n      if (nodeOK) {\n        return $scope.startSync();\n      }\n    });\n  }\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = ($scope, $state, $http, $timeout, $interval, Webmin, summary, UIUtils, Base58) => {\n\n  const local_host = summary.host.split(':')[0]; // We suppose IPv4 configuration\n  const local_port = summary.host.split(':')[1];\n  const local_sign_pk = Base58.decode(summary.pubkey);\n  const local_sign_sk = Base58.decode(summary.seckey);\n\n  const DEFAULT_CESIUM_SETTINGS = {\n    \"useRelative\": true,\n    \"timeWarningExpire\": 2592000,\n    \"useLocalStorage\": true,\n    \"rememberMe\": true,\n    \"plugins\": {},\n    \"node\": {\n      \"host\": local_host,\n      \"port\": local_port\n    },\n    \"showUDHistory\": true\n  };\n\n  $scope.notifications = {\n    help: []\n  };\n\n  Waves.displayEffect();\n\n  var isMobile = require('js/lib/mobileDetector');\n  if (isMobile()) {\n    $(\".button-collapse\").sideNav({\n      menuWidth: 280\n    });\n  }\n\n  UIUtils.changeTitle(summary.version);\n\n  $scope.openWallet = () => {\n\n    let walletHeight = parseInt(localStorage.getItem('wallet_height')) || 1000;\n    let walletWidth = parseInt(localStorage.getItem('wallet_width')) || 1400;\n\n    openNewTab (window.location.origin + '/cesium/index.html', {\n      position: 'center',\n      height: walletHeight,\n      width: walletWidth,\n      show: false\n    }, function(win) {\n      let settingsStr = win.window.localStorage.getItem('CESIUM_SETTINGS');\n      let dataStr = win.window.localStorage.getItem('CESIUM_DATA');\n      let settings = (settingsStr && JSON.parse(settingsStr));\n      let data = (dataStr && JSON.parse(dataStr));\n      let keyPairOK = data && data.keypair && data.keypair.signPk && data.keypair.signSk && true;\n      if (keyPairOK) {\n        data.keypair.signPk.length = local_sign_pk.length;\n        data.keypair.signSk.length = local_sign_sk.length;\n        keyPairOK = Base58.encode(Array.from(data.keypair.signPk)) == summary.pubkey\n          && Base58.encode(Array.from(data.keypair.signSk)) == summary.seckey\n          && data.pubkey == summary.pubkey;\n      }\n      if (!data\n        || !keyPairOK\n        || settings.node.host != local_host\n        || settings.node.port != local_port) {\n        settings = settings || DEFAULT_CESIUM_SETTINGS;\n        data = data || {};\n        console.debug('Configuring Cesium...');\n        settings.node = {\n          \"host\": local_host,\n          \"port\": local_port\n        };\n        settings.plugins = {};\n        settings.rememberMe = true;\n        data.pubkey = summary.pubkey;\n        data.keypair = {\n          signPk: local_sign_pk,\n          signSk: local_sign_sk\n        };\n        win.window.localStorage.setItem('CESIUM_SETTINGS', JSON.stringify(settings));\n        win.window.localStorage.setItem('CESIUM_DATA', JSON.stringify(data));\n        win.on('closed', () => {\n          // Reopen the wallet\n          $timeout(() => $scope.openWallet(), 1);\n        });\n        win.close();\n      } else {\n        // Cesium is correctly configured for the network part\n        win.show();\n        win.on('closed', function() {\n          localStorage.setItem('wallet_height', win.window.innerHeight - 8); // Seems to always have 8 pixels more\n          localStorage.setItem('wallet_width', win.window.innerWidth - 16); // Seems to always have 16 pixels more\n          mainWindow.focus();\n        });\n      }\n    });\n  };\n\n  let aboutWin;\n\n  $scope.showAbout = () => {\n    if (aboutWin) {\n      aboutWin.focus();\n    } else {\n      openWindow(window.location.origin + '/#/about', {\n        position: 'center',\n        height: 380,\n        width: 510\n      }, function(subwin) {\n        subwin.window.gui = window.gui;\n        subwin.on('closed', () => {\n          aboutWin = null;\n          mainWindow.focus();\n        });\n        aboutWin = subwin;\n      });\n    }\n  };\n\n  $scope.startServer = () => {\n    $scope.server_stopped = false;\n    return co(function *() {\n      yield Webmin.server.services.startAll();\n      $scope.server_started = true;\n    });\n  };\n\n  $scope.stopServer = () => {\n    $scope.server_started = false;\n    return co(function *() {\n      yield Webmin.server.services.stopAll();\n      $scope.server_stopped = true;\n    });\n  };\n\n  $scope.restartServer = () => {\n    return co(function *() {\n      yield $scope.stopServer();\n      yield $scope.startServer();\n    });\n  };\n\n  function checkUpdates() {\n    const LATEST_RELEASE_URL = 'https://api.github.com/repos/duniter/duniter/releases/latest';\n    co(function*() {\n      try {\n        const latest = yield $http.get(LATEST_RELEASE_URL);\n        const local_string_version = 'v' + summary.version;\n        const m = local_string_version.match(/^v([\\d.]+)([ab]?\\d*)/);\n        const localVersion = (m && m[1]) || \"\";\n        const localSuffix = m && m[2];\n        const isLocalAPreRelease = !!(localSuffix);\n        const remoteVersion = latest.data.tag_name.substr(1);\n        if (localVersion < remoteVersion || (localVersion == remoteVersion && isLocalAPreRelease)) {\n          if ($scope.notifications.help.filter((entry) => entry.message == 'help.new_version_available').length == 0) {\n            $scope.notifications.help.push({\n              icon: 'play_for_work',\n              message: 'help.new_version_available',\n              onclick: () => openExternal('https://github.com/duniter/duniter/releases/latest')\n            });\n          }\n        }\n      } catch (e) {\n        console.error(e);\n      }\n    });\n  }\n\n  $interval(checkUpdates, 1000 * 3600);\n  $timeout(checkUpdates, 1000);\n};\n","\"use strict\";\n\nconst BLOCKS_COUNT = 40;\n\nvar co = require('co');\n\nmodule.exports = ($scope, $state, $timeout, Webmin, UIUtils, Graph) => {\n\n  let data = {};\n\n  $scope.loading = true;\n  $scope.blocksCount = $scope.blocksCount || BLOCKS_COUNT;\n\n  $scope.$watch('withTime', (newValue) => {\n    if (newValue) {\n      timeGraph();\n    }\n  });\n\n  $scope.$watch('withSpeed', (newValue) => {\n    if (newValue) {\n      speedGraph();\n    }\n  });\n\n  $scope.$watch('withDifficulty', (newValue) => {\n    if (newValue) {\n      diffGraph();\n    }\n  });\n\n  $scope.updateGraphs = () => {\n    return co(function *() {\n      let summary = yield Webmin.summary();\n      let parameters = yield Webmin.currency.parameters();\n      let blocks = yield Webmin.blockchain.blocks({\n        count: $scope.blocksCount,\n        from: Math.max(0, summary.current.number - $scope.blocksCount)\n      });\n      let speeds = [], accelerations = [], medianTimeIncrements = [], actualDurations = [];\n      let BY_HOUR = 3600;\n      for (let i = 0, len = blocks.length; i < len; i++) {\n        let block = blocks[i];\n        let acc = 0;\n        let previousPos = Math.max(0, i - parameters.dtDiffEval);\n        for (let j = previousPos; j < i; j++) {\n          acc += (blocks[j+1].medianTime - blocks[j].medianTime);\n        }\n        let availPreviousBlocks = i - 1 - previousPos;\n        let localAvgSpeed = acc / (availPreviousBlocks || 1);\n        let realDuration = !isNaN(localAvgSpeed) && localAvgSpeed != 0 ? localAvgSpeed : parameters.avgGenTime;\n        actualDurations.push(parseFloat((realDuration).toFixed(2)));\n        speeds.push(parseFloat((BY_HOUR/realDuration).toFixed(2)));\n        accelerations.push(block.time - block.medianTime);\n        medianTimeIncrements.push(block.medianTime - (i ? blocks[i-1].medianTime : block.medianTime));\n      }\n      data.summary = summary;\n      data.speeds = speeds;\n      data.accelerations = accelerations;\n      data.medianTimeIncrements = medianTimeIncrements;\n      data.actualDurations = actualDurations;\n      data.minSpeeds = speeds.map(() => parseFloat((BY_HOUR/Math.ceil(parameters.avgGenTime * Math.sqrt(1.066))).toFixed(2)));\n      data.maxSpeeds = speeds.map(() => parseFloat((BY_HOUR/Math.floor(parameters.avgGenTime / Math.sqrt(1.066))).toFixed(2)));\n      data.minDurations = speeds.map(() => parseFloat(((parameters.avgGenTime / 1.066)).toFixed(2)));\n      data.maxDurations = speeds.map(() => parseFloat(((parameters.avgGenTime * 1.066)).toFixed(2)));\n      data.difficulties = blocks.map((b) => b.powMin);\n\n      let graphs = [];\n      if ($scope.withTime) graphs.push(timeGraph);\n      if ($scope.withSpeed) graphs.push(speedGraph);\n      if ($scope.withDifficulty) graphs.push(diffGraph);\n      for (let i = 0, len = graphs.length; i < len; i++) {\n        graphs[i]();\n      }\n      $scope.loading = false;\n    });\n  };\n\n  function timeGraph() {\n    if ($scope.withTime) {\n      Graph.timeGraphs('#timeGraph', Math.max(0, data.summary.current.number - $scope.blocksCount + 1), data.accelerations, data.medianTimeIncrements, data.actualDurations, data.minDurations, data.maxDurations);\n    }\n  }\n\n  function speedGraph() {\n    if ($scope.withSpeed) {\n      Graph.speedGraph('#speedGraph', Math.max(0, data.summary.current.number - $scope.blocksCount), data.speeds, data.minSpeeds, data.maxSpeeds, (series) => {\n        $scope.series = series;\n      });\n    }\n  }\n\n  function diffGraph() {\n    if ($scope.withDifficulty) {\n      Graph.difficultyGraph('#difficultyGraph', Math.max(0, data.summary.current.number - $scope.blocksCount), data.difficulties);\n    }\n  }\n\n  return co(function *() {\n    yield $scope.updateGraphs();\n    $scope.withTime = true;\n    $scope.withDifficulty = true;\n    $scope.$apply();\n  });\n};\n","\"use strict\";\n\nmodule.exports = ($scope, UIUtils) => {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.menu = 'graphs';\n};\n","\"use strict\";\n\nmodule.exports = ($scope, UIUtils) => {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.menu = 'home';\n};\n","\"use strict\";\n\nmodule.exports = ($scope, Webmin, peers) => {\n\n  $scope.peers = peers.peers;\n\n  const co = require('co');\n\n  $scope.update = () => co(function *() {\n    $scope.searching = true;\n    let delayP = Q.delay(500);\n    $scope.peers = (yield Webmin.network.peers()).peers;\n    yield delayP;\n    $scope.searching = false;\n    $scope.$apply();\n  });\n};\n","\"use strict\";\n\nmodule.exports = ($scope, $interval, Webmin, UIUtils, summary, ws) => {\n\n  let co = require('co');\n  let moment = require('moment');\n\n  bindBlockWS(() => {\n    $scope.loadPowData();\n  });\n  let M = summary.current.monetaryMass || 0;\n  // const nbUDperYear = Math.ceil(365.25 * 3600 * 24 / summary.parameters.dt);\n  // const globalC = Math.round(Math.pow(1 + summary.parameters.c, nbUDperYear) * 100) / 100 - 1;\n  let UD = summary.parameters.ud0;\n  if (summary.lastUDBlock) {\n    const N = summary.current.membersCount;\n    UD = parseInt((summary.lastUDBlock.dividend * Math.pow(10, summary.lastUDBlock.unitbase) + Math.pow(summary.parameters.c, 2) * M / N).toFixed(0));\n  }\n  $scope.current = summary.current;\n  $scope.current_currency = summary.current.currency;\n  $scope.current_number = summary.current.number;\n  $scope.current_membersCount = summary.current.membersCount;\n  $scope.current_medianTime = summary.current.medianTime;\n  $scope.current_powMin = summary.current.powMin;\n  $scope.monetaryMass = parseInt(M / UD) || 0;\n  $scope.server_started = true;\n  $scope.server_stopped = false;\n  $scope.phones = [];\n  $scope.abc = 'abcdef';\n  $scope.newIdentities = 2;\n\n  $(\".dropdown-button\").dropdown({ constrainwidth: false });\n\n  $scope.lastNearPoW = '';\n  $scope.totalPoW = '...';\n  $scope.sync_state = 'home.pulling.state.unkown';\n  $scope.network_percent = 0;\n  $scope.peer_percent = 0;\n  $scope.has_pulled = false;\n  $scope.is_pulling = false;\n  $scope.last_pulling = 0;\n  let start_block = 0;\n\n  $interval(() => {\n    if ($scope.last_pulling) {\n      $scope.sync_state = $scope.is_pulling ? 'home.pulling.state.syncing' : 'home.pulling.state.synced';\n      $scope.sync_time = moment($scope.last_pulling).fromNow();\n    }\n  }, 1000);\n\n  $scope.loadPowData = () => co(function*() {\n    let res = yield Webmin.powSummary();\n    $scope.pow_total = res.total;\n    $scope.pow_mirror = res.mirror;\n    $scope.pow_waiting = res.waiting;\n  });\n\n  ws.on(undefined, (data) => {\n    if (data.type === 'started') {\n      $scope.server_started = true;\n      $scope.server_stopped = false;\n      bindBlockWS();\n      UIUtils.toast('general.server.started');\n      $scope.$apply();\n    }\n    if (data.type === 'stopped') {\n      $scope.server_stopped = true;\n      $scope.server_started = false;\n      UIUtils.toast('general.server.stopped');\n      $scope.$apply();\n    }\n    if (data.type === 'pulling') {\n      $scope.is_pulling = true;\n      $scope.has_pulled = true;\n      const event = data.value;\n      if (($scope.last_pulling && event.type === 'start') || (!$scope.last_pulling && event.type !== 'end')) {\n        $scope.last_pulling = moment();\n      }\n      if (event.type === 'peer') {\n        $scope.network_percent = parseInt((event.data.number + 1) / event.data.length * 100);\n        $scope.peer_percent = 100;\n        start_block = 0;\n      }\n      if (event.type === 'applying') {\n        if (!start_block) {\n          start_block = event.data.number;\n        }\n        const total = event.data.last - start_block;\n        const doneCount = event.data.number - start_block;\n        $scope.peer_percent = parseInt(doneCount / total * 100);\n      }\n      if (event.type === 'end') {\n        $scope.is_pulling = false;\n        $scope.network_percent = 0;\n        $scope.peer_percent = 0;\n        start_block = 0;\n      }\n    }\n    if (data.type === 'pow') {\n      const pow = data.value;\n      if (pow.found) {\n        $scope.pow_waiting = true;\n        $scope.lastNearPoW = '#' + pow.hash;\n        $scope.$apply();\n      } else {\n        $scope.pow_waiting = false;\n        $scope.lastNearPoW = '#' + pow.hash;\n        $scope.$apply();\n      }\n    }\n  });\n\n  function bindBlockWS(cb) {\n    Webmin.wsBlock().on(undefined, (block) => {\n      $scope.current_currency = block.currency;\n      $scope.current_number = block.number;\n      $scope.current_membersCount = block.membersCount;\n      $scope.current_medianTime = block.medianTime;\n      $scope.current_powMin = block.powMin;\n      let M = summary.current.monetaryMass || 0;\n      let UD = summary.parameters.ud0;\n      if (summary.lastUDBlock) {\n        const N = summary.current.membersCount;\n        UD = parseInt((summary.lastUDBlock.dividend * Math.pow(10, summary.lastUDBlock.unitbase) + Math.pow(summary.parameters.c, 2) * M / N).toFixed(0));\n      }\n      $scope.monetaryMass = parseInt(M / UD) || 0;\n      $scope.$apply();\n      cb && cb();\n    });\n  }\n  \n  $scope.reconfigure_network = () => co(function *() {\n    $scope.reconfiguring = true;\n    let delay = Q.delay(1000);\n    try {\n      let netinferfaces = yield Webmin.network.interfaces();\n      let conf = {};\n      conf.local_ipv4 = netinferfaces.auto.local.ipv4 || '';\n      conf.local_ipv6 = netinferfaces.auto.local.ipv6 || '';\n      conf.remote_ipv4 = netinferfaces.auto.remote.ipv4 || '';\n      conf.remote_ipv6 = netinferfaces.auto.remote.ipv6 || '';\n      conf.lport = netinferfaces.auto.local.port || 9330;\n      conf.rport = netinferfaces.auto.remote.port || 9330;\n      conf.upnp = netinferfaces.auto.remote.upnp || false;\n      conf.dns = netinferfaces.auto.remote.dns || '';\n      yield Webmin.server.netConf({\n        conf: conf\n      });\n      yield delay;\n      $scope.should_reconfigure = false;\n      UIUtils.toast('general.network.reconf_ok');\n      $scope.$apply();\n    } catch (e) {\n      yield delay;\n      $scope.reconfiguring = false;\n      $scope.$apply();\n    }\n  });\n\n  return co(function *() {\n    yield $scope.startServer();\n    try {\n      yield $scope.loadPowData();\n      const reachable = yield Webmin.isNodePubliclyReachable();\n      if (!reachable || !reachable.success) {\n        $scope.should_reconfigure = true;\n      }\n    } catch (e) {\n      console.log(e);\n    }\n  });\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = ($scope, $http, $state, $location, Webmin, UIUtils) => {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.conf = $scope.$parent.conf || {};\n  $scope.$parent.menu = 'settings';\n\n  $(\".dropdown-button\").dropdown({ constrainwidth: false });\n\n  $scope.fullReset = () => co(function *() {\n    yield Webmin.server.services.stopAll();\n    yield Webmin.server.resetData();\n    $state.go('index');\n  });\n};\n","\"use strict\";\n\nmodule.exports = ($scope, Importer, Webmin) => {\n\n  $scope.export_link = Webmin.getExportURL();\n\n  Importer($scope);\n};\n","\"use strict\";\n\nconst co = require('co');\n\nmodule.exports = ($scope, $http, $state, $timeout, UIUtils, summary, Webmin) => {\n\n  $scope.cpuPower = parseInt(summary.conf.cpu * 100);\n\n  $scope.updateCPUpower = () => co(function *() {\n    $scope.savingCPU = true;\n    yield Webmin.server.cpuConf({\n      cpu: parseFloat(($scope.cpuPower / 100).toFixed(2))\n    });\n    UIUtils.toast('settings.cpu.saved');\n    $scope.savingCPU = false;\n  });\n};\n","\"use strict\";\n\nmodule.exports = ($scope, conf, UIUtils) => {\n\n  $scope.$parent.conf = conf;\n\n  UIUtils.enableInputs();\n  $('input').attr('disabled', 'disabled');\n};\n","\"use strict\";\n\nvar co = require('co');\nvar Peer = require('js/lib/entity/peer');\n\nmodule.exports = ($scope, $http, $state, Webmin, peers) => {\n\n  $scope.peers = peers.map((peer) => {\n    let p = new Peer(peer);\n    return {\n      name: [p.getURL(), \"(\" + p.pubkey.slice(0, 6) + \")\"].join(' '),\n      host_port: [p.getHost(), p.getPort()].join('|')\n    }\n  });\n\n  $scope.resetNode = () => {\n    $('#modalReset').openModal();\n  };\n\n  $scope.resetNodeAndSync = () => co(function *() {\n    yield Webmin.server.services.stopAll();\n    yield Webmin.server.resetData();\n    let sp = $scope.remote_host.split('|');\n    $state.go('sync', {\n      host: sp[0],\n      port: sp[1],\n      sync: true\n    })\n  });\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = ($scope, $state, Webmin, summary, PubkeyGenerator) => {\n\n  $scope.pubkey = summary.pubkey;\n\n  setTimeout(() => {\n    $('select').material_select();\n  }, 500);\n\n  $scope.accept = () => co(function *() {\n    yield Webmin.server.keyConf({\n      conf: $scope.$parent.conf\n    });\n    $scope.$parent.conf.idty_entropy = '';\n    $scope.$parent.conf.idty_password = '';\n    $state.reload();\n    $scope.restartServer();\n  });\n\n  PubkeyGenerator($scope);\n};\n","\"use strict\";\n\nmodule.exports = ($scope, ws, UIUtils) => {\n\n  UIUtils.enableTabs();\n\n  let co = require('co');\n  let _ = require('underscore');\n\n  // Default values\n  if (!localStorage.getItem('log_error')) localStorage.setItem('log_error', true);\n  if (!localStorage.getItem('log_warn')) localStorage.setItem('log_warn', true);\n  if (!localStorage.getItem('log_info')) localStorage.setItem('log_info', true);\n\n  $scope.logsSize = parseInt(localStorage.getItem('log_size')) || 100;\n  $scope.logs = _.range(0, $scope.logsSize).map(() => \"\");\n  $scope.logsString = \"\";\n  $scope.follow = true;\n  $scope.levels = {\n    error: localStorage.getItem('log_error') == \"true\",\n    warn: localStorage.getItem('log_warn') == \"true\",\n    info: localStorage.getItem('log_info') == \"true\",\n    debug: localStorage.getItem('log_debug') == \"true\",\n    trace: localStorage.getItem('log_trace') == \"true\"\n  };\n\n  _.keys($scope.levels).map((level) => {\n    $scope.$watch('levels.' + level, (newValue) => {\n      localStorage.setItem('log_' + level, newValue);\n      $scope.logs.splice(0, $scope.logs.length);\n      ws.send();\n    });\n  });\n\n  $scope.$watch('logsSize', (newValue) => {\n    localStorage.setItem('log_size', newValue);\n    addLogs({ value: [] }, true);\n  });\n\n  ws.on('log', addLogs);\n\n  function addLogs(res, autoDigest) {\n\n    if (!$scope.pause) {\n      let newlogs = _.filter(res.value, (log) => $scope.levels[log.level]);\n      // Add at max LOGS_FLOW_SIZE new lines\n      newlogs.splice(0, Math.max(0, newlogs.length - $scope.logsSize));\n      // Add just enough space for incoming logs\n      $scope.logs.splice(0, Math.max(0, $scope.logs.length + newlogs.length - $scope.logsSize));\n      for (let i = 0, len = newlogs.length; i < len; i++) {\n        let log = newlogs[i];\n        $scope.logs.push(log);\n      }\n      if (!autoDigest) {\n        $scope.$apply();\n      }\n    }\n\n    if ($scope.follow) {\n      var elem = document.getElementById('logs');\n      if (elem) {\n        elem.scrollTop = elem.scrollHeight;\n      }\n    }\n  }\n\n  return co(function *() {\n    yield ws.whenOpened();\n    ws.send();\n  });\n};\n","\"use strict\";\n\nconst co = require('co');\n\nmodule.exports = ($scope, Webmin) => {\n  \n  $scope.generating = false;\n  $scope.error = '';\n\n  $scope.shareLogs = () => co(function*() {\n    if (!$scope.generating) {\n      try {\n        $scope.error = '';\n        $scope.generating = true;\n        const res = yield Webmin.logsExport(2000);\n        $scope.link = res.link;\n      } catch (e) {\n        $scope.error = (e && e.message) || e || 'Unknown error';\n      }\n      $scope.generating = false;\n    }\n  });\n};\n","\"use strict\";\n\nvar co = require('co');\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = ($scope, $http, $state, Webmin, UIUtils, netinterfaces, firstConf) => {\n\n  let autoconf = netinterfaces.auto;\n\n  $scope.autoconfig = () => {\n    $scope.$parent.conf.local_ipv4 = autoconf.local.ipv4 || '';\n    $scope.$parent.conf.local_ipv6 = autoconf.local.ipv6 || '';\n    $scope.$parent.conf.remote_ipv4 = autoconf.remote.ipv4 || '';\n    $scope.$parent.conf.remote_ipv6 = autoconf.remote.ipv6 || '';\n    $scope.$parent.conf.lport = autoconf.local.port || $scope.$parent.conf.lport;\n    $scope.$parent.conf.rport = autoconf.remote.port || $scope.$parent.conf.rport;\n    $scope.$parent.conf.upnp = autoconf.remote.upnp || $scope.$parent.conf.upnp;\n    $scope.$parent.conf.dns = autoconf.remote.dns || $scope.$parent.conf.dns;\n\n    if (conf.dev_autoconf && firstConf) {\n      $state.go('configure.create.root');\n    }\n  };\n\n  $scope.local_neti = toArrayOfAddresses(netinterfaces.local);\n  $scope.remote_neti = toArrayOfAddresses(netinterfaces.remote);\n\n  $scope.$parent.conf = $scope.$parent.conf || {};\n  $scope.$parent.conf.local_ipv4 = netinterfaces.conf.local.ipv4;\n  $scope.$parent.conf.local_ipv6 = netinterfaces.conf.local.ipv6;\n  $scope.$parent.conf.remote_ipv4 = netinterfaces.conf.remote.ipv4;\n  $scope.$parent.conf.remote_ipv6 = netinterfaces.conf.remote.ipv6;\n  $scope.$parent.conf.lport = netinterfaces.conf.local.port;\n  $scope.$parent.conf.rport = netinterfaces.conf.remote.port;\n  $scope.$parent.conf.upnp = netinterfaces.conf.remote.upnp;\n  $scope.$parent.conf.dns = netinterfaces.conf.remote.dns;\n\n  UIUtils.enableInputs();\n\n  if (firstConf) {\n    $scope.$parent.conf.lport = conf.default_port;\n    $scope.$parent.conf.rport = conf.default_port;\n    // Trigger autoconfig\n    $scope.autoconfig();\n  }\n\n  $scope.saveConf = () => co(function *() {\n    $scope.$parent.conf.lport = $scope.$parent.conf.rport;\n    $scope.$parent.conf.remote_ipv6 = $scope.$parent.conf.local_ipv6;\n    yield Webmin.server.netConf({\n      conf: $scope.$parent.conf\n    });\n    UIUtils.toast('settings.network.saved');\n  });\n};\n\nfunction toArrayOfAddresses(netiScope) {\n  return netiScope.reduce(function(arr, neti) {\n    return arr.concat(neti.addresses.map((addr) => {\n      return {\n        name: [neti.name, addr.address].join(' '),\n        addr: addr.address,\n        family: addr.family\n      };\n    }))\n  }, []);\n}\n","module.exports = () => {\n  require('./services/webmin')(angular);\n\n  const duniterApp = angular.module('duniterUIApp', [\n    'ui.router',\n    'homeControllers',\n    'pascalprecht.translate'\n  ]);\n\n  duniterApp.config( [\n    '$compileProvider', ($compileProvider) => $compileProvider.aHrefSanitizationWhitelist(/^\\s*(https?|data):/)\n  ]);\n\n  require('./lib/conf/translate')(duniterApp);\n  require('./lib/conf/routes')(duniterApp);\n  require('js/services/datetime')(duniterApp);\n  require('js/services/ui_utils')(duniterApp);\n  require('js/services/graphs')(duniterApp);\n  require('js/services/pubkeyGenerator')(duniterApp);\n  require('js/services/importer')(duniterApp);\n  require('js/services/base58')(duniterApp);\n\n  window.duniterChildCallback = function(gui) {\n    window.gui = gui;\n  };\n\n  window.onresize = () => {\n    window.onResize && window.onResize(window);\n  };\n\n  window.openWindow = function openWindow(url, options, callback) {\n    if (window.gui) {\n      // Duniter Desktop\n      window.gui.Window.open(url, options, callback);\n    } else {\n      // Browser\n      let innerHeight = options.height || 375;\n      let innerWidth = options.width || 500;\n      window.open(url, '_blank ', [\n        'top=' + (window.screenTop + (options.top || 200)),\n        'left=' + (window.screenLeft + (options.left || 200)),\n        'height=' + (innerHeight + 8),\n        'width=' + (innerWidth + 16),\n        'menubar=no',\n        'status=no'\n      ].join(','));\n    }\n  };\n\n  window.openNewTab = function openWindow(url, options, callback) {\n    if (window.gui) {\n      // Duniter Desktop\n      window.gui.Window.open(url, options, callback);\n    } else {\n      // Browser\n      window.open(url, '_blank ');\n    }\n  };\n\n  window.openExternal = function openExternal(url) {\n    if (window.gui) {\n      window.gui.Shell.openExternal(url);\n    } else {\n      window.open(url, '_blank');\n    }\n  };\n\n  let homeControllers = angular.module('homeControllers', ['duniter.services.webmin', 'ngFileUpload']);\n\n  homeControllers.controller('IndexController',            require('./controllers/IndexController'));\n  homeControllers.controller('AboutController',            require('./controllers/AboutController'));\n  homeControllers.controller('IdentityController',         require('./controllers/init/create/IdentityController'));\n  homeControllers.controller('ParametersController',       require('./controllers/init/create/ParametersController'));\n  homeControllers.controller('RootBlockController',        require('./controllers/init/create/RootBlockController'));\n  homeControllers.controller('SyncController',             require('./controllers/init/sync/SyncController'));\n  homeControllers.controller('MainController',             require('./controllers/main/MainController'));\n  homeControllers.controller('HomeController',             require('./controllers/main/home/HomeController'));\n  homeControllers.controller('OverviewController',         require('./controllers/main/home/tabs/OverviewController'));\n  homeControllers.controller('HomeNetworkController',      require('./controllers/main/home/tabs/HomeNetworkController'));\n  homeControllers.controller('LogsController',             require('./controllers/main/settings/tabs/LogsController'));\n  homeControllers.controller('LogsSettingsController',     require('./controllers/main/settings/tabs/LogsSettingsController'));\n  homeControllers.controller('NetworkController',          require('./controllers/main/settings/tabs/NetworkController'));\n  homeControllers.controller('SettingsController',         require('./controllers/main/settings/SettingsController'));\n  homeControllers.controller('DataController',             require('./controllers/main/settings/tabs/DataController'));\n  homeControllers.controller('BackupController',           require('./controllers/main/settings/tabs/BackupController'));\n  homeControllers.controller('CPUController',              require('./controllers/main/settings/tabs/CPUController'));\n  homeControllers.controller('CurrencyController',         require('./controllers/main/settings/tabs/CurrencyController'));\n  homeControllers.controller('KeyController',              require('./controllers/main/settings/tabs/KeyController'));\n  homeControllers.controller('GraphsController',           require('./controllers/main/graphs/GraphsController'));\n  homeControllers.controller('GraphsBlockchainController', require('./controllers/main/graphs/GraphsBlockchainController'));\n};\n","\"use strict\";\n\nmodule.exports = {\n\n  init: () => {\n\n    // Hack since Node v5\n    try {\n      window.jade = require('jade' + '/' + 'runtime');\n    } catch (e) {\n    }\n\n    console.log('Configuring Angular app...');\n\n    require('./app.config')();\n\n    console.log('App initialized.');\n  }\n};\n","module.exports = {\n  server: \"\", // Empty server will use the browser current host\n  port: \"\",   // Empty port will use the browser current port\n  default_port: 9220,\n  dev_autoconf: false,\n  api_timeout: 10000 // 10 sec timeout\n};\n","module.exports = {\n  \"top.menu.overview\": \"Home\",\n  \"top.menu.data\": \"Explore\",\n  \"top.menu.settings\": \"Settings\",\n  \"top.menu.wallet\": \"Wallet\",\n  \"general.server.started\": \"Server started\",\n  \"general.server.stopped\": \"Server stopped\",\n  \"general.choose_option\": \"Choose your option\",\n  \"general.network.reconf_ok\": \"Reconfiguration success\",\n  \"global.button.validate\": \"Validate\",\n  \"global.button.start\": \"Start\",\n  \"err.unknown\": \"Unknown error\",\n  \"err.connection\": \"Could not connect to node\",\n  \"err.back_index\": \"Get back to previous screen\",\n  \"err.sync.interrupted\": \"Sync interrupted because the following error occured:\",\n  \"index.message.loading\": \"Loading...\",\n  \"crypto.secret_key\": \"Secret key\",\n  \"index.message.current_block\": \"Current block {{ number }}\",\n  \"configuration.init.choose.title\": \"Initialization\",\n  \"configuration.init.choose.message\": \"Your software has to be initialized. You may either create a new currency or connect to an existing one.\",\n  \"configuration.init.choose.create\": \"Create a new currency\",\n  \"configuration.init.choose.connect\": \"Connect to an existing currency\",\n  \"configuration.init.choose.import\": \"Import from a backup file\",\n  \"configuration.create_currency.cancel\": \"Cancel & go home\",\n  \"configuration.create_uid.title\": \"Your identity\",\n  \"configuration.create_uid.message\": \"As a first step, you need to define your personal, unique identity.<br/>The following informations will be <strong>definitive</strong> for this currency: please choose them carefully.\",\n  \"configuration.create_uid.uid.tooltip\": \"The name you will be known as.\",\n  \"configuration.create_uid.entropy.tooltip\": \"An entropy source to make your key unique: an e-mail, a phone n°, ...\",\n  \"configuration.create_uid.password.tooltip\": \"A secret password to protect your key.\",\n  \"configuration.create_uid.create_button\": \"Continue\",\n  \"configuration.create_uid.preview_button\": \"Preview pubkey\",\n  \"configuration.create_uid.nrp_algo_choose\": \"NRP algorithm\",\n  \"configuration.create_uid.nrp_algo_choose_1\": \"N = 4096 ; r = 16 ; p = 1\",\n  \"configuration.create_uid.modal_title\": \"Identity confirmation\",\n  \"configuration.create_uid.modal_message\": \"This identity will be definitive for this currency: you will be known by your User ID and will be able to access your account using your Secret Key and Password values.\",\n  \"configuration.create_uid.modal_agree\": \"Agree\",\n  \"configuration.create_uid.modal_disagree\": \"Disagree\",\n  \"configuration.create_uid.modal_preview_title\": \"Preview of pubkey\",\n  \"configuration.create_uid.modal_preview_ok\": \"OK\",\n  \"configuration.create_network.title\": \"Network\",\n  \"configuration.create_network.message\": \"uCoin is a P2P software and needs bidirectionnal access to the network. Please chose carefully the following parameters.\",\n  \"configuration.create_network.none\": \"None\",\n  \"configuration.create_network.ipv4.title\": \"IPv4\",\n  \"configuration.create_network.ipv6.title\": \"IPv6\",\n  \"configuration.create_network.ipv4.message\": \"For compatibilty reasons, you may prefer to use classic IPv4 interfaces. The configuration is more complicated.\",\n  \"configuration.create_network.local_ipv4\": \"Private (computer)\",\n  \"configuration.create_network.remote_ipv4\": \"Public (box/router)\",\n  \"configuration.create_network.local_ipv6\": \"IPv6\",\n  \"configuration.create_network.port\": \"Port\",\n  \"configuration.create_network.port.title\": \"Port\",\n  \"configuration.create_network.ipv6.message\": \"IPv6 gives your computer a unique, direct address to your node over the Internet. This is the <b>recommended way</b> to connect your node to the network.\",\n  \"configuration.create_network.port.message\": \"Wether you use IPv6 or IPv4, Duniter node will use this port number for connection to the network. With IPv4, this number will be used for both private and public interfaces.\",\n  \"configuration.create_network.dns.title\": \"Domain name\",\n  \"configuration.create_network.dns\": \"Domain name\",\n  \"configuration.create_network.dns.message\": \"IPv6 (AAAA) and IPv4 (A) DNS records will be used.\",\n  \"configuration.create_network.upnp\": \"Use UPnP\",\n  \"configuration.create_network.button.validate\": \"Continue\",\n  \"configuration.create_network.button.autoconf\": \"Automatic configuration\",\n  \"configuration.create_parameters.title\": \"Currency\",\n  \"configuration.create_parameters.message\": \"Initial parameters of the currency. It should be carefully chosen, as these parameters never change once the currency is started.\",\n  \"configuration.create_parameters.currency.title\": \"Money units\",\n  \"configuration.create_parameters.currency.message\": \"Give a name to your currency. The 3 following parameters configure the way new money units are created.\",\n  \"configuration.create_parameters.currency\": \"Currency name\",\n  \"configuration.create_parameters.c\": \"c\",\n  \"configuration.create_parameters.dt\": \"UD period\",\n  \"configuration.create_parameters.ud0\": \"UD(0)\",\n  \"configuration.create_parameters.button.validate\": \"Continue\",\n  \"configuration.create_parameters.wot.title\": \"Web of Trust\",\n  \"configuration.create_parameters.wot.message\": \"The following parameters deal with identities and their links gathered in the Web of Trust concept.\",\n  \"configuration.create_parameters.sigStock\": \"Max cert stock\",\n  \"configuration.create_parameters.sigPeriod\": \"Delay between 2 certs\",\n  \"configuration.create_parameters.sigValidity\": \"Cert expiry delay\",\n  \"configuration.create_parameters.msValidity\": \"Membership expiry delay\",\n  \"configuration.create_parameters.sigQty\": \"Min required certs\",\n  \"configuration.create_parameters.sigWindow\": \"Cert time window\",\n  \"configuration.create_parameters.stepMax\": \"Max distance\",\n  \"configuration.create_parameters.xpercent\": \"Percent of distance\",\n  \"configuration.create_parameters.blockchain.title\": \"Blockchain\",\n  \"configuration.create_parameters.blockchain.message\": \"The technical support of money and identities is the blockchain. It also has some parameters driving its behavior.\",\n  \"configuration.create_parameters.medianTimeBlocks\": \"Blocks count\",\n  \"configuration.create_parameters.avgGenTime\": \"Block gen. duration\",\n  \"configuration.create_parameters.dtDiffEval\": \"Blocks count for diff.\",\n  \"configuration.create_parameters.blocksRot\": \"Personal diff. blocks\",\n  \"configuration.create_parameters.percentRot\": \"Personal diff. rotation\",\n  \"configuration.create_root.title\": \"Root block creation\",\n  \"configuration.create_root.message\": \"This is the final step to create the new currency! The root block or <i>genesis</i> will include the first members and define the currency parameters. Once generated and submitted, the blockchain will be started.\",\n  \"configuration.create_root.button.start\": \"Start HTTP\",\n  \"configuration.create_root.button.stop\": \"Stop HTTP\",\n  \"configuration.create_root.button.generate\": \"Give a try\",\n  \"configuration.create_root.need_a_try\": \"You need to generate a first block with the « Give a try » button. Start HTTP server to do so.\",\n  \"configuration.create_root.button.accept_and_send\": \"Accept this block and start currency\",\n  \"configuration.create_root.button.cancel\": \"Cancel creation and go to home screen\",\n  \"configuration.create_root.host_listening\": \"Host listening at:\",\n  \"configuration.create_uid.pubkey_preview\": \"Public key preview\",\n  \"home.current.number\": \"Current block #\",\n  \"home.current.membersCount\": \"Members count\",\n  \"home.current.medianTime\": \"Median time\",\n  \"home.current.powMin\": \"Common difficulty level\",\n  \"home.current.mmass\": \"Monetary mass\",\n  \"home.pulling.network\": \"Network\",\n  \"home.pulling.peer\": \"Peer\",\n  \"home.pulling.state.unkown\": \"Next sync in few minutes\",\n  \"home.pulling.state.synced\": \"Synced\",\n  \"home.pulling.state.syncing\": \"Syncing...\",\n  \"home.pow.unit\": \"blocks made by this key\",\n  \"home.pow.is_mirror\": \"This node is a mirror\",\n  \"home.pow.is_waiting\": \"Waiting for better proof conditions\",\n  \"home.tabs.overview\": \"Overview\",\n  \"home.tabs.overview.should_reconfigure\": \"Your configuration has changed and your node is no more reachable from the network. You should reconfigure it to have a functional node. If this message appears again, you should manually configure the network settings. Often, selecting only IPv6 interface (disabling IPv4) solves the problem.\",\n  \"home.tabs.network\": \"Peers\",\n  \"home.tabs.network.button.update\": \"Check peers again\",\n  \"home.tabs.logs\": \"Logs\",\n  \"home.tabs.logs.follow.logs\": \"Follow logs\",\n  \"home.tabs.logs.pause.logs\": \"Pause logs\",\n  \"home.tabs.logs.level.error\": \"Error\",\n  \"home.tabs.logs.level.warn\": \"Warning\",\n  \"home.tabs.logs.level.info\": \"Info\",\n  \"home.tabs.logs.level.debug\": \"Debug\",\n  \"home.tabs.logs.level.trace\": \"Trace\",\n  \"sync.title\": \"Synchronize\",\n  \"sync.message\": \"Your node will be synchronized with an existing currency: just enter technical details about a node to sync with it.\",\n  \"sync.host\": \"Host\",\n  \"sync.port\": \"Port\",\n  \"sync.check\": \"Check node\",\n  \"sync.start\": \"Synchronize with this node\",\n  \"sync.failed\": \"Synchronization failed.\",\n  \"sync.mode.simplified\": \"Simplified mode\",\n  \"sync.mode.manual\": \"Manual mode\",\n  \"sync.simplified.choose\": \"Node to connect to\",\n  \"sync.simplified.default_option\": \"Please select a node to continue\",\n  \"sync.simplified.currency\": \"Currency\",\n  \"sync.simplified.main_mirror\": \"(main mirror)\",\n  \"sync.simplified.official_mirror\": \"(other official mirror)\",\n  \"sync.ready.node.part1\": \"This node is available!\",\n  \"sync.ready.node.part2\": \"Click on the green button to proceed.\",\n  \"sync.started.node\": \"Synchronization started on node:\",\n  \"sync.error.unreachable.try.another.node\": \"This node is not available. Please select another one.\",\n  \"home.menu.server.stop\": \"Stop server\",\n  \"home.menu.server.start\": \"Start server\",\n  \"home.menu.server.restart\": \"Restart server\",\n  \"home.state\": \"Server:\",\n  \"home.state.started\": \"STARTED\",\n  \"home.state.stopped\": \"STOPPED\",\n  \"settings.tabs.logs\": \"Logs\",\n  \"settings.tabs.data\": \"Data\",\n  \"settings.tabs.backup\": \"Backup\",\n  \"settings.tabs.identity\": \"Crypto\",\n  \"settings.tabs.network\": \"Network\",\n  \"settings.tabs.currency\": \"Currency\",\n  \"settings.tabs.cpu\": \"CPU\",\n  \"settings.data.reset.title\": \"Reset this node\",\n  \"settings.data.reset.message\": \"If you desire to reset this node's data and sync it again with the network, please select a node to sync against and validate.\",\n  \"settings.data.reset.warning\": \"This process <strong>will not</strong> reset the node identity and network settings, which will be reused.\",\n  \"settings.data.reset.peer.none_option\": \"Select a node\",\n  \"settings.data.reset.peer.label\": \"Synchronization peer\",\n  \"settings.data.reset.button\": \"Full reset of the node\",\n  \"settings.data.reset_sync.button\": \"Reset data and start sync\",\n  \"settings.logs.title\": \"Logs\",\n  \"settings.logs.consult.message\": \"Your node continually generates information messages in a log file. This information may help you understand what your node <i>is doing</i> or what it <i>has done</i> few times ago.\",\n  \"settings.logs.consult.button\": \"View real-time logs\",\n  \"settings.logs.share.message\": \"You may want to <b>share your logs</b> with other people, sometimes to get help or to add informations in a bug tracker. Clicking on below button will extract the last 2000 lines of your logs and push it on the web, returning you a link to be shared with whoever you want.\",\n  \"settings.logs.share.button\": \"Create a web link to your logs\",\n  \"settings.logs.share.generating\": \"Generating your link...\",\n  \"settings.logs.share.error\": \"An error occurred during the generation of your link:\",\n  \"settings.data.backup.title\": \"Backup\",\n  \"settings.data.backup.message\": \"You can create backups of your node's data and restore them using the buttons below.\",\n  \"settings.data.backup.warning\": \"<b>Export</b> will only backup your node's data, which <i>excludes your secret key and configuration details</i>.<br><b>Import</b> will reset your node's data by applying the backup. Your secret keys and configuration remains untouched.\",\n  \"settings.data.backup.button.export\": \"Create a data backup\",\n  \"settings.data.backup.button.import\": \"Import a data backup\",\n  \"settings.data.backup.importing\": \"Importing data...\",\n  \"settings.data.backup.imported\": \"Import successfull!\",\n  \"settings.network.button.validate\": \"Save and apply network settings\",\n  \"settings.network.saved\": \"Configuration saved and applied successfully\",\n  \"settings.key.title\": \"Public key of this node:\",\n  \"settings.key.button.validate\": \"Save and use this key\",\n  \"settings.key.button.change\": \"Change keyring\",\n  \"settings.key.pubkey.description\": \"This public key is the public part of your keyring, which is composed of a public key and a private key. This public key is shared with all the peers of the network and users of the currency, while your private key is secretely kept and used by this node to process operations on the network.\",\n  \"settings.data.modal_title\": \"Confirm full reset\",\n  \"settings.data.modal_message\": \"This action will completely reset the data of your node and redirect you to initial configuration screen. Do you confirm?\",\n  \"settings.data.modal_disagree\": \"No, cancel this\",\n  \"settings.data.modal_agree\": \"Yes, process the reset\",\n  \"settings.data.reset.experimental\": \"This functionality is still considered experimental. If you encounters strange behaviors, please stop the software and reset manually your node by removing all the files BUT conf.json under ~/.config/ucoin/ucoin_default, and restart the software.\",\n  \"settings.cpu.title\": \"CPU settings\",\n  \"settings.cpu.message\": \"You can adjust the CPU power dedicated to proof-of-work computation. The higher the value, the faster is your node, the higher the chances you have to compute a block early.\",\n  \"settings.cpu.warning\": \"<b>Up to 8 cores</b> of your machine are dedicated to proof-of-work computation currently. Also, setting CPU to 100% does not mean Duniter will use 100% of each core, but will use as much as possible each of them, as a core is also shared with other programs.\",\n  \"settings.cpu.range\": \"% of CPU power core dedicated to proof-of-work :\",\n  \"settings.cpu.power\": \"Core power:\",\n  \"settings.cpu.saved\": \"CPU settings saved.\",\n  \"graphs.tabs.blockchain\": \"Blockchain\",\n  \"graphs.tabs.currency\": \"Currency\",\n  \"graphs.blockchain.range\": \"Graphs for the last X blocks: (please choose X value)\",\n  \"graphs.blockchain.with.time\": \"Time variations graph\",\n  \"graphs.blockchain.with.speed\": \"Writing speed graph\",\n  \"graphs.blockchain.with.difficulty\": \"Difficulty graph\",\n  \"help.about_duniter\": \"About Duniter\",\n  \"help.about_duniter.title\": \"About\",\n  \"help.about_duniter.subtitle\": \"Duniter Desktop\",\n  \"help.about_duniter.version\": \"Version: \",\n  \"help.about_duniter.forum\": \"Forum\",\n  \"help.about_duniter.chat\": \"Chat\",\n  \"help.new_version_available\": \"New version available\"\n}\n;","var co = require('co');\nvar _ = require('underscore');\n\nmodule.exports = (app) => {\n\n  app.config(['$stateProvider', '$urlRouterProvider', ($stateProvider, $urlRouterProvider) => {\n\n    // States\n    $stateProvider.\n    state('index', {\n      url: '/',\n      template: require('views/index'),\n      resolve: {\n        ws: (Webmin) => Webmin.ws(),\n        summary: (Webmin) => Webmin.summary()\n      },\n      controller: 'IndexController'\n    }).\n\n    state('about', {\n      url: '/about',\n      template: require('views/about'),\n      resolve: {\n        summary: (Webmin) => Webmin.summary(),\n        version: (summary) => summary && 'v' + summary.version || 'unknown version'\n      },\n      controller: 'AboutController'\n    }).\n\n    state('configure', {\n      abstract: true,\n      url: '/configure',\n      template: require('views/init/layout'),\n      controller: ($scope) => {\n        $scope.conf = {\n          currency: 'super_currency',\n          c: 0.007376575,\n          dt: 30.4375 * 24 * 3600,\n          ud0: 100,\n          stepMax: 3,\n          sigDelay: 3600 * 24 * 365 * 5,\n          sigPeriod: 0, // Instant\n          sigStock: 40,\n          sigWindow: 3600 * 24 * 14, // 2 weeks\n          sigValidity: 3600 * 24 * 365,\n          msValidity: 3600 * 24 * 365,\n          sigQty: 0,\n          xpercent: 0.9,\n          percentRot: 0.66,\n          blocksRot: 20,\n          avgGenTime: 16 * 60,\n          dtDiffEval: 10,\n          medianTimeBlocks: 20\n        };\n      }\n    }).\n\n    state('configure.choose', {\n      url: '/choose',\n      template: require('views/init/choose'),\n      controller: ($scope, Importer) => {\n        Importer($scope);\n      }\n    }).\n\n    state('configure.create', {\n      url: '/create',\n      template: '<div class=\"ui-scrollable\" ui-view=\"\"></div>'\n    }).\n\n    state('configure.create.uid', {\n      url: '/create/uid',\n      template: require('views/init/create/create_uid'),\n      controller: 'IdentityController'\n    }).\n\n    state('configure.create.network', {\n      url: '/create/network',\n      template: require('views/init/create/create_network'),\n      resolve: {\n        netinterfaces: (Webmin) => resolveNetworkAutoConf(Webmin),\n        firstConf: () => true\n      },\n      controller: 'NetworkController'\n    }).\n\n    state('configure.create.parameters', {\n      url: '/create/parameters',\n      template: require('views/init/create/create_parameters'),\n      controller: 'ParametersController'\n    }).\n\n    state('configure.create.root', {\n      url: '/create/root',\n      template: require('views/init/create/create_root'),\n      controller: 'RootBlockController'\n    }).\n\n    state('sync', {\n      url: '/sync?host=&port=&sync=&to=',\n      template: require('views/init/sync/sync'),\n      controller: 'SyncController'\n    }).\n\n    state('main', {\n      abstract: true,\n      url: '/main',\n      template: require('views/main/main'),\n      resolve: {\n        ws: (Webmin) => Webmin.ws(),\n        summary: (Webmin) => Webmin.summary()\n      },\n      controller: 'MainController'\n    }).\n\n    state('main.home', {\n      abstract: true,\n      url: '/home',\n      template: require('views/main/home/home'),\n      controller: 'HomeController'\n    }).\n\n    state('main.home.overview', {\n      url: '/overview',\n      template: require('views/main/home/tabs/overview'),\n      controller: 'OverviewController'\n    }).\n\n    state('main.home.network', {\n      url: '/network',\n      template: require('views/main/home/tabs/network'),\n      resolve: {\n        peers: (Webmin) => co(function *() {\n          return Webmin.network.peers();\n        })\n      },\n      controller: 'HomeNetworkController'\n    }).\n\n    state('main.settings', {\n      abstract: true,\n      url: '/settings',\n      template: require('views/main/settings/settings'),\n      resolve: {\n        summary: (Webmin) => Webmin.summary()\n      },\n      controller: 'SettingsController'\n    }).\n\n    state('main.settings.data', {\n      url: '/data',\n      template: require('views/main/settings/tabs/data'),\n      resolve: {\n        peers: (Webmin) => co(function *() {\n          try {\n            let self = yield Webmin.network.selfPeer();\n            let res = yield Webmin.network.peers();\n            return _.filter(res.peers, (p) => p.pubkey != self.pubkey && p.status == 'UP');\n          } catch (e) {\n            console.error(e);\n            return [];\n          }\n        })\n      },\n      controller: 'DataController'\n    }).\n\n    state('main.settings.logs', {\n      url: '/logs',\n      template: require('views/main/settings/tabs/logs'),\n      controller: 'LogsSettingsController'\n    }).\n\n    state('main.settings.backup', {\n      url: '/backup',\n      template: require('views/main/settings/tabs/backup'),\n      controller: 'BackupController'\n    }).\n\n    state('main.settings.cpu', {\n      url: '/cpu',\n      template: require('views/main/settings/tabs/cpu'),\n      resolve: {\n        summary: (Webmin) => Webmin.summary()\n      },\n      controller: 'CPUController'\n    }).\n\n    state('main.settings.crypto', {\n      url: '/crypto',\n      template: require('views/main/settings/tabs/crypto'),\n      controller: 'KeyController'\n    }).\n\n    state('main.settings.network', {\n      url: '/network',\n      resolve: {\n        netinterfaces: (Webmin) => resolveNetworkAutoConf(Webmin),\n        firstConf: () => false\n      },\n      template: require('views/main/settings/tabs/network'),\n      controller: 'NetworkController'\n    }).\n\n    state('main.settings.currency', {\n      url: '/currency',\n      resolve: {\n        conf: (summary) => co(function *() {\n          return summary.parameters;\n        })\n      },\n      template: require('views/main/settings/tabs/currency'),\n      controller: 'CurrencyController'\n    }).\n\n    state('main.graphs', {\n      abstract: true,\n      url: '/graphs',\n      template: require('views/main/graphs/graphs'),\n      controller: 'GraphsController'\n    }).\n\n    state('main.graphs.blockchain', {\n      url: '/blockchain',\n      template: require('views/main/graphs/blockchain'),\n      controller: 'GraphsBlockchainController'\n    }).\n\n    //state('graphs.crypto', {\n    //  url: '/crypto',\n    //  template: require('views/graphs/crypto'),\n    //  controller: 'KeyController'\n    //}).\n    //\n    //state('graphs.network', {\n    //  url: '/network',\n    //  resolve: {\n    //    netinterfaces: (Webmin) => resolveNetworkAutoConf(Webmin),\n    //    firstConf: () => false\n    //  },\n    //  template: require('views/graphs/network'),\n    //  controller: 'NetworkController'\n    //}).\n    //\n    //state('graphs.currency', {\n    //  url: '/currency',\n    //  resolve: {\n    //    conf: (bmapi) => co(function *() {\n    //      return bmapi.currency.parameters();\n    //    })\n    //  },\n    //  template: require('views/graphs/currency'),\n    //  controller: 'CurrencyController'\n    //}).\n\n    state('logs', {\n      url: '/logs',\n      template: require('views/logs'),\n      resolve: {\n        ws: (Webmin) => Webmin.ws()\n      },\n      controller: 'LogsController'\n    }).\n\n    state('error', {\n      url: '/error\\?err',\n      template: require('views/error'),\n      controller: ($scope, $stateParams) =>\n        $scope.errorMsg = $stateParams.err || 'err.unknown'\n    });\n\n    // Default route\n    $urlRouterProvider.otherwise('/');\n  }]);\n\n  app.run(($rootScope, $state) => {\n    $rootScope.$on('$stateChangeError', (event, toState, toParams, fromState, fromParams, error) => {\n      console.error(error);\n      $state.go('error', { err: error.message });\n    });\n  });\n\n  function resolveNetworkAutoConf(Webmin) {\n    return co(function *() {\n      let netinterfaces = yield Webmin.network.interfaces();\n      return netinterfaces || { local: {}, remote: {} };\n    });\n  }\n};\n","module.exports = (app) => {\n\n  app.config(['$translateProvider', ($translateProvider) => {\n\n    $translateProvider.translations('en', require('./i18n/en'));\n\n    // Default language\n    $translateProvider.preferredLanguage('en');\n\n    // Other parameters\n    $translateProvider.useSanitizeValueStrategy('');\n  }]);\n};\n","\"use strict\";\n\nmodule.exports = function Peer(json) {\n\n  var that = this;\n\n  var BMA_REGEXP = /^BASIC_MERKLED_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))$/;\n\n  Object.keys(json).forEach(function(key) {\n    that[key] = json[key];\n  });\n\n  that.endpoints = that.endpoints || [];\n  that.statusTS = that.statusTS || 0;\n\n  that.keyID = function () {\n    return that.pubkey && that.pubkey.length > 10 ? that.pubkey.substring(0, 10) : \"Unknown\";\n  };\n\n  that.copyValues = function(to) {\n    var obj = that;\n    [\"version\", \"currency\", \"pub\", \"endpoints\", \"hash\", \"status\", \"statusTS\", \"block\", \"signature\"].forEach(function (key) {\n      to[key] = obj[key];\n    });\n  };\n\n  that.copyValuesFrom = function(from) {\n    var obj = that;\n    [\"version\", \"currency\", \"pub\", \"endpoints\", \"block\", \"signature\"].forEach(function (key) {\n      obj[key] = from[key];\n    });\n  };\n\n  that.json = function() {\n    var obj = that;\n    var json = {};\n    [\"version\", \"currency\", \"endpoints\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n      json[key] = obj[key];\n    });\n    json.raw = that.getRaw();\n    json.pubkey = that.pubkey;\n    return json;\n  };\n\n  that.getBMA = function() {\n    var bma = null;\n    that.endpoints.forEach(function(ep){\n      var matches = !bma && ep.match(BMA_REGEXP);\n      if (matches) {\n        bma = {\n          \"dns\": matches[2] || '',\n          \"ipv4\": matches[4] || '',\n          \"ipv6\": matches[6] || '',\n          \"port\": matches[8] || 9101\n        };\n      }\n    });\n    return bma || {};\n  };\n\n  that.getDns = function() {\n    var bma = that.getBMA();\n    return bma.dns ? bma.dns : null;\n  };\n\n  that.getIPv4 = function() {\n    var bma = that.getBMA();\n    return bma.ipv4 ? bma.ipv4 : null;\n  };\n\n  that.getIPv6 = function() {\n    var bma = that.getBMA();\n    return bma.ipv6 ? bma.ipv6 : null;\n  };\n\n  that.getPort = function() {\n    var bma = that.getBMA();\n    return bma.port ? bma.port : null;\n  };\n\n  that.getHost = function() {\n    var bma = that.getBMA();\n    var host =\n      (that.hasValid4(bma) ? bma.ipv4 :\n        (bma.dns ? bma.dns :\n          (bma.ipv6 ? '[' + bma.ipv6 + ']' : '')));\n    return host;\n  };\n\n  that.getURL = function() {\n    var bma = that.getBMA();\n    var base = '';\n    if (bma.dns) {\n      base = bma.dns;\n    } else if (that.hasValid4(bma)) {\n      base = bma.ipv4;\n    } else if (bma.ipv6) {\n      base = '[' + bma.ipv6 + ']';\n    }\n    if(bma.port)\n      base += ':' + bma.port;\n    return base;\n  };\n\n  that.hasValid4 = function(bma) {\n    return bma.ipv4 && !bma.ipv4.match(/^127.0/) && !bma.ipv4.match(/^192.168/) ? true : false;\n  };\n\n  that.getNamedURL = function() {\n    var bma = that.getBMA();\n    var base =\n      (that.hasValid4(bma) ? bma.ipv4 :\n        (bma.dns ? bma.dns :\n          (bma.ipv6 ? '[' + bma.ipv6 + ']' : '')));\n    if(bma.port)\n      base += ':' + bma.port;\n    return base;\n  };\n\n  that.isReachable = function () {\n    return that.getURL() ? true : false;\n  };\n};\n","module.exports = function mobilecheck() {\n  var check = false;\n  (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n  return check;\n};\n","module.exports = (app) => {\n\n  let Base58 = {};\n\n  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n  Base58.alphabetMap = {};\n\n  for(let i = 0; i < Base58.alphabet.length; i++) {\n    Base58.alphabetMap[Base58.alphabet.charAt(i)] = i\n  }\n\n  Base58.encode = function(buffer) {\n    if (buffer.length === 0) return '';\n\n    let i, j, digits = [0];\n    for (i = 0; i < buffer.length; i++) {\n      for (j = 0; j < digits.length; j++) digits[j] <<= 8\n      digits[digits.length - 1] += buffer[i];\n\n      let carry = 0;\n      for (j = digits.length - 1; j >= 0; j--){\n        digits[j] += carry;\n        carry = (digits[j] / 58) | 0;\n        digits[j] %= 58\n      }\n\n      while (carry) {\n        digits.unshift(carry);\n        carry = (digits[0] / 58) | 0;\n        digits[0] %= 58\n      }\n    }\n\n    // deal with leading zeros\n    for (i = 0; i < buffer.length - 1 && buffer[i] == 0; i++) digits.unshift(0)\n\n    return digits.map(function(digit) { return Base58.alphabet[digit] }).join('')\n  };\n\n  Base58.decode = function(string) {\n    if (string.length === 0) return (new Uint8Array());\n\n    let input = string.split('').map(function(c){\n      return Base58.alphabetMap[c]\n    });\n\n    let i, j, bytes = [0];\n    for (i = 0; i < input.length; i++) {\n      for (j = 0; j < bytes.length; j++) bytes[j] *= 58\n      bytes[bytes.length - 1] += input[i];\n\n      let carry = 0;\n      for (j = bytes.length - 1; j >= 0; j--){\n        bytes[j] += carry;\n        carry = bytes[j] >> 8;\n        bytes[j] &= 0xff\n      }\n\n      while (carry) {\n        bytes.unshift(carry);\n        carry = bytes[0] >> 8;\n        bytes[0] &= 0xff\n      }\n    }\n\n    // deal with leading zeros\n    for (i = 0; i < input.length - 1 && input[i] == 0; i++) bytes.unshift(0)\n    return (new Uint8Array(bytes))\n  };\n\n  app.factory('Base58', function() {\n    return {\n      encode: Base58.encode,\n      decode: Base58.decode\n    };\n  });\n};\n","var _ = require('underscore');\nvar conf = require('../lib/conf/conf');\nlet moment = require('moment');\n\nmodule.exports = (app) => {\n\n    app.filter('mt_date', () => {\n      return (input) => {\n        if(input == null){ return \"\"; }\n        return moment(input * 1000).format('YYYY MM DD');\n      };\n    });\n\n    app.filter('mt_time', () => {\n      return (input) => {\n        if(input == null){ return \"\"; }\n        return moment(input * 1000).format('HH:mm:ss');\n      };\n    });\n};\n","module.exports = (app) => {\n\n  app.factory('Graph', function() {\n      return {\n\n        speedGraph: function speedGraphs (id, offset, speeds, minSpeeds, maxSpeeds, getSeries) {\n          var xValuex = [];\n          for (var i = 0, len = speeds.length; i < len; i++) {\n            xValuex.push(i + offset);\n          }\n          $(id).highcharts({\n            chart: {\n              type: \"area\",\n              zoomType: 'x',\n              events: {\n                load: function () {\n                  getSeries(this.series);\n                }\n              }\n            },\n            title: {\n              text: 'Blocks writing speed'\n            },\n            subtitle: {\n              text: document.ontouchstart === undefined ?\n                'Click and drag in the plot area to zoom in' :\n                'Pinch the chart to zoom in'\n            },\n            xAxis: {\n              //categories: xValuex,\n              minRange: 3, // 10 blocks,\n              labels: {\n                formatter: function() {\n                  return this.value + offset;\n                }\n              }\n            },\n            yAxis: {\n              //type: 'logarithmic',\n              minorTickInterval: 1,\n              title: {\n                text: 'Blocks per hour (logarithmic scale)'\n              },\n              floor: 0,\n              min: 0\n            },\n            colors: ['#ff0000', '#7cb5ec', '#000000'],\n            legend: {\n              enabled: true\n            },\n            tooltip: {\n              shared: true,\n              crosshairs: true,\n              formatter: blockFormatter(offset)\n            },\n            plotOptions: {\n              area: {\n                fillColor: {\n                  linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1},\n                  stops: [\n                    [0, Highcharts.getOptions().colors[0]],\n                    [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]\n                  ]\n                },\n                marker: {\n                  radius: 2\n                },\n                lineWidth: 1,\n                states: {\n                  hover: {\n                    lineWidth: 1\n                  }\n                },\n                threshold: null\n              }\n            },\n\n            series: [{\n              type: 'line',\n              name: \"Upper limit\",\n              data: maxSpeeds\n            },{\n              type: 'area',\n              name: \"Actual speed\",\n              data: speeds\n            },{\n              type: 'line',\n              name: \"Lower limit\",\n              data: minSpeeds\n            }\n            ]\n          });\n        },\n\n        difficultyGraph: function difficultyGraph (id, offset, difficulties) {\n          $(id).highcharts({\n            chart: {\n              type: \"area\",\n              zoomType: 'x'\n            },\n            title: {\n              text: 'Proof-of-Work difficulty by block'\n            },\n            subtitle: {\n              text: document.ontouchstart === undefined ?\n                'Click and drag in the plot area to zoom in' :\n                'Pinch the chart to zoom in'\n            },\n            xAxis: {\n              minRange: 10, // 10 blocks,\n              labels: {\n                formatter: function() {\n                  return this.value + offset;\n                }\n              }\n            },\n            yAxis: {\n              title: {\n                text: 'Number of zeros'\n              },\n              floor: 0,\n              min: 0\n            },\n            legend: {\n              enabled: true\n            },\n            tooltip: {\n              shared: true,\n              crosshairs: true,\n              formatter: blockFormatter(offset)\n            },\n            plotOptions: {\n              area: {\n                fillColor: {\n                  linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1},\n                  stops: [\n                    [0, Highcharts.getOptions().colors[0]],\n                    [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]\n                  ]\n                },\n                marker: {\n                  radius: 2\n                },\n                lineWidth: 1,\n                states: {\n                  hover: {\n                    lineWidth: 1\n                  }\n                },\n                threshold: null\n              }\n            },\n\n            series: [\n              {\n                name: 'PoW difficulty',\n                data: difficulties\n              }\n            ]\n          });\n        },\n\n        timeGraphs: function timeGraphs (id, offset, timeAccelerations, medianTimeIncrements, speeds, minSpeeds, maxSpeeds) {\n          var timesInc = [];\n          medianTimeIncrements.forEach(function (inc) {\n            timesInc.push(inc == 0 ? 1 : inc);\n          });\n          $(id).highcharts({\n            chart: {\n              // type: \"area\",\n              zoomType: 'x'\n            },\n            title: {\n              text: 'Blockchain time variations'\n            },\n            subtitle: {\n              text: document.ontouchstart === undefined ?\n                'Click and drag in the plot area to zoom in' :\n                'Pinch the chart to zoom in'\n            },\n            xAxis: {\n              minRange: 10, // 10 blocks,\n              labels: {\n                formatter: function() {\n                  return this.value + offset;\n                }\n              }\n            },\n            yAxis: {\n              //type: 'logarithmic',\n              minorTickInterval: 1,\n              title: {\n                text: 'Number of seconds (logarithmic scale)'\n              }\n            },\n            legend: {\n              enabled: true\n            },\n            tooltip: {\n              shared: true,\n              crosshairs: true,\n              formatter: blockFormatter(offset)\n            },\n            plotOptions: {\n              area: {\n                fillColor: {\n                  linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1},\n                  stops: [\n                    [0, Highcharts.getOptions().colors[0]],\n                    [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]\n                  ]\n                },\n                marker: {\n                  radius: 2\n                },\n                lineWidth: 1,\n                states: {\n                  hover: {\n                    lineWidth: 1\n                  }\n                },\n                threshold: null\n              }\n            },\n\n            series: [\n              {\n                name: 'Time acceleration',\n                data: timeAccelerations\n              },{\n                name: \"Median Time variation\",\n                data: timesInc\n              }\n              ,{\n                name: \"Too high duration\",\n                data: maxSpeeds\n              }\n              ,{\n                name: \"Actual duration\",\n                data: speeds\n              }\n              ,{\n                name: \"Too low duration\",\n                data: minSpeeds\n              }\n            ]\n          });\n        }\n      }\n    });\n};\n\nfunction blockFormatter(offset) {\n  return function() {\n    var html = '<span style=\"font-size: 10px\">' + (this.x + offset) + '</span><br/>';\n    for (var i = 0, len = this.points.length; i < len; i++) {\n      var point = this.points[i];\n      var series = point.series;\n      html += '<span style=\"color:' + series.color + '\">\\u25CF</span>' + series.name + ': <b>' + point.y + '</b><br/>';\n    }\n    return html;\n  }\n}\n","module.exports = (app) => {\n\n  app.factory('Importer', function($http, $state, $timeout, UIUtils, Upload, Webmin) {\n\n    return ($scope) => {\n\n      $scope.uploadFiles = function(file, errFiles) {\n        $scope.f = file;\n        $scope.errFile = errFiles && errFiles[0];\n        if (file) {\n          UIUtils.toast('settings.data.backup.importing');\n          file.upload = Upload.upload({\n            url: Webmin.getImportURL(),\n            data: { importData: file }\n          });\n\n          file.upload.then(function (response) {\n            $timeout(function () {\n              UIUtils.toast('settings.data.backup.imported');\n              $state.go('main.home.overview');\n              file.result = response.data;\n            });\n          }, function (response) {\n            if (response.status > 0)\n              $scope.errorMsg = response.status + ': ' + response.data;\n          }, function (evt) {\n            file.progress = Math.min(100, parseInt(100.0 *\n              evt.loaded / evt.total));\n          });\n        }\n      }\n    };\n  });\n};\n","module.exports = (app) => {\n\n  app.factory('PubkeyGenerator', function($timeout, Webmin) {\n\n    var co = require('co');\n\n    return ($scope) => {\n\n      let concat = \"\";\n      $scope.pubkey_preview = \"\";\n      let timeout = preview();\n\n      function preview() {\n        return $timeout(() => {\n          if ($scope.$parent) {\n            let salt = $scope.$parent.conf.idty_entropy;\n            let pass = $scope.$parent.conf.idty_password;\n            let newConcat = [salt, pass].join('');\n            if (salt && pass && newConcat != concat) {\n              concat = newConcat;\n              $scope.previewPubkey(concat);\n              timeout = preview();\n            } else {\n              timeout = preview();\n            }\n          }\n        }, 100);\n      }\n\n      $scope.previewPubkey = () => co(function *() {\n        let data = yield Webmin.key.preview({\n          conf: $scope.$parent.conf\n        });\n        $scope.pubkey_preview = data.pubkey;\n      }).catch(() => null);\n    };\n  });\n};\n","module.exports = (app) => {\n\n  app.factory('UIUtils', function($q, $translate, $state, $location) {\n      return {\n\n        translate: (msg) => $q.when($translate(msg)),\n\n        toastRaw: (msg) => {\n          return Materialize.toast(msg, 4000);\n        },\n\n        toast: (msg) => {\n          return $q.when($translate(msg)).then((translated) => Materialize.toast(translated, 4000))\n        },\n\n        enableInputs: () => $('i.prefix, label[value!=\"\"]').addClass('active'),\n\n        enableTabs: () => {\n          let jTabs = $('ul.tabs');\n          jTabs.tabs();\n          $('ul.tabs a').click((e) => {\n            let href = $(e.currentTarget).attr('href');\n            let state = href.slice(1);\n            $state.go(state);\n          });\n\n          let currentID = $location.path()\n            .replace(/\\//g, '.')\n            .replace(/\\./, '');\n\n          jTabs.tabs('select_tab', currentID);\n        },\n\n        changeTitle: (version) => document.title = 'Duniter ' + version\n      }\n    });\n};\n","const co = require('co');\nconst _ = require('underscore');\nconst conf = require('../lib/conf/conf');\n\nmodule.exports = (angular) => {\n\n  angular.module('duniter.services.webmin', ['ngResource'])\n\n    .factory('Webmin', function($http, $q) {\n\n      function httpProtocol() {\n        return window.location.protocol + '//';\n      }\n\n      function wsProtocol() {\n        return window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n      }\n\n      function Webmin(server) {\n\n        function getResource(uri, protocol) {\n          return function(params) {\n            return $q.when(httpGet(uri, params, protocol));\n          }\n        }\n\n        function httpGet(uri, params, protocol) {\n          return Q.Promise((resolve, reject) => {\n            var config = {\n              timeout: conf.api_timeout\n            }, suffix = '', pkeys = [], queryParams = null;\n            if (typeof params == 'object') {\n              pkeys = _.keys(params);\n              queryParams = {};\n            }\n            pkeys.forEach(function(pkey){\n              var prevURI = uri;\n              uri = uri.replace(new RegExp(':' + pkey), params[pkey]);\n              if (prevURI == uri) {\n                queryParams[pkey] = params[pkey];\n              }\n            });\n            config.params = queryParams;\n            $http.get((protocol || httpProtocol()) + server + uri + suffix, config)\n              .success(function(data, status, headers, config) {\n                resolve(data);\n              })\n              .error(function(data, status, headers, config) {\n                console.log(data);\n                reject(data);\n              });\n          });\n        }\n\n        function postResource(uri) {\n          return function(data, params) {\n            return $q.when(Q.Promise((resolve, reject) => {\n              var config = {\n                timeout: 4000\n              }, suffix = '', pkeys = [], queryParams = null;\n              if (typeof params == 'object') {\n                pkeys = _.keys(params);\n                queryParams = {};\n              }\n              pkeys.forEach(function(pkey){\n                var prevURI = uri;\n                uri = uri.replace(new RegExp(':' + pkey), params[pkey]);\n                if (prevURI == uri) {\n                  queryParams[pkey] = params[pkey];\n                }\n              });\n              config.params = queryParams;\n              $http.post(httpProtocol() + server + uri + suffix, data, config)\n                .success(function(data, status, headers, config) {\n                  resolve(data);\n                })\n                .error(function(data, status, headers, config) {\n                  reject(data);\n                });\n            }));\n          }\n        }\n\n        let wsMap = {};\n\n        function ws(uri) {\n          var sock = wsMap[uri] || new WebSocket(uri);\n          wsMap[uri] = sock;\n          sock.onclose = function(e) {\n            console.log('close');\n            console.log(e);\n          };\n          sock.onerror = function(e) {\n            console.log('onerror');\n            console.log(e);\n          };\n          let opened = false, openedCallback;\n          sock.onopen = function() {\n            opened = true;\n            openedCallback && openedCallback();\n          };\n          let listener, messageType;\n          sock.onmessage = function(e) {\n            let res = JSON.parse(e.data);\n            if (res.type == 'log') {\n              for (let i = 0, len = res.value.length; i < len; i++) {\n                let log = res.value[i];\n                // console[log.level](log.msg);\n              }\n            }\n            if (listener && (messageType === undefined || (res.type === messageType))) {\n              listener(res);\n            }\n          };\n          return {\n            on: function(type, callback) {\n              messageType = type;\n              listener = callback;\n            },\n            whenOpened: () => co(function *() {\n              if (opened) return true;\n              else {\n                yield Q.Promise((resolve) => {\n                  openedCallback = resolve;\n                });\n              }\n            }),\n            send: (msg) => sock.send(msg)\n          };\n        }\n\n        return {\n          getExportURL: () => httpProtocol() + server + '/webmin/data/duniter_export',\n          getImportURL: () => httpProtocol() + server + '/webmin/data/duniter_import',\n          isNodePubliclyReachable: getResource('/webmin/server/reachable'),\n          ws: () => ws(wsProtocol() + server + '/webmin/ws'),\n          wsBlock: () => ws(wsProtocol() + server + '/webmin/ws_block'),\n          wsPeer: () => ws(wsProtocol() + server + '/webmin/ws_peer'),\n          summary: getResource('/webmin/summary'),\n          powSummary: getResource('/webmin/summary/pow'),\n          logsExport: (nbLines) => getResource('/webmin/logs/export/' + nbLines)(),\n          blockchain: {\n            blocks: (opts) => getResource('/webmin/blockchain/blocks/' + opts.count + '/' + opts.from)(),\n            block_add: postResource('/webmin/blockchain/add')\n          },\n          server: {\n            http: {\n              start: getResource('/webmin/server/http/start'),\n              stop: getResource('/webmin/server/http/stop'),\n              openUPnP: getResource('/webmin/server/http/upnp/open'),\n              regularUPnP: getResource('/webmin/server/http/upnp/regular')\n            },\n            services: {\n              startAll: getResource('/webmin/server/services/start_all'),\n              stopAll: getResource('/webmin/server/services/stop_all')\n            },\n            sendConf: postResource('/webmin/server/send_conf'),\n            netConf: postResource('/webmin/server/net_conf'),\n            keyConf: postResource('/webmin/server/key_conf'),\n            cpuConf: postResource('/webmin/server/cpu_conf'),\n            testSync: postResource('/webmin/server/test_sync'),\n            startSync: postResource('/webmin/server/start_sync'),\n            previewNext: getResource('/webmin/server/preview_next'),\n            autoConfNetwork: getResource('/webmin/server/auto_conf_network'),\n            resetData: getResource('/webmin/server/reset/data'),\n            republishNewSelfPeer: getResource('/webmin/server/republish_selfpeer')\n          },\n          key: {\n            preview: postResource('/webmin/key/preview')\n          },\n          network: {\n            interfaces: getResource('/webmin/network/interfaces'),\n            selfPeer: getResource('/webmin/network/self'),\n            peers: getResource('/webmin/network/peers')\n          },\n          currency: {\n            parameters: getResource('/webmin/currency/parameters')\n          }\n        }\n      }\n      let server = window.location.hostname;\n      let port = window.location.port;\n      let service = Webmin([server, port].join(':'));\n      service.instance = Webmin;\n      return service;\n    });\n};\n"]}
\ No newline at end of file
diff --git a/public/templates.js b/public/templates.js
index 13bfc31ddfbd5f760a06f95d59f7499266d7c187..a2d28df8ede50fef89c0cec49ed24cdcd45f1618 100644
--- a/public/templates.js
+++ b/public/templates.js
@@ -382,7 +382,7 @@ var buf = [];
 var jade_mixins = {};
 var jade_interp;
 
-buf.push("<main><div class=\"container\"><div class=\"row\"><div class=\"s12 center\"><div class=\"card\"><div class=\"card-content\"><i class=\"fa fa-cloud-download fa-5x\"></i><h1 translate=\"sync.title\" class=\"card-title\"></h1><p translate=\"sync.message\"></p></div><div class=\"card-action\"><form class=\"row\"><div class=\"input-field col s12 m3\"><p><input type=\"radio\" name=\"groupeMode\" value=\"simplified\" id=\"radio1\" ng-model=\"sync_mode\" ng-disabled=\"synchronizing\"/><label for=\"radio1\">{{ 'sync.mode.simplified' | translate }}</label></p><p><input type=\"radio\" name=\"groupeMode\" value=\"manual\" id=\"radio2\" ng-model=\"sync_mode\" ng-disabled=\"synchronizing\"/><label for=\"radio2\">{{ 'sync.mode.manual' | translate }}</label></p></div><div class=\"input-field col s12 m6\"><div ng-show=\"sync_mode == 'simplified'\" class=\"input-field col s12\"><select ng-model=\"simplified_host\" ng-change=\"checkNode()\" ng-disabled=\"synchronizing\" class=\"browser-default\"><option value=\"\" disabled=\"disabled\" selected=\"selected\">{{ 'sync.simplified.default_option' | translate }}</option><optgroup label=\"{{ 'sync.simplified.currency' | translate }} « TestNet »\"><option value=\"duniter.org:8999\">duniter.org {{ 'sync.simplified.main_mirror' | translate }}</option><option value=\"testnet.duniter.inso.ovh:80\">testnet.duniter.inso.ovh:80</option></optgroup></select><label>{{ 'sync.simplified.choose' | translate }}</label></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field col s8\"><i class=\"prefix material-icons\">language</i><input id=\"host\" type=\"text\" ng-model=\"host\"/><label for=\"host\">{{ 'sync.host' | translate }}</label></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field col s4\"><i class=\"prefix fa fa-plug\"></i><input id=\"port\" type=\"number\" ng-model=\"port\"/><label for=\"port\">{{ 'sync.port' | translate }}</label></div></div><div class=\"col s12 m3\"><div ng-if=\"checking\" class=\"preloader-wrapper active small\"><div class=\"spinner-layer spinner-blue-only\"><div class=\"circle-clipper left\"><div class=\"circle\"></div></div></div></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field\"><button ng-show=\"!checking\" ng-disabled=\"synchronizing || (sync_mode != 'simplified' &amp;&amp; !(host &amp;&amp; port))\" ng-click=\"checkNode()\" class=\"btn-large waves-effect waves-light\"><i class=\"left fa fa-wifi\"></i><span translate=\"sync.check\"></span></button></div></div></form><div class=\"row\"><div class=\"col s12\"><blockquote ng-show=\"sync_error\" class=\"card-panel left-align\">{{ sync_error | translate }}</blockquote><blockquote ng-show=\"sync_message\" class=\"info card-panel left-align\">{{ sync_message }}</blockquote></div></div><div class=\"row\"><button ng-disabled=\"!checked_host || synchronizing\" ng-click=\"startSync()\" class=\"btn-large waves-effect waves-light\"><i class=\"left fa fa-cloud-download\"></i><span translate=\"sync.start\"></span></button></div><div ng-show=\"synchronizing\" class=\"row\"><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ down_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Downloading... ({{ down_percent }}%)</span></div><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ apply_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Applying... ({{ apply_percent }}%)</span></div></div><blockquote ng-show=\"sync_failed\" class=\"card-panel left-align\">{{ 'sync.failed' | translate }}</blockquote></div></div></div></div></div></main>");;return buf.join("");
+buf.push("<main><div class=\"container\"><div class=\"row\"><div class=\"s12 center\"><div class=\"card\"><div class=\"card-content\"><i class=\"fa fa-cloud-download fa-5x\"></i><h1 translate=\"sync.title\" class=\"card-title\"></h1><p translate=\"sync.message\"></p></div><div class=\"card-action\"><form class=\"row\"><div class=\"input-field col s12 m3\"><p><input type=\"radio\" name=\"groupeMode\" value=\"simplified\" id=\"radio1\" ng-model=\"sync_mode\" ng-disabled=\"synchronizing\"/><label for=\"radio1\">{{ 'sync.mode.simplified' | translate }}</label></p><p><input type=\"radio\" name=\"groupeMode\" value=\"manual\" id=\"radio2\" ng-model=\"sync_mode\" ng-disabled=\"synchronizing\"/><label for=\"radio2\">{{ 'sync.mode.manual' | translate }}</label></p></div><div class=\"input-field col s12 m6\"><div ng-show=\"sync_mode == 'simplified'\" class=\"input-field col s12\"><select ng-model=\"simplified_host\" ng-change=\"checkNode()\" ng-disabled=\"synchronizing\" class=\"browser-default\"><option value=\"\" disabled=\"disabled\" selected=\"selected\">{{ 'sync.simplified.default_option' | translate }}</option><optgroup label=\"{{ 'sync.simplified.currency' | translate }} « TestNet »\"><option value=\"fakenet.cgeek.fr:10900\">fakenet.cgeek.fr:10900 {{ 'sync.simplified.main_mirror' | translate }}</option></optgroup></select><label>{{ 'sync.simplified.choose' | translate }}</label></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field col s8\"><i class=\"prefix material-icons\">language</i><input id=\"host\" type=\"text\" ng-model=\"host\"/><label for=\"host\">{{ 'sync.host' | translate }}</label></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field col s4\"><i class=\"prefix fa fa-plug\"></i><input id=\"port\" type=\"number\" ng-model=\"port\"/><label for=\"port\">{{ 'sync.port' | translate }}</label></div></div><div class=\"col s12 m3\"><div ng-if=\"checking\" class=\"preloader-wrapper active small\"><div class=\"spinner-layer spinner-blue-only\"><div class=\"circle-clipper left\"><div class=\"circle\"></div></div></div></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field\"><button ng-show=\"!checking\" ng-disabled=\"synchronizing || (sync_mode != 'simplified' &amp;&amp; !(host &amp;&amp; port))\" ng-click=\"checkNode()\" class=\"btn-large waves-effect waves-light\"><i class=\"left fa fa-wifi\"></i><span translate=\"sync.check\"></span></button></div></div></form><div class=\"row\"><div class=\"col s12\"><blockquote ng-show=\"sync_error\" class=\"card-panel left-align\">{{ sync_error | translate }}</blockquote><blockquote ng-show=\"sync_message\" class=\"info card-panel left-align\">{{ sync_message }}</blockquote></div></div><div class=\"row\"><button ng-disabled=\"!checked_host || synchronizing\" ng-click=\"startSync()\" class=\"btn-large waves-effect waves-light\"><i class=\"left fa fa-cloud-download\"></i><span translate=\"sync.start\"></span></button></div><div ng-show=\"synchronizing\" class=\"row\"><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ down_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Downloading... ({{ down_percent }}%)</span></div><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ apply_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Applying... ({{ apply_percent }}%)</span></div></div><blockquote ng-show=\"sync_failed\" class=\"card-panel left-align\">{{ 'sync.failed' | translate }}</blockquote></div></div></div></div></div></main>");;return buf.join("");
 };
 if (typeof define === 'function' && define.amd) {
   define([], function() {
diff --git a/server/controller/webmin.js b/server/controller/webmin.js
index 41dc112bdc46090596446c12c03445b1842c8e87..4833b39bfc055c12debfc65513d49a3ba50516e8 100644
--- a/server/controller/webmin.js
+++ b/server/controller/webmin.js
@@ -1,5 +1,6 @@
 "use strict";
 
+const os = require('os');
 const path = require('path');
 const util = require('util');
 const es = require('event-stream');
@@ -8,34 +9,30 @@ const stream      = require('stream');
 const _ = require('underscore');
 const Q = require('q');
 const co = require('co');
-const Peer = require('../../app/js/lib/entity/peer');
+const duniterKeypair = require('duniter-keypair');
 
-module.exports = (duniterServer) => {
-  return new WebAdmin(duniterServer);
+module.exports = (duniterServer, startServices, stopServices) => {
+  return new WebAdmin(duniterServer, startServices, stopServices);
 };
 
-function WebAdmin (duniterServer) {
+function WebAdmin (duniterServer, startServices, stopServices) {
 
   const logger = duniterServer.logger;
   const keyring = duniterServer.lib.keyring;
   const Identity = duniterServer.lib.Identity;
+  const Peer = duniterServer.lib.Peer;
   const rawer = duniterServer.lib.rawer;
   const http2raw = duniterServer.lib.http2raw;
   const dos2unix = duniterServer.lib.dos2unix;
   const contacter = duniterServer.lib.contacter;
-  const bma = duniterServer.lib.bma;
   const network = duniterServer.lib.network;
   const constants = duniterServer.lib.constants;
   const ucp = duniterServer.lib.ucp;
 
   // Node instance: this is the object to be managed by the web admin
   const server = this.server = duniterServer;
-  let bmapi;
   const that = this;
 
-  // Routing documents
-  server.routing();
-
   server.pipe(es.mapSync(function(data) {
     if (data.pulling !== undefined || data.pow !== undefined) {
       that.push(data);
@@ -71,10 +68,6 @@ function WebAdmin (duniterServer) {
   function replugDAL() {
     return co(function *() {
       yield pluggedConfP;
-
-      // Routing documents
-      server.routing();
-
       return plugForDAL();
     });
   }
@@ -111,32 +104,18 @@ function WebAdmin (duniterServer) {
     return {
       "total": yield server.getCountOfSelfMadePoW(),
       "mirror": !(yield server.isServerMember()),
-      "waiting": server.isPoWWaiting()
+      "waiting": true
     };
   });
 
   this.previewPubkey = (req) => co(function *() {
     const conf = http2raw.conf(req);
-    const pair = yield keyring.scryptKeyPair(conf.idty_entropy, conf.idty_password);
+    const pair = yield duniterKeypair.duniter.methods.scrypt(conf.idty_entropy, conf.idty_password);
     return {
-      "pubkey": pair.publicKey
+      "pubkey": pair.pub
     };
   });
 
-  this.startHTTP = () => co(function *() {
-    yield pluggedDALP;
-    try {
-      if (!bmapi) {
-        bmapi = yield bma(server, null, true);
-      }
-      yield bmapi.openConnections();
-      return { success: true };
-    } catch (e) {
-      logger.error(e);
-      return { success: false };
-    }
-  });
-
   this.openUPnP = () => co(function *() {
     yield pluggedDALP;
     return server.upnp();
@@ -158,17 +137,6 @@ function WebAdmin (duniterServer) {
     return {};
   });
 
-  this.stopHTTP = () => co(function *() {
-    yield pluggedDALP;
-    try {
-      yield bmapi.closeConnections();
-      return { success: true };
-    } catch (e) {
-      logger.error(e);
-      return { success: false };
-    }
-  });
-
   this.previewNext = () => co(function *() {
     yield pluggedDALP;
     const block = yield server.doMakeNextBlock();
@@ -179,8 +147,8 @@ function WebAdmin (duniterServer) {
   this.sendConf = (req) => co(function *() {
     yield pluggedConfP;
     const conf = http2raw.conf(req);
-    const pair = yield keyring.scryptKeyPair(conf.idty_entropy, conf.idty_password);
-    yield server.dal.saveConf({
+    const pair = yield duniterKeypair.duniter.methods.scrypt(conf.idty_entropy, conf.idty_password);
+    yield server.dal.saveConf(_.extend(server.conf, {
       routing: true,
       createNext: true,
       cpu: constants.DEFAULT_CPU,
@@ -214,11 +182,11 @@ function WebAdmin (duniterServer) {
       xpercent: conf.xpercent,
       idtyWindow: conf.idtyWindow,
       msWindow: conf.msWindow
-    });
+    }));
     pluggedConfP = co(function *() {
-      yield bmapi.closeConnections();
-      yield server.loadConf();
-      bmapi = yield bma(server, null, true);
+      // yield bmapi.closeConnections();
+      // yield server.loadConf();
+      // bmapi = yield bma(server, null, true);
     });
     yield pluggedConfP;
     const buid = '0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855';
@@ -274,10 +242,12 @@ function WebAdmin (duniterServer) {
       upnp: conf.upnp
     }));
     pluggedConfP = co(function *() {
-      yield bmapi.closeConnections();
+      // yield bmapi.closeConnections();
       yield server.loadConf();
-      bmapi = yield bma(server, null, true);
-      yield bmapi.openConnections();
+      yield stopServices();
+      yield startServices();
+      // bmapi = yield bma(server, null, true);
+      // yield bmapi.openConnections();
       yield server.recomputeSelfPeer();
     });
     yield pluggedConfP;
@@ -287,9 +257,9 @@ function WebAdmin (duniterServer) {
   this.applyNewKeyConf = (req) => co(function *() {
     yield pluggedConfP;
     const conf = http2raw.conf(req);
-    const keyPair = yield keyring.scryptKeyPair(conf.idty_entropy, conf.idty_password);
-    const publicKey = keyPair.publicKey;
-    const secretKey = keyPair.secretKey;
+    const keyPair = yield duniterKeypair.duniter.methods.scrypt(conf.idty_entropy, conf.idty_password);
+    const publicKey = keyPair.pub;
+    const secretKey = keyPair.sec;
     yield server.dal.saveConf(_.extend(server.conf, {
       salt: conf.idty_entropy,
       passwd: conf.idty_password,
@@ -307,7 +277,7 @@ function WebAdmin (duniterServer) {
     yield pluggedConfP;
     server.conf.cpu = http2raw.cpu(req);
     yield server.dal.saveConf(server.conf);
-    yield server.applyCPU(server.conf.cpu);
+    server.push({ cpu: server.conf.cpu });
     pluggedConfP = yield server.loadConf();
     yield pluggedConfP;
     return {};
@@ -336,7 +306,7 @@ function WebAdmin (duniterServer) {
     }
     let upnpConf;
     try {
-      upnpConf = yield network.upnpConf();
+      upnpConf = yield network.upnpConf(null, logger);
       if (upnpConf.remoteipv4) {
         upnp.addresses.push({
           family: 'IPv4',
@@ -352,14 +322,14 @@ function WebAdmin (duniterServer) {
     } catch (e) {
       logger.error(e.stack || e);
     }
-    const lanIPv4 = network.getLANIPv4();
+    const lanIPv4 = getLANIPv4();
     lanIPv4.forEach(function(addr) {
       lan.addresses.push({
         family: 'IPv4',
         address: addr.value
       });
     });
-    const lanIPv6 = network.getLANIPv6();
+    const lanIPv6 = getLANIPv6();
     lanIPv6.forEach(function(addr) {
       lan.addresses.push({
         family: 'IPv6',
@@ -417,14 +387,7 @@ function WebAdmin (duniterServer) {
   this.startAllServices = () => co(function *() {
     // Allow services to be stopped
     stopServicesP = null;
-    if (!server.conf.salt && !server.conf.passwd) {
-      const conf = {
-        idty_entropy: ~~(Math.random() * 2147483647) + "",
-        idty_password: ~~(Math.random() * 2147483647) + ""
-      };
-      yield that.applyNewKeyConf({ body: { conf :conf } });
-    }
-    yield startServicesP || (startServicesP = server.startServices());
+    yield startServicesP || (startServicesP = startServices());
     that.push({ started: true });
     return {};
   });
@@ -432,7 +395,7 @@ function WebAdmin (duniterServer) {
   this.stopAllServices = () => co(function *() {
     // Allow services to be started
     startServicesP = null;
-    yield (stopServicesP || (stopServicesP = server.stopServices()));
+    yield (stopServicesP || (stopServicesP = stopServices()));
     that.push({ stopped: true });
     return {};
   });
@@ -465,16 +428,16 @@ function WebAdmin (duniterServer) {
       });
       yield server.dal.saveConf(server.conf);
       pluggedConfP = co(function *() {
-        yield bmapi.closeConnections();
+        // yield bmapi.closeConnections();
         yield server.loadConf();
-        bmapi = yield bma(server, null, true);
+        // bmapi = yield bma(server, null, true);
       });
     }
     return {};
   });
 
   this.startSync = (req) => co(function *() {
-    const sync = server.synchronize(req.body.host, parseInt(req.body.port), parseInt(req.body.to), parseInt(req.body.chunkLen));
+    const sync = require('duniter-crawler').duniter.methods.synchronize(server, req.body.host, parseInt(req.body.port), parseInt(req.body.to), parseInt(req.body.chunkLen));
     sync.flow.pipe(es.mapSync(function(data) {
       // Broadcast block
       that.push(data);
@@ -487,7 +450,6 @@ function WebAdmin (duniterServer) {
     yield pluggedDALP;
     // We have to wait for a non-breaking window to process reset
     yield server.BlockchainService.pushFIFO(() => co(function *() {
-      yield that.stopHTTP();
       yield that.stopAllServices();
       yield server.unplugFileSystem();
       yield server.cleanDBData();
@@ -525,12 +487,20 @@ function WebAdmin (duniterServer) {
 
   this.isNodePubliclyReachable = (req) => co(function *() {
     const peer = yield server.PeeringService.peer();
-    const reachable = yield contacter.statics.isReachableFromTheInternet(peer, { timeout: 5000 });
+    const p = Peer.statics.fromJSON(peer);
+    let reachable;
+    const node = contacter(p.getHostPreferDNS(), p.getPort());
+    try {
+      yield node.getPeer();
+      reachable = true;
+    } catch (e) {
+      reachable = false;
+    }
     return { success: reachable };
   });
 
   this.testPeer = (req) => co(function *() {
-    return server.testForSync(req.body.host, parseInt(req.body.port));
+    return require('duniter-crawler').duniter.methods.testForSync(server, req.body.host, parseInt(req.body.port));
   });
 
   this.logsExport = (req) => co(function *() {
@@ -569,7 +539,7 @@ function WebAdmin (duniterServer) {
       return co(function *() {
           yield server.plugFileSystem();
           yield server.loadConf();
-          bmapi = yield bma(server, null, true);
+          // bmapi = yield bma(server, null, true);
       });
   }
 
@@ -582,4 +552,34 @@ function WebAdmin (duniterServer) {
 
 }
 
+function getLANIPv4 () {
+  return getLAN('IPv4');
+}
+
+function getLANIPv6 () {
+  return getLAN('IPv6');
+}
+
+function getLAN(family) {
+  let netInterfaces = os.networkInterfaces();
+  let keys = _.keys(netInterfaces);
+  let res = [];
+  for (const name of keys) {
+    let addresses = netInterfaces[name];
+    for (const addr of addresses) {
+      if ((addr.family == "IPv4" && family == "IPv4"
+        && addr.address != "127.0.0.1" && addr.address != "lo" && addr.address != "localhost")
+        || (addr.family == "IPv6" && family == "IPv6"
+        && addr.address != "::1" && addr.address != "lo" && addr.address != "localhost"))
+      {
+        res.push({
+          name: name,
+          value: addr.address
+        });
+      }
+    }
+  }
+  return res;
+}
+
 util.inherits(WebAdmin, stream.Duplex);
diff --git a/server/lib/network.js b/server/lib/network.js
index 08c574f6f5d085f05dcffcf4aeb83f09adf63388..916d2232abee35bd553abfcdc3755a813b674977 100644
--- a/server/lib/network.js
+++ b/server/lib/network.js
@@ -14,6 +14,7 @@ const handleRequest = (method, uri, promiseFunc) => {
             } catch (e) {
                 // HTTP error
                 res.status(400).send(e);
+                console.error(e);
             }
         });
     });
diff --git a/server/lib/routes.js b/server/lib/routes.js
index 37d008479c07df765cc5e96d9d2584417a3b9053..e979a7edf2ef81c6651a4497f662ca0402e927f0 100644
--- a/server/lib/routes.js
+++ b/server/lib/routes.js
@@ -18,8 +18,6 @@ module.exports = {
         handleRequest(app.get.bind(app),   '/webmin/logs/export/:quantity',    webminCtrl.logsExport);
         handleRequest(app.post.bind(app), '/webmin/key/preview',               webminCtrl.previewPubkey);
         handleRequest(app.get.bind(app),  '/webmin/server/reachable',          webminCtrl.isNodePubliclyReachable);
-        handleRequest(app.get.bind(app),  '/webmin/server/http/start',         webminCtrl.startHTTP);
-        handleRequest(app.get.bind(app),  '/webmin/server/http/stop',          webminCtrl.stopHTTP);
         handleRequest(app.get.bind(app),  '/webmin/server/http/upnp/open',     webminCtrl.openUPnP);
         handleRequest(app.get.bind(app),  '/webmin/server/http/upnp/regular',  webminCtrl.regularUPnP);
         handleRequest(app.get.bind(app),  '/webmin/server/preview_next',       webminCtrl.previewNext);
diff --git a/server/server.js b/server/server.js
index da16f33023fd53003098c00e0f996d30b48c630e..e6d1be9193b072b43cb5aae789ff6dd361b2d942 100644
--- a/server/server.js
+++ b/server/server.js
@@ -14,7 +14,7 @@ for (const module of modules) {
 }
 
 return co(function*(){
-  yield stack.executeStack();
+  yield stack.executeStack(process.argv);
   console.log('Done');
 });
 
diff --git a/yarn.lock b/yarn.lock
index 39408ee6b116d41913c25a6136cc145866576769..8dc5d7585d4af2c6407e1c58f15b8b75cbf7eb66 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -14,6 +14,10 @@ abbrev@1:
   version "1.0.9"
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
 
+accept-encoding@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/accept-encoding/-/accept-encoding-0.1.0.tgz#5dd88b8df71f1dc2e5cc6b9565ecce1e399a333e"
+
 accepts@~1.3.0, accepts@~1.3.3:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
@@ -102,13 +106,17 @@ amp-pick@^1.0.0:
     amp-internal-flatten "^1.0.0"
     amp-is-function "^1.0.0"
 
+ansi-escapes@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
 ansi-regex@^1.0.0, ansi-regex@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz#41c847194646375e6a1a5d10c3ca054ef9fc980d"
 
 ansi-regex@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107"
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
 
 ansi-styles@^2.2.1:
   version "2.2.1"
@@ -188,13 +196,6 @@ array-flatten@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
 
-array-index@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9"
-  dependencies:
-    debug "^2.2.0"
-    es6-symbol "^3.0.2"
-
 array-unique@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
@@ -261,7 +262,7 @@ async@1.5.2, async@^1.5.2:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
 
-async@^2.0.0:
+async@2.1.4, async@^2.0.0:
   version "2.1.4"
   resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4"
   dependencies:
@@ -893,13 +894,17 @@ babel-types@^6.13.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19
     to-fast-properties "^1.0.1"
 
 babylon@^6.11.0:
-  version "6.14.1"
-  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815"
+  version "6.15.0"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e"
 
 balanced-match@^0.4.1:
   version "0.4.2"
   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
 
+base-x@^2.0.1:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/base-x/-/base-x-2.0.3.tgz#d010aa601a4c97be3667593f8dbe38794612d9e9"
+
 base64-js@^1.0.2:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
@@ -918,6 +923,12 @@ bcrypt-pbkdf@^1.0.0:
   dependencies:
     tweetnacl "^0.14.3"
 
+best-encoding@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/best-encoding/-/best-encoding-0.1.1.tgz#195213dabcac045818b807b7a31f839faddc974e"
+  dependencies:
+    accept-encoding "~0.1.0"
+
 binary-extensions@^1.0.0:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
@@ -939,6 +950,12 @@ bl@^1.0.0, bl@~1.1.2:
   dependencies:
     readable-stream "~2.0.5"
 
+bl@~0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-0.7.0.tgz#3fb0670602ac2878eb770dc2039f1836be62ae5b"
+  dependencies:
+    readable-stream "~1.0.2"
+
 block-stream@*:
   version "0.0.9"
   resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
@@ -1079,6 +1096,12 @@ brunch@2.4.2:
     read-components "~0.6.0"
     source-map "~0.5.0"
 
+bs58@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.0.tgz#65f5deaf6d74e6135a99f763ca6209ab424b9172"
+  dependencies:
+    base-x "^2.0.1"
+
 buffer-crc32@^0.2.1:
   version "0.2.13"
   resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
@@ -1119,8 +1142,8 @@ builtin-status-codes@^2.0.0:
   resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-2.0.0.tgz#6f22003baacf003ccd287afe6872151fddc58579"
 
 busboy@*:
-  version "0.2.13"
-  resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.13.tgz#90fc4f6a3967d815616fc976bfa8e56aed0c58b6"
+  version "0.2.14"
+  resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
   dependencies:
     dicer "0.2.5"
     readable-stream "1.1.x"
@@ -1148,6 +1171,10 @@ camelcase@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
 
+caseless@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.3.0.tgz#534e97916387d3b706b64fdebbac46438450934f"
+
 caseless@~0.11.0:
   version "0.11.0"
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
@@ -1224,10 +1251,20 @@ clean-css@^3.1.9:
     commander "2.8.x"
     source-map "0.4.x"
 
+cli-cursor@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+  dependencies:
+    restore-cursor "^1.0.1"
+
 cli-width@^1.0.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d"
 
+cli-width@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
+
 cliui@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
@@ -1346,6 +1383,14 @@ concat-map@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
 
+concat-stream@^1.4.7:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+  dependencies:
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
 connect-busboy@0.0.2:
   version "0.0.2"
   resolved "https://registry.yarnpkg.com/connect-busboy/-/connect-busboy-0.0.2.tgz#ac5c9c96672171885e576c66b2bfd95d3bb11097"
@@ -1413,12 +1458,16 @@ cp@~0.1.0:
   resolved "https://registry.yarnpkg.com/cp/-/cp-0.1.1.tgz#3946a76c1a53ffe0e68593f341c124b336c1f06d"
 
 crc32-stream@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-1.0.0.tgz#ea155e5e1d738ed3778438ffe92ffe2a141aeb3f"
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-1.0.1.tgz#ce2c5dc3bd8ffb3830f9cb47f540222c63c90fab"
   dependencies:
-    buffer-crc32 "^0.2.1"
+    crc "^3.4.4"
     readable-stream "^2.0.0"
 
+crc@^3.4.4:
+  version "3.4.4"
+  resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b"
+
 create-ecdh@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
@@ -1513,12 +1562,6 @@ cycle@1.0.x:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
 
-d@^0.1.1, d@~0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309"
-  dependencies:
-    es5-ext "~0.10.2"
-
 daemonize2@0.4.2:
   version "0.4.2"
   resolved "https://registry.yarnpkg.com/daemonize2/-/daemonize2-0.4.2.tgz#c6e474078becfa7d7a814002514c4712f64fe06f"
@@ -1529,6 +1572,13 @@ dashdash@^1.12.0:
   dependencies:
     assert-plus "^1.0.0"
 
+ddos@0.1.16:
+  version "0.1.16"
+  resolved "https://registry.yarnpkg.com/ddos/-/ddos-0.1.16.tgz#45c7cc77ebcd3f7a41a500d23d96dbeb2bca34c9"
+  dependencies:
+    hashish ""
+    response ""
+
 debug@*, debug@^2.1.1, debug@^2.2.0, debug@~2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
@@ -1616,49 +1666,174 @@ domain-browser@~1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
 
-"duniter@file:../duniter":
-  version "0.60.0"
+duniter-bma@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/duniter-bma/-/duniter-bma-0.1.0.tgz#e766e2d077368bb0778c0f6de618d8a5582c4300"
   dependencies:
-    archiver "1.0.1"
-    async "1.5.2"
-    bindings "1.2.1"
+    async "2.1.4"
     body-parser "1.15.2"
     co "4.6.0"
-    colors "1.1.2"
-    commander "2.9.0"
     cors "2.8.1"
-    daemonize2 "0.4.2"
+    ddos "0.1.16"
+    errorhandler "1.4.3"
+    event-stream "3.3.4"
+    express "4.14.0"
+    express-cors "0.0.3"
+    express-fileupload "0.0.5"
+    inquirer "0.8.5"
+    morgan "1.7.0"
+    nnupnp "1.0.2"
+    q "1.4.1"
+    request "2.75.0"
+    request-promise "4.1.1"
+    underscore "1.8.3"
+    ws "1.1.1"
+
+duniter-bma@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/duniter-bma/-/duniter-bma-0.2.0.tgz#fcbe47f50992c6901ab5360a5098e2220a025a5b"
+  dependencies:
+    async "2.1.4"
+    body-parser "1.15.2"
+    co "4.6.0"
+    cors "2.8.1"
+    ddos "0.1.16"
     errorhandler "1.4.3"
     event-stream "3.3.4"
     express "4.14.0"
     express-cors "0.0.3"
     express-fileupload "0.0.5"
     inquirer "0.8.5"
+    morgan "1.7.0"
+    nnupnp "1.0.2"
+    q "1.4.1"
+    request "2.75.0"
+    request-promise "4.1.1"
+    underscore "1.8.3"
+    ws "1.1.1"
+
+duniter-common@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/duniter-common/-/duniter-common-0.1.0.tgz#f5cbdc301ba8e57fcc1ab39521ac8f621e3df691"
+  dependencies:
+    co "4.6.0"
+    naclb "1.3.7"
+    node-pre-gyp "0.6.32"
+    tweetnacl "0.14.3"
+
+duniter-crawler@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/duniter-crawler/-/duniter-crawler-0.1.0.tgz#438607e85c79364767642af61c0141cd7722531b"
+  dependencies:
+    async "2.1.4"
+    co "4.6.0"
+    duniter-bma "0.1.0"
+    inquirer "2.0.0"
+    moment "2.17.1"
+    multimeter "0.1.1"
+    q "1.4.1"
+    querablep "0.1.0"
+    request "2.75.0"
+    request-promise "4.1.1"
+    underscore "1.8.3"
+
+duniter-crawler@^0.2.1:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/duniter-crawler/-/duniter-crawler-0.2.2.tgz#cf786ad009c09e2b941be808520d80d220f5964c"
+  dependencies:
+    async "2.1.4"
+    co "4.6.0"
+    duniter-bma "0.2.0"
+    inquirer "2.0.0"
+    moment "2.17.1"
+    multimeter "0.1.1"
+    q "1.4.1"
+    querablep "0.1.0"
+    request "2.75.0"
+    request-promise "4.1.1"
+    underscore "1.8.3"
+
+duniter-keypair@0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/duniter-keypair/-/duniter-keypair-0.1.1.tgz#f046c09d09c2fa264a646efe8a52206c8f83acc2"
+  dependencies:
+    bs58 "4.0.0"
+    co "4.6.0"
+    inquirer "^2.0.0"
+    node-pre-gyp "0.6.32"
+    q "1.4.1"
+    scryptb "6.0.4"
+    tweetnacl "0.14.3"
+    tweetnacl-util "0.13.5"
+
+duniter-keypair@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/duniter-keypair/-/duniter-keypair-0.2.0.tgz#8cdca5cf7e3e5db792d5ab018e34bd73ee977f61"
+  dependencies:
+    bs58 "4.0.0"
+    co "4.6.0"
+    inquirer "^2.0.0"
+    node-pre-gyp "0.6.32"
+    q "1.4.1"
+    scryptb "6.0.4"
+    tweetnacl "0.14.3"
+    tweetnacl-util "0.13.5"
+
+duniter-prover@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/duniter-prover/-/duniter-prover-0.1.0.tgz#26f0708448139a0a220ab88402819138555f39b6"
+  dependencies:
+    async "2.1.4"
+    co "4.6.0"
+    duniter-common "0.1.0"
+    duniter-crawler "0.1.0"
+    duniter-keypair "0.1.1"
+    inquirer "0.8.5"
+    moment "2.17.1"
+    multimeter "0.1.1"
+    node-uuid "1.4.7"
+    q "1.4.1"
+    querablep "0.1.0"
+    request "2.75.0"
+    request-promise "4.1.1"
+    underscore "1.8.3"
+
+duniter@duniter/duniter:
+  version "0.90.0"
+  resolved "https://codeload.github.com/duniter/duniter/tar.gz/0bde64a7a2d0d890c2eb3b0f116d5fa6dd25da8c"
+  dependencies:
+    archiver "1.0.1"
+    async "1.5.2"
+    bindings "1.2.1"
+    co "4.6.0"
+    colors "1.1.2"
+    commander "2.9.0"
+    daemonize2 "0.4.2"
+    duniter-bma "0.1.0"
+    duniter-common "0.1.0"
+    duniter-crawler "0.1.0"
+    duniter-keypair "0.1.1"
+    duniter-prover "0.1.0"
+    event-stream "3.3.4"
+    inquirer "0.8.5"
     jison "0.4.17"
     merkle "0.5.1"
     moment "2.15.1"
-    morgan "1.7.0"
-    multimeter "0.1.1"
-    naclb "1.3.7"
-    nnupnp "1.0.2"
-    node-pre-gyp "^0.6.32"
-    node-uuid "^1.4.7"
+    node-pre-gyp "0.6.32"
     optimist "0.6.1"
-    parallelshell "^2.0.0"
+    parallelshell "2.0.0"
     q "1.4.1"
     q-io "1.13.2"
+    querablep "^0.1.0"
     request "2.75.0"
     request-promise "4.1.1"
-    scryptb "6.0.4"
     sqlite3 "3.1.4"
     superagent "2.3.0"
-    tweetnacl "0.14.3"
     underscore "1.8.3"
     unzip "0.1.11"
     unzip2 "0.2.5"
     winston "2.2.0"
     wotb "0.4.14"
-    ws "1.1.1"
 
 duplexer@~0.1.1:
   version "0.1.1"
@@ -1710,28 +1885,6 @@ errorhandler@1.4.3:
     accepts "~1.3.0"
     escape-html "~1.0.3"
 
-es5-ext@^0.10.7, es5-ext@~0.10.11, es5-ext@~0.10.2:
-  version "0.10.12"
-  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047"
-  dependencies:
-    es6-iterator "2"
-    es6-symbol "~3.1"
-
-es6-iterator@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac"
-  dependencies:
-    d "^0.1.1"
-    es5-ext "^0.10.7"
-    es6-symbol "3"
-
-es6-symbol@3, es6-symbol@^3.0.2, es6-symbol@~3.1:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa"
-  dependencies:
-    d "~0.1.1"
-    es5-ext "~0.10.11"
-
 escape-html@~1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -1806,6 +1959,10 @@ exec-sh@^0.2.0:
   dependencies:
     merge "^1.1.3"
 
+exit-hook@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+
 expand-brackets@^0.1.4:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
@@ -1865,6 +2022,14 @@ extend@^3.0.0, extend@~3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
 
+external-editor@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b"
+  dependencies:
+    extend "^3.0.0"
+    spawn-sync "^1.0.15"
+    tmp "^0.0.29"
+
 extglob@^0.3.1:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
@@ -1914,6 +2079,12 @@ figures@^1.3.5:
     escape-string-regexp "^1.0.5"
     object-assign "^4.1.0"
 
+figures@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
 filename-regex@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"
@@ -2000,8 +2171,8 @@ form-data@~2.1.1:
     mime-types "^2.1.12"
 
 formidable@^1.0.17:
-  version "1.0.17"
-  resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559"
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.1.1.tgz#96b8886f7c3c3508b932d6bd70c4d3a88f35f1a9"
 
 forwarded@~0.1.0:
   version "0.1.0"
@@ -2042,8 +2213,8 @@ fs.realpath@^1.0.0:
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
 
 fsevents@^1.0.0:
-  version "1.0.15"
-  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44"
+  version "1.0.17"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.17.tgz#8537f3f12272678765b4fd6528c0f1f66f8f4558"
   dependencies:
     nan "^2.3.0"
     node-pre-gyp "^0.6.29"
@@ -2244,6 +2415,12 @@ hash.js@^1.0.0:
   dependencies:
     inherits "^2.0.1"
 
+hashish@:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/hashish/-/hashish-0.0.4.tgz#6d60bc6ffaf711b6afd60e426d077988014e6554"
+  dependencies:
+    traverse ">=0.2.4"
+
 hawk@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.0.0.tgz#b90bb169807285411da7ffcb8dd2598502d3b52d"
@@ -2338,7 +2515,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1:
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
 
@@ -2373,6 +2550,25 @@ inquirer@0.8.5:
     rx "^2.4.3"
     through "^2.3.6"
 
+inquirer@2.0.0, inquirer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-2.0.0.tgz#e1351687b90d150ca403ceaa3cefb1e3065bef4b"
+  dependencies:
+    ansi-escapes "^1.1.0"
+    chalk "^1.0.0"
+    cli-cursor "^1.0.1"
+    cli-width "^2.0.0"
+    external-editor "^1.1.0"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.6"
+    pinkie-promise "^2.0.0"
+    run-async "^2.2.0"
+    rx "^4.1.0"
+    string-width "^2.0.0"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
 invariant@^2.2.0:
   version "2.2.2"
   resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
@@ -2387,9 +2583,9 @@ ip@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/ip/-/ip-0.0.1.tgz#bbc68d7cc448560a63fbe99237a01bc50fdca7ec"
 
-ipaddr.js@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.1.1.tgz#c791d95f52b29c1247d5df80ada39b8a73647230"
+ipaddr.js@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.2.0.tgz#8aba49c9192799585bdd643e0ccb50e8ae777ba4"
 
 is-arrayish@^0.2.1:
   version "0.2.1"
@@ -2441,6 +2637,10 @@ is-fullwidth-code-point@^1.0.0:
   dependencies:
     number-is-nan "^1.0.0"
 
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
 is-glob@^2.0.0, is-glob@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@@ -2470,7 +2670,7 @@ is-primitive@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
 
-is-promise@^2.0.0:
+is-promise@^2.0.0, is-promise@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
 
@@ -2581,6 +2781,10 @@ js-tokens@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5"
 
+js-tokens@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.0.tgz#a2f2a969caae142fb3cd56228358c89366957bd1"
+
 jsbn@~0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd"
@@ -2711,7 +2915,7 @@ lodash@^3.3.1:
   version "3.10.1"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
 
-lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.8.0:
+lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.8.0:
   version "4.17.4"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
 
@@ -2731,10 +2935,10 @@ longest@^1.0.1:
   resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
 
 loose-envify@^1.0.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8"
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
   dependencies:
-    js-tokens "^2.0.0"
+    js-tokens "^3.0.0"
 
 loud-rejection@^1.0.0:
   version "1.6.0"
@@ -2846,21 +3050,21 @@ miller-rabin@^4.0.0:
     bn.js "^4.0.0"
     brorand "^1.0.1"
 
-mime-db@~1.25.0:
-  version "1.25.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392"
+mime-db@~1.26.0:
+  version "1.26.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff"
 
 mime-types@^2.1.10, mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7:
-  version "2.1.13"
-  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88"
+  version "2.1.14"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee"
   dependencies:
-    mime-db "~1.25.0"
+    mime-db "~1.26.0"
 
-mime@1.3.4, mime@^1.3.4:
+mime@1.3.4, mime@^1.2.11, mime@^1.3.4:
   version "1.3.4"
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
 
-mime@^1.2.11, mime@~1.2.11, mime@~1.2.9:
+mime@~1.2.11, mime@~1.2.9:
   version "1.2.11"
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10"
 
@@ -2885,7 +3089,7 @@ minimatch@~0.2.11, minimatch@~0.2.14:
     lru-cache "2"
     sigmund "~1.0.0"
 
-minimist@0.0.8:
+minimist@0.0.8, minimist@~0.0.1:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
 
@@ -2893,15 +3097,11 @@ minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
 
-minimist@~0.0.1:
-  version "0.0.10"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
-
-mkdirp@0.3.0, mkdirp@0.3.x:
+mkdirp@0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e"
 
-mkdirp@0.3.4:
+mkdirp@0.3.4, mkdirp@0.3.x:
   version "0.3.4"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.4.tgz#f8c81d213b7299a031f193a57d752a17d2f6c7d8"
 
@@ -2935,6 +3135,10 @@ moment@2.15.1:
   version "2.15.1"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.15.1.tgz#e979c2a29e22888e60f396f2220a6118f85cd94c"
 
+moment@2.17.1:
+  version "2.17.1"
+  resolved "https://registry.yarnpkg.com/moment/-/moment-2.17.1.tgz#fed9506063f36b10f066c8b59a144d7faebe1d82"
+
 moment@2.6.0:
   version "2.6.0"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.6.0.tgz#0765b72b841dd213fa91914c0f6765122719f061"
@@ -2967,6 +3171,10 @@ mute-stream@0.0.4:
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.4.tgz#a9219960a6d5d5d046597aee51252c6655f7177e"
 
+mute-stream@0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db"
+
 naclb@1.3.7:
   version "1.3.7"
   resolved "https://registry.yarnpkg.com/naclb/-/naclb-1.3.7.tgz#df606c3ae4442e67932c9aaeaf36eebef8860b48"
@@ -2979,11 +3187,15 @@ nan@2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.2.0.tgz#779c07135629503cf6a7b7e6aab33049b3c3853c"
 
-nan@^2.0.5, nan@^2.3.2, nan@~2.3.3:
+nan@^2.0.5, nan@^2.3.0, nan@^2.3.2, nan@^2.3.3:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.0.tgz#aa8f1e34531d807e9e27755b234b4a6ec0c152a8"
+
+nan@~2.3.3:
   version "2.3.5"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.3.5.tgz#822a0dc266290ce4cd3a12282ca3e7e364668a08"
 
-nan@^2.3.0, nan@^2.3.3, nan@~2.4.0:
+nan@~2.4.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232"
 
@@ -3051,8 +3263,8 @@ node-browser-modules@~0.1.0:
     vm-browserify "~0.0.4"
 
 node-gyp@^3.3.1:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.4.0.tgz#dda558393b3ecbbe24c9e6b8703c71194c63fa36"
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.5.0.tgz#a8fe5e611d079ec16348a3eb960e78e11c85274a"
   dependencies:
     fstream "^1.0.0"
     glob "^7.0.3"
@@ -3060,9 +3272,8 @@ node-gyp@^3.3.1:
     minimatch "^3.0.2"
     mkdirp "^0.5.0"
     nopt "2 || 3"
-    npmlog "0 || 1 || 2 || 3"
+    npmlog "0 || 1 || 2 || 3 || 4"
     osenv "0"
-    path-array "^1.0.0"
     request "2"
     rimraf "2"
     semver "2.x || 3.x || 4 || 5"
@@ -3152,15 +3363,7 @@ normalize-path@^2.0.0, normalize-path@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a"
 
-"npmlog@0 || 1 || 2 || 3", npmlog@~2.0.0:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692"
-  dependencies:
-    ansi "~0.3.1"
-    are-we-there-yet "~1.1.2"
-    gauge "~1.2.5"
-
-npmlog@^4.0.0, npmlog@^4.0.1:
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.1:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f"
   dependencies:
@@ -3169,6 +3372,14 @@ npmlog@^4.0.0, npmlog@^4.0.1:
     gauge "~2.7.1"
     set-blocking "~2.0.0"
 
+npmlog@~2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692"
+  dependencies:
+    ansi "~0.3.1"
+    are-we-there-yet "~1.1.2"
+    gauge "~1.2.5"
+
 number-is-nan@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
@@ -3182,8 +3393,8 @@ oauth-sign@~0.8.1:
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
 
 object-assign@^4.0.1, object-assign@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
 
 object.omit@^2.0.0:
   version "2.0.1"
@@ -3214,6 +3425,10 @@ once@~1.3.0, once@~1.3.3:
   dependencies:
     wrappy "1"
 
+onetime@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+
 optimist@0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
@@ -3245,6 +3460,10 @@ os-locale@^1.4.0:
   dependencies:
     lcid "^1.0.0"
 
+os-shim@^0.1.2:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917"
+
 os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
@@ -3293,12 +3512,6 @@ parseurl@~1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
 
-path-array@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271"
-  dependencies:
-    array-index "^1.0.0"
-
 path-browserify@~0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
@@ -3397,11 +3610,11 @@ promise@~2.0:
     is-promise "~1"
 
 proxy-addr@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.2.tgz#b4cc5f22610d9535824c123aef9d3cf73c40ba37"
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.3.tgz#dc97502f5722e888467b3fa2297a7b1ff47df074"
   dependencies:
     forwarded "~0.1.0"
-    ipaddr.js "1.1.1"
+    ipaddr.js "1.2.0"
 
 pseudomap@^1.0.1:
   version "1.0.2"
@@ -3474,6 +3687,10 @@ qs@~0.6.0:
   version "0.6.6"
   resolved "https://registry.yarnpkg.com/qs/-/qs-0.6.6.tgz#6e015098ff51968b8a3c819001d5f2c89bc4b107"
 
+querablep@0.1.0, querablep@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/querablep/-/querablep-0.1.0.tgz#b2cd2b3e75fcd45d5dd7ade4c1811ab547849a84"
+
 querystring-es3@~0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
@@ -3551,7 +3768,19 @@ readable-stream@1.1.x:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.0.5:
+readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@~2.1.4:
+  version "2.1.5"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0"
+  dependencies:
+    buffer-shims "^1.0.0"
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    string_decoder "~0.10.x"
+    util-deprecate "~1.0.1"
+
+readable-stream@^2.2.2:
   version "2.2.2"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e"
   dependencies:
@@ -3563,7 +3792,7 @@ readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.
     string_decoder "~0.10.x"
     util-deprecate "~1.0.1"
 
-readable-stream@~1.0.0, readable-stream@~1.0.31:
+readable-stream@~1.0.0, readable-stream@~1.0.2, readable-stream@~1.0.31:
   version "1.0.34"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
   dependencies:
@@ -3583,18 +3812,6 @@ readable-stream@~2.0.5:
     string_decoder "~0.10.x"
     util-deprecate "~1.0.1"
 
-readable-stream@~2.1.4:
-  version "2.1.5"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0"
-  dependencies:
-    buffer-shims "^1.0.0"
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "~1.0.0"
-    process-nextick-args "~1.0.6"
-    string_decoder "~0.10.x"
-    util-deprecate "~1.0.1"
-
 readdirp@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
@@ -3772,6 +3989,22 @@ resolve@1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
 
+response@:
+  version "0.18.0"
+  resolved "https://registry.yarnpkg.com/response/-/response-0.18.0.tgz#a1009f271733f233582de0a95fb4cbaa5ea8b206"
+  dependencies:
+    best-encoding "^0.1.1"
+    bl "~0.7.0"
+    caseless "^0.3.0"
+    mime "~1.2.11"
+
+restore-cursor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+  dependencies:
+    exit-hook "^1.0.0"
+    onetime "^1.0.0"
+
 right-align@^0.1.1:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
@@ -3794,10 +4027,20 @@ ripemd160@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e"
 
+run-async@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+  dependencies:
+    is-promise "^2.1.0"
+
 rx@^2.4.3:
   version "2.5.3"
   resolved "https://registry.yarnpkg.com/rx/-/rx-2.5.3.tgz#21adc7d80f02002af50dae97fd9dbf248755f566"
 
+rx@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
+
 sane@~1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/sane/-/sane-1.0.4.tgz#8ddfa3d52d3cf12171d052c28bce05eff1211881"
@@ -3963,8 +4206,8 @@ sntp@1.x.x:
     hoek "2.x.x"
 
 source-map-support@^0.4.2:
-  version "0.4.8"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.8.tgz#4871918d8a3af07289182e974e32844327b2e98b"
+  version "0.4.10"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.10.tgz#d7b19038040a14c0837a18e630a196453952b378"
   dependencies:
     source-map "^0.5.3"
 
@@ -3984,6 +4227,13 @@ source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.0, source-map@~0.5.1:
   version "0.5.6"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
 
+spawn-sync@^1.0.15:
+  version "1.0.15"
+  resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476"
+  dependencies:
+    concat-stream "^1.4.7"
+    os-shim "^0.1.2"
+
 spdx-correct@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
@@ -4012,8 +4262,8 @@ sqlite3@3.1.4:
     node-pre-gyp "~0.6.28"
 
 sshpk@^1.7.0:
-  version "1.10.1"
-  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0"
+  version "1.10.2"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.2.tgz#d5a804ce22695515638e798dbe23273de070a5fa"
   dependencies:
     asn1 "~0.2.3"
     assert-plus "^1.0.0"
@@ -4080,6 +4330,13 @@ string-width@^1.0.1:
     is-fullwidth-code-point "^1.0.0"
     strip-ansi "^3.0.0"
 
+string-width@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^3.0.0"
+
 string_decoder@~0.10.31, string_decoder@~0.10.x:
   version "0.10.31"
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
@@ -4237,7 +4494,7 @@ timers-browserify@~1.4.2:
   dependencies:
     process "~0.11.0"
 
-tmp@0.0.29:
+tmp@0.0.29, tmp@^0.0.29:
   version "0.0.29"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0"
   dependencies:
@@ -4275,7 +4532,7 @@ transformers@2.1.0:
     promise "~2.0"
     uglify-js "~2.2.5"
 
-"traverse@>=0.3.0 <0.4":
+traverse@>=0.2.4, "traverse@>=0.3.0 <0.4":
   version "0.3.9"
   resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9"
 
@@ -4295,6 +4552,10 @@ tunnel-agent@~0.4.1:
   version "0.4.3"
   resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
 
+tweetnacl-util@0.13.5:
+  version "0.13.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.13.5.tgz#e39cd5d99709ee7125a18b03895b45a1299e475f"
+
 tweetnacl@0.14.3, tweetnacl@^0.14.3, tweetnacl@~0.14.0:
   version "0.14.3"
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d"
@@ -4312,6 +4573,10 @@ typedarray-to-buffer@^3.1.2:
   dependencies:
     is-typedarray "^1.0.0"
 
+typedarray@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
 uglify-js-brunch@2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/uglify-js-brunch/-/uglify-js-brunch-2.0.1.tgz#bf55ba28df5e4ee5083bf7e3964d88eb4aabca13"
@@ -4513,14 +4778,10 @@ with@~4.0.0:
     acorn "^1.0.1"
     acorn-globals "^1.0.3"
 
-wordwrap@0.0.2:
+wordwrap@0.0.2, wordwrap@~0.0.2:
   version "0.0.2"
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
 
-wordwrap@~0.0.2:
-  version "0.0.3"
-  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
-
 wotb@0.4.14:
   version "0.4.14"
   resolved "https://registry.yarnpkg.com/wotb/-/wotb-0.4.14.tgz#61162f5e427a51e7a41c7e834d16a41fea2373fc"
@@ -4615,8 +4876,8 @@ yargs@~3.10.0:
     window-size "0.1.0"
 
 zip-stream@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.1.0.tgz#2ad479fffc168e05a888e8c348ff6813b3f13733"
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.1.1.tgz#5216b48bbb4d2651f64d5c6e6f09eb4a7399d557"
   dependencies:
     archiver-utils "^1.3.0"
     compress-commons "^1.1.0"