@querc/squidex-client
Version:
NodeJS client for the [Squidex](https://squidex.io/) CMS
212 lines (206 loc) • 29.1 kB
JavaScript
"use strict";
require("jest");
var _content = require("./content");
var _httpClient = require("../http/http-client");
var _authenticationManager = require("../authentication/authentication-manager");
var _squidexQuery = require("./squidex-query");
jest.mock('../http/http-client');
const TOKEN = 'abc-123';
const CONFIG = {
url: 'https://foo',
appName: 'my-app',
clientId: 'my-app:default',
clientSecret: 'SEKRIT'
};
describe('Content Schema should...', () => {
let httpClient;
let authenticationManager;
let contentSchema;
beforeEach(() => {
// Mock the API response
_httpClient.HttpClient.prototype.send = jest.fn().mockResolvedValue({
items: [{
data: {
test: 'TEST1'
},
created: '1970-01-01T00:00:00.000Z',
lastModified: '1978-01-24T03:17:00.000Z'
}, {
data: {
test: 'TEST2'
},
created: '1970-01-01T00:00:00.000Z',
lastModified: '1978-01-24T03:17:00.000Z'
}, {
data: {
test: 'TEST3'
},
created: '1970-01-01T00:00:00.000Z',
lastModified: '1978-01-24T03:17:00.000Z'
}]
});
httpClient = new _httpClient.HttpClient();
_authenticationManager.AuthenticationManager.prototype.authenticate = jest.fn().mockResolvedValue(TOKEN);
authenticationManager = new _authenticationManager.AuthenticationManager(CONFIG, httpClient);
contentSchema = new _content.ContentSchema(CONFIG, httpClient, authenticationManager);
contentSchema.schema = 'test';
});
test('exist', () => {
expect(_authenticationManager.AuthenticationManager).toBeDefined();
});
test('call the API server', async () => {
await contentSchema.query();
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/?'
}));
});
test('send the token', async () => {
await contentSchema.query();
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
token: 'abc-123'
}));
});
test('include the serialised query in the URL', async () => {
await contentSchema.query({
$top: 10
});
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/?%24top=10'
}));
});
test('include drafts', async () => {
await contentSchema.query({}, true);
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
draft: true
}));
});
test('deserialise dates correctly', async () => {
const result = await contentSchema.query();
expect(result.items[0].created).toBeInstanceOf(Date);
expect(result.items[0].created.getFullYear()).toBe(1970);
expect(result.items[0].lastModified).toBeInstanceOf(Date);
expect(result.items[0].lastModified.getFullYear()).toBe(1978);
});
test('not overwrite JSON query for querySingle()', async () => {
const query = new _squidexQuery.SquidexJsonQuery();
query.q = {
skip: 2
};
await contentSchema.querySingle(query);
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/?q=%7B%22skip%22%3A2%7D'
}));
});
test('only request the first result for querySingle()', async () => {
await contentSchema.querySingle();
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/?%24top=1'
}));
});
test('return all data for query()', async () => {
const result = await contentSchema.query();
expect(result.items.length).toBe(3);
});
test('return first result for querySingle()', async () => {
const result = await contentSchema.querySingle();
expect(result).toMatchObject({
data: {
test: 'TEST1'
}
});
});
test('send a POST request with the content for create()', async () => {
await contentSchema.create({
test: 'TEST'
});
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/?publish=false',
method: 'POST',
data: {
test: 'TEST'
}
}));
});
test('include the publish parameter for create({}, true)', async () => {
await contentSchema.create({}, true);
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/?publish=true'
}));
});
test('send a PUT request with the content for update()', async () => {
await contentSchema.update('123-456', {
test: 'TEST'
});
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/123-456',
method: 'PUT',
data: {
test: 'TEST'
}
}));
});
test('send a PATCH request with the content for patch()', async () => {
await contentSchema.patch('123-456', {
test: 'TEST'
});
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/123-456',
method: 'PATCH',
data: {
test: 'TEST'
}
}));
});
test('send a DELETE request for delete()', async () => {
await contentSchema.delete('123-456');
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/123-456',
method: 'DELETE'
}));
});
test('send a PUT request for updateStatus()', async () => {
await contentSchema.updateStatus('123-456', {
status: 'Testing'
});
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/123-456/status',
method: 'PUT'
}));
});
test('send DueTime for updateStatus() if provided', async () => {
await contentSchema.updateStatus('123-456', {
status: 'Testing',
dueTime: new Date('2424-01-24T00:00Z')
});
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/123-456/status',
method: 'PUT',
data: {
DueTime: '2424-01-24T00:00:00.000Z',
Status: 'Testing'
}
}));
});
test('send a PUT request for discard()', async () => {
await contentSchema.discard('123-456');
expect(httpClient.send).toHaveBeenCalledTimes(1);
expect(httpClient.send).toHaveBeenCalledWith(expect.objectContaining({
path: '/api/content/my-app/test/123-456/discard',
method: 'PUT'
}));
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWFzL2NvbnRlbnQudGVzdC50cyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsIlRPS0VOIiwiQ09ORklHIiwidXJsIiwiYXBwTmFtZSIsImNsaWVudElkIiwiY2xpZW50U2VjcmV0IiwiZGVzY3JpYmUiLCJodHRwQ2xpZW50IiwiYXV0aGVudGljYXRpb25NYW5hZ2VyIiwiY29udGVudFNjaGVtYSIsImJlZm9yZUVhY2giLCJIdHRwQ2xpZW50IiwicHJvdG90eXBlIiwic2VuZCIsImZuIiwibW9ja1Jlc29sdmVkVmFsdWUiLCJpdGVtcyIsImRhdGEiLCJ0ZXN0IiwiY3JlYXRlZCIsImxhc3RNb2RpZmllZCIsIkF1dGhlbnRpY2F0aW9uTWFuYWdlciIsImF1dGhlbnRpY2F0ZSIsIkNvbnRlbnRTY2hlbWEiLCJzY2hlbWEiLCJleHBlY3QiLCJ0b0JlRGVmaW5lZCIsInF1ZXJ5IiwidG9IYXZlQmVlbkNhbGxlZFRpbWVzIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJvYmplY3RDb250YWluaW5nIiwicGF0aCIsInRva2VuIiwiJHRvcCIsImRyYWZ0IiwicmVzdWx0IiwidG9CZUluc3RhbmNlT2YiLCJEYXRlIiwiZ2V0RnVsbFllYXIiLCJ0b0JlIiwiU3F1aWRleEpzb25RdWVyeSIsInEiLCJza2lwIiwicXVlcnlTaW5nbGUiLCJsZW5ndGgiLCJ0b01hdGNoT2JqZWN0IiwiY3JlYXRlIiwibWV0aG9kIiwidXBkYXRlIiwicGF0Y2giLCJkZWxldGUiLCJ1cGRhdGVTdGF0dXMiLCJzdGF0dXMiLCJkdWVUaW1lIiwiRHVlVGltZSIsIlN0YXR1cyIsImRpc2NhcmQiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0FBLElBQUksQ0FBQ0MsSUFBTCxDQUFVLHFCQUFWO0FBRUEsTUFBTUMsS0FBSyxHQUFHLFNBQWQ7QUFDQSxNQUFNQyxNQUFNLEdBQUc7QUFDWEMsRUFBQUEsR0FBRyxFQUFFLGFBRE07QUFFWEMsRUFBQUEsT0FBTyxFQUFFLFFBRkU7QUFHWEMsRUFBQUEsUUFBUSxFQUFFLGdCQUhDO0FBSVhDLEVBQUFBLFlBQVksRUFBRTtBQUpILENBQWY7QUFPQUMsUUFBUSxDQUFDLDBCQUFELEVBQTZCLE1BQU07QUFDdkMsTUFBSUMsVUFBSjtBQUNBLE1BQUlDLHFCQUFKO0FBQ0EsTUFBSUMsYUFBSjtBQUVBQyxFQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNiO0FBQ0FDLDJCQUFXQyxTQUFYLENBQXFCQyxJQUFyQixHQUE0QmYsSUFBSSxDQUFDZ0IsRUFBTCxHQUFVQyxpQkFBVixDQUE0QjtBQUNwREMsTUFBQUEsS0FBSyxFQUFFLENBQ0g7QUFDSUMsUUFBQUEsSUFBSSxFQUFFO0FBQUVDLFVBQUFBLElBQUksRUFBRTtBQUFSLFNBRFY7QUFFSUMsUUFBQUEsT0FBTyxFQUFFLDBCQUZiO0FBR0lDLFFBQUFBLFlBQVksRUFBRTtBQUhsQixPQURHLEVBTUg7QUFDSUgsUUFBQUEsSUFBSSxFQUFFO0FBQUVDLFVBQUFBLElBQUksRUFBRTtBQUFSLFNBRFY7QUFFSUMsUUFBQUEsT0FBTyxFQUFFLDBCQUZiO0FBR0lDLFFBQUFBLFlBQVksRUFBRTtBQUhsQixPQU5HLEVBV0g7QUFDSUgsUUFBQUEsSUFBSSxFQUFFO0FBQUVDLFVBQUFBLElBQUksRUFBRTtBQUFSLFNBRFY7QUFFSUMsUUFBQUEsT0FBTyxFQUFFLDBCQUZiO0FBR0lDLFFBQUFBLFlBQVksRUFBRTtBQUhsQixPQVhHO0FBRDZDLEtBQTVCLENBQTVCO0FBb0JBYixJQUFBQSxVQUFVLEdBQUcsSUFBS0ksc0JBQUwsRUFBYjtBQUVBVSxpREFBc0JULFNBQXRCLENBQWdDVSxZQUFoQyxHQUErQ3hCLElBQUksQ0FBQ2dCLEVBQUwsR0FBVUMsaUJBQVYsQ0FBNEJmLEtBQTVCLENBQS9DO0FBQ0FRLElBQUFBLHFCQUFxQixHQUFHLElBQUthLDRDQUFMLENBQW1DcEIsTUFBbkMsRUFBMkNNLFVBQTNDLENBQXhCO0FBRUFFLElBQUFBLGFBQWEsR0FBRyxJQUFJYyxzQkFBSixDQUFrQnRCLE1BQWxCLEVBQTBCTSxVQUExQixFQUFzQ0MscUJBQXRDLENBQWhCO0FBQ0FDLElBQUFBLGFBQWEsQ0FBQ2UsTUFBZCxHQUF1QixNQUF2QjtBQUNILEdBN0JTLENBQVY7QUErQkFOLEVBQUFBLElBQUksQ0FBQyxPQUFELEVBQVUsTUFBTTtBQUNoQk8sSUFBQUEsTUFBTSxDQUFDSiw0Q0FBRCxDQUFOLENBQThCSyxXQUE5QjtBQUNILEdBRkcsQ0FBSjtBQUlBUixFQUFBQSxJQUFJLENBQUMscUJBQUQsRUFBd0IsWUFBWTtBQUNwQyxVQUFNVCxhQUFhLENBQUNrQixLQUFkLEVBQU47QUFFQUYsSUFBQUEsTUFBTSxDQUFDbEIsVUFBVSxDQUFDTSxJQUFaLENBQU4sQ0FBd0JlLHFCQUF4QixDQUE4QyxDQUE5QztBQUNBSCxJQUFBQSxNQUFNLENBQUNsQixVQUFVLENBQUNNLElBQVosQ0FBTixDQUF3QmdCLG9CQUF4QixDQUNJSixNQUFNLENBQUNLLGdCQUFQLENBQXdCO0FBQ3BCQyxNQUFBQSxJQUFJLEVBQUU7QUFEYyxLQUF4QixDQURKO0FBS0gsR0FURyxDQUFKO0FBV0FiLEVBQUFBLElBQUksQ0FBQyxnQkFBRCxFQUFtQixZQUFZO0FBQy9CLFVBQU1ULGFBQWEsQ0FBQ2tCLEtBQWQsRUFBTjtBQUVBRixJQUFBQSxNQUFNLENBQUNsQixVQUFVLENBQUNNLElBQVosQ0FBTixDQUF3QmUscUJBQXhCLENBQThDLENBQTlDO0FBQ0FILElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZ0Isb0JBQXhCLENBQ0lKLE1BQU0sQ0FBQ0ssZ0JBQVAsQ0FBd0I7QUFDcEJFLE1BQUFBLEtBQUssRUFBRTtBQURhLEtBQXhCLENBREo7QUFLSCxHQVRHLENBQUo7QUFXQWQsRUFBQUEsSUFBSSxDQUFDLHlDQUFELEVBQTRDLFlBQVk7QUFDeEQsVUFBTVQsYUFBYSxDQUFDa0IsS0FBZCxDQUFvQjtBQUFFTSxNQUFBQSxJQUFJLEVBQUU7QUFBUixLQUFwQixDQUFOO0FBRUFSLElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZSxxQkFBeEIsQ0FBOEMsQ0FBOUM7QUFDQUgsSUFBQUEsTUFBTSxDQUFDbEIsVUFBVSxDQUFDTSxJQUFaLENBQU4sQ0FBd0JnQixvQkFBeEIsQ0FDSUosTUFBTSxDQUFDSyxnQkFBUCxDQUF3QjtBQUNwQkMsTUFBQUEsSUFBSSxFQUFFO0FBRGMsS0FBeEIsQ0FESjtBQUtILEdBVEcsQ0FBSjtBQVdBYixFQUFBQSxJQUFJLENBQUMsZ0JBQUQsRUFBbUIsWUFBWTtBQUMvQixVQUFNVCxhQUFhLENBQUNrQixLQUFkLENBQW9CLEVBQXBCLEVBQXdCLElBQXhCLENBQU47QUFFQUYsSUFBQUEsTUFBTSxDQUFDbEIsVUFBVSxDQUFDTSxJQUFaLENBQU4sQ0FBd0JlLHFCQUF4QixDQUE4QyxDQUE5QztBQUNBSCxJQUFBQSxNQUFNLENBQUNsQixVQUFVLENBQUNNLElBQVosQ0FBTixDQUF3QmdCLG9CQUF4QixDQUNJSixNQUFNLENBQUNLLGdCQUFQLENBQXdCO0FBQ3BCSSxNQUFBQSxLQUFLLEVBQUU7QUFEYSxLQUF4QixDQURKO0FBS0gsR0FURyxDQUFKO0FBV0FoQixFQUFBQSxJQUFJLENBQUMsNkJBQUQsRUFBZ0MsWUFBWTtBQUM1QyxVQUFNaUIsTUFBTSxHQUFHLE1BQU0xQixhQUFhLENBQUNrQixLQUFkLEVBQXJCO0FBRUFGLElBQUFBLE1BQU0sQ0FBQ1UsTUFBTSxDQUFDbkIsS0FBUCxDQUFhLENBQWIsRUFBZ0JHLE9BQWpCLENBQU4sQ0FBZ0NpQixjQUFoQyxDQUErQ0MsSUFBL0M7QUFDQVosSUFBQUEsTUFBTSxDQUFDVSxNQUFNLENBQUNuQixLQUFQLENBQWEsQ0FBYixFQUFnQkcsT0FBaEIsQ0FBd0JtQixXQUF4QixFQUFELENBQU4sQ0FBOENDLElBQTlDLENBQW1ELElBQW5EO0FBQ0FkLElBQUFBLE1BQU0sQ0FBQ1UsTUFBTSxDQUFDbkIsS0FBUCxDQUFhLENBQWIsRUFBZ0JJLFlBQWpCLENBQU4sQ0FBcUNnQixjQUFyQyxDQUFvREMsSUFBcEQ7QUFDQVosSUFBQUEsTUFBTSxDQUFDVSxNQUFNLENBQUNuQixLQUFQLENBQWEsQ0FBYixFQUFnQkksWUFBaEIsQ0FBNkJrQixXQUE3QixFQUFELENBQU4sQ0FBbURDLElBQW5ELENBQXdELElBQXhEO0FBQ0gsR0FQRyxDQUFKO0FBU0FyQixFQUFBQSxJQUFJLENBQUMsNENBQUQsRUFBK0MsWUFBWTtBQUMzRCxVQUFNUyxLQUFLLEdBQUcsSUFBSWEsOEJBQUosRUFBZDtBQUNBYixJQUFBQSxLQUFLLENBQUNjLENBQU4sR0FBVTtBQUFFQyxNQUFBQSxJQUFJLEVBQUU7QUFBUixLQUFWO0FBQ0EsVUFBTWpDLGFBQWEsQ0FBQ2tDLFdBQWQsQ0FBMEJoQixLQUExQixDQUFOO0FBRUFGLElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZSxxQkFBeEIsQ0FBOEMsQ0FBOUM7QUFDQUgsSUFBQUEsTUFBTSxDQUFDbEIsVUFBVSxDQUFDTSxJQUFaLENBQU4sQ0FBd0JnQixvQkFBeEIsQ0FDSUosTUFBTSxDQUFDSyxnQkFBUCxDQUF3QjtBQUNwQkMsTUFBQUEsSUFBSSxFQUFFO0FBRGMsS0FBeEIsQ0FESjtBQUtILEdBWEcsQ0FBSjtBQWFBYixFQUFBQSxJQUFJLENBQUMsaURBQUQsRUFBb0QsWUFBWTtBQUNoRSxVQUFNVCxhQUFhLENBQUNrQyxXQUFkLEVBQU47QUFFQWxCLElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZSxxQkFBeEIsQ0FBOEMsQ0FBOUM7QUFDQUgsSUFBQUEsTUFBTSxDQUFDbEIsVUFBVSxDQUFDTSxJQUFaLENBQU4sQ0FBd0JnQixvQkFBeEIsQ0FDSUosTUFBTSxDQUFDSyxnQkFBUCxDQUF3QjtBQUNwQkMsTUFBQUEsSUFBSSxFQUFFO0FBRGMsS0FBeEIsQ0FESjtBQUtILEdBVEcsQ0FBSjtBQVdBYixFQUFBQSxJQUFJLENBQUMsNkJBQUQsRUFBZ0MsWUFBWTtBQUM1QyxVQUFNaUIsTUFBTSxHQUFHLE1BQU0xQixhQUFhLENBQUNrQixLQUFkLEVBQXJCO0FBRUFGLElBQUFBLE1BQU0sQ0FBQ1UsTUFBTSxDQUFDbkIsS0FBUCxDQUFhNEIsTUFBZCxDQUFOLENBQTRCTCxJQUE1QixDQUFpQyxDQUFqQztBQUNILEdBSkcsQ0FBSjtBQU1BckIsRUFBQUEsSUFBSSxDQUFDLHVDQUFELEVBQTBDLFlBQVk7QUFDdEQsVUFBTWlCLE1BQU0sR0FBRyxNQUFNMUIsYUFBYSxDQUFDa0MsV0FBZCxFQUFyQjtBQUVBbEIsSUFBQUEsTUFBTSxDQUFDVSxNQUFELENBQU4sQ0FBZVUsYUFBZixDQUE2QjtBQUFFNUIsTUFBQUEsSUFBSSxFQUFFO0FBQUVDLFFBQUFBLElBQUksRUFBRTtBQUFSO0FBQVIsS0FBN0I7QUFDSCxHQUpHLENBQUo7QUFNQUEsRUFBQUEsSUFBSSxDQUFDLG1EQUFELEVBQXNELFlBQVk7QUFDbEUsVUFBTVQsYUFBYSxDQUFDcUMsTUFBZCxDQUFxQjtBQUFFNUIsTUFBQUEsSUFBSSxFQUFFO0FBQVIsS0FBckIsQ0FBTjtBQUVBTyxJQUFBQSxNQUFNLENBQUNsQixVQUFVLENBQUNNLElBQVosQ0FBTixDQUF3QmUscUJBQXhCLENBQThDLENBQTlDO0FBQ0FILElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZ0Isb0JBQXhCLENBQ0lKLE1BQU0sQ0FBQ0ssZ0JBQVAsQ0FBd0I7QUFDcEJDLE1BQUFBLElBQUksRUFBRSx5Q0FEYztBQUVwQmdCLE1BQUFBLE1BQU0sRUFBRSxNQUZZO0FBR3BCOUIsTUFBQUEsSUFBSSxFQUFFO0FBQUVDLFFBQUFBLElBQUksRUFBRTtBQUFSO0FBSGMsS0FBeEIsQ0FESjtBQU9ILEdBWEcsQ0FBSjtBQWFBQSxFQUFBQSxJQUFJLENBQUMsb0RBQUQsRUFBdUQsWUFBWTtBQUNuRSxVQUFNVCxhQUFhLENBQUNxQyxNQUFkLENBQXFCLEVBQXJCLEVBQXlCLElBQXpCLENBQU47QUFFQXJCLElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZSxxQkFBeEIsQ0FBOEMsQ0FBOUM7QUFDQUgsSUFBQUEsTUFBTSxDQUFDbEIsVUFBVSxDQUFDTSxJQUFaLENBQU4sQ0FBd0JnQixvQkFBeEIsQ0FDSUosTUFBTSxDQUFDSyxnQkFBUCxDQUF3QjtBQUNwQkMsTUFBQUEsSUFBSSxFQUFFO0FBRGMsS0FBeEIsQ0FESjtBQUtILEdBVEcsQ0FBSjtBQVdBYixFQUFBQSxJQUFJLENBQUMsa0RBQUQsRUFBcUQsWUFBWTtBQUNqRSxVQUFNVCxhQUFhLENBQUN1QyxNQUFkLENBQXFCLFNBQXJCLEVBQWdDO0FBQUU5QixNQUFBQSxJQUFJLEVBQUU7QUFBUixLQUFoQyxDQUFOO0FBRUFPLElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZSxxQkFBeEIsQ0FBOEMsQ0FBOUM7QUFDQUgsSUFBQUEsTUFBTSxDQUFDbEIsVUFBVSxDQUFDTSxJQUFaLENBQU4sQ0FBd0JnQixvQkFBeEIsQ0FDSUosTUFBTSxDQUFDSyxnQkFBUCxDQUF3QjtBQUNwQkMsTUFBQUEsSUFBSSxFQUFFLGtDQURjO0FBRXBCZ0IsTUFBQUEsTUFBTSxFQUFFLEtBRlk7QUFHcEI5QixNQUFBQSxJQUFJLEVBQUU7QUFBRUMsUUFBQUEsSUFBSSxFQUFFO0FBQVI7QUFIYyxLQUF4QixDQURKO0FBT0gsR0FYRyxDQUFKO0FBYUFBLEVBQUFBLElBQUksQ0FBQyxtREFBRCxFQUFzRCxZQUFZO0FBQ2xFLFVBQU1ULGFBQWEsQ0FBQ3dDLEtBQWQsQ0FBb0IsU0FBcEIsRUFBK0I7QUFBRS9CLE1BQUFBLElBQUksRUFBRTtBQUFSLEtBQS9CLENBQU47QUFFQU8sSUFBQUEsTUFBTSxDQUFDbEIsVUFBVSxDQUFDTSxJQUFaLENBQU4sQ0FBd0JlLHFCQUF4QixDQUE4QyxDQUE5QztBQUNBSCxJQUFBQSxNQUFNLENBQUNsQixVQUFVLENBQUNNLElBQVosQ0FBTixDQUF3QmdCLG9CQUF4QixDQUNJSixNQUFNLENBQUNLLGdCQUFQLENBQXdCO0FBQ3BCQyxNQUFBQSxJQUFJLEVBQUUsa0NBRGM7QUFFcEJnQixNQUFBQSxNQUFNLEVBQUUsT0FGWTtBQUdwQjlCLE1BQUFBLElBQUksRUFBRTtBQUFFQyxRQUFBQSxJQUFJLEVBQUU7QUFBUjtBQUhjLEtBQXhCLENBREo7QUFPSCxHQVhHLENBQUo7QUFhQUEsRUFBQUEsSUFBSSxDQUFDLG9DQUFELEVBQXVDLFlBQVk7QUFDbkQsVUFBTVQsYUFBYSxDQUFDeUMsTUFBZCxDQUFxQixTQUFyQixDQUFOO0FBRUF6QixJQUFBQSxNQUFNLENBQUNsQixVQUFVLENBQUNNLElBQVosQ0FBTixDQUF3QmUscUJBQXhCLENBQThDLENBQTlDO0FBQ0FILElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZ0Isb0JBQXhCLENBQ0lKLE1BQU0sQ0FBQ0ssZ0JBQVAsQ0FBd0I7QUFDcEJDLE1BQUFBLElBQUksRUFBRSxrQ0FEYztBQUVwQmdCLE1BQUFBLE1BQU0sRUFBRTtBQUZZLEtBQXhCLENBREo7QUFNSCxHQVZHLENBQUo7QUFZQTdCLEVBQUFBLElBQUksQ0FBQyx1Q0FBRCxFQUEwQyxZQUFZO0FBQ3RELFVBQU1ULGFBQWEsQ0FBQzBDLFlBQWQsQ0FBMkIsU0FBM0IsRUFBc0M7QUFBRUMsTUFBQUEsTUFBTSxFQUFFO0FBQVYsS0FBdEMsQ0FBTjtBQUVBM0IsSUFBQUEsTUFBTSxDQUFDbEIsVUFBVSxDQUFDTSxJQUFaLENBQU4sQ0FBd0JlLHFCQUF4QixDQUE4QyxDQUE5QztBQUNBSCxJQUFBQSxNQUFNLENBQUNsQixVQUFVLENBQUNNLElBQVosQ0FBTixDQUF3QmdCLG9CQUF4QixDQUNJSixNQUFNLENBQUNLLGdCQUFQLENBQXdCO0FBQ3BCQyxNQUFBQSxJQUFJLEVBQUUseUNBRGM7QUFFcEJnQixNQUFBQSxNQUFNLEVBQUU7QUFGWSxLQUF4QixDQURKO0FBTUgsR0FWRyxDQUFKO0FBWUE3QixFQUFBQSxJQUFJLENBQUMsNkNBQUQsRUFBZ0QsWUFBWTtBQUM1RCxVQUFNVCxhQUFhLENBQUMwQyxZQUFkLENBQTJCLFNBQTNCLEVBQXNDO0FBQUVDLE1BQUFBLE1BQU0sRUFBRSxTQUFWO0FBQXFCQyxNQUFBQSxPQUFPLEVBQUUsSUFBSWhCLElBQUosQ0FBUyxtQkFBVDtBQUE5QixLQUF0QyxDQUFOO0FBRUFaLElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZSxxQkFBeEIsQ0FBOEMsQ0FBOUM7QUFDQUgsSUFBQUEsTUFBTSxDQUFDbEIsVUFBVSxDQUFDTSxJQUFaLENBQU4sQ0FBd0JnQixvQkFBeEIsQ0FDSUosTUFBTSxDQUFDSyxnQkFBUCxDQUF3QjtBQUNwQkMsTUFBQUEsSUFBSSxFQUFFLHlDQURjO0FBRXBCZ0IsTUFBQUEsTUFBTSxFQUFFLEtBRlk7QUFHcEI5QixNQUFBQSxJQUFJLEVBQUU7QUFBRXFDLFFBQUFBLE9BQU8sRUFBRSwwQkFBWDtBQUF1Q0MsUUFBQUEsTUFBTSxFQUFFO0FBQS9DO0FBSGMsS0FBeEIsQ0FESjtBQU9ILEdBWEcsQ0FBSjtBQWFBckMsRUFBQUEsSUFBSSxDQUFDLGtDQUFELEVBQXFDLFlBQVk7QUFDakQsVUFBTVQsYUFBYSxDQUFDK0MsT0FBZCxDQUFzQixTQUF0QixDQUFOO0FBRUEvQixJQUFBQSxNQUFNLENBQUNsQixVQUFVLENBQUNNLElBQVosQ0FBTixDQUF3QmUscUJBQXhCLENBQThDLENBQTlDO0FBQ0FILElBQUFBLE1BQU0sQ0FBQ2xCLFVBQVUsQ0FBQ00sSUFBWixDQUFOLENBQXdCZ0Isb0JBQXhCLENBQ0lKLE1BQU0sQ0FBQ0ssZ0JBQVAsQ0FBd0I7QUFDcEJDLE1BQUFBLElBQUksRUFBRSwwQ0FEYztBQUVwQmdCLE1BQUFBLE1BQU0sRUFBRTtBQUZZLEtBQXhCLENBREo7QUFNSCxHQVZHLENBQUo7QUFXSCxDQW5PTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdqZXN0JztcbmltcG9ydCB7IENvbnRlbnRTY2hlbWEgfSBmcm9tICcuL2NvbnRlbnQnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJy4uL2h0dHAvaHR0cC1jbGllbnQnO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25NYW5hZ2VyIH0gZnJvbSAnLi4vYXV0aGVudGljYXRpb24vYXV0aGVudGljYXRpb24tbWFuYWdlcic7XG5pbXBvcnQgeyBTcXVpZGV4SnNvblF1ZXJ5IH0gZnJvbSAnLi9zcXVpZGV4LXF1ZXJ5Jztcbmplc3QubW9jaygnLi4vaHR0cC9odHRwLWNsaWVudCcpO1xuXG5jb25zdCBUT0tFTiA9ICdhYmMtMTIzJztcbmNvbnN0IENPTkZJRyA9IHtcbiAgICB1cmw6ICdodHRwczovL2ZvbycsXG4gICAgYXBwTmFtZTogJ215LWFwcCcsXG4gICAgY2xpZW50SWQ6ICdteS1hcHA6ZGVmYXVsdCcsXG4gICAgY2xpZW50U2VjcmV0OiAnU0VLUklUJyxcbn07XG5cbmRlc2NyaWJlKCdDb250ZW50IFNjaGVtYSBzaG91bGQuLi4nLCAoKSA9PiB7XG4gICAgbGV0IGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG4gICAgbGV0IGF1dGhlbnRpY2F0aW9uTWFuYWdlcjogQXV0aGVudGljYXRpb25NYW5hZ2VyO1xuICAgIGxldCBjb250ZW50U2NoZW1hOiBDb250ZW50U2NoZW1hO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIC8vIE1vY2sgdGhlIEFQSSByZXNwb25zZVxuICAgICAgICBIdHRwQ2xpZW50LnByb3RvdHlwZS5zZW5kID0gamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IHRlc3Q6ICdURVNUMScgfSxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZDogJzE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwWicsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogJzE5NzgtMDEtMjRUMDM6MTc6MDAuMDAwWicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgdGVzdDogJ1RFU1QyJyB9LFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkOiAnMTk3MC0wMS0wMVQwMDowMDowMC4wMDBaJyxcbiAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiAnMTk3OC0wMS0yNFQwMzoxNzowMC4wMDBaJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyB0ZXN0OiAnVEVTVDMnIH0sXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQ6ICcxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMFonLFxuICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQ6ICcxOTc4LTAxLTI0VDAzOjE3OjAwLjAwMFonLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBodHRwQ2xpZW50ID0gbmV3IChIdHRwQ2xpZW50IGFzIGFueSkoKTtcblxuICAgICAgICBBdXRoZW50aWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLmF1dGhlbnRpY2F0ZSA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShUT0tFTik7XG4gICAgICAgIGF1dGhlbnRpY2F0aW9uTWFuYWdlciA9IG5ldyAoQXV0aGVudGljYXRpb25NYW5hZ2VyIGFzIGFueSkoQ09ORklHLCBodHRwQ2xpZW50KTtcblxuICAgICAgICBjb250ZW50U2NoZW1hID0gbmV3IENvbnRlbnRTY2hlbWEoQ09ORklHLCBodHRwQ2xpZW50LCBhdXRoZW50aWNhdGlvbk1hbmFnZXIpO1xuICAgICAgICBjb250ZW50U2NoZW1hLnNjaGVtYSA9ICd0ZXN0JztcbiAgICB9KTtcblxuICAgIHRlc3QoJ2V4aXN0JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QoQXV0aGVudGljYXRpb25NYW5hZ2VyKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY2FsbCB0aGUgQVBJIHNlcnZlcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS5xdWVyeSgpO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8/JyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCB0aGUgdG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnRlbnRTY2hlbWEucXVlcnkoKTtcblxuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIHRva2VuOiAnYWJjLTEyMycsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGUgdGhlIHNlcmlhbGlzZWQgcXVlcnkgaW4gdGhlIFVSTCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS5xdWVyeSh7ICR0b3A6IDEwIH0pO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8/JTI0dG9wPTEwJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnaW5jbHVkZSBkcmFmdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnRlbnRTY2hlbWEucXVlcnkoe30sIHRydWUpO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgZHJhZnQ6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2Rlc2VyaWFsaXNlIGRhdGVzIGNvcnJlY3RseScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udGVudFNjaGVtYS5xdWVyeSgpO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuaXRlbXNbMF0uY3JlYXRlZCkudG9CZUluc3RhbmNlT2YoRGF0ZSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuaXRlbXNbMF0uY3JlYXRlZC5nZXRGdWxsWWVhcigpKS50b0JlKDE5NzApO1xuICAgICAgICBleHBlY3QocmVzdWx0Lml0ZW1zWzBdLmxhc3RNb2RpZmllZCkudG9CZUluc3RhbmNlT2YoRGF0ZSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuaXRlbXNbMF0ubGFzdE1vZGlmaWVkLmdldEZ1bGxZZWFyKCkpLnRvQmUoMTk3OCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdub3Qgb3ZlcndyaXRlIEpTT04gcXVlcnkgZm9yIHF1ZXJ5U2luZ2xlKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFNxdWlkZXhKc29uUXVlcnkoKTtcbiAgICAgICAgcXVlcnkucSA9IHsgc2tpcDogMiB9O1xuICAgICAgICBhd2FpdCBjb250ZW50U2NoZW1hLnF1ZXJ5U2luZ2xlKHF1ZXJ5KTtcblxuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIHBhdGg6ICcvYXBpL2NvbnRlbnQvbXktYXBwL3Rlc3QvP3E9JTdCJTIyc2tpcCUyMiUzQTIlN0QnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdvbmx5IHJlcXVlc3QgdGhlIGZpcnN0IHJlc3VsdCBmb3IgcXVlcnlTaW5nbGUoKScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS5xdWVyeVNpbmdsZSgpO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8/JTI0dG9wPTEnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdyZXR1cm4gYWxsIGRhdGEgZm9yIHF1ZXJ5KCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRlbnRTY2hlbWEucXVlcnkoKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0Lml0ZW1zLmxlbmd0aCkudG9CZSgzKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3JldHVybiBmaXJzdCByZXN1bHQgZm9yIHF1ZXJ5U2luZ2xlKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRlbnRTY2hlbWEucXVlcnlTaW5nbGUoKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b01hdGNoT2JqZWN0KHsgZGF0YTogeyB0ZXN0OiAnVEVTVDEnIH0gfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzZW5kIGEgUE9TVCByZXF1ZXN0IHdpdGggdGhlIGNvbnRlbnQgZm9yIGNyZWF0ZSgpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb250ZW50U2NoZW1hLmNyZWF0ZSh7IHRlc3Q6ICdURVNUJyB9KTtcblxuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIHBhdGg6ICcvYXBpL2NvbnRlbnQvbXktYXBwL3Rlc3QvP3B1Ymxpc2g9ZmFsc2UnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgdGVzdDogJ1RFU1QnIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGUgdGhlIHB1Ymxpc2ggcGFyYW1ldGVyIGZvciBjcmVhdGUoe30sIHRydWUpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb250ZW50U2NoZW1hLmNyZWF0ZSh7fSwgdHJ1ZSk7XG5cbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnL2FwaS9jb250ZW50L215LWFwcC90ZXN0Lz9wdWJsaXNoPXRydWUnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzZW5kIGEgUFVUIHJlcXVlc3Qgd2l0aCB0aGUgY29udGVudCBmb3IgdXBkYXRlKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnRlbnRTY2hlbWEudXBkYXRlKCcxMjMtNDU2JywgeyB0ZXN0OiAnVEVTVCcgfSk7XG5cbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnL2FwaS9jb250ZW50L215LWFwcC90ZXN0LzEyMy00NTYnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgZGF0YTogeyB0ZXN0OiAnVEVTVCcgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCBhIFBBVENIIHJlcXVlc3Qgd2l0aCB0aGUgY29udGVudCBmb3IgcGF0Y2goKScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS5wYXRjaCgnMTIzLTQ1NicsIHsgdGVzdDogJ1RFU1QnIH0pO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8xMjMtNDU2JyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQQVRDSCcsXG4gICAgICAgICAgICAgICAgZGF0YTogeyB0ZXN0OiAnVEVTVCcgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCBhIERFTEVURSByZXF1ZXN0IGZvciBkZWxldGUoKScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS5kZWxldGUoJzEyMy00NTYnKTtcblxuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIHBhdGg6ICcvYXBpL2NvbnRlbnQvbXktYXBwL3Rlc3QvMTIzLTQ1NicsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCBhIFBVVCByZXF1ZXN0IGZvciB1cGRhdGVTdGF0dXMoKScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS51cGRhdGVTdGF0dXMoJzEyMy00NTYnLCB7IHN0YXR1czogJ1Rlc3RpbmcnIH0pO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8xMjMtNDU2L3N0YXR1cycsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCBEdWVUaW1lIGZvciB1cGRhdGVTdGF0dXMoKSBpZiBwcm92aWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29udGVudFNjaGVtYS51cGRhdGVTdGF0dXMoJzEyMy00NTYnLCB7IHN0YXR1czogJ1Rlc3RpbmcnLCBkdWVUaW1lOiBuZXcgRGF0ZSgnMjQyNC0wMS0yNFQwMDowMFonKSB9KTtcblxuICAgICAgICBleHBlY3QoaHR0cENsaWVudC5zZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICAgIHBhdGg6ICcvYXBpL2NvbnRlbnQvbXktYXBwL3Rlc3QvMTIzLTQ1Ni9zdGF0dXMnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBEdWVUaW1lOiAnMjQyNC0wMS0yNFQwMDowMDowMC4wMDBaJywgU3RhdHVzOiAnVGVzdGluZycgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnc2VuZCBhIFBVVCByZXF1ZXN0IGZvciBkaXNjYXJkKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnRlbnRTY2hlbWEuZGlzY2FyZCgnMTIzLTQ1NicpO1xuXG4gICAgICAgIGV4cGVjdChodHRwQ2xpZW50LnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgICAgZXhwZWN0KGh0dHBDbGllbnQuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgICAgcGF0aDogJy9hcGkvY29udGVudC9teS1hcHAvdGVzdC8xMjMtNDU2L2Rpc2NhcmQnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9KTtcbn0pO1xuIl19