videogular2
Version:
Videogular is a video application framework for desktop and mobile powered by Angular 2.0
203 lines • 29.9 kB
JavaScript
;
var vg_scrub_bar_1 = require("./vg-scrub-bar");
var vg_api_1 = require("../../core/services/vg-api");
var vg_controls_hidden_1 = require('./../../core/services/vg-controls-hidden');
var vg_media_1 = require("../../core/vg-media/vg-media");
var vg_states_1 = require('../../core/states/vg-states');
describe('Scrub bar', function () {
var scrubBar;
var ref;
var cdRef;
var api;
var vgControlsHiddenState;
var media;
var elem = {
play: function () { },
pause: function () { },
load: function () { },
duration: 100,
currentTime: 0,
volume: 1,
playbackRate: 1,
buffered: {
length: 2,
end: function () { return 50; }
},
id: 'testVideo',
observe: function () {
return {};
},
dispatchEvent: function () { }
};
beforeEach(function () {
ref = {
nativeElement: {
getAttribute: function (name) {
return name;
},
scrollWidth: 200
}
};
cdRef = {
detectChanges: function () { },
markForCheck: function () { },
detach: function () { },
reattach: function () { },
checkNoChanges: function () { }
};
api = new vg_api_1.VgAPI();
media = new vg_media_1.VgMedia(api, cdRef);
media.vgMedia = elem;
vgControlsHiddenState = new vg_controls_hidden_1.VgControlsHidden();
scrubBar = new vg_scrub_bar_1.VgScrubBar(ref, api, vgControlsHiddenState);
});
it('Should get media by id on init', function () {
spyOn(api, 'getMediaById');
scrubBar.vgFor = 'test';
scrubBar.onPlayerReady();
expect(api.getMediaById).toHaveBeenCalledWith('test');
});
it('Should show scrub bar', function () {
vgControlsHiddenState.state(false);
expect(scrubBar.hideScrubBar).toBe(false);
});
it('Should hide scrub bar', function () {
vgControlsHiddenState.state(true);
expect(scrubBar.hideScrubBar).toBe(true);
});
describe('onMouseDownScrubBar', function () {
it('should call API seekTime 10 when offsetX is 20 and scrollWidth is 200', function () {
api = {
seekTime: function () { },
pause: function () { },
registerMedia: function () { },
state: vg_states_1.VgStates.VG_PLAYING,
isLive: false,
canPlay: true
};
spyOn(api, 'pause');
media.onCanPlay({});
api.registerMedia(media);
scrubBar.target = api;
scrubBar.target.canPlay = true;
scrubBar.vgSlider = true;
scrubBar.isSeeking = true;
scrubBar.onMouseDownScrubBar({ offsetX: 20 });
expect(api.pause).toHaveBeenCalled();
});
});
describe('onMouseMoveScrubBar', function () {
it('should modify time.current to 10 when offsetX is 20 and scrollWidth is 200 and vgSlider is true and isSeeking is true', function () {
spyOn(api, 'seekTime');
scrubBar.target = api;
scrubBar.vgSlider = false;
scrubBar.onMouseMoveScrubBar({ offsetX: 20 });
expect(api.seekTime).toHaveBeenCalledTimes(0);
scrubBar.vgSlider = true;
scrubBar.isSeeking = true;
scrubBar.onMouseMoveScrubBar({ offsetX: 20 });
expect(api.seekTime).toHaveBeenCalledWith(10, true);
});
});
describe('onMouseOutScrubBar', function () {
it('should modify time.current to 10 when offsetX is 20 and scrollWidth is 200 and vgSlider is true and isSeeking is true', function () {
spyOn(api, 'seekTime');
media.onCanPlay({});
api.registerMedia(media);
scrubBar.target = api;
scrubBar.vgSlider = false;
scrubBar.onMouseOutScrubBar({ offsetX: 20 });
expect(api.seekTime).toHaveBeenCalledTimes(0);
scrubBar.vgSlider = true;
scrubBar.isSeeking = true;
scrubBar.onMouseOutScrubBar({ offsetX: 20 });
expect(api.seekTime).toHaveBeenCalledWith(10, true);
});
});
describe('onMouseUpScrubBar', function () {
it('should modify time.current to 10 when offsetX is 20 and scrollWidth is 200 and vgSlider is true and isSeeking is true', function () {
spyOn(api, 'seekTime');
media.onCanPlay({});
api.registerMedia(media);
scrubBar.target = api;
scrubBar.vgSlider = false;
scrubBar.onMouseUpScrubBar({ offsetX: 20 });
expect(api.seekTime).toHaveBeenCalledTimes(0);
scrubBar.vgSlider = true;
scrubBar.isSeeking = true;
scrubBar.onMouseUpScrubBar({ offsetX: 20 });
expect(api.seekTime).toHaveBeenCalledWith(10, true);
});
});
describe('onTouchStartScrubBar', function () {
it('should call API seekTime 10 when offsetX is 20 and scrollWidth is 200', function () {
spyOn(api, 'seekTime');
spyOn(api, 'pause');
media.onCanPlay({});
api.registerMedia(media);
scrubBar.target = api;
scrubBar.vgSlider = false;
scrubBar.onTouchStartScrubBar({ touches: [{ pageX: 20 }] });
expect(api.seekTime).toHaveBeenCalledWith(10, true);
expect(api.pause).toHaveBeenCalledTimes(0);
scrubBar.vgSlider = true;
scrubBar.isSeeking = true;
scrubBar.onTouchStartScrubBar({ touches: [{ pageX: 20 }] });
expect(api.seekTime).toHaveBeenCalledTimes(1);
expect(api.pause).toHaveBeenCalledTimes(1);
});
});
describe('onTouchMoveScrubBar', function () {
it('should modify time.current to 10 when offsetX is 20 and scrollWidth is 200 and vgSlider is true and isSeeking is true', function () {
spyOn(api, 'seekTime');
scrubBar.target = api;
scrubBar.vgSlider = false;
scrubBar.onTouchMoveScrubBar({ touches: [{ pageX: 20 }] });
expect(api.seekTime).toHaveBeenCalledTimes(0);
scrubBar.vgSlider = true;
scrubBar.isSeeking = true;
scrubBar.onTouchMoveScrubBar({ touches: [{ pageX: 20 }] });
expect(api.seekTime).toHaveBeenCalledWith(10, true);
});
});
describe('onTouchCancelScrubBar', function () {
it('should not seek', function () {
spyOn(api, 'seekTime');
scrubBar.target = api;
scrubBar.vgSlider = false;
scrubBar.onTouchCancelScrubBar({ touches: [{ pageX: 20 }] });
expect(api.seekTime).toHaveBeenCalledTimes(0);
scrubBar.vgSlider = true;
scrubBar.isSeeking = true;
scrubBar.onTouchCancelScrubBar({ touches: [{ pageX: 20 }] });
expect(api.seekTime).toHaveBeenCalledTimes(0);
});
});
describe('onTouchEndScrubBar', function () {
it('should not seek', function () {
spyOn(api, 'seekTime');
scrubBar.target = api;
scrubBar.vgSlider = false;
scrubBar.onTouchEndScrubBar({ touches: [{ pageX: 20 }] });
expect(api.seekTime).toHaveBeenCalledTimes(0);
scrubBar.vgSlider = true;
scrubBar.isSeeking = true;
scrubBar.onTouchEndScrubBar({ touches: [{ pageX: 20 }] });
expect(api.seekTime).toHaveBeenCalledTimes(0);
});
});
describe('onTouchLeaveScrubBar', function () {
it('should not seek', function () {
spyOn(api, 'seekTime');
scrubBar.target = api;
scrubBar.vgSlider = false;
scrubBar.onTouchLeaveScrubBar({ touches: [{ pageX: 20 }] });
expect(api.seekTime).toHaveBeenCalledTimes(0);
scrubBar.vgSlider = true;
scrubBar.isSeeking = true;
scrubBar.onTouchLeaveScrubBar({ touches: [{ pageX: 20 }] });
expect(api.seekTime).toHaveBeenCalledTimes(0);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmctc2NydWItYmFyLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2Zy1zY3J1Yi1iYXIuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsNkJBQXlCLGdCQUFnQixDQUFDLENBQUE7QUFDMUMsdUJBQW9CLDRCQUE0QixDQUFDLENBQUE7QUFFakQsbUNBQStCLDBDQUEwQyxDQUFDLENBQUE7QUFDMUUseUJBQXNCLDhCQUE4QixDQUFDLENBQUE7QUFDckQsMEJBQXlCLDZCQUE2QixDQUFDLENBQUE7QUFFdkQsUUFBUSxDQUFDLFdBQVcsRUFBRTtJQUNsQixJQUFJLFFBQW1CLENBQUM7SUFDeEIsSUFBSSxHQUFjLENBQUM7SUFDbkIsSUFBSSxLQUF1QixDQUFDO0lBQzVCLElBQUksR0FBUyxDQUFDO0lBQ2QsSUFBSSxxQkFBdUMsQ0FBQztJQUM1QyxJQUFJLEtBQWEsQ0FBQztJQUNsQixJQUFJLElBQUksR0FBRztRQUNQLElBQUksRUFBRSxjQUFPLENBQUM7UUFDZCxLQUFLLEVBQUUsY0FBTyxDQUFDO1FBQ2YsSUFBSSxFQUFFLGNBQU8sQ0FBQztRQUNkLFFBQVEsRUFBRSxHQUFHO1FBQ2IsV0FBVyxFQUFFLENBQUM7UUFDZCxNQUFNLEVBQUUsQ0FBQztRQUNULFlBQVksRUFBRSxDQUFDO1FBQ2YsUUFBUSxFQUFFO1lBQ04sTUFBTSxFQUFFLENBQUM7WUFDVCxHQUFHLEVBQUUsY0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQztTQUMxQjtRQUNELEVBQUUsRUFBRSxXQUFXO1FBQ2YsT0FBTyxFQUFFO1lBQ0wsTUFBTSxDQUFNLEVBQUUsQ0FBQztRQUNuQixDQUFDO1FBQ0QsYUFBYSxFQUFFLGNBQU8sQ0FBQztLQUMxQixDQUFDO0lBRUYsVUFBVSxDQUFDO1FBQ1AsR0FBRyxHQUFHO1lBQ0YsYUFBYSxFQUFFO2dCQUNYLFlBQVksRUFBRSxVQUFDLElBQUk7b0JBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDaEIs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QUFHLEdBQUcsQ0FBQztZQUN0QixRQUFRLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUUxQixRQUFRLENBQUMsb0JBQW9CLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBRSxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztZQUUzRCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTlDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBRTFCLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1lBRTNELE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtWZ1NjcnViQmFyfSBmcm9tIFwiLi92Zy1zY3J1Yi1iYXJcIjtcbmltcG9ydCB7VmdBUEl9IGZyb20gXCIuLi8uLi9jb3JlL3NlcnZpY2VzL3ZnLWFwaVwiO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZiwgRWxlbWVudFJlZn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7VmdDb250cm9sc0hpZGRlbn0gZnJvbSAnLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3ZnLWNvbnRyb2xzLWhpZGRlbic7XG5pbXBvcnQge1ZnTWVkaWF9IGZyb20gXCIuLi8uLi9jb3JlL3ZnLW1lZGlhL3ZnLW1lZGlhXCI7XG5pbXBvcnQgeyBWZ1N0YXRlcyB9IGZyb20gJy4uLy4uL2NvcmUvc3RhdGVzL3ZnLXN0YXRlcyc7XG5cbmRlc2NyaWJlKCdTY3J1YiBiYXInLCAoKSA9PiB7XG4gICAgbGV0IHNjcnViQmFyOlZnU2NydWJCYXI7XG4gICAgbGV0IHJlZjpFbGVtZW50UmVmO1xuICAgIGxldCBjZFJlZjpDaGFuZ2VEZXRlY3RvclJlZjtcbiAgICBsZXQgYXBpOlZnQVBJO1xuICAgIGxldCB2Z0NvbnRyb2xzSGlkZGVuU3RhdGU6IFZnQ29udHJvbHNIaWRkZW47XG4gICAgbGV0IG1lZGlhOlZnTWVkaWE7XG4gICAgbGV0IGVsZW0gPSB7XG4gICAgICAgIHBsYXk6ICgpID0+IHt9LFxuICAgICAgICBwYXVzZTogKCkgPT4ge30sXG4gICAgICAgIGxvYWQ6ICgpID0+IHt9LFxuICAgICAgICBkdXJhdGlvbjogMTAwLFxuICAgICAgICBjdXJyZW50VGltZTogMCxcbiAgICAgICAgdm9sdW1lOiAxLFxuICAgICAgICBwbGF5YmFja1JhdGU6IDEsXG4gICAgICAgIGJ1ZmZlcmVkOiB7XG4gICAgICAgICAgICBsZW5ndGg6IDIsXG4gICAgICAgICAgICBlbmQ6ICgpID0+IHtyZXR1cm4gNTA7fVxuICAgICAgICB9LFxuICAgICAgICBpZDogJ3Rlc3RWaWRlbycsXG4gICAgICAgIG9ic2VydmU6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiA8YW55Pnt9O1xuICAgICAgICB9LFxuICAgICAgICBkaXNwYXRjaEV2ZW50OiAoKSA9PiB7fVxuICAgIH07XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgcmVmID0ge1xuICAgICAgICAgICAgbmF0aXZlRWxlbWVudDoge1xuICAgICAgICAgICAgICAgIGdldEF0dHJpYnV0ZTogKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JvbGxXaWR0aDogMjAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNkUmVmID0ge1xuICAgICAgICAgICAgZGV0ZWN0Q2hhbmdlczogKCkgPT4ge30sXG4gICAgICAgICAgICBtYXJrRm9yQ2hlY2s6ICgpID0+IHt9LFxuICAgICAgICAgICAgZGV0YWNoOiAoKSA9PiB7fSxcbiAgICAgICAgICAgIHJlYXR0YWNoOiAoKSA9PiB7fSxcbiAgICAgICAgICAgIGNoZWNrTm9DaGFuZ2VzOiAoKSA9PiB7fVxuICAgICAgICB9XG5cbiAgICAgICAgYXBpID0gbmV3IFZnQVBJKCk7XG4gICAgICAgIG1lZGlhID0gbmV3IFZnTWVkaWEoYXBpLCBjZFJlZik7XG4gICAgICAgIG1lZGlhLnZnTWVkaWEgPSBlbGVtO1xuICAgICAgICB2Z0NvbnRyb2xzSGlkZGVuU3RhdGUgPSBuZXcgVmdDb250cm9sc0hpZGRlbigpO1xuXG4gICAgICAgIHNjcnViQmFyID0gbmV3IFZnU2NydWJCYXIocmVmLCBhcGksIHZnQ29udHJvbHNIaWRkZW5TdGF0ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBtZWRpYSBieSBpZCBvbiBpbml0JywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICdnZXRNZWRpYUJ5SWQnKTtcblxuICAgICAgICBzY3J1YkJhci52Z0ZvciA9ICd0ZXN0JztcbiAgICAgICAgc2NydWJCYXIub25QbGF5ZXJSZWFkeSgpO1xuXG4gICAgICAgIGV4cGVjdChhcGkuZ2V0TWVkaWFCeUlkKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndGVzdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBzaG93IHNjcnViIGJhcicsICgpID0+IHtcbiAgICAgICAgdmdDb250cm9sc0hpZGRlblN0YXRlLnN0YXRlKGZhbHNlKTtcbiAgICAgICAgZXhwZWN0KHNjcnViQmFyLmhpZGVTY3J1YkJhcikudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGhpZGUgc2NydWIgYmFyJywgKCkgPT4ge1xuICAgICAgICB2Z0NvbnRyb2xzSGlkZGVuU3RhdGUuc3RhdGUodHJ1ZSk7XG4gICAgICAgIGV4cGVjdChzY3J1YkJhci5oaWRlU2NydWJCYXIpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25Nb3VzZURvd25TY3J1YkJhcicsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjYWxsIEFQSSBzZWVrVGltZSAxMCB3aGVuIG9mZnNldFggaXMgMjAgYW5kIHNjcm9sbFdpZHRoIGlzIDIwMCcsICgpID0+IHtcbiAgICAgICAgICAgIGFwaSA9IDxhbnk+e1xuICAgICAgICAgICAgICAgIHNlZWtUaW1lOiAoKSA9PiB7fSxcbiAgICAgICAgICAgICAgICBwYXVzZTogKCkgPT4ge30sXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJNZWRpYTogKCkgPT4ge30sXG4gICAgICAgICAgICAgICAgc3RhdGU6IFZnU3RhdGVzLlZHX1BMQVlJTkcsXG4gICAgICAgICAgICAgICAgaXNMaXZlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjYW5QbGF5OiB0cnVlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzcHlPbihhcGksICdwYXVzZScpO1xuXG4gICAgICAgICAgICBtZWRpYS5vbkNhblBsYXkoe30pO1xuICAgICAgICAgICAgYXBpLnJlZ2lzdGVyTWVkaWEobWVkaWEpO1xuXG4gICAgICAgICAgICBzY3J1YkJhci50YXJnZXQgPSBhcGk7XG4gICAgICAgICAgICBzY3J1YkJhci50YXJnZXQuY2FuUGxheSA9IHRydWU7XG4gICAgICAgICAgICBzY3J1YkJhci52Z1NsaWRlciA9IHRydWU7XG4gICAgICAgICAgICBzY3J1YkJhci5pc1NlZWtpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBzY3J1YkJhci5vbk1vdXNlRG93blNjcnViQmFyKHsgb2Zmc2V0WDogMjAgfSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChhcGkucGF1c2UpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25Nb3VzZU1vdmVTY3J1YkJhcicsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBtb2RpZnkgdGltZS5jdXJyZW50IHRvIDEwIHdoZW4gb2Zmc2V0WCBpcyAyMCBhbmQgc2Nyb2xsV2lkdGggaXMgMjAwIGFuZCB2Z1NsaWRlciBpcyB0cnVlIGFuZCBpc1NlZWtpbmcgaXMgdHJ1ZScsICgpID0+IHtcbiAgICAgICAgICAgIHNweU9uKGFwaSwgJ3NlZWtUaW1lJyk7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLnRhcmdldCA9IGFwaTtcbiAgICAgICAgICAgIHNjcnViQmFyLnZnU2xpZGVyID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLm9uTW91c2VNb3ZlU2NydWJCYXIoeyBvZmZzZXRYOiAyMCB9KTtcblxuICAgICAgICAgICAgZXhwZWN0KGFwaS5zZWVrVGltZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDApO1xuXG4gICAgICAgICAgICBzY3J1YkJhci52Z1NsaWRlciA9IHRydWU7XG4gICAgICAgICAgICBzY3J1YkJhci5pc1NlZWtpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBzY3J1YkJhci5vbk1vdXNlTW92ZVNjcnViQmFyKHsgb2Zmc2V0WDogMjAgfSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChhcGkuc2Vla1RpbWUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25Nb3VzZU91dFNjcnViQmFyJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIG1vZGlmeSB0aW1lLmN1cnJlbnQgdG8gMTAgd2hlbiBvZmZzZXRYIGlzIDIwIGFuZCBzY3JvbGxXaWR0aCBpcyAyMDAgYW5kIHZnU2xpZGVyIGlzIHRydWUgYW5kIGlzU2Vla2luZyBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgICAgICAgc3B5T24oYXBpLCAnc2Vla1RpbWUnKTtcblxuICAgICAgICAgICAgbWVkaWEub25DYW5QbGF5KHt9KTtcbiAgICAgICAgICAgIGFwaS5yZWdpc3Rlck1lZGlhKG1lZGlhKTtcblxuICAgICAgICAgICAgc2NydWJCYXIudGFyZ2V0ID0gYXBpO1xuICAgICAgICAgICAgc2NydWJCYXIudmdTbGlkZXIgPSBmYWxzZTtcblxuICAgICAgICAgICAgc2NydWJCYXIub25Nb3VzZU91dFNjcnViQmFyKHsgb2Zmc2V0WDogMjAgfSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChhcGkuc2Vla1RpbWUpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygwKTtcblxuICAgICAgICAgICAgc2NydWJCYXIudmdTbGlkZXIgPSB0cnVlO1xuICAgICAgICAgICAgc2NydWJCYXIuaXNTZWVraW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgc2NydWJCYXIub25Nb3VzZU91dFNjcnViQmFyKHsgb2Zmc2V0WDogMjAgfSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChhcGkuc2Vla1RpbWUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25Nb3VzZVVwU2NydWJCYXInLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgbW9kaWZ5IHRpbWUuY3VycmVudCB0byAxMCB3aGVuIG9mZnNldFggaXMgMjAgYW5kIHNjcm9sbFdpZHRoIGlzIDIwMCBhbmQgdmdTbGlkZXIgaXMgdHJ1ZSBhbmQgaXNTZWVraW5nIGlzIHRydWUnLCAoKSA9PiB7XG4gICAgICAgICAgICBzcHlPbihhcGksICdzZWVrVGltZScpO1xuXG4gICAgICAgICAgICBtZWRpYS5vbkNhblBsYXkoe30pO1xuICAgICAgICAgICAgYXBpLnJlZ2lzdGVyTWVkaWEobWVkaWEpO1xuXG4gICAgICAgICAgICBzY3J1YkJhci50YXJnZXQgPSBhcGk7XG4gICAgICAgICAgICBzY3J1YkJhci52Z1NsaWRlciA9IGZhbHNlO1xuXG4gICAgICAgICAgICBzY3J1YkJhci5vbk1vdXNlVXBTY3J1YkJhcih7IG9mZnNldFg6IDIwIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QoYXBpLnNlZWtUaW1lKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMCk7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLnZnU2xpZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHNjcnViQmFyLmlzU2Vla2luZyA9IHRydWU7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLm9uTW91c2VVcFNjcnViQmFyKHsgb2Zmc2V0WDogMjAgfSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChhcGkuc2Vla1RpbWUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25Ub3VjaFN0YXJ0U2NydWJCYXInLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgY2FsbCBBUEkgc2Vla1RpbWUgMTAgd2hlbiBvZmZzZXRYIGlzIDIwIGFuZCBzY3JvbGxXaWR0aCBpcyAyMDAnLCAoKSA9PiB7XG4gICAgICAgICAgICBzcHlPbihhcGksICdzZWVrVGltZScpO1xuICAgICAgICAgICAgc3B5T24oYXBpLCAncGF1c2UnKTtcblxuICAgICAgICAgICAgbWVkaWEub25DYW5QbGF5KHt9KTtcbiAgICAgICAgICAgIGFwaS5yZWdpc3Rlck1lZGlhKG1lZGlhKTtcblxuICAgICAgICAgICAgc2NydWJCYXIudGFyZ2V0ID0gYXBpO1xuICAgICAgICAgICAgc2NydWJCYXIudmdTbGlkZXIgPSBmYWxzZTtcblxuICAgICAgICAgICAgc2NydWJCYXIub25Ub3VjaFN0YXJ0U2NydWJCYXIoeyB0b3VjaGVzOiBbIHtwYWdlWDogMjAgfV19KTtcblxuICAgICAgICAgICAgZXhwZWN0KGFwaS5zZWVrVGltZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMTAsIHRydWUpO1xuICAgICAgICAgICAgZXhwZWN0KGFwaS5wYXVzZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDApO1xuXG4gICAgICAgICAgICBzY3J1YkJhci52Z1NsaWRlciA9IHRydWU7XG4gICAgICAgICAgICBzY3J1YkJhci5pc1NlZWtpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBzY3J1YkJhci5vblRvdWNoU3RhcnRTY3J1YkJhcih7IHRvdWNoZXM6IFsge3BhZ2VYOiAyMCB9XX0pO1xuXG4gICAgICAgICAgICBleHBlY3QoYXBpLnNlZWtUaW1lKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgICAgICBleHBlY3QoYXBpLnBhdXNlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uVG91Y2hNb3ZlU2NydWJCYXInLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgbW9kaWZ5IHRpbWUuY3VycmVudCB0byAxMCB3aGVuIG9mZnNldFggaXMgMjAgYW5kIHNjcm9sbFdpZHRoIGlzIDIwMCBhbmQgdmdTbGlkZXIgaXMgdHJ1ZSBhbmQgaXNTZWVraW5nIGlzIHRydWUnLCAoKSA9PiB7XG4gICAgICAgICAgICBzcHlPbihhcGksICdzZWVrVGltZScpO1xuXG4gICAgICAgICAgICBzY3J1YkJhci50YXJnZXQgPSBhcGk7XG4gICAgICAgICAgICBzY3J1YkJhci52Z1NsaWRlciA9IGZhbHNlO1xuXG4gICAgICAgICAgICBzY3J1YkJhci5vblRvdWNoTW92ZVNjcnViQmFyKHsgdG91Y2hlczogWyB7cGFnZVg6IDIwIH1dfSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChhcGkuc2Vla1RpbWUpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygwKTtcblxuICAgICAgICAgICAgc2NydWJCYXIudmdTbGlkZXIgPSB0cnVlO1xuICAgICAgICAgICAgc2NydWJCYXIuaXNTZWVraW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgc2NydWJCYXIub25Ub3VjaE1vdmVTY3J1YkJhcih7IHRvdWNoZXM6IFsge3BhZ2VYOiAyMCB9XX0pO1xuXG4gICAgICAgICAgICBleHBlY3QoYXBpLnNlZWtUaW1lKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgxMCwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uVG91Y2hDYW5jZWxTY3J1YkJhcicsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBub3Qgc2VlaycsICgpID0+IHtcbiAgICAgICAgICAgIHNweU9uKGFwaSwgJ3NlZWtUaW1lJyk7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLnRhcmdldCA9IGFwaTtcbiAgICAgICAgICAgIHNjcnViQmFyLnZnU2xpZGVyID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLm9uVG91Y2hDYW5jZWxTY3J1YkJhcih7IHRvdWNoZXM6IFsge3BhZ2VYOiAyMCB9XX0pO1xuXG4gICAgICAgICAgICBleHBlY3QoYXBpLnNlZWtUaW1lKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMCk7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLnZnU2xpZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHNjcnViQmFyLmlzU2Vla2luZyA9IHRydWU7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLm9uVG91Y2hDYW5jZWxTY3J1YkJhcih7IHRvdWNoZXM6IFsge3BhZ2VYOiAyMCB9XX0pO1xuXG4gICAgICAgICAgICBleHBlY3QoYXBpLnNlZWtUaW1lKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uVG91Y2hFbmRTY3J1YkJhcicsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBub3Qgc2VlaycsICgpID0+IHtcbiAgICAgICAgICAgIHNweU9uKGFwaSwgJ3NlZWtUaW1lJyk7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLnRhcmdldCA9IGFwaTtcbiAgICAgICAgICAgIHNjcnViQmFyLnZnU2xpZGVyID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLm9uVG91Y2hFbmRTY3J1YkJhcih7IHRvdWNoZXM6IFsge3BhZ2VYOiAyMCB9XX0pO1xuXG4gICAgICAgICAgICBleHBlY3QoYXBpLnNlZWtUaW1lKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMCk7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLnZnU2xpZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHNjcnViQmFyLmlzU2Vla2luZyA9IHRydWU7XG5cbiAgICAgICAgICAgIHNjcnViQmFyLm9uVG91Y2hFbmRTY3J1YkJhcih7IHRvdWNoZXM6IFsge3BhZ2VYOiAyMCB9XX0pO1xuXG4gICAgICAgICAgICBleHBlY3QoYXBpLnNlZWtUaW1lKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uVG91Y2hMZWF2ZVNjcnViQmFyJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIG5vdCBzZWVrJywgKCkgPT4ge1xuICAgICAgICAgICAgc3B5T24oYXBpLCAnc2Vla1RpbWUnKTtcblxuICAgICAgICAgICAgc2NydWJCYXIudGFyZ2V0ID0gYXBpO1xuICAgICAgICAgICAgc2NydWJCYXIudmdTbGlkZXIgPSBmYWxzZTtcblxuICAgICAgICAgICAgc2NydWJCYXIub25Ub3VjaExlYXZlU2NydWJCYXIoeyB0b3VjaGVzOiBbIHtwYWdlWDogMjAgfV19KTtcblxuICAgICAgICAgICAgZXhwZWN0KGFwaS5zZWVrVGltZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDApO1xuXG4gICAgICAgICAgICBzY3J1YkJhci52Z1NsaWRlciA9IHRydWU7XG4gICAgICAgICAgICBzY3J1YkJhci5pc1NlZWtpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBzY3J1YkJhci5vblRvdWNoTGVhdmVTY3J1YkJhcih7IHRvdWNoZXM6IFsge3BhZ2VYOiAyMCB9XX0pO1xuXG4gICAgICAgICAgICBleHBlY3QoYXBpLnNlZWtUaW1lKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG5cbmludGVyZmFjZSBEZWNvcmF0b3JJbnZvY2F0aW9uIHtcbiAgdHlwZTogRnVuY3Rpb247XG4gIGFyZ3M/OiBhbnlbXTtcbn1cbiJdfQ==