From ac8e25b0ef80e21a2c80c304de3debd206d233d9 Mon Sep 17 00:00:00 2001
From: Chris Hines <chris.hines@monash.edu>
Date: Tue, 5 Mar 2019 12:40:43 +1100
Subject: [PATCH] many changes, plust setup git ignore

---
 .gitignore                                    |   4 +
 install.sh                                    |   4 +-
 package-lock.json                             | 652 ++++++++++--------
 src/app/.job.ts.swp                           | Bin 12288 -> 0 bytes
 src/app/apiserver.ts                          |   5 +
 src/app/authorisation.service.ts              |  58 +-
 src/app/identity.ts                           |   1 +
 src/app/joblist/joblist.component.html        |   4 +-
 src/app/launcher/launcher.component.html      |  55 +-
 src/app/launcher/launcher.component.ts        |  12 +-
 .../sv2-side-nav/sv2-side-nav.component.html  |  17 +-
 src/app/tes.service.ts                        |  47 +-
 src/assets/config/apiservers.json             |  14 +
 src/assets/config/authservers.json            |   9 +-
 src/assets/config/computesites.json           |  10 +-
 src/assets/config/m3apps.json                 |  17 +-
 src/assets/config/m3apps.json~                |  62 --
 src/environments/environment.prod.ts          |   3 +-
 src/environments/environment.ts               |   3 +-
 19 files changed, 587 insertions(+), 390 deletions(-)
 delete mode 100644 src/app/.job.ts.swp
 create mode 100644 src/app/apiserver.ts
 create mode 100644 src/assets/config/apiservers.json
 delete mode 100644 src/assets/config/m3apps.json~

diff --git a/.gitignore b/.gitignore
index eabf65e..2127bb7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,3 +42,7 @@ testem.log
 # System Files
 .DS_Store
 Thumbs.db
+
+*~
+*.swp
+*.swo
diff --git a/install.sh b/install.sh
index 6c7c245..88fc867 100755
--- a/install.sh
+++ b/install.sh
@@ -1,4 +1,4 @@
-mkdir -p /var/www/sv2/dist/sv2
+mkdir -p /opt/strudel2/spa/sv2
 cp sv2.conf /etc/nginx/snippets
-cp -r dist/* /var/www/sv2/dist/sv2
+cp -r dist/* /opt/strudel2/spa/sv2
 echo "you must include /etc/nginx/snippets/sv2.conf in your nginx site config manually"
diff --git a/package-lock.json b/package-lock.json
index 41d844d..a07f0ec 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,6 +12,17 @@
       "requires": {
         "@angular-devkit/core": "7.3.1",
         "rxjs": "6.3.3"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
+          "requires": {
+            "tslib": "1.9.0"
+          }
+        }
       }
     },
     "@angular-devkit/build-angular": {
@@ -67,6 +78,15 @@
         "webpack-subresource-integrity": "1.1.0-rc.6"
       },
       "dependencies": {
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
+          "requires": {
+            "tslib": "1.9.0"
+          }
+        },
         "semver": {
           "version": "5.6.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
@@ -110,6 +130,17 @@
         "@angular-devkit/architect": "0.13.1",
         "@angular-devkit/core": "7.3.1",
         "rxjs": "6.3.3"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
+          "requires": {
+            "tslib": "1.9.0"
+          }
+        }
       }
     },
     "@angular-devkit/core": {
@@ -125,6 +156,15 @@
         "source-map": "0.7.3"
       },
       "dependencies": {
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
+          "requires": {
+            "tslib": "1.9.0"
+          }
+        },
         "source-map": {
           "version": "0.7.3",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
@@ -133,16 +173,6 @@
         }
       }
     },
-    "@angular-devkit/schematics": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.3.1.tgz",
-      "integrity": "sha512-cd7usiasfSgw75INz72/VssrLr9tiVRYfo1TEdvr9ww0GuQbuQpB33xbV8W135eAV8+wzQ3Ce8ohaDHibvj6Yg==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/core": "7.3.1",
-        "rxjs": "6.3.3"
-      }
-    },
     "@angular/animations": {
       "version": "7.2.4",
       "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.4.tgz",
@@ -152,9 +182,9 @@
       }
     },
     "@angular/cdk": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-7.1.0.tgz",
-      "integrity": "sha512-dY740pKcIRtKr6n6NomrgqfdEj988urTZ9I/bfJjxF5fdhnSjyhEvDlB55EHsrF+bTTZbZXRmv7AwOQ9GJnD9w==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-7.3.1.tgz",
+      "integrity": "sha512-m6hy+HPLDgVM+Y2C3UWvIG06euIV8oG5QxrCitZui8JZ/dj/0V5bxATKgWN62haYnYR4en4z1bfH0kOvQj+LEA==",
       "requires": {
         "parse5": "5.1.0",
         "tslib": "1.9.0"
@@ -169,30 +199,280 @@
       }
     },
     "@angular/cli": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.3.1.tgz",
-      "integrity": "sha512-8EvXYRhTqTaTk5PKv7VZxIWJiyG51R9RC9gtpRFx4bbnurqBHdEUxGMmaRsGT8QDbfvVsWnuakE0eeW1CrfZAQ==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.2.4.tgz",
+      "integrity": "sha512-xv3e0JE4bLZA7GAOBWB9F2Bxq5M9Zw/Agl8Q9mNiPVnYVD3ZeFNfrAat43CxIL1co0W1YEvVzadsCR8kbRmL9A==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.13.1",
-        "@angular-devkit/core": "7.3.1",
-        "@angular-devkit/schematics": "7.3.1",
-        "@schematics/angular": "7.3.1",
-        "@schematics/update": "0.13.1",
-        "@yarnpkg/lockfile": "1.1.0",
-        "ini": "1.3.5",
+        "@angular-devkit/architect": "0.12.4",
+        "@angular-devkit/core": "7.2.4",
+        "@angular-devkit/schematics": "7.2.4",
+        "@schematics/angular": "7.2.4",
+        "@schematics/update": "0.12.4",
         "inquirer": "6.2.1",
-        "npm-package-arg": "6.1.0",
-        "opn": "5.4.0",
-        "pacote": "9.4.0",
-        "semver": "5.6.0",
+        "opn": "5.3.0",
+        "semver": "5.5.1",
         "symbol-observable": "1.2.0"
       },
       "dependencies": {
+        "@angular-devkit/architect": {
+          "version": "0.12.4",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.12.4.tgz",
+          "integrity": "sha512-19f3jbGyP+GzTSBgrHR4SWGK81SUgtTxhkAcyhmsIEDuXrMJM8kPu0HB9WivJ5p08+jzwz6xdF9mpNYSeD9uqw==",
+          "dev": true,
+          "requires": {
+            "@angular-devkit/core": "7.2.4",
+            "rxjs": "6.3.3"
+          }
+        },
+        "@angular-devkit/core": {
+          "version": "7.2.4",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.2.4.tgz",
+          "integrity": "sha512-XHF59tIHg2qEM1Wd415xhykBLjjfOK6yMB7CjNk1bToUMX2QDT87izJF4y1Vwa0lIw9G0jdgP/4/M/OqXcbYmA==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.6.2",
+            "chokidar": "2.0.4",
+            "fast-json-stable-stringify": "2.0.0",
+            "rxjs": "6.3.3",
+            "source-map": "0.7.3"
+          }
+        },
+        "@angular-devkit/schematics": {
+          "version": "7.2.4",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.2.4.tgz",
+          "integrity": "sha512-ObIDnIxXRpts+Jzs0PQ7JVuK4d5vWEh9K+Ow8nMO5/LmYJQ8/2nMEQo/9lhdKPMiXmhbuvB7qZL5J+cxwwijhw==",
+          "dev": true,
+          "requires": {
+            "@angular-devkit/core": "7.2.4",
+            "rxjs": "6.3.3"
+          }
+        },
+        "@schematics/angular": {
+          "version": "7.2.4",
+          "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.2.4.tgz",
+          "integrity": "sha512-aflQwIX4E9tDhp6ZASuQCm8CzxLxdkuOe6qN1FbCxpxMUc9E+iK9jhOjw+Xnl3boJpWHAA+k9JO1sYe3wrh3Ng==",
+          "dev": true,
+          "requires": {
+            "@angular-devkit/core": "7.2.4",
+            "@angular-devkit/schematics": "7.2.4",
+            "typescript": "3.2.2"
+          }
+        },
+        "@schematics/update": {
+          "version": "0.12.4",
+          "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.12.4.tgz",
+          "integrity": "sha512-VJbRGt+WipRdsbFdW40DASIqy8r4o40k2Umv7A0/cjFkq1egyZSC8QAYXhWx3iYn7BSXfGg83hknaAhYCC6Yjw==",
+          "dev": true,
+          "requires": {
+            "@angular-devkit/core": "7.2.4",
+            "@angular-devkit/schematics": "7.2.4",
+            "@yarnpkg/lockfile": "1.1.0",
+            "ini": "1.3.5",
+            "pacote": "9.1.1",
+            "rxjs": "6.3.3",
+            "semver": "5.5.1",
+            "semver-intersect": "1.4.0"
+          }
+        },
+        "ajv": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
+          "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "2.0.1",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.4.1",
+            "uri-js": "4.2.2"
+          }
+        },
+        "cacache": {
+          "version": "11.3.2",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz",
+          "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==",
+          "dev": true,
+          "requires": {
+            "bluebird": "3.5.3",
+            "chownr": "1.1.1",
+            "figgy-pudding": "3.5.1",
+            "glob": "7.1.3",
+            "graceful-fs": "4.1.15",
+            "lru-cache": "5.1.1",
+            "mississippi": "3.0.0",
+            "mkdirp": "0.5.1",
+            "move-concurrently": "1.0.1",
+            "promise-inflight": "1.0.1",
+            "rimraf": "2.6.3",
+            "ssri": "6.0.1",
+            "unique-filename": "1.1.1",
+            "y18n": "4.0.0"
+          },
+          "dependencies": {
+            "lru-cache": {
+              "version": "5.1.1",
+              "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+              "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+              "dev": true,
+              "requires": {
+                "yallist": "3.0.3"
+              }
+            }
+          }
+        },
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "dev": true,
+          "requires": {
+            "pump": "3.0.0"
+          }
+        },
+        "mississippi": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+          "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+          "dev": true,
+          "requires": {
+            "concat-stream": "1.6.2",
+            "duplexify": "3.7.1",
+            "end-of-stream": "1.4.1",
+            "flush-write-stream": "1.1.1",
+            "from2": "2.3.0",
+            "parallel-transform": "1.1.0",
+            "pump": "3.0.0",
+            "pumpify": "1.5.1",
+            "stream-each": "1.2.3",
+            "through2": "2.0.5"
+          }
+        },
+        "opn": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
+          "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
+          "dev": true,
+          "requires": {
+            "is-wsl": "1.1.0"
+          }
+        },
+        "pacote": {
+          "version": "9.1.1",
+          "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.1.1.tgz",
+          "integrity": "sha512-f28Rq5ozzKAA9YwIKw61/ipwAatUZseYmVssDbHHaexF0wRIVotapVEZPAjOT7Eu3LYVqEp0NVpNizoAnYBUaA==",
+          "dev": true,
+          "requires": {
+            "bluebird": "3.5.3",
+            "cacache": "11.3.2",
+            "figgy-pudding": "3.5.1",
+            "get-stream": "4.1.0",
+            "glob": "7.1.3",
+            "lru-cache": "4.1.5",
+            "make-fetch-happen": "4.0.1",
+            "minimatch": "3.0.4",
+            "minipass": "2.3.5",
+            "mississippi": "3.0.0",
+            "mkdirp": "0.5.1",
+            "normalize-package-data": "2.5.0",
+            "npm-package-arg": "6.1.0",
+            "npm-packlist": "1.3.0",
+            "npm-pick-manifest": "2.2.3",
+            "npm-registry-fetch": "3.9.0",
+            "osenv": "0.1.5",
+            "promise-inflight": "1.0.1",
+            "promise-retry": "1.1.1",
+            "protoduck": "5.0.1",
+            "rimraf": "2.6.3",
+            "safe-buffer": "5.1.2",
+            "semver": "5.6.0",
+            "ssri": "6.0.1",
+            "tar": "4.4.8",
+            "unique-filename": "1.1.1",
+            "which": "1.3.1"
+          },
+          "dependencies": {
+            "semver": {
+              "version": "5.6.0",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+              "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+              "dev": true
+            }
+          }
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "1.4.1",
+            "once": "1.4.0"
+          }
+        },
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
+          "requires": {
+            "tslib": "1.9.0"
+          }
+        },
         "semver": {
-          "version": "5.6.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
-          "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+          "version": "5.5.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
+          "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "3.5.1"
+          }
+        },
+        "tar": {
+          "version": "4.4.8",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
+          "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
+          "dev": true,
+          "requires": {
+            "chownr": "1.1.1",
+            "fs-minipass": "1.2.5",
+            "minipass": "2.3.5",
+            "minizlib": "1.2.1",
+            "mkdirp": "0.5.1",
+            "safe-buffer": "5.1.2",
+            "yallist": "3.0.3"
+          }
+        },
+        "typescript": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz",
+          "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==",
+          "dev": true
+        },
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "dev": true,
+          "requires": {
+            "isexe": "2.0.0"
+          }
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
+          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
           "dev": true
         }
       }
@@ -382,7 +662,7 @@
         },
         "load-json-file": {
           "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+          "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
           "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
           "dev": true,
           "requires": {
@@ -444,7 +724,7 @@
         },
         "pify": {
           "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
           "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
           "dev": true
         },
@@ -553,9 +833,9 @@
       }
     },
     "@angular/flex-layout": {
-      "version": "7.0.0-beta.19",
-      "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-7.0.0-beta.19.tgz",
-      "integrity": "sha512-MXq+zZ6/s5/+GsL9fZ42mKL0LjZ/+L0sVU5FaQuSAJ57soLl5QAGWvdxVmROtqcHd3Htp35R49nKSZBJ0nfAjg==",
+      "version": "7.0.0-beta.23",
+      "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-7.0.0-beta.23.tgz",
+      "integrity": "sha512-jH2i3i/M7SbK6scVlj2urVL5OhzwavbQ7KwvUjyc/UwccKnnzuOuWEGCINLja/aoaUO3I35LluCLv6a6VN0olA==",
       "requires": {
         "tslib": "1.9.0"
       }
@@ -583,9 +863,9 @@
       "dev": true
     },
     "@angular/material": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@angular/material/-/material-7.1.0.tgz",
-      "integrity": "sha512-bgotNpSfGLjNZ1AcTyhs6XS7trF4I7UHwQmfa0l8y3Gf9plwErPDfQe2XqnayRyG9nTwHj9f1lQ45X5mr3/0/A==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@angular/material/-/material-7.3.1.tgz",
+      "integrity": "sha512-txq2y/JSB+05l8a/OfnByw7AEKSeAWAJ49jzCoeb3804sCeVEbvuWZfpmKBX8vCVTZh005Ypuk55R4NP5AIgaw==",
       "requires": {
         "tslib": "1.9.0"
       }
@@ -779,48 +1059,16 @@
         "rxjs": "6.3.3",
         "tree-kill": "1.2.1",
         "webpack-sources": "1.3.0"
-      }
-    },
-    "@schematics/angular": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.3.1.tgz",
-      "integrity": "sha512-0Ne8APPlTAjKg5CSZqluwCuW/5yPjr3ALCWzqwPxN0suE745usThtasBmqrjw0RMIt8nRqRgtg54Z7lCPO9ZFg==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/core": "7.3.1",
-        "@angular-devkit/schematics": "7.3.1",
-        "typescript": "3.2.4"
       },
       "dependencies": {
-        "typescript": {
-          "version": "3.2.4",
-          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz",
-          "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==",
-          "dev": true
-        }
-      }
-    },
-    "@schematics/update": {
-      "version": "0.13.1",
-      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.13.1.tgz",
-      "integrity": "sha512-EHOqolT/d/jRGuVTCUESLpk8JNpuaPlsVHfeK7Kdp/t0wSEnmtOelZX4+leS25lGXDaDUF3138ntjrZR4n6bGw==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/core": "7.3.1",
-        "@angular-devkit/schematics": "7.3.1",
-        "@yarnpkg/lockfile": "1.1.0",
-        "ini": "1.3.5",
-        "pacote": "9.4.0",
-        "rxjs": "6.3.3",
-        "semver": "5.6.0",
-        "semver-intersect": "1.4.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.6.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
-          "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
-          "dev": true
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
+          "requires": {
+            "tslib": "1.9.0"
+          }
         }
       }
     },
@@ -831,18 +1079,18 @@
       "dev": true
     },
     "@types/jasminewd2": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz",
-      "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==",
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz",
+      "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==",
       "dev": true,
       "requires": {
         "@types/jasmine": "3.3.8"
       }
     },
     "@types/node": {
-      "version": "10.12.23",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.23.tgz",
-      "integrity": "sha512-EKhb5NveQ3NlW5EV7B0VRtDKwUfVey8LuJRl9pp5iW0se87/ZqLjG0PMf2MCzPXAJYWZN5Ltg7pHIAf9/Dm1tQ==",
+      "version": "10.12.24",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.24.tgz",
+      "integrity": "sha512-GWWbvt+z9G5otRBW8rssOFgRY87J9N/qbhqfjMZ+gUuL6zoL+Hm6gP/8qQBG4jjimqdaNLCehcVapZ/Fs2WjCQ==",
       "dev": true
     },
     "@types/q": {
@@ -869,7 +1117,7 @@
       "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==",
       "dev": true,
       "requires": {
-        "@types/node": "10.12.23",
+        "@types/node": "10.12.24",
         "@types/source-list-map": "0.1.2",
         "source-map": "0.6.1"
       },
@@ -1215,9 +1463,9 @@
       }
     },
     "app-root-path": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz",
-      "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz",
+      "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=",
       "dev": true
     },
     "append-transform": {
@@ -1530,7 +1778,7 @@
       "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
       "dev": true,
       "requires": {
-        "core-js": "2.5.5",
+        "core-js": "2.6.4",
         "regenerator-runtime": "0.11.1"
       }
     },
@@ -2777,17 +3025,25 @@
       "dev": true
     },
     "codelyzer": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.2.1.tgz",
-      "integrity": "sha512-CKwfgpfkqi9dyzy4s6ELaxJ54QgJ6A8iTSsM4bzHbLuTpbKncvNc3DUlCvpnkHBhK47gEf4qFsWoYqLrJPhy6g==",
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz",
+      "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==",
       "dev": true,
       "requires": {
-        "app-root-path": "2.0.1",
-        "css-selector-tokenizer": "0.7.0",
+        "app-root-path": "2.1.0",
+        "css-selector-tokenizer": "0.7.1",
         "cssauron": "1.4.0",
         "semver-dsl": "1.0.1",
         "source-map": "0.5.7",
-        "sprintf-js": "1.0.3"
+        "sprintf-js": "1.1.2"
+      },
+      "dependencies": {
+        "sprintf-js": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+          "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
+          "dev": true
+        }
       }
     },
     "collection-visit": {
@@ -3049,9 +3305,9 @@
       }
     },
     "core-js": {
-      "version": "2.5.5",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
-      "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs="
+      "version": "2.6.4",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz",
+      "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A=="
     },
     "core-util-is": {
       "version": "1.0.2",
@@ -3157,13 +3413,13 @@
       "dev": true
     },
     "css-selector-tokenizer": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz",
-      "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=",
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz",
+      "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==",
       "dev": true,
       "requires": {
         "cssesc": "0.1.0",
-        "fastparse": "1.1.1",
+        "fastparse": "1.1.2",
         "regexpu-core": "1.0.0"
       }
     },
@@ -4127,9 +4383,9 @@
       "dev": true
     },
     "fastparse": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz",
-      "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+      "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
       "dev": true
     },
     "faye-websocket": {
@@ -5967,7 +6223,7 @@
         "lodash": "4.17.11",
         "mute-stream": "0.0.7",
         "run-async": "2.3.0",
-        "rxjs": "6.3.3",
+        "rxjs": "6.4.0",
         "string-width": "2.1.1",
         "strip-ansi": "5.0.0",
         "through": "2.3.8"
@@ -6736,7 +6992,7 @@
         "colors": "1.1.2",
         "combine-lists": "1.0.1",
         "connect": "3.6.6",
-        "core-js": "2.5.5",
+        "core-js": "2.6.4",
         "di": "0.0.1",
         "dom-serialize": "2.2.1",
         "expand-braces": "0.1.2",
@@ -8092,156 +8348,6 @@
       "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
       "dev": true
     },
-    "pacote": {
-      "version": "9.4.0",
-      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.4.0.tgz",
-      "integrity": "sha512-WQ1KL/phGMkedYEQx9ODsjj7xvwLSpdFJJdEXrLyw5SILMxcTNt5DTxT2Z93fXuLFYJBlZJdnwdalrQdB/rX5w==",
-      "dev": true,
-      "requires": {
-        "bluebird": "3.5.3",
-        "cacache": "11.3.2",
-        "figgy-pudding": "3.5.1",
-        "get-stream": "4.1.0",
-        "glob": "7.1.3",
-        "lru-cache": "5.1.1",
-        "make-fetch-happen": "4.0.1",
-        "minimatch": "3.0.4",
-        "minipass": "2.3.5",
-        "mississippi": "3.0.0",
-        "mkdirp": "0.5.1",
-        "normalize-package-data": "2.5.0",
-        "npm-package-arg": "6.1.0",
-        "npm-packlist": "1.3.0",
-        "npm-pick-manifest": "2.2.3",
-        "npm-registry-fetch": "3.9.0",
-        "osenv": "0.1.5",
-        "promise-inflight": "1.0.1",
-        "promise-retry": "1.1.1",
-        "protoduck": "5.0.1",
-        "rimraf": "2.6.3",
-        "safe-buffer": "5.1.2",
-        "semver": "5.6.0",
-        "ssri": "6.0.1",
-        "tar": "4.4.8",
-        "unique-filename": "1.1.1",
-        "which": "1.3.1"
-      },
-      "dependencies": {
-        "cacache": {
-          "version": "11.3.2",
-          "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz",
-          "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==",
-          "dev": true,
-          "requires": {
-            "bluebird": "3.5.3",
-            "chownr": "1.1.1",
-            "figgy-pudding": "3.5.1",
-            "glob": "7.1.3",
-            "graceful-fs": "4.1.15",
-            "lru-cache": "5.1.1",
-            "mississippi": "3.0.0",
-            "mkdirp": "0.5.1",
-            "move-concurrently": "1.0.1",
-            "promise-inflight": "1.0.1",
-            "rimraf": "2.6.3",
-            "ssri": "6.0.1",
-            "unique-filename": "1.1.1",
-            "y18n": "4.0.0"
-          }
-        },
-        "get-stream": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-          "dev": true,
-          "requires": {
-            "pump": "3.0.0"
-          }
-        },
-        "lru-cache": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-          "dev": true,
-          "requires": {
-            "yallist": "3.0.3"
-          }
-        },
-        "mississippi": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
-          "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
-          "dev": true,
-          "requires": {
-            "concat-stream": "1.6.2",
-            "duplexify": "3.7.1",
-            "end-of-stream": "1.4.1",
-            "flush-write-stream": "1.1.1",
-            "from2": "2.3.0",
-            "parallel-transform": "1.1.0",
-            "pump": "3.0.0",
-            "pumpify": "1.5.1",
-            "stream-each": "1.2.3",
-            "through2": "2.0.5"
-          }
-        },
-        "pump": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "1.4.1",
-            "once": "1.4.0"
-          }
-        },
-        "semver": {
-          "version": "5.6.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
-          "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
-          "dev": true
-        },
-        "ssri": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
-          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
-          "dev": true,
-          "requires": {
-            "figgy-pudding": "3.5.1"
-          }
-        },
-        "tar": {
-          "version": "4.4.8",
-          "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
-          "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
-          "dev": true,
-          "requires": {
-            "chownr": "1.1.1",
-            "fs-minipass": "1.2.5",
-            "minipass": "2.3.5",
-            "minizlib": "1.2.1",
-            "mkdirp": "0.5.1",
-            "safe-buffer": "5.1.2",
-            "yallist": "3.0.3"
-          }
-        },
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "requires": {
-            "isexe": "2.0.0"
-          }
-        },
-        "yallist": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
-          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
-          "dev": true
-        }
-      }
-    },
     "pako": {
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz",
@@ -9005,9 +9111,9 @@
       "dev": true
     },
     "regenerate": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
-      "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
       "dev": true
     },
     "regenerator-runtime": {
@@ -9041,7 +9147,7 @@
       "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
       "dev": true,
       "requires": {
-        "regenerate": "1.3.3",
+        "regenerate": "1.4.0",
         "regjsgen": "0.2.0",
         "regjsparser": "0.1.5"
       }
@@ -9244,17 +9350,17 @@
       }
     },
     "rxjs": {
-      "version": "6.3.3",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
-      "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
+      "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
       "requires": {
         "tslib": "1.9.0"
       }
     },
     "rxjs-compat": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.2.0.tgz",
-      "integrity": "sha512-kFX7NSIgyzqn3+J5F/w75R72wDOICXwArbXyPU1neE4laOEwxkMTm+2oAZXN82yb+yli+j+c5USgbGLfphTCTA=="
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.4.0.tgz",
+      "integrity": "sha512-eo/O8RS83hJdJukCtA+IF6qnqa8FPOuVo+OPCzgVi+dbTle9KCdNv97IcQO0WwNVik7DJLKmf0F8uwzc0q40vw=="
     },
     "safe-buffer": {
       "version": "5.1.2",
@@ -10760,9 +10866,9 @@
       "dev": true
     },
     "typescript": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3.tgz",
-      "integrity": "sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz",
+      "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==",
       "dev": true
     },
     "uglify-js": {
@@ -11722,9 +11828,9 @@
       "dev": true
     },
     "zone.js": {
-      "version": "0.8.26",
-      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz",
-      "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA=="
+      "version": "0.8.29",
+      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz",
+      "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ=="
     }
   }
 }
diff --git a/src/app/.job.ts.swp b/src/app/.job.ts.swp
deleted file mode 100644
index 06708e136886eebf98fa2da91c3168aa23a1e71e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12288
zcmeI%!AiqG5P;#S;87GkdRgn)rq)YopFqK5J$OqttBtft%x*;x^*KC>&*2kz@a7|U
ztG<HUHiB3wy+;0pVc5)&&3uqUNYp$zJXY;SQ~cTx`FwakeXW1U%eIK_C#kWM!s0ay
zZGUmcta>-QVW6|v1oo;G*g^+ko(C6M)No52w9Fy&Ab`NUz{s8LwbyzFt^Mh%zFXf>
zTbsT4KCU2u00IagfB*srAb`NX6>xb??)`Kt<%FwcuKmj8mV^KT2q1s}0tg_000Iag
zfB*s&6bNIH%XN`QACv$8-{1dZzkl=b?BmJDv|hpacw__+KmY**5I_I{1Q0*~0R$=`
za4X8Md=w25t*i^3>G)J6>3R2OB{o+7SxDlJN=L)U6kRdbc~&^32cfm<D2vpMd;vkd
BK~w+$

diff --git a/src/app/apiserver.ts b/src/app/apiserver.ts
new file mode 100644
index 0000000..6dec701
--- /dev/null
+++ b/src/app/apiserver.ts
@@ -0,0 +1,5 @@
+export class APIServer {
+    name: string;
+    tes: string;
+    tws: string
+}
diff --git a/src/app/authorisation.service.ts b/src/app/authorisation.service.ts
index 321db36..0eeda95 100644
--- a/src/app/authorisation.service.ts
+++ b/src/app/authorisation.service.ts
@@ -25,7 +25,9 @@ export class SshauthzServer {}
 export class AuthorisationService {
   // public token: BehaviorSubject<AuthToken>;
   public token: AuthToken
-  public SshAuthzServers: BehaviorSubject<SshAuthzServer[]>;
+  public sshAuthzServers: BehaviorSubject<SshAuthzServer[]>;
+  public loggedInAuthZ: BehaviorSubject<SshAuthzServer[]>;
+  public loggedOutAuthZ: BehaviorSubject<SshAuthzServer[]>;
   public readyToNavigate: Subject<[Boolean,string]>;
   public progress: Subject<string>;
   // private keyCert: Subject<KeyCert>;
@@ -48,12 +50,16 @@ export class AuthorisationService {
                 this.progress.next("");
                 // this.token.subscribe(token => this.getCert(token));
                 this.route.fragment.subscribe(frag => this.storeToken(frag));
-                this.SshAuthzServers = new BehaviorSubject<SshAuthzServer[]>([]);
+                this.sshAuthzServers = new BehaviorSubject<SshAuthzServer[]>([]);
+                this.loggedInAuthZ = new BehaviorSubject<SshAuthzServer[]>([]);
+                this.loggedOutAuthZ = new BehaviorSubject<SshAuthzServer[]>([]);
                 this.backendURI = environment.tesurl;
-                this.agentContents = new BehaviorSubject(null);
+                this.agentContents = new BehaviorSubject([]);
                 this.keys = [];
                 this.getSshAuthzServers();
                 this.keys = [];
+      this.agentContents.subscribe((value) => this.updateLoggedAuthZ());
+      this.sshAuthzServers.subscribe((value) => this.updateLoggedAuthZ());
  }
 
  public setStatusMsg(statusMsg: BehaviorSubject<any>) {
@@ -68,9 +74,48 @@ export class AuthorisationService {
                     .subscribe(resp => this.updateSshAuthzServers(resp));
  }
 
+ private updateLoggedAuthZ() {
+     let agentContents = this.agentContents.value
+     let authzServers = this.sshAuthzServers.value
+     let loggedin = []
+     let loggedout = []
+     var found: boolean;
+     for (let s of authzServers) {
+         found=false;
+         console.log('server fp',s.cafp)
+         for (let cert of agentContents) {
+           console.log('cert',cert);
+           if ('Signing CA' in cert) {
+             for (let ca of cert['Signing CA']) {
+               console.log('ca',ca);
+               if (ca == s.cafp) {
+                 loggedin.push(s)
+                 found=true;
+                 continue;
+               }
+             }
+           }
+           if (found) {
+               continue;
+           }
+         }
+         if (!found)  {
+           loggedout.push(s)
+         }
+     }
+     console.log('updating which authz servers are logged in and out');
+     console.log('logged in');
+     console.log(loggedin);
+     console.log('logged out');
+     console.log(loggedout);
+     this.loggedOutAuthZ.next(loggedout);
+     this.loggedInAuthZ.next(loggedin);
+ }
+        
+
  updateSshAuthzServers(resp) {
-   this.SshAuthzServers.next(<SshAuthzServer[]>resp);
-   console.log('sshauthzservers set to',this.SshAuthzServers.value);
+   this.sshAuthzServers.next(<SshAuthzServer[]>resp);
+   console.log('sshauthzservers set to',this.sshAuthzServers.value);
  }
 
  storeToken(frag: string) {
@@ -191,6 +236,7 @@ public getKeys(id?: Identity) {
                      //            error => this.httperror(error))
  }
 
+
  private killAgent() {
    this.statusMsg.next("Logging out")
    let headers = new HttpHeaders();
@@ -228,7 +274,7 @@ public getKeys(id?: Identity) {
 
  public login(authservice: SshAuthzServer) {
    let redirect_uri = window.location.origin+this.locationStrategy.getBaseHref()+"sshauthz_callback";
-   let nonce="asdfzxcv";
+   let nonce=Math.random().toString(36).substring(2, 15)
 
    console.log(this.location.path());
 
diff --git a/src/app/identity.ts b/src/app/identity.ts
index 4247872..217695f 100644
--- a/src/app/identity.ts
+++ b/src/app/identity.ts
@@ -56,4 +56,5 @@ export class SshAuthzServer {
   scope: string;
   logout: string;
   userdefined: boolean;
+  cafp: string;
 }
diff --git a/src/app/joblist/joblist.component.html b/src/app/joblist/joblist.component.html
index aaa183c..a86885a 100644
--- a/src/app/joblist/joblist.component.html
+++ b/src/app/joblist/joblist.component.html
@@ -9,10 +9,12 @@
       Select your username an compute site on the left to see running jobs or start new jobs.
     </div>
     <div *ngIf="!(identity == undefined)">
-      <button mat-button (click)="refreshJobs()" style="width: 100%; text-align: left">Refresh</button>
+        Jobs running as {{ identity.displayName() }}      
       <div *ngFor="let job of tesService.joblist | async">
         <app-job [jobdata]=job></app-job>
       </div>
+      <button mat-button (click)="refreshJobs()" style="width: 100%; text-align: right">Refresh Job list</button>
+
     </div>
 </mat-card>
 
diff --git a/src/app/launcher/launcher.component.html b/src/app/launcher/launcher.component.html
index 642b748..1e6dfdc 100644
--- a/src/app/launcher/launcher.component.html
+++ b/src/app/launcher/launcher.component.html
@@ -1,3 +1,5 @@
+
+
 <div  fxFlex style="flex: 1 1 0%; box-sizing: border-box">
 <div fxLayout="column" fxLayoutAlign="space-around stretch" style="height: 100%; width: 100%" >
 <mat-toolbar color="primary">
@@ -11,25 +13,42 @@
 <mat-sidenav-container autosize autosize style="height: 100%; width: 100%">
   <mat-sidenav #idSideNav mode="side" opened>
     <mat-accordion>
-      <app-sv2-side-nav></app-sv2-side-nav>
-      </mat-accordion>
-      <mat-divider></mat-divider>
-      <mat-accordion>
-			<div *ngFor="let id of computeSitesService.appidentities | async">
-				<mat-expansion-panel (click)=selectId(id)>
-					<mat-expansion-panel-header>
-						{{ id.displayName() }}
-					</mat-expansion-panel-header>
-					<!-- <div *ngFor="let app of id.site.appCatalog.value">
-            <div *ngIf="app.startscript != null">
-						  <button mat-button (click)=openLaunchWindow(app,id)>{{ app.name }}</button>
-            </div>
-					</div> -->
-          <app-strudelapplist [applist]=id.site.appCatalog [identity]="id"></app-strudelapplist>
-				</mat-expansion-panel>
-			</div>
+
+<!-- <mat-accordion> -->
+    <mat-expansion-panel>
+      <mat-expansion-panel-header>
+        <mat-panel-title>
+            More Services
+        </mat-panel-title>
+        </mat-expansion-panel-header>
+        <div *ngFor="let sshauthzserver of (authService.loggedOutAuthZ | async)" style="width: 100%">
+          <button mat-button (click)=login(sshauthzserver) fxFlex style="text-align: left"> Run on {{ sshauthzserver.name }}</button>
+          <button mat-icon-button *ngIf="sshauthzserver.userdefined === true"><mat-icon>remove</mat-icon></button>
+        </div>
+        <button mat-button (click) =logout() style="width: 100%; text-align: left">Logout</button>
+        <button mat-button (click) ="authService.updateAgentContents()" style="width: 100%; text-align: left">Refresh Services</button>
+        </mat-expansion-panel>
+    <div *ngFor="let id of computeSitesService.appidentities | async">
+	<mat-expansion-panel (click)=selectId(id)>
+		<mat-expansion-panel-header>
+			{{ id.displayName() }}
+		</mat-expansion-panel-header>
+        <app-strudelapplist [applist]=id.site.appCatalog [identity]="id"></app-strudelapplist>
+	</mat-expansion-panel>
+	</div>
+    <mat-expansion-panel>
+        <mat-expansion-panel-header>
+            Advanced Options
+        </mat-expansion-panel-header>
+        Select an API server
+        <mat-select (selectionChange)="tesService.apiserver.next($event.value)" [value]="tesService.apiserver|async">
+            <mat-option *ngFor="let apis of tesService.apiservers|async" [value]="apis">
+                {{ apis.name }}
+            </mat-option>
+        </mat-select>
+    </mat-expansion-panel>
 	</mat-accordion>
-	</mat-sidenav>
+</mat-sidenav>
 
   <app-joblist [identity]="identitySubject | async"></app-joblist>
   <div fxFlex></div>
diff --git a/src/app/launcher/launcher.component.ts b/src/app/launcher/launcher.component.ts
index dc8d65a..162665e 100644
--- a/src/app/launcher/launcher.component.ts
+++ b/src/app/launcher/launcher.component.ts
@@ -47,7 +47,7 @@ export class LauncherComponent implements OnInit {
                 private authService: AuthorisationService,
                 public computeSitesService: ComputesitesService,
                 ) {
-    this.authService.SshAuthzServers.subscribe(o => {this.sshauthzservers = o});
+    this.authService.sshAuthzServers.subscribe(o => {this.sshauthzservers = o});
     this.identitySubject = new BehaviorSubject(undefined);
   }
 
@@ -68,6 +68,16 @@ export class LauncherComponent implements OnInit {
   //}
 
 
+  logout() {
+      let dialogRef = this.dialog.open(LogoutdialogComponent, {
+        width: '250px',
+        height: '400px',
+      });
+  }
+
+  login (sshauthzserver) {
+    this.authService.login(sshauthzserver);
+  }
 
 
   selectId(id: Identity) {
diff --git a/src/app/sv2-side-nav/sv2-side-nav.component.html b/src/app/sv2-side-nav/sv2-side-nav.component.html
index 216506d..8bf1634 100644
--- a/src/app/sv2-side-nav/sv2-side-nav.component.html
+++ b/src/app/sv2-side-nav/sv2-side-nav.component.html
@@ -2,15 +2,18 @@
 <mat-expansion-panel>
   <mat-expansion-panel-header>
     <mat-panel-title>
-    Login
+    More Services
   </mat-panel-title>
   </mat-expansion-panel-header>
-  <div *ngFor="let sshauthzserver of (authService.SshAuthzServers | async)">
-    <div style="width: 100%">
-    <button mat-button (click)=login(sshauthzserver) fxFlex style="text-align: left">Login to {{ sshauthzserver.name }} </button>
-    <button mat-icon-button *ngIf="sshauthzserver.userdefined === true"><mat-icon>remove</mat-icon></button>
-    </div>
+  <div *ngFor="let sshauthzserver of (authService.loggedInAuthZ | async)" style="width: 100%">
+      <button mat-button (click) =logout()>Logout {{ sshauthzserver.name }}</button>
+  </div>
+  <div *ngFor="let sshauthzserver of (authService.loggedOutAuthZ | async)" style="width: 100%">
+      <button mat-button (click)=login(sshauthzserver) fxFlex style="text-align: left"> Run on {{ sshauthzserver.name }}</button>
+      <button mat-icon-button *ngIf="sshauthzserver.userdefined === true"><mat-icon>remove</mat-icon></button>
+  </div>
+  <div style="width: 100%">
+      <button mat-button (click) ="authService.updateAgentContents()"> Refresh </button>
   </div>
-  <button mat-button (click)=logout()  style="width: 100%; text-align: left" >Logout</button>
 </mat-expansion-panel>
 <!-- </mat-accordion> -->
diff --git a/src/app/tes.service.ts b/src/app/tes.service.ts
index dbadf09..08db0e0 100644
--- a/src/app/tes.service.ts
+++ b/src/app/tes.service.ts
@@ -9,9 +9,10 @@ import {BehaviorSubject} from 'rxjs/BehaviorSubject';
 import { Subject } from 'rxjs/Subject';
 import { Strudelapp, StrudelappInstance } from './strudelapp';
 import { Computesite } from './computesite';
+import { APIServer } from './apiserver';
 import { Identity, AuthToken, KeyCert, SshAuthzServer } from './identity';
-import { BatchInterface} from './batchinterface';
-import {ComputesitesService} from './computesites.service';
+import { BatchInterface } from './batchinterface';
+import { ComputesitesService } from './computesites.service';
 import { StrudelappsService } from './strudelapps.service';
 import { timer } from 'rxjs/observable/timer';
 import { repeat } from 'rxjs/operators';
@@ -32,6 +33,7 @@ Its also responsible for querying a compute site for running jobs */
 })
 export class TesService {
 public Base=environment.tesurl;
+public twsproxy = environment.twsurl;
 // public Base='http://localhost:5000';
 public statusMsg: BehaviorSubject<any>;
 public jobs: any[];
@@ -42,6 +44,8 @@ public joblist: BehaviorSubject<Job[]>;
 private timerSubscription: any;
 private appwindow: any;
 private appwindowWatcher: any;
+public apiserver: BehaviorSubject<APIServer>;
+public apiservers: BehaviorSubject<APIServer[]>;
 // public batchinterface: {[id: string] : BatchInterface};
 
   constructor(private http: HttpClient,
@@ -54,9 +58,13 @@ private appwindowWatcher: any;
     this.busy = new BehaviorSubject<boolean>(false);
     // this.joblist = new BehaviorSubject<{[id: string]: Job[]}>({});
     this.joblist = new BehaviorSubject<Job[]>([]);
+      this.apiserver = new BehaviorSubject<APIServer>(undefined);
+    this.apiservers = new BehaviorSubject<APIServer[]>([]);
+    this.apiserver.subscribe((r)=>this.logApiServerChange(r));
 
     this.timerSubscription = null;
     this.appwindowWatcher = null;
+    this.getAPIServers();
     // this.batchinterface = {};
     // this.computesitesService.identities.subscribe(identities => this.startPolling(identities));
  }
@@ -65,6 +73,29 @@ public setStatusMsg(statusMsg: BehaviorSubject<any>) {
   this.statusMsg = statusMsg;
 }
 
+private logApiServerChange(r) {
+    console.log('api server was updated');
+    console.log(this.apiserver.value);
+}
+
+ setApiServer(server: APIServer) {
+     console.log('calling setAPIServer');
+     this.apiserver.next(server);
+ }
+
+ getAPIServers() {
+   let headers = new HttpHeaders();
+   let options = { headers: headers, withCredentials: false};
+   this.http.get<SshAuthzServer[]>('./assets/config/apiservers.json',options)
+                    .subscribe(resp => this.updateAPIServers(resp));
+ }
+
+ private updateAPIServers(resp) {
+     this.apiservers.next(<APIServer[]>resp);
+     this.apiserver.next(this.apiservers.value[0]);
+ }
+
+
  private buildParams(app: Strudelapp, identity: Identity, batchinterface: BatchInterface, appinst?: any): string {
    let params = new URLSearchParams();
    let id = identity.copy_skip_catalog();
@@ -166,8 +197,8 @@ public setStatusMsg(statusMsg: BehaviorSubject<any>) {
    let body = {'app': app, 'appparams': appparams, 'keys': keys}
    console.log('tes is submitting the job with body',body);
    this.http.post<any>(this.Base+'/submit'+'?'+paramstr, body, options)
-                                         // .pipe(catchError(this.handleError))
-                                         .subscribe(resp => {
+                                          .pipe(catchError(this.handleError))
+                                          .subscribe(resp => {
                                                               this.busy.next(false);
                                                               this.statusMsg.next(null)
                                                             },
@@ -255,8 +286,10 @@ public setStatusMsg(statusMsg: BehaviorSubject<any>) {
    this.getAppInstance(job);
  }
 
- public openAppWindow(url: string) {
-   let windowloc = url;
+ public openAppWindow(url: any) {
+     console.log('in open window url is',url,this.twsproxy);
+     let windowloc = url.replace(/\{twsproxy\}/g,this.twsproxy);
+     console.log('window loc is ',windowloc);
    // let windowloc = this.router.config
    this.appwindow = window.open(windowloc);
    if (!(this.appwindowWatcher === null)) {
@@ -342,6 +375,8 @@ private httperror(errorstr: string) {
 
 
 private handleError(error: HttpErrorResponse) {
+  console.error('in handleError');
+  console.error(error);
   if (error.error instanceof ErrorEvent) {
     // A client-side or network error occurred. Handle it accordingly.
     return throwError("Hmm, that didn't work. If you're using a local connection, please make sure Strudel-TES is running.");
diff --git a/src/assets/config/apiservers.json b/src/assets/config/apiservers.json
new file mode 100644
index 0000000..96cdeba
--- /dev/null
+++ b/src/assets/config/apiservers.json
@@ -0,0 +1,14 @@
+[
+    {
+        "name": "Testing",
+        "tes": "https://strudel2-test.cloud.cvl.org.au/tes",
+        "tws": "https://strudel2-test.cloud.cvl.org.au"
+    },
+    {
+        "name": "Dev",
+        "tes": "https://vm-118-138-240-255.erc.monash.edu.au/tes",
+        "tws": "https://vm-118-138-240-255.erc.monash.edu.au/"
+    }
+]
+
+
diff --git a/src/assets/config/authservers.json b/src/assets/config/authservers.json
index 376edea..e2d26fa 100644
--- a/src/assets/config/authservers.json
+++ b/src/assets/config/authservers.json
@@ -8,7 +8,8 @@
       "logout": "https://sshauthz.cloud.cvl.org.au/pysshauthz/oauth2/logout",
       "name": "M3 via AAF Central",
       "icon": null,
-      "scope": "user:email"
+      "scope": "user:email",
+      "cafp": "RSA SHA256:cmDxHrZQSPlBMUUcI/BWmruXho1XOzfXPDHSqVTwV2I"
     },
     {
       "authorise": "https://sshauthz.cloud.cvl.org.au/pysshauthz/oauth2/oauth/authorize/google",
@@ -18,7 +19,8 @@
       "logout": "https://sshauthz.cloud.cvl.org.au/pysshauthz/oauth2/logout",
       "name": "M3 via Google",
       "icon": null,
-      "scope": "user:email"
+      "scope": "user:email",
+      "cafp": "RSA SHA256:cmDxHrZQSPlBMUUcI/BWmruXho1XOzfXPDHSqVTwV2I"
     },
     {
       "authorise": "https://sshauthz.cloud.cvl.org.au/pysshauthz/oauth2/oauth/authorize/aafcentral",
@@ -28,7 +30,8 @@
       "logout": "https://sshauthz.cloud.cvl.org.au/pysshauthz/oauth2/logout",
       "name": "OzStar via AAF Central",
       "icon": null,
-      "scope": "user:email"
+      "scope": "user:email",
+      "cafp": "RSA SHA256:uRYwTJSLksZbwSXYYmOjXh6JzSXpwVnY6o7BYFJc60g"
     }
 
 ]
diff --git a/src/assets/config/computesites.json b/src/assets/config/computesites.json
index 9e1c469..1d472d6 100644
--- a/src/assets/config/computesites.json
+++ b/src/assets/config/computesites.json
@@ -1,17 +1,17 @@
 [
   {
-    "url": "http://localhost:5200/",
+    "url": "https://vm-118-138-240-255.erc.monash.edu.au/sbatch/",
     "name": "M3",
     "host": "m3-login2.massive.org.au",
     "dtn": "m3-dtn1.massive.org.au",
     "cafingerprint": "RSA SHA256:cmDxHrZQSPlBMUUcI/BWmruXho1XOzfXPDHSqVTwV2I",
     "appCatalog": [],
     "appCatalogUri": "./assets/config/m3apps.json",
-    "cancelcmd": "scancel {jobid}",
-    "statcmd": "/usr/local/sv2/sv2stat.py"
+    "cancelcmd": "/usr/local/sv2/sv2scancel.sh {jobid}",
+    "statcmd": "/home/chines/sv2stat.py"
   },
   {
-    "url": "https://vm-118-138-240-255.erc.monash.edu.au/m3siteconfig/",
+    "url": "https://vm-118-138-240-255.erc.monash.edu.au/sbatch/",
     "name": "OzStar",
     "host": "ozstar.swin.edu.au",
     "dtn": "ozstar.swin.edu.au",
@@ -22,7 +22,7 @@
     "statcmd": "/usr/local/sv2/sv2stat.py"
   },
   {
-    "url": "https://vm-118-138-240-255.erc.monash.edu.au/m3siteconfig_dev/",
+    "url": "https://vm-118-138-240-255.erc.monash.edu.au/m3siteconfig/",
     "name": "CVL@UWA",
     "host": "146.118.65.246",
     "dtn": "146.118.65.246",
diff --git a/src/assets/config/m3apps.json b/src/assets/config/m3apps.json
index 0f36950..9b2dc43 100644
--- a/src/assets/config/m3apps.json
+++ b/src/assets/config/m3apps.json
@@ -1,9 +1,9 @@
 [
   { "url": null,
     "name": "Desktop",
-    "startscript": "#!/bin/bash\n/home/chines/sv2/desktop_novnc/desktop.sh\n ",
-    "paramscmd": "/home/chines/sv2/desktop_novnc/params.py",
-    "client": {"cmd": null, "redir": "vnc.html?host=vm-118-138-240-255.erc.monash.edu.au&port=443&password={password}" },
+    "startscript": "#!/bin/bash\n/usr/local/sv2/desktop/desktop.slurm\n ",
+    "paramscmd": "/usr/local/sv2/desktop/params.py",
+    "client": {"cmd": null, "redir": "vnc.html?password={password}" },
     "localbind": true,
     "applist": null
   },
@@ -19,9 +19,18 @@
   { "url": "transfer",
     "name": "Transfer files",
     "startscript": "#!/bin/bash\n echo '{appparams}' | /usr/local/sv2/copytool.py\n",
-    "paramscmd": "/home/chines/sv2/desktop_novnc/params.py",
+    "paramscmd": "/usr/local/sv2/desktop/params.py",
     "client": {"cmd": null, "redir": null },
     "localbind": true,
     "applist": null
+  },
+  {
+    "url": null,
+    "name": "CryoSPARC",
+    "startscript": null,
+    "paramscmd": "/home/chines/cryosparc_params.py",
+    "client": {"cmd": null, "redir": ""},
+    "localbind": true,
+    "applist": null
   }
 ]
diff --git a/src/assets/config/m3apps.json~ b/src/assets/config/m3apps.json~
deleted file mode 100644
index f15ba47..0000000
--- a/src/assets/config/m3apps.json~
+++ /dev/null
@@ -1,62 +0,0 @@
-[
-  { "url": null,
-    "name": "Desktop",
-    "startscript": "#!/bin/bash\n/home/chines/sv2/desktop_novnc/desktop.sh\n ",
-    "paramscmd": "/home/chines/sv2/desktop_novnc/params.py",
-    "client": {"cmd": null, "redir": "vnc.html?host=vm-118-138-240-255.erc.monash.edu.au&port=443&password={password}" },
-    "localbind": true,
-    "applist": null
-  },
-  { "url": null,
-    "name": "Guacamole Desktop",
-    "startscript": "#!/bin/bash\n/home/chines/desktop.sh\n ",
-    "paramscmd": "/home/chines/vdiparam.py",
-    "client": {"cmd": null, "redir": "guacamole?username={username}&password={password}" },
-    "localbind": true,
-    "applist": null
-  },
- {
-   "url": null,
-   "name": "Jupyter Lab",
-   "startscript": "#!/bin/bash\n/home/chines/jupyter.slurm\n",
-   "paramscmd": "/home/chines/jupyter_params.py",
-   "client": {"cmd": null, "redir": "?token={token}"},
-   "localbind": true,
-   "applist": null
-  },
-  {
-    "url": null,
-    "name": "LiberTEM",
-    "startscript": "eval $(cat /home/chines/libertembatch)",
-    "paramscmd": "/projects/pMOSP/chines/libertem_venv/bin/python /projects/pMOSP/chines/libertem_venv/bin/server_stat.py",
-    "client": {"cmd": null, "redir": ""},
-    "localbind": true,
-    "applist": null
-  },
-  {
-    "url": null,
-    "name": "CryoSPARC",
-    "startscript": null,
-    "paramscmd": "/home/chines/cryosparc_params.py",
-    "client": {"cmd": null, "redir": ""},
-    "localbind": true,
-    "applist": null
-  },
-  {
-    "url": null,
-    "name": "R Studio Server",
-    "startscript": "#!/bin/bash\n/usr/local/sv2/rstudioserver/run.sh\n",
-    "paramscmd": "/usr/local/sv2/rstudioserver/params.py",
-    "client": {"cmd": null, "redir": ""},
-    "localbind": true,
-    "applist": null
-  },
-  { "url": "transfer",
-    "name": "Transfer files",
-    "startscript": "#!/bin/bash\n echo '{appparams}' | /usr/local/sv2/copytool.py\n",
-    "paramscmd": "/home/chines/sv2/desktop_novnc/params.py",
-    "client": {"cmd": null, "redir": null },
-    "localbind": true,
-    "applist": null
-  }
-]
diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts
index 358d47b..56357e8 100644
--- a/src/environments/environment.prod.ts
+++ b/src/environments/environment.prod.ts
@@ -1,5 +1,6 @@
 export const environment = {
   production: true,
-  tesurl: "https://vm-118-138-240-255.erc.monash.edu.au/tes"
+  tesurl: "https://vm-118-138-240-255.erc.monash.edu.au/tes",
+  twsurl: "https://vm-118-138-240-255.erc.monash.edu.au/"
 
 };
diff --git a/src/environments/environment.ts b/src/environments/environment.ts
index 39a4192..998149d 100644
--- a/src/environments/environment.ts
+++ b/src/environments/environment.ts
@@ -5,5 +5,6 @@
 
 export const environment = {
   production: false,
-  tesurl: "http://localhost:5000"
+  tesurl: "https://strudel2-test.cloud.cvl.org.au/tes",
+  twsurl: "https://strudel2-test.cloud.cvl.org.au"
 };
-- 
GitLab