appium-ios-simulator
Version:
iOS Simulator interface for Appium.
483 lines (382 loc) • 34.9 kB
JavaScript
require('source-map-support').install();
;
var _Promise = require('babel-runtime/core-js/promise')['default'];
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 _ = require('../..');
var _libSimulatorXcode6 = require('../../lib/simulator-xcode-6');
var _libSimulatorXcode62 = _interopRequireDefault(_libSimulatorXcode6);
var _libSimulatorXcode7 = require('../../lib/simulator-xcode-7');
var _libSimulatorXcode72 = _interopRequireDefault(_libSimulatorXcode7);
var _nodeSimctl = require('node-simctl');
var simctl = _interopRequireWildcard(_nodeSimctl);
var _chai = require('chai');
var _chai2 = _interopRequireDefault(_chai);
var _chaiAsPromised = require('chai-as-promised');
var _chaiAsPromised2 = _interopRequireDefault(_chaiAsPromised);
var _sinon = require('sinon');
var _sinon2 = _interopRequireDefault(_sinon);
var _assetsDeviceList = require('../assets/deviceList');
var _bluebird = require('bluebird');
var _bluebird2 = _interopRequireDefault(_bluebird);
var _appiumXcode = require('appium-xcode');
var _appiumXcode2 = _interopRequireDefault(_appiumXcode);
_chai2['default'].should();
_chai2['default'].use(_chaiAsPromised2['default']);
var UDID = _assetsDeviceList.devices['7.1'][0].udid;
describe('simulator', function () {
var xcodeMock = undefined;
var getDevicesStub = undefined;
beforeEach(function () {
xcodeMock = _sinon2['default'].mock(_appiumXcode2['default']);
getDevicesStub = _sinon2['default'].stub(simctl, 'getDevices');
getDevicesStub.returns(_Promise.resolve(_assetsDeviceList.devices));
});
afterEach(function () {
xcodeMock.restore();
simctl.getDevices.restore();
});
describe('getSimulator', function () {
it('should create a simulator with default xcode version', function callee$2$0() {
var xcodeVersion, sim;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
xcodeVersion = { major: 6, versionString: '6.0.0' };
xcodeMock.expects('getVersion').returns(_Promise.resolve(xcodeVersion));
context$3$0.next = 4;
return _regeneratorRuntime.awrap((0, _.getSimulator)(UDID));
case 4:
sim = context$3$0.sent;
sim.xcodeVersion.should.equal(xcodeVersion);
sim.should.be.an['instanceof'](_libSimulatorXcode62['default']);
case 7:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should create an xcode 7 simulator with xcode version 7', function callee$2$0() {
var xcodeVersion, sim;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
xcodeVersion = { major: 7, versionString: '7.0.0' };
xcodeMock.expects('getVersion').returns(_Promise.resolve(xcodeVersion));
context$3$0.next = 4;
return _regeneratorRuntime.awrap((0, _.getSimulator)(UDID));
case 4:
sim = context$3$0.sent;
sim.xcodeVersion.should.equal(xcodeVersion);
sim.should.be.an['instanceof'](_libSimulatorXcode72['default']);
case 7:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should throw an error if xcode version less than 6', function callee$2$0() {
var xcodeVersion;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
xcodeVersion = { major: 5, versionString: '5.4.0' };
xcodeMock.expects('getVersion').returns(_Promise.resolve(xcodeVersion));
context$3$0.next = 4;
return _regeneratorRuntime.awrap((0, _.getSimulator)(UDID).should.eventually.be.rejectedWith('version'));
case 4:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should throw an error if xcode version above 7', function callee$2$0() {
var xcodeVersion;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
xcodeVersion = { major: 8, versionString: '8.0.0' };
xcodeMock.expects('getVersion').returns(_Promise.resolve(xcodeVersion));
context$3$0.next = 4;
return _regeneratorRuntime.awrap((0, _.getSimulator)(UDID).should.eventually.be.rejectedWith('not yet'));
case 4:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should throw an error if udid does 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:
context$3$0.next = 2;
return _regeneratorRuntime.awrap((0, _.getSimulator)('123').should.be.rejectedWith('No sim found'));
case 2:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should list stats for sim', function callee$2$0() {
var xcodeVersion, sims, stats;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
xcodeVersion = { major: 6, versionString: '6.0.0' };
xcodeMock.expects('getVersion').atLeast(1).returns(_Promise.resolve(xcodeVersion));
sims = [(0, _.getSimulator)('F33783B2-9EE9-4A99-866E-E126ADBAD410'), (0, _.getSimulator)('DFBC2970-9455-4FD9-BB62-9E4AE5AA6954')];
stats = sims.map(function (simProm) {
return simProm.then(function (sim) {
return sim.stat();
});
});
context$3$0.next = 6;
return _regeneratorRuntime.awrap(_bluebird2['default'].all(stats));
case 6:
stats = context$3$0.sent;
stats[0].state.should.equal('Shutdown');
stats[0].name.should.equal('Resizable iPhone');
stats[1].state.should.equal('Shutdown');
stats[1].name.should.equal('Resizable iPad');
case 11:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
});
describe('getDeviceString', function () {
describe('Xcode 6', function () {
var xcodeVersion = { major: 6, versionString: '6.0.0' };
beforeEach(function () {
xcodeMock.expects('getVersion').returns(_Promise.resolve(xcodeVersion));
});
it('should get the correct device for iOS 8+', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
xcodeMock.expects('getMaxIOSSDK').returns(_Promise.resolve(8.4));
context$4$0.next = 3;
return _regeneratorRuntime.awrap((0, _.getDeviceString)());
case 3:
device = context$4$0.sent;
device.should.equal('iPhone 6 (8.4 Simulator)');
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should get the correct device for iOS 8+ when platform version passed in', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
context$4$0.next = 2;
return _regeneratorRuntime.awrap((0, _.getDeviceString)({ platformVersion: '8.1' }));
case 2:
device = context$4$0.sent;
device.should.equal('iPhone 6 (8.1 Simulator)');
case 4:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should get the correct device for iOS 7+', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
xcodeMock.expects('getMaxIOSSDK').returns(_Promise.resolve(7.1));
context$4$0.next = 3;
return _regeneratorRuntime.awrap((0, _.getDeviceString)());
case 3:
device = context$4$0.sent;
device.should.equal('iPhone 5s (7.1 Simulator)');
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should get the correct device for iOS 7+ when platform version passed in', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
context$4$0.next = 2;
return _regeneratorRuntime.awrap((0, _.getDeviceString)({ platformVersion: '7.1' }));
case 2:
device = context$4$0.sent;
device.should.equal('iPhone 5s (7.1 Simulator)');
case 4:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should pass through device name when passed with =', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
xcodeMock.expects('getMaxIOSSDK').returns(_Promise.resolve(8.4));
context$4$0.next = 3;
return _regeneratorRuntime.awrap((0, _.getDeviceString)({ deviceName: '=fancy device' }));
case 3:
device = context$4$0.sent;
device.should.equal('fancy device');
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should add a device name when passed without =', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
xcodeMock.expects('getMaxIOSSDK').returns(_Promise.resolve(8.4));
context$4$0.next = 3;
return _regeneratorRuntime.awrap((0, _.getDeviceString)({ deviceName: 'fancy device' }));
case 3:
device = context$4$0.sent;
device.should.equal('fancy device (8.4 Simulator)');
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should handle string platform version', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
xcodeMock.expects('getMaxIOSSDK').returns(_Promise.resolve('8.4'));
context$4$0.next = 3;
return _regeneratorRuntime.awrap((0, _.getDeviceString)());
case 3:
device = context$4$0.sent;
device.should.equal('iPhone 6 (8.4 Simulator)');
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
});
describe('Xcode 7', function () {
var xcodeVersion = { major: 7, versionString: '7.0.0' };
beforeEach(function () {
xcodeMock.expects('getVersion').returns(_Promise.resolve(xcodeVersion));
});
it('should get the correct device for iOS 8+', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
xcodeMock.expects('getMaxIOSSDK').returns(_Promise.resolve(8.4));
context$4$0.next = 3;
return _regeneratorRuntime.awrap((0, _.getDeviceString)());
case 3:
device = context$4$0.sent;
device.should.equal('iPhone 6 (8.4)');
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should get the correct device for iOS 8+ when platform version passed in', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
context$4$0.next = 2;
return _regeneratorRuntime.awrap(_libSimulatorXcode72['default'].getDeviceString({ platformVersion: '8.1' }));
case 2:
device = context$4$0.sent;
device.should.equal('iPhone 6 (8.1)');
case 4:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should get the correct device for iOS 9+', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
xcodeMock.expects('getMaxIOSSDK').returns(_Promise.resolve(9));
context$4$0.next = 3;
return _regeneratorRuntime.awrap((0, _.getDeviceString)());
case 3:
device = context$4$0.sent;
device.should.equal('iPhone 6 (9.0) [');
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should get the correct device for iOS 9+ when platform version passed in', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
context$4$0.next = 2;
return _regeneratorRuntime.awrap((0, _.getDeviceString)({ platformVersion: '9.0' }));
case 2:
device = context$4$0.sent;
device.should.equal('iPhone 6 (9.0) [');
case 4:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should pass through device name when passed with =', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
xcodeMock.expects('getMaxIOSSDK').returns(_Promise.resolve(9.0));
context$4$0.next = 3;
return _regeneratorRuntime.awrap((0, _.getDeviceString)({ deviceName: '=fancy device' }));
case 3:
device = context$4$0.sent;
device.should.equal('fancy device');
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
it('should add a device name when passed without =', function callee$3$0() {
var device;
return _regeneratorRuntime.async(function callee$3$0$(context$4$0) {
while (1) switch (context$4$0.prev = context$4$0.next) {
case 0:
xcodeMock.expects('getMaxIOSSDK').returns(_Promise.resolve(9.0));
context$4$0.next = 3;
return _regeneratorRuntime.awrap((0, _.getDeviceString)({ deviceName: 'fancy device' }));
case 3:
device = context$4$0.sent;
device.should.equal('fancy device (9.0)');
case 5:
case 'end':
return context$4$0.stop();
}
}, null, _this);
});
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvdW5pdC9zaW11bGF0b3Itc3BlY3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Z0JBRThDLE9BQU87O2tDQUN6Qiw2QkFBNkI7Ozs7a0NBQzdCLDZCQUE2Qjs7OzswQkFDakMsYUFBYTs7SUFBekIsTUFBTTs7b0JBQ0QsTUFBTTs7Ozs4QkFDSSxrQkFBa0I7Ozs7cUJBQzNCLE9BQU87Ozs7Z0NBQ0Qsc0JBQXNCOzt3QkFDaEMsVUFBVTs7OzsyQkFDTixjQUFjOzs7O0FBR2hDLGtCQUFLLE1BQU0sRUFBRSxDQUFDO0FBQ2Qsa0JBQUssR0FBRyw2QkFBZ0IsQ0FBQzs7QUFFekIsSUFBTSxJQUFJLEdBQUcsMEJBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOztBQUVwQyxRQUFRLENBQUMsV0FBVyxFQUFFLFlBQU07QUFDMUIsTUFBSSxTQUFTLFlBQUEsQ0FBQztBQUNkLE1BQUksY0FBYyxZQUFBLENBQUM7O0FBRW5CLFlBQVUsQ0FBQyxZQUFNO0FBQ2YsYUFBUyxHQUFHLG1CQUFNLElBQUksMEJBQU8sQ0FBQztBQUM5QixrQkFBYyxHQUFHLG1CQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDbEQsa0JBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUSxPQUFPLDJCQUFTLENBQUMsQ0FBQztHQUNsRCxDQUFDLENBQUM7QUFDSCxXQUFTLENBQUMsWUFBTTtBQUNkLGFBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNwQixVQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0dBQzdCLENBQUMsQ0FBQzs7QUFFSCxVQUFRLENBQUMsY0FBYyxFQUFFLFlBQU07QUFDN0IsTUFBRSxDQUFDLHNEQUFzRCxFQUFFO1VBQ3JELFlBQVksRUFHWixHQUFHOzs7O0FBSEgsd0JBQVksR0FBRyxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBQzs7QUFD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RS9DLE1BQU07Ozs7QUFEVix1QkFBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7K0NBQzdDLHVCQUFnQixFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUMsQ0FBQzs7O0FBQTVELG9CQUFNOztBQUNWLG9CQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDOzs7Ozs7O09BQzNDLENBQUMsQ0FBQztLQUNKLENBQUMsQ0FBQztHQUNKLENBQUMsQ0FBQztDQUNKLENBQUMsQ0FBQyIsImZpbGUiOiJ0ZXN0L3VuaXQvc2ltdWxhdG9yLXNwZWNzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1vY2hhXG5cbmltcG9ydCB7IGdldFNpbXVsYXRvciwgZ2V0RGV2aWNlU3RyaW5nIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IFNpbXVsYXRvclhjb2RlNiBmcm9tICcuLi8uLi9saWIvc2ltdWxhdG9yLXhjb2RlLTYnO1xuaW1wb3J0IFNpbXVsYXRvclhjb2RlNyBmcm9tICcuLi8uLi9saWIvc2ltdWxhdG9yLXhjb2RlLTcnO1xuaW1wb3J0ICogYXMgc2ltY3RsIGZyb20gJ25vZGUtc2ltY3RsJztcbmltcG9ydCBjaGFpIGZyb20gJ2NoYWknO1xuaW1wb3J0IGNoYWlBc1Byb21pc2VkIGZyb20gJ2NoYWktYXMtcHJvbWlzZWQnO1xuaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IGRldmljZXMgfSBmcm9tICcuLi9hc3NldHMvZGV2aWNlTGlzdCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeGNvZGUgZnJvbSAnYXBwaXVtLXhjb2RlJztcblxuXG5jaGFpLnNob3VsZCgpO1xuY2hhaS51c2UoY2hhaUFzUHJvbWlzZWQpO1xuXG5jb25zdCBVRElEID0gZGV2aWNlc1snNy4xJ11bMF0udWRpZDtcblxuZGVzY3JpYmUoJ3NpbXVsYXRvcicsICgpID0+IHtcbiAgbGV0IHhjb2RlTW9jaztcbiAgbGV0IGdldERldmljZXNTdHViO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHhjb2RlTW9jayA9IHNpbm9uLm1vY2soeGNvZGUpO1xuICAgIGdldERldmljZXNTdHViID0gc2lub24uc3R1YihzaW1jdGwsICdnZXREZXZpY2VzJyk7XG4gICAgZ2V0RGV2aWNlc1N0dWIucmV0dXJucyhQcm9taXNlLnJlc29sdmUoZGV2aWNlcykpO1xuICB9KTtcbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICB4Y29kZU1vY2sucmVzdG9yZSgpO1xuICAgIHNpbWN0bC5nZXREZXZpY2VzLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFNpbXVsYXRvcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIHNpbXVsYXRvciB3aXRoIGRlZmF1bHQgeGNvZGUgdmVyc2lvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB4Y29kZVZlcnNpb24gPSB7bWFqb3I6IDYsIHZlcnNpb25TdHJpbmc6ICc2LjAuMCd9O1xuICAgICAgeGNvZGVNb2NrLmV4cGVjdHMoJ2dldFZlcnNpb24nKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh4Y29kZVZlcnNpb24pKTtcblxuICAgICAgbGV0IHNpbSA9IGF3YWl0IGdldFNpbXVsYXRvcihVRElEKTtcbiAgICAgIHNpbS54Y29kZVZlcnNpb24uc2hvdWxkLmVxdWFsKHhjb2RlVmVyc2lvbik7XG4gICAgICBzaW0uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoU2ltdWxhdG9yWGNvZGU2KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIGFuIHhjb2RlIDcgc2ltdWxhdG9yIHdpdGggeGNvZGUgdmVyc2lvbiA3JywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHhjb2RlVmVyc2lvbiA9IHttYWpvcjogNywgdmVyc2lvblN0cmluZzogJzcuMC4wJ307XG4gICAgICB4Y29kZU1vY2suZXhwZWN0cygnZ2V0VmVyc2lvbicpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHhjb2RlVmVyc2lvbikpO1xuXG4gICAgICBsZXQgc2ltID0gYXdhaXQgZ2V0U2ltdWxhdG9yKFVESUQpO1xuICAgICAgc2ltLnhjb2RlVmVyc2lvbi5zaG91bGQuZXF1YWwoeGNvZGVWZXJzaW9uKTtcbiAgICAgIHNpbS5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihTaW11bGF0b3JYY29kZTcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBpZiB4Y29kZSB2ZXJzaW9uIGxlc3MgdGhhbiA2JywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHhjb2RlVmVyc2lvbiA9IHttYWpvcjogNSwgdmVyc2lvblN0cmluZzogJzUuNC4wJ307XG4gICAgICB4Y29kZU1vY2suZXhwZWN0cygnZ2V0VmVyc2lvbicpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKHhjb2RlVmVyc2lvbikpO1xuXG4gICAgICBhd2FpdCBnZXRTaW11bGF0b3IoVURJRCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKCd2ZXJzaW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIHhjb2RlIHZlcnNpb24gYWJvdmUgNycsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB4Y29kZVZlcnNpb24gPSB7bWFqb3I6IDgsIHZlcnNpb25TdHJpbmc6ICc4LjAuMCd9O1xuICAgICAgeGNvZGVNb2NrLmV4cGVjdHMoJ2dldFZlcnNpb24nKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh4Y29kZVZlcnNpb24pKTtcblxuICAgICAgYXdhaXQgZ2V0U2ltdWxhdG9yKFVESUQpLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgnbm90IHlldCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBpZiB1ZGlkIGRvZXMgbm90IGV4aXN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZ2V0U2ltdWxhdG9yKCcxMjMnKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdObyBzaW0gZm91bmQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbGlzdCBzdGF0cyBmb3Igc2ltJywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHhjb2RlVmVyc2lvbiA9IHttYWpvcjogNiwgdmVyc2lvblN0cmluZzogJzYuMC4wJ307XG4gICAgICB4Y29kZU1vY2suZXhwZWN0cygnZ2V0VmVyc2lvbicpLmF0TGVhc3QoMSkucmV0dXJucyhQcm9taXNlLnJlc29sdmUoeGNvZGVWZXJzaW9uKSk7XG5cbiAgICAgIGxldCBzaW1zID0gW1xuICAgICAgICBnZXRTaW11bGF0b3IoJ0YzMzc4M0IyLTlFRTktNEE5OS04NjZFLUUxMjZBREJBRDQxMCcpLFxuICAgICAgICBnZXRTaW11bGF0b3IoJ0RGQkMyOTcwLTk0NTUtNEZEOS1CQjYyLTlFNEFFNUFBNjk1NCcpLFxuICAgICAgXTtcblxuICAgICAgbGV0IHN0YXRzID0gc2ltcy5tYXAoKHNpbVByb20pID0+IHtcbiAgICAgICAgcmV0dXJuIHNpbVByb20udGhlbigoc2ltKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNpbS5zdGF0KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHN0YXRzID0gYXdhaXQgQi5hbGwoc3RhdHMpO1xuXG4gICAgICBzdGF0c1swXS5zdGF0ZS5zaG91bGQuZXF1YWwoJ1NodXRkb3duJyk7XG4gICAgICBzdGF0c1swXS5uYW1lLnNob3VsZC5lcXVhbCgnUmVzaXphYmxlIGlQaG9uZScpO1xuICAgICAgc3RhdHNbMV0uc3RhdGUuc2hvdWxkLmVxdWFsKCdTaHV0ZG93bicpO1xuICAgICAgc3RhdHNbMV0ubmFtZS5zaG91bGQuZXF1YWwoJ1Jlc2l6YWJsZSBpUGFkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG5cbiAgZGVzY3JpYmUoJ2dldERldmljZVN0cmluZycsICgpID0+IHtcbiAgICBkZXNjcmliZSgnWGNvZGUgNicsICgpID0+IHtcbiAgICAgIGxldCB4Y29kZVZlcnNpb24gPSB7bWFqb3I6IDYsIHZlcnNpb25TdHJpbmc6ICc2LjAuMCd9O1xuXG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgeGNvZGVNb2NrLmV4cGVjdHMoJ2dldFZlcnNpb24nKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh4Y29kZVZlcnNpb24pKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGdldCB0aGUgY29ycmVjdCBkZXZpY2UgZm9yIGlPUyA4KycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgeGNvZGVNb2NrLmV4cGVjdHMoJ2dldE1heElPU1NESycpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKDguNCkpO1xuICAgICAgICBsZXQgZGV2aWNlID0gYXdhaXQgZ2V0RGV2aWNlU3RyaW5nKCk7XG4gICAgICAgIGRldmljZS5zaG91bGQuZXF1YWwoJ2lQaG9uZSA2ICg4LjQgU2ltdWxhdG9yKScpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGdldCB0aGUgY29ycmVjdCBkZXZpY2UgZm9yIGlPUyA4KyB3aGVuIHBsYXRmb3JtIHZlcnNpb24gcGFzc2VkIGluJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgZGV2aWNlID0gYXdhaXQgZ2V0RGV2aWNlU3RyaW5nKHtwbGF0Zm9ybVZlcnNpb246ICc4LjEnfSk7XG4gICAgICAgIGRldmljZS5zaG91bGQuZXF1YWwoJ2lQaG9uZSA2ICg4LjEgU2ltdWxhdG9yKScpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGdldCB0aGUgY29ycmVjdCBkZXZpY2UgZm9yIGlPUyA3KycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgeGNvZGVNb2NrLmV4cGVjdHMoJ2dldE1heElPU1NESycpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKDcuMSkpO1xuICAgICAgICBsZXQgZGV2aWNlID0gYXdhaXQgZ2V0RGV2aWNlU3RyaW5nKCk7XG4gICAgICAgIGRldmljZS5zaG91bGQuZXF1YWwoJ2lQaG9uZSA1cyAoNy4xIFNpbXVsYXRvciknKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBnZXQgdGhlIGNvcnJlY3QgZGV2aWNlIGZvciBpT1MgNysgd2hlbiBwbGF0Zm9ybSB2ZXJzaW9uIHBhc3NlZCBpbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGRldmljZSA9IGF3YWl0IGdldERldmljZVN0cmluZyh7cGxhdGZvcm1WZXJzaW9uOiAnNy4xJ30pO1xuICAgICAgICBkZXZpY2Uuc2hvdWxkLmVxdWFsKCdpUGhvbmUgNXMgKDcuMSBTaW11bGF0b3IpJyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgcGFzcyB0aHJvdWdoIGRldmljZSBuYW1lIHdoZW4gcGFzc2VkIHdpdGggPScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgeGNvZGVNb2NrLmV4cGVjdHMoJ2dldE1heElPU1NESycpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKDguNCkpO1xuICAgICAgICBsZXQgZGV2aWNlID0gYXdhaXQgZ2V0RGV2aWNlU3RyaW5nKHtkZXZpY2VOYW1lOiAnPWZhbmN5IGRldmljZSd9KTtcbiAgICAgICAgZGV2aWNlLnNob3VsZC5lcXVhbCgnZmFuY3kgZGV2aWNlJyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYWRkIGEgZGV2aWNlIG5hbWUgd2hlbiBwYXNzZWQgd2l0aG91dCA9JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB4Y29kZU1vY2suZXhwZWN0cygnZ2V0TWF4SU9TU0RLJykucmV0dXJucyhQcm9taXNlLnJlc29sdmUoOC40KSk7XG4gICAgICAgIGxldCBkZXZpY2UgPSBhd2FpdCBnZXREZXZpY2VTdHJpbmcoe2RldmljZU5hbWU6ICdmYW5jeSBkZXZpY2UnfSk7XG4gICAgICAgIGRldmljZS5zaG91bGQuZXF1YWwoJ2ZhbmN5IGRldmljZSAoOC40IFNpbXVsYXRvciknKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgc3RyaW5nIHBsYXRmb3JtIHZlcnNpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHhjb2RlTW9jay5leHBlY3RzKCdnZXRNYXhJT1NTREsnKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgnOC40JykpO1xuICAgICAgICBsZXQgZGV2aWNlID0gYXdhaXQgZ2V0RGV2aWNlU3RyaW5nKCk7XG4gICAgICAgIGRldmljZS5zaG91bGQuZXF1YWwoJ2lQaG9uZSA2ICg4LjQgU2ltdWxhdG9yKScpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnWGNvZGUgNycsICgpID0+IHtcbiAgICAgIGxldCB4Y29kZVZlcnNpb24gPSB7bWFqb3I6IDcsIHZlcnNpb25TdHJpbmc6ICc3LjAuMCd9O1xuXG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgeGNvZGVNb2NrLmV4cGVjdHMoJ2dldFZlcnNpb24nKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSh4Y29kZVZlcnNpb24pKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGdldCB0aGUgY29ycmVjdCBkZXZpY2UgZm9yIGlPUyA4KycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgeGNvZGVNb2NrLmV4cGVjdHMoJ2dldE1heElPU1NESycpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKDguNCkpO1xuICAgICAgICBsZXQgZGV2aWNlID0gYXdhaXQgZ2V0RGV2aWNlU3RyaW5nKCk7XG4gICAgICAgIGRldmljZS5zaG91bGQuZXF1YWwoJ2lQaG9uZSA2ICg4LjQpJyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgZ2V0IHRoZSBjb3JyZWN0IGRldmljZSBmb3IgaU9TIDgrIHdoZW4gcGxhdGZvcm0gdmVyc2lvbiBwYXNzZWQgaW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBkZXZpY2UgPSBhd2FpdCBTaW11bGF0b3JYY29kZTcuZ2V0RGV2aWNlU3RyaW5nKHtwbGF0Zm9ybVZlcnNpb246ICc4LjEnfSk7XG4gICAgICAgIGRldmljZS5zaG91bGQuZXF1YWwoJ2lQaG9uZSA2ICg4LjEpJyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgZ2V0IHRoZSBjb3JyZWN0IGRldmljZSBmb3IgaU9TIDkrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB4Y29kZU1vY2suZXhwZWN0cygnZ2V0TWF4SU9TU0RLJykucmV0dXJucyhQcm9taXNlLnJlc29sdmUoOSkpO1xuICAgICAgICBsZXQgZGV2aWNlID0gYXdhaXQgZ2V0RGV2aWNlU3RyaW5nKCk7XG4gICAgICAgIGRldmljZS5zaG91bGQuZXF1YWwoJ2lQaG9uZSA2ICg5LjApIFsnKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBnZXQgdGhlIGNvcnJlY3QgZGV2aWNlIGZvciBpT1MgOSsgd2hlbiBwbGF0Zm9ybSB2ZXJzaW9uIHBhc3NlZCBpbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGRldmljZSA9IGF3YWl0IGdldERldmljZVN0cmluZyh7cGxhdGZvcm1WZXJzaW9uOiAnOS4wJ30pO1xuICAgICAgICBkZXZpY2Uuc2hvdWxkLmVxdWFsKCdpUGhvbmUgNiAoOS4wKSBbJyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgcGFzcyB0aHJvdWdoIGRldmljZSBuYW1lIHdoZW4gcGFzc2VkIHdpdGggPScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgeGNvZGVNb2NrLmV4cGVjdHMoJ2dldE1heElPU1NESycpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKDkuMCkpO1xuICAgICAgICBsZXQgZGV2aWNlID0gYXdhaXQgZ2V0RGV2aWNlU3RyaW5nKHtkZXZpY2VOYW1lOiAnPWZhbmN5IGRldmljZSd9KTtcbiAgICAgICAgZGV2aWNlLnNob3VsZC5lcXVhbCgnZmFuY3kgZGV2aWNlJyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYWRkIGEgZGV2aWNlIG5hbWUgd2hlbiBwYXNzZWQgd2l0aG91dCA9JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB4Y29kZU1vY2suZXhwZWN0cygnZ2V0TWF4SU9TU0RLJykucmV0dXJucyhQcm9taXNlLnJlc29sdmUoOS4wKSk7XG4gICAgICAgIGxldCBkZXZpY2UgPSBhd2FpdCBnZXREZXZpY2VTdHJpbmcoe2RldmljZU5hbWU6ICdmYW5jeSBkZXZpY2UnfSk7XG4gICAgICAgIGRldmljZS5zaG91bGQuZXF1YWwoJ2ZhbmN5IGRldmljZSAoOS4wKScpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=