UNPKG

appium-doctor

Version:

Test environment for fitness to run Appium

261 lines (205 loc) 21.4 kB
require('source-map-support').install(); 'use strict'; var _regeneratorRuntime = require('babel-runtime/regenerator')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; var _interopRequireWildcard = require('babel-runtime/helpers/interop-require-wildcard')['default']; var _this = this; var _chai = require('chai'); var _chai2 = _interopRequireDefault(_chai); var _appiumSupport = require('appium-support'); var _teen_process = require('teen_process'); var tp = _interopRequireWildcard(_teen_process); var _libNodeDetector = require('../lib/node-detector'); var _libNodeDetector2 = _interopRequireDefault(_libNodeDetector); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _appiumTestSupport = require('appium-test-support'); _chai2['default'].should(); var expect = _chai2['default'].expect; describe('NodeDetector', (0, _appiumTestSupport.withMocks)({ fs: _appiumSupport.fs, tp: tp }, function (mocks, S) { it('retrieveInCommonPlaces - success', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: mocks.fs.expects('exists').once().returns(_bluebird2['default'].resolve(true)); context$2$0.next = 3; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].retrieveInCommonPlaces()); case 3: context$2$0.sent.should.equal('/usr/local/bin/node'); (0, _appiumTestSupport.verify)(mocks); case 5: case 'end': return context$2$0.stop(); } }, null, _this); }); it('retrieveInCommonPlaces - failure', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: mocks.fs.expects('exists').twice().returns(_bluebird2['default'].resolve(false)); context$2$0.next = 3; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].retrieveInCommonPlaces()); case 3: context$2$0.t0 = context$2$0.sent; expect(context$2$0.t0).to.be.a('null'); (0, _appiumTestSupport.verify)(mocks); case 6: case 'end': return context$2$0.stop(); } }, null, _this); }); // retrieveUsingWhichCommand var testRetrieveWithScript = function testRetrieveWithScript(method) { it(method + ' - success', function callee$2$0() { return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: mocks.tp.expects('exec').once().returns(_bluebird2['default'].resolve({ stdout: '/a/b/c/d\n', stderr: '' })); mocks.fs.expects('exists').once().returns(_bluebird2['default'].resolve(true)); context$3$0.next = 4; return _regeneratorRuntime.awrap(_libNodeDetector2['default'][method]()); case 4: context$3$0.sent.should.equal('/a/b/c/d'); (0, _appiumTestSupport.verify)(mocks); case 6: case 'end': return context$3$0.stop(); } }, null, _this); }); it(method + ' - failure - path not found ', function callee$2$0() { return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: mocks.tp.expects('exec').once().returns(_bluebird2['default'].resolve({ stdout: 'aaa not found\n', stderr: '' })); context$3$0.next = 3; return _regeneratorRuntime.awrap(_libNodeDetector2['default'][method]()); case 3: context$3$0.t0 = context$3$0.sent; expect(context$3$0.t0).to.be.a('null'); (0, _appiumTestSupport.verify)(mocks); case 6: case 'end': return context$3$0.stop(); } }, null, _this); }); it(method + ' - failure - path not exist', function callee$2$0() { return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: mocks.tp.expects('exec').once().returns(_bluebird2['default'].resolve({ stdout: '/a/b/c/d\n', stderr: '' })); mocks.fs.expects('exists').once().returns(_bluebird2['default'].resolve(false)); context$3$0.next = 4; return _regeneratorRuntime.awrap(_libNodeDetector2['default'][method]()); case 4: context$3$0.t0 = context$3$0.sent; expect(context$3$0.t0).to.be.a('null'); case 6: case 'end': return context$3$0.stop(); } }, null, _this); }); }; testRetrieveWithScript('retrieveUsingWhichCommand'); testRetrieveWithScript('retrieveUsingAppleScript'); it('retrieveUsingAppiumConfigFile - success', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: mocks.fs.expects('exists').twice().returns(_bluebird2['default'].resolve(true)); mocks.fs.expects('readFile').once().returns(_bluebird2['default'].resolve('{"node_bin": "/a/b/c/d"}')); context$2$0.next = 4; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].retrieveUsingAppiumConfigFile()); case 4: context$2$0.sent.should.equal('/a/b/c/d'); (0, _appiumTestSupport.verify)(mocks); case 6: case 'end': return context$2$0.stop(); } }, null, _this); }); it('retrieveUsingAppiumConfigFile - failure - not json', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: mocks.fs.expects('exists').once().returns(_bluebird2['default'].resolve(true)); mocks.fs.expects('readFile').once().returns(_bluebird2['default'].resolve('{node_bin: "/a/b/c/d"}')); context$2$0.next = 4; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].retrieveUsingAppiumConfigFile()); case 4: context$2$0.t0 = context$2$0.sent; expect(context$2$0.t0).to.be.a('null'); (0, _appiumTestSupport.verify)(mocks); case 7: case 'end': return context$2$0.stop(); } }, null, _this); }); it('retrieveUsingAppiumConfigFile - failure - path does not exist', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: mocks.fs.expects('exists').once().returns(_bluebird2['default'].resolve(true)); mocks.fs.expects('exists').once().returns(_bluebird2['default'].resolve(false)); mocks.fs.expects('readFile').once().returns(_bluebird2['default'].resolve('{"node_bin": "/a/b/c/d"}')); context$2$0.next = 5; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].retrieveUsingAppiumConfigFile()); case 5: context$2$0.t0 = context$2$0.sent; expect(context$2$0.t0).to.be.a('null'); (0, _appiumTestSupport.verify)(mocks); case 8: case 'end': return context$2$0.stop(); } }, null, _this); }); it('checkForNodeBinary - success', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: mocks.NodeDetector = S.sandbox.mock(_libNodeDetector2['default']); mocks.NodeDetector.expects('retrieveInCommonPlaces').once().returns(null); mocks.NodeDetector.expects('retrieveUsingWhichCommand').once().returns(null); mocks.NodeDetector.expects('retrieveUsingAppleScript').returns('/a/b/c/d'); mocks.NodeDetector.expects('retrieveUsingAppiumConfigFile').never(); context$2$0.next = 7; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].detect()); case 7: context$2$0.sent.should.equal('/a/b/c/d'); (0, _appiumTestSupport.verify)(mocks); case 9: case 'end': return context$2$0.stop(); } }, null, _this); }); it('checkForNodeBinary - failure', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: mocks.NodeDetector = S.sandbox.mock(_libNodeDetector2['default']); mocks.NodeDetector.expects('retrieveInCommonPlaces').once().returns(null); mocks.NodeDetector.expects('retrieveUsingWhichCommand').once().returns(null); mocks.NodeDetector.expects('retrieveUsingAppleScript').once().returns(null); mocks.NodeDetector.expects('retrieveUsingAppiumConfigFile').once().returns(null); context$2$0.next = 7; return _regeneratorRuntime.awrap(_libNodeDetector2['default'].detect()); case 7: context$2$0.t0 = context$2$0.sent; expect(context$2$0.t0).to.be.a('null'); (0, _appiumTestSupport.verify)(mocks); case 10: case 'end': return context$2$0.stop(); } }, null, _this); }); })); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3Qvbm9kZS1kZXRlY3Rvci1zcGVjcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7b0JBRWlCLE1BQU07Ozs7NkJBQ0osZ0JBQWdCOzs0QkFDZixjQUFjOztJQUF0QixFQUFFOzsrQkFDVyxzQkFBc0I7Ozs7d0JBQ2pDLFVBQVU7Ozs7aUNBQ1UscUJBQXFCOztBQUd2RCxrQkFBSyxNQUFNLEVBQUUsQ0FBQztBQUNkLElBQUksTUFBTSxHQUFHLGtCQUFLLE1BQU0sQ0FBQzs7QUFFekIsUUFBUSxDQUFDLGNBQWMsRUFBRSxrQ0FBVSxFQUFDLEVBQUUsbUJBQUEsRUFBRSxFQUFFLEVBQUYsRUFBRSxFQUFDLEVBQUUsVUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFLO0FBQ3pELElBQUUsQ0FBQyxrQ0FBa0MsRUFBRTs7OztBQUNyQyxlQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsc0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7OzJDQUNwRCw2QkFBYSxzQkFBc0IsRUFBRTs7OzJCQUN6QyxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQjs7QUFDckMseUNBQU8sS0FBSyxDQUFDLENBQUM7Ozs7Ozs7R0FDZixDQUFDLENBQUM7O0FBRUgsSUFBRSxDQUFDLGtDQUFrQyxFQUFFOzs7O0FBQ3JDLGVBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxzQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7MkNBQ2hELDZCQUFhLHNCQUFzQixFQUFFOzs7O0FBQWxELGdCQUFNLGlCQUE4QyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNOztBQUNsRSx5Q0FBTyxLQUFLLENBQUMsQ0FBQzs7Ozs7OztHQUNmLENBQUMsQ0FBQzs7O0FBR0gsTUFBSSxzQkFB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LENBQUMsQ0FBQyxNQUFNOztBQUNsRCx5Q0FBTyxLQUFLLENBQUMsQ0FBQzs7Ozs7OztHQUNmLENBQUMsQ0FBQztDQUVKLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3Qvbm9kZS1kZXRlY3Rvci1zcGVjcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptb2NoYVxuXG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7IGZzIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0ICogYXMgdHAgZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBOb2RlRGV0ZWN0b3IgZnJvbSAnLi4vbGliL25vZGUtZGV0ZWN0b3InO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgd2l0aE1vY2tzLCB2ZXJpZnkgfSBmcm9tICdhcHBpdW0tdGVzdC1zdXBwb3J0JztcblxuXG5jaGFpLnNob3VsZCgpO1xubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuXG5kZXNjcmliZSgnTm9kZURldGVjdG9yJywgd2l0aE1vY2tzKHtmcywgdHB9LCAobW9ja3MsIFMpID0+IHtcbiAgaXQoJ3JldHJpZXZlSW5Db21tb25QbGFjZXMgLSBzdWNjZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tzLmZzLmV4cGVjdHMoJ2V4aXN0cycpLm9uY2UoKS5yZXR1cm5zKEIucmVzb2x2ZSh0cnVlKSk7XG4gICAgKGF3YWl0IE5vZGVEZXRlY3Rvci5yZXRyaWV2ZUluQ29tbW9uUGxhY2VzKCkpXG4gICAgICAuc2hvdWxkLmVxdWFsKCcvdXNyL2xvY2FsL2Jpbi9ub2RlJyk7XG4gICAgdmVyaWZ5KG1vY2tzKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHJpZXZlSW5Db21tb25QbGFjZXMgLSBmYWlsdXJlJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tzLmZzLmV4cGVjdHMoJ2V4aXN0cycpLnR3aWNlKCkucmV0dXJucyhCLnJlc29sdmUoZmFsc2UpKTtcbiAgICBleHBlY3QoYXdhaXQgTm9kZURldGVjdG9yLnJldHJpZXZlSW5Db21tb25QbGFjZXMoKSkudG8uYmUuYSgnbnVsbCcpO1xuICAgIHZlcmlmeShtb2Nrcyk7XG4gIH0pO1xuXG4gIC8vIHJldHJpZXZlVXNpbmdXaGljaENvbW1hbmRcbiAgbGV0IHRlc3RSZXRyaWV2ZVdpdGhTY3JpcHQgPSAobWV0aG9kKSA9PiB7XG4gICAgaXQobWV0aG9kICsgJyAtIHN1Y2Nlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBtb2Nrcy50cC5leHBlY3RzKCdleGVjJykub25jZSgpLnJldHVybnMoXG4gICAgICAgIEIucmVzb2x2ZSh7c3Rkb3V0OiAnL2EvYi9jL2RcXG4nLCBzdGRlcnI6ICcnfSkpO1xuICAgICAgbW9ja3MuZnMuZXhwZWN0cygnZXhpc3RzJykub25jZSgpLnJldHVybnMoQi5yZXNvbHZlKHRydWUpKTtcbiAgICAgIChhd2FpdCBOb2RlRGV0ZWN0b3JbbWV0aG9kXSgpKVxuICAgICAgICAuc2hvdWxkLmVxdWFsKCcvYS9iL2MvZCcpO1xuICAgICAgdmVyaWZ5KG1vY2tzKTtcbiAgICB9KTtcblxuICAgIGl0KG1ldGhvZCArICcgLSBmYWlsdXJlIC0gcGF0aCBub3QgZm91bmQgJywgYXN5bmMgKCkgPT4ge1xuICAgICAgbW9ja3MudHAuZXhwZWN0cygnZXhlYycpLm9uY2UoKS5yZXR1cm5zKFxuICAgICAgICBCLnJlc29sdmUoe3N0ZG91dDogJ2FhYSBub3QgZm91bmRcXG4nLCBzdGRlcnI6ICcnfSkpO1xuICAgICAgZXhwZWN0KGF3YWl0IE5vZGVEZXRlY3RvclttZXRob2RdKCkpLnRvLmJlLmEoJ251bGwnKTtcbiAgICAgIHZlcmlmeShtb2Nrcyk7XG4gICAgfSk7XG4gICAgaXQobWV0aG9kICsgJyAtIGZhaWx1cmUgLSBwYXRoIG5vdCBleGlzdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIG1vY2tzLnRwLmV4cGVjdHMoJ2V4ZWMnKS5vbmNlKCkucmV0dXJucyhcbiAgICAgICAgQi5yZXNvbHZlKHtzdGRvdXQ6ICcvYS9iL2MvZFxcbicsIHN0ZGVycjogJyd9KSk7XG4gICAgICBtb2Nrcy5mcy5leHBlY3RzKCdleGlzdHMnKS5vbmNlKCkucmV0dXJucyhCLnJlc29sdmUoZmFsc2UpKTtcbiAgICAgIGV4cGVjdChhd2FpdCBOb2RlRGV0ZWN0b3JbbWV0aG9kXSgpKS50by5iZS5hKCdudWxsJyk7XG4gICAgfSk7XG4gIH07XG5cbiAgdGVzdFJldHJpZXZlV2l0aFNjcmlwdCgncmV0cmlldmVVc2luZ1doaWNoQ29tbWFuZCcpO1xuICB0ZXN0UmV0cmlldmVXaXRoU2NyaXB0KCdyZXRyaWV2ZVVzaW5nQXBwbGVTY3JpcHQnKTtcblxuICBpdCgncmV0cmlldmVVc2luZ0FwcGl1bUNvbmZpZ0ZpbGUgLSBzdWNjZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tzLmZzLmV4cGVjdHMoJ2V4aXN0cycpLnR3aWNlKCkucmV0dXJucyhCLnJlc29sdmUodHJ1ZSkpO1xuICAgIG1vY2tzLmZzLmV4cGVjdHMoJ3JlYWRGaWxlJykub25jZSgpLnJldHVybnMoXG4gICAgICBCLnJlc29sdmUoJ3tcIm5vZGVfYmluXCI6IFwiL2EvYi9jL2RcIn0nKSk7XG4gICAgKGF3YWl0IE5vZGVEZXRlY3Rvci5yZXRyaWV2ZVVzaW5nQXBwaXVtQ29uZmlnRmlsZSgpKVxuICAgICAgLnNob3VsZC5lcXVhbCgnL2EvYi9jL2QnKTtcbiAgICB2ZXJpZnkobW9ja3MpO1xuICB9KTtcblxuICBpdCgncmV0cmlldmVVc2luZ0FwcGl1bUNvbmZpZ0ZpbGUgLSBmYWlsdXJlIC0gbm90IGpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja3MuZnMuZXhwZWN0cygnZXhpc3RzJykub25jZSgpLnJldHVybnMoQi5yZXNvbHZlKHRydWUpKTtcbiAgICBtb2Nrcy5mcy5leHBlY3RzKCdyZWFkRmlsZScpLm9uY2UoKS5yZXR1cm5zKFxuICAgICAgQi5yZXNvbHZlKCd7bm9kZV9iaW46IFwiL2EvYi9jL2RcIn0nKSk7XG4gICAgZXhwZWN0KGF3YWl0IE5vZGVEZXRlY3Rvci5yZXRyaWV2ZVVzaW5nQXBwaXVtQ29uZmlnRmlsZSgpKVxuICAgICAgLnRvLmJlLmEoJ251bGwnKTtcbiAgICB2ZXJpZnkobW9ja3MpO1xuICB9KTtcblxuICBpdCgncmV0cmlldmVVc2luZ0FwcGl1bUNvbmZpZ0ZpbGUgLSBmYWlsdXJlIC0gcGF0aCBkb2VzIG5vdCBleGlzdCcsIGFzeW5jICgpID0+IHtcbiAgICBtb2Nrcy5mcy5leHBlY3RzKCdleGlzdHMnKS5vbmNlKCkucmV0dXJucyhCLnJlc29sdmUodHJ1ZSkpO1xuICAgIG1vY2tzLmZzLmV4cGVjdHMoJ2V4aXN0cycpLm9uY2UoKS5yZXR1cm5zKEIucmVzb2x2ZShmYWxzZSkpO1xuICAgIG1vY2tzLmZzLmV4cGVjdHMoJ3JlYWRGaWxlJykub25jZSgpLnJldHVybnMoXG4gICAgICBCLnJlc29sdmUoJ3tcIm5vZGVfYmluXCI6IFwiL2EvYi9jL2RcIn0nKSk7XG4gICAgZXhwZWN0KGF3YWl0IE5vZGVEZXRlY3Rvci5yZXRyaWV2ZVVzaW5nQXBwaXVtQ29uZmlnRmlsZSgpKVxuICAgICAgLnRvLmJlLmEoJ251bGwnKTtcbiAgICB2ZXJpZnkobW9ja3MpO1xuICB9KTtcblxuICBpdCgnY2hlY2tGb3JOb2RlQmluYXJ5IC0gc3VjY2VzcycsIGFzeW5jICgpID0+IHtcbiAgICBtb2Nrcy5Ob2RlRGV0ZWN0b3IgPSBTLnNhbmRib3gubW9jayhOb2RlRGV0ZWN0b3IpO1xuICAgIG1vY2tzLk5vZGVEZXRlY3Rvci5leHBlY3RzKCdyZXRyaWV2ZUluQ29tbW9uUGxhY2VzJykub25jZSgpLnJldHVybnMobnVsbCk7XG4gICAgbW9ja3MuTm9kZURldGVjdG9yLmV4cGVjdHMoJ3JldHJpZXZlVXNpbmdXaGljaENvbW1hbmQnKS5vbmNlKCkucmV0dXJucyhudWxsKTtcbiAgICBtb2Nrcy5Ob2RlRGV0ZWN0b3IuZXhwZWN0cygncmV0cmlldmVVc2luZ0FwcGxlU2NyaXB0JykucmV0dXJucygnL2EvYi9jL2QnKTtcbiAgICBtb2Nrcy5Ob2RlRGV0ZWN0b3IuZXhwZWN0cygncmV0cmlldmVVc2luZ0FwcGl1bUNvbmZpZ0ZpbGUnKS5uZXZlcigpO1xuICAgIChhd2FpdCBOb2RlRGV0ZWN0b3IuZGV0ZWN0KCkpLnNob3VsZC5lcXVhbCgnL2EvYi9jL2QnKTtcbiAgICB2ZXJpZnkobW9ja3MpO1xuICB9KTtcblxuICBpdCgnY2hlY2tGb3JOb2RlQmluYXJ5IC0gZmFpbHVyZScsIGFzeW5jICgpID0+IHtcbiAgICBtb2Nrcy5Ob2RlRGV0ZWN0b3IgPSBTLnNhbmRib3gubW9jayhOb2RlRGV0ZWN0b3IpO1xuICAgIG1vY2tzLk5vZGVEZXRlY3Rvci5leHBlY3RzKCdyZXRyaWV2ZUluQ29tbW9uUGxhY2VzJykub25jZSgpLnJldHVybnMobnVsbCk7XG4gICAgbW9ja3MuTm9kZURldGVjdG9yLmV4cGVjdHMoJ3JldHJpZXZlVXNpbmdXaGljaENvbW1hbmQnKS5vbmNlKCkucmV0dXJucyhudWxsKTtcbiAgICBtb2Nrcy5Ob2RlRGV0ZWN0b3IuZXhwZWN0cygncmV0cmlldmVVc2luZ0FwcGxlU2NyaXB0Jykub25jZSgpLnJldHVybnMobnVsbCk7XG4gICAgbW9ja3MuTm9kZURldGVjdG9yLmV4cGVjdHMoJ3JldHJpZXZlVXNpbmdBcHBpdW1Db25maWdGaWxlJykub25jZSgpLnJldHVybnMobnVsbCk7XG4gICAgZXhwZWN0KGF3YWl0IE5vZGVEZXRlY3Rvci5kZXRlY3QoKSkudG8uYmUuYSgnbnVsbCcpO1xuICAgIHZlcmlmeShtb2Nrcyk7XG4gIH0pO1xuXG59KSk7XG4iXSwic291cmNlUm9vdCI6Ii4uLy4uIn0=