angular-duo-pane
Version:
A library for Angular projects to easily add a two pane view for desktops, foldables and dual screen devices.
193 lines • 22.3 kB
JavaScript
import { __awaiter, __decorate, __generator, __values } from "tslib";
import { Injectable } from '@angular/core';
import { Segment } from '../models/Segment';
import * as i0 from "@angular/core";
var DuoPaneInformationService = /** @class */ (function () {
function DuoPaneInformationService() {
var _this = this;
this.Spanning = 'none';
this.FoldSize = 0;
this.BrowserShellSize = 0;
this.Segments = null;
this.needsDispatch = false;
this.Spanning = sessionStorage.getItem(DuoPaneInformationService_1.ns + "-spanning") || 'none';
this.FoldSize = +sessionStorage.getItem(DuoPaneInformationService_1.ns + "-fold-size") || 0;
this.BrowserShellSize = +sessionStorage.getItem(DuoPaneInformationService_1.ns + "-browser-shell-size") || 0;
this.eventTarget = document.createDocumentFragment();
// Web-based emulator runs this polyfill in an iframe, we need to
// communicate emulator state changes to the site.
// Should only be registered once (in CSS or JS polyfill, not both).
window.addEventListener('message', function (ev) {
if (ev.data.action === 'update') {
Object.assign(_this, ev.data.value);
}
});
window.addEventListener('resize', function () { return _this.debounce(_this.invalidate(), 200); });
}
DuoPaneInformationService_1 = DuoPaneInformationService;
DuoPaneInformationService.prototype.addEventListener = function (type, listener, options) {
this.eventTarget.addEventListener(type, listener, options);
};
DuoPaneInformationService.prototype.removeEventListener = function (type, callback, options) {
this.eventTarget.removeEventListener(type, callback, options);
};
DuoPaneInformationService.prototype.dispatchEvent = function (event) {
if (event.type !== 'change') {
return;
}
var methodName = "on" + event.type;
if (typeof this[methodName] === 'function') {
this[methodName](event);
}
return this.eventTarget.dispatchEvent(event);
};
Object.defineProperty(DuoPaneInformationService.prototype, "foldSize", {
get: function () {
return this.FoldSize;
},
set: function (foldSize) {
sessionStorage.setItem(DuoPaneInformationService_1.ns + "-fold-size", foldSize.toString());
this.FoldSize = foldSize;
this.invalidate();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DuoPaneInformationService.prototype, "browserShellSize", {
get: function () {
return this.BrowserShellSize;
},
set: function (browserShellSize) {
sessionStorage.setItem(DuoPaneInformationService_1.ns + "-browser-shell-size", browserShellSize.toString());
this.BrowserShellSize = browserShellSize;
this.invalidate();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DuoPaneInformationService.prototype, "spanning", {
get: function () {
return this.Spanning;
},
set: function (spanning) {
sessionStorage.setItem(DuoPaneInformationService_1.ns + "-spanning", spanning);
this.Spanning = spanning;
this.invalidate();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DuoPaneInformationService.prototype, "segments", {
set: function (segments) {
this.Segments = segments;
},
enumerable: true,
configurable: true
});
DuoPaneInformationService.prototype.getTwoLargestSegments = function () {
var e_1, _a;
var segments = this.windowSegments;
if (segments.length > 2) {
var twoLargestSegments = [null, null];
var largestSize = 0;
try {
for (var segments_1 = __values(segments), segments_1_1 = segments_1.next(); !segments_1_1.done; segments_1_1 = segments_1.next()) {
var segment = segments_1_1.value;
var segmentSize = segment.height * segment.width;
if (segmentSize >= largestSize) {
largestSize = segmentSize;
twoLargestSegments[0] = twoLargestSegments[1];
twoLargestSegments[1] = segment;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (segments_1_1 && !segments_1_1.done && (_a = segments_1.return)) _a.call(segments_1);
}
finally { if (e_1) throw e_1.error; }
}
return twoLargestSegments;
}
else {
return segments;
}
};
Object.defineProperty(DuoPaneInformationService.prototype, "windowSegments", {
get: function () {
// TODO: replace with window.getWindowSegments() once it is a web standard
if (this.Segments !== null && this.Segments.length > 0) {
return this.Segments;
}
if (this.spanning === 'none') {
return [
new Segment(window.innerWidth, window.innerHeight, 0, 0)
];
}
if (this.spanning === 'single-fold-horizontal') {
var screenCenter = (window.innerHeight - this.browserShellSize) / 2;
var width = window.innerWidth;
return [
new Segment(width, screenCenter - this.foldSize / 2, 0, 0),
new Segment(width, this.foldSize, screenCenter - this.foldSize / 2, 0),
new Segment(width, window.innerHeight, screenCenter + this.foldSize / 2, 0)
];
}
if (this.spanning === 'single-fold-vertical') {
var width = window.innerWidth / 2 - this.foldSize / 2;
var height = window.innerHeight;
return [
new Segment(width, height, 0, 0),
new Segment(this.foldSize, height, 0, width),
new Segment(width, height, 0, window.innerWidth / 2 + this.foldSize / 2)
];
}
},
enumerable: true,
configurable: true
});
/**
* Returns a function that won't call `fn` if it was invoked at a
* faster interval than `wait`.
*/
DuoPaneInformationService.prototype.debounce = function (fn, wait) {
var timeout;
return function () {
clearTimeout(timeout);
timeout = setTimeout(function () {
fn.apply(this, arguments);
}, wait);
};
};
DuoPaneInformationService.prototype.invalidate = function () {
return __awaiter(this, void 0, void 0, function () {
var _a;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
if (!!this.needsDispatch) return [3 /*break*/, 2];
this.needsDispatch = true;
_a = this;
return [4 /*yield*/, Promise.resolve(false)];
case 1:
_a.needsDispatch = _b.sent();
this.dispatchEvent(new Event('change'));
_b.label = 2;
case 2: return [2 /*return*/];
}
});
});
};
var DuoPaneInformationService_1;
DuoPaneInformationService.ns = '__foldables__';
DuoPaneInformationService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DuoPaneInformationService_Factory() { return new DuoPaneInformationService(); }, token: DuoPaneInformationService, providedIn: "root" });
DuoPaneInformationService = DuoPaneInformationService_1 = __decorate([
Injectable({
providedIn: 'root'
})
], DuoPaneInformationService);
return DuoPaneInformationService;
}());
export { DuoPaneInformationService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVvLXBhbmUtaW5mb3JtYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItZHVvLXBhbmUvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvZHVvLXBhbmUtaW5mb3JtYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7O0FBSzVDO0lBV0U7UUFBQSxpQkFrQkM7UUExQk8sYUFBUSxHQUFpQixNQUFNLENBQUM7UUFDaEMsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLHFCQUFnQixHQUFHLENBQUMsQ0FBQztRQUNyQixhQUFRLEdBQWUsSUFBSSxDQUFDO1FBQzVCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBTTVCLElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBSSwyQkFBeUIsQ0FBQyxFQUFFLGNBQVcsQ0FBaUIsSUFBSSxNQUFNLENBQUM7UUFDN0csSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUksMkJBQXlCLENBQUMsRUFBRSxlQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBSSwyQkFBeUIsQ0FBQyxFQUFFLHdCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNHLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFckQsaUVBQWlFO1FBQ2pFLGtEQUFrRDtRQUNsRCxvRUFBb0U7UUFDcEUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxVQUFBLEVBQUU7WUFDbkMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7Z0JBQy9CLE1BQU0sQ0FB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QkFDbkIsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNZLDhDQUFVLEdBQXZCOzs7Ozs7NkJBQ00sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFuQix3QkFBbUI7d0JBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO3dCQUMxQixLQUFBLElBQUksQ0FBQTt3QkFBaUIscUJBQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBQTs7d0JBQWpELEdBQUssYUFBYSxHQUFHLFNBQTRCLENBQUM7d0JBQ2xELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzs7Ozs7O0tBRTNDOztJQTVKc0IsNEJBQUUsR0FBRyxlQUFlLENBQUM7O0lBRmpDLHlCQUF5QjtRQUhyQyxVQUFVLENBQUM7WUFDVixVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDO09BQ1cseUJBQXlCLENBZ0tyQztvQ0F4S0Q7Q0F3S0MsQUFoS0QsSUFnS0M7U0FoS1kseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Bhbm5pbmdNb2RlIH0gZnJvbSAnLi4vbW9kZWxzL1NwYW5uaW5nTW9kZSc7XG5pbXBvcnQgeyBJU2VnbWVudCB9IGZyb20gJy4uL21vZGVscy9JU2VnbWVudCc7XG5pbXBvcnQgeyBTZWdtZW50IH0gZnJvbSAnLi4vbW9kZWxzL1NlZ21lbnQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEdW9QYW5lSW5mb3JtYXRpb25TZXJ2aWNlIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG5zID0gJ19fZm9sZGFibGVzX18nO1xuICBwcml2YXRlIFNwYW5uaW5nOiBTcGFubmluZ01vZGUgPSAnbm9uZSc7XG4gIHByaXZhdGUgRm9sZFNpemUgPSAwO1xuICBwcml2YXRlIEJyb3dzZXJTaGVsbFNpemUgPSAwO1xuICBwcml2YXRlIFNlZ21lbnRzOiBJU2VnbWVudFtdID0gbnVsbDtcbiAgcHJpdmF0ZSBuZWVkc0Rpc3BhdGNoID0gZmFsc2U7XG4gIHByaXZhdGUgZXZlbnRUYXJnZXQ6IERvY3VtZW50RnJhZ21lbnQ7XG5cblxuICBjb25zdHJ1Y3RvcigpIHtcblxuICAgIHRoaXMuU3Bhbm5pbmcgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGAke0R1b1BhbmVJbmZvcm1hdGlvblNlcnZpY2UubnN9LXNwYW5uaW5nYCkgYXMgU3Bhbm5pbmdNb2RlIHx8ICdub25lJztcbiAgICB0aGlzLkZvbGRTaXplID0gK3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oYCR7RHVvUGFuZUluZm9ybWF0aW9uU2VydmljZS5uc30tZm9sZC1zaXplYCkgfHwgMDtcbiAgICB0aGlzLkJyb3dzZXJTaGVsbFNpemUgPSArc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShgJHtEdW9QYW5lSW5mb3JtYXRpb25TZXJ2aWNlLm5zfS1icm93c2VyLXNoZWxsLXNpemVgKSB8fCAwO1xuXG4gICAgdGhpcy5ldmVudFRhcmdldCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgIC8vIFdlYi1iYXNlZCBlbXVsYXRvciBydW5zIHRoaXMgcG9seWZpbGwgaW4gYW4gaWZyYW1lLCB3ZSBuZWVkIHRvXG4gICAgLy8gY29tbXVuaWNhdGUgZW11bGF0b3Igc3RhdGUgY2hhbmdlcyB0byB0aGUgc2l0ZS5cbiAgICAvLyBTaG91bGQgb25seSBiZSByZWdpc3RlcmVkIG9uY2UgKGluIENTUyBvciBKUyBwb2x5ZmlsbCwgbm90IGJvdGgpLlxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZXYgPT4ge1xuICAgICAgaWYgKGV2LmRhdGEuYWN0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGV2LmRhdGEudmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLmRlYm91bmNlKHRoaXMuaW52YWxpZGF0ZSgpLCAyMDApKTtcblxuICB9XG5cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LCBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgY2FsbGJhY2s6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMpO1xuICB9XG5cblxuXG4gIHB1YmxpYyBkaXNwYXRjaEV2ZW50KGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC50eXBlICE9PSAnY2hhbmdlJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtZXRob2ROYW1lID0gYG9uJHtldmVudC50eXBlfWA7XG4gICAgaWYgKHR5cGVvZiB0aGlzW21ldGhvZE5hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW21ldGhvZE5hbWVdKGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvbGRTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuRm9sZFNpemU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGZvbGRTaXplKGZvbGRTaXplOiBudW1iZXIpIHtcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGAke0R1b1BhbmVJbmZvcm1hdGlvblNlcnZpY2UubnN9LWZvbGQtc2l6ZWAsIGZvbGRTaXplLnRvU3RyaW5nKCkpO1xuICAgIHRoaXMuRm9sZFNpemUgPSBmb2xkU2l6ZTtcbiAgICB0aGlzLmludmFsaWRhdGUoKTtcblxuICB9XG5cbiAgcHVibGljIGdldCBicm93c2VyU2hlbGxTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuQnJvd3NlclNoZWxsU2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYnJvd3NlclNoZWxsU2l6ZShicm93c2VyU2hlbGxTaXplOiBudW1iZXIpIHtcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGAke0R1b1BhbmVJbmZvcm1hdGlvblNlcnZpY2UubnN9LWJyb3dzZXItc2hlbGwtc2l6ZWAsIGJyb3dzZXJTaGVsbFNpemUudG9TdHJpbmcoKSk7XG4gICAgdGhpcy5Ccm93c2VyU2hlbGxTaXplID0gYnJvd3NlclNoZWxsU2l6ZTtcbiAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3Bhbm5pbmcoKTogU3Bhbm5pbmdNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5TcGFubmluZztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc3Bhbm5pbmcoc3Bhbm5pbmc6IFNwYW5uaW5nTW9kZSkge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oYCR7RHVvUGFuZUluZm9ybWF0aW9uU2VydmljZS5uc30tc3Bhbm5pbmdgLCBzcGFubmluZyk7XG4gICAgdGhpcy5TcGFubmluZyA9IHNwYW5uaW5nO1xuICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICB9XG5cblxuICBwdWJsaWMgc2V0IHNlZ21lbnRzKHNlZ21lbnRzOiBJU2VnbWVudFtdKSB7XG4gICAgdGhpcy5TZWdtZW50cyA9IHNlZ21lbnRzO1xuICB9XG5cbiAgcHVibGljIGdldFR3b0xhcmdlc3RTZWdtZW50cygpOiBJU2VnbWVudFtdIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHRoaXMud2luZG93U2VnbWVudHM7XG4gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGNvbnN0IHR3b0xhcmdlc3RTZWdtZW50cyA9IFtudWxsLCBudWxsXTtcbiAgICAgIGxldCBsYXJnZXN0U2l6ZSA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICAgICAgY29uc3Qgc2VnbWVudFNpemUgPSBzZWdtZW50LmhlaWdodCAqIHNlZ21lbnQud2lkdGg7XG4gICAgICAgIGlmIChzZWdtZW50U2l6ZSA+PSBsYXJnZXN0U2l6ZSkge1xuICAgICAgICAgIGxhcmdlc3RTaXplID0gc2VnbWVudFNpemU7XG4gICAgICAgICAgdHdvTGFyZ2VzdFNlZ21lbnRzWzBdID0gdHdvTGFyZ2VzdFNlZ21lbnRzWzFdO1xuICAgICAgICAgIHR3b0xhcmdlc3RTZWdtZW50c1sxXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0d29MYXJnZXN0U2VnbWVudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWdtZW50cztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdpbmRvd1NlZ21lbnRzKCk6IElTZWdtZW50W10ge1xuICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCB3aW5kb3cuZ2V0V2luZG93U2VnbWVudHMoKSBvbmNlIGl0IGlzIGEgd2ViIHN0YW5kYXJkXG4gICAgaWYgKHRoaXMuU2VnbWVudHMgIT09IG51bGwgJiYgdGhpcy5TZWdtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5TZWdtZW50cztcbiAgICB9XG4gICAgaWYgKHRoaXMuc3Bhbm5pbmcgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbmV3IFNlZ21lbnQod2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCwgMCwgMClcbiAgICAgIF07XG4gICAgfVxuICAgIGlmICh0aGlzLnNwYW5uaW5nID09PSAnc2luZ2xlLWZvbGQtaG9yaXpvbnRhbCcpIHtcbiAgICAgIGNvbnN0IHNjcmVlbkNlbnRlciA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLmJyb3dzZXJTaGVsbFNpemUpIC8gMjtcbiAgICAgIGNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBuZXcgU2VnbWVudCh3aWR0aCwgc2NyZWVuQ2VudGVyIC0gdGhpcy5mb2xkU2l6ZSAvIDIsIDAsIDApLFxuICAgICAgICBuZXcgU2VnbWVudCh3aWR0aCwgdGhpcy5mb2xkU2l6ZSwgc2NyZWVuQ2VudGVyIC0gdGhpcy5mb2xkU2l6ZSAvIDIsIDApLFxuICAgICAgICBuZXcgU2VnbWVudCh3aWR0aCwgd2luZG93LmlubmVySGVpZ2h0LCBzY3JlZW5DZW50ZXIgKyB0aGlzLmZvbGRTaXplIC8gMiwgMClcbiAgICAgIF07XG4gICAgfVxuICAgIGlmICh0aGlzLnNwYW5uaW5nID09PSAnc2luZ2xlLWZvbGQtdmVydGljYWwnKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIC8gMiAtIHRoaXMuZm9sZFNpemUgLyAyO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbmV3IFNlZ21lbnQod2lkdGgsIGhlaWdodCwgMCwgMCksXG4gICAgICAgIG5ldyBTZWdtZW50KHRoaXMuZm9sZFNpemUsIGhlaWdodCwgMCwgd2lkdGgpLFxuICAgICAgICBuZXcgU2VnbWVudCh3aWR0aCwgaGVpZ2h0LCAwLCB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgKyB0aGlzLmZvbGRTaXplIC8gMilcbiAgICAgIF07XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd29uJ3QgY2FsbCBgZm5gIGlmIGl0IHdhcyBpbnZva2VkIGF0IGFcbiAgICogZmFzdGVyIGludGVydmFsIHRoYW4gYHdhaXRgLlxuICAgKi9cbiAgcHVibGljIGRlYm91bmNlKGZuOiBhbnksIHdhaXQ6IG51bWJlcikge1xuICAgIGxldCB0aW1lb3V0O1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0sIHdhaXQpO1xuICAgIH07XG4gIH1cbiAgcHVibGljIGFzeW5jIGludmFsaWRhdGUoKSB7XG4gICAgaWYgKCF0aGlzLm5lZWRzRGlzcGF0Y2gpIHtcbiAgICAgIHRoaXMubmVlZHNEaXNwYXRjaCA9IHRydWU7XG4gICAgICB0aGlzLm5lZWRzRGlzcGF0Y2ggPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJykpO1xuICAgIH1cbiAgfVxuXG59XG4iXX0=